Merge "Make update.php and install.php use wfPHPVersionError() and reorganise it"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 15 Mar 2013 20:55:49 +0000 (20:55 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 15 Mar 2013 20:55:49 +0000 (20:55 +0000)
736 files changed:
.gitignore
HISTORY
RELEASE-NOTES-1.21
UPGRADE
api.php
api.php5
composer.json
docs/database.txt
docs/databases/ibm_db2.txt [deleted file]
docs/hooks.txt
docs/maintenance.txt
docs/memcached.txt
img_auth.php5
includes/Action.php
includes/AjaxResponse.php
includes/ArrayUtils.php
includes/Article.php
includes/AuthPlugin.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.php
includes/Category.php
includes/CategoryPage.php
includes/CategoryViewer.php
includes/Categoryfinder.php
includes/Cdb.php
includes/ChangeTags.php
includes/ChangesFeed.php
includes/ChangesList.php
includes/Collation.php
includes/ConfEditor.php
includes/Cookie.php
includes/CryptRand.php
includes/DataUpdate.php
includes/DefaultSettings.php
includes/DeferredUpdates.php
includes/Defines.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/ExternalEdit.php
includes/ExternalUser.php
includes/Fallback.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/FormOptions.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.old.php [deleted file]
includes/HttpFunctions.php
includes/IP.php
includes/ImageGallery.php
includes/ImagePage.php
includes/Import.php
includes/Init.php
includes/Licenses.php
includes/LinkFilter.php
includes/Linker.php
includes/LinksUpdate.php
includes/MagicWord.php
includes/MappedIterator.php [new file with mode: 0644]
includes/Message.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Pager.php
includes/PathRouter.php
includes/PoolCounter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/ProxyTools.php
includes/QueryPage.php
includes/RecentChange.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/SeleniumWebSettings.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinLegacy.php
includes/SkinTemplate.php
includes/SpecialPage.php
includes/SpecialPageFactory.php
includes/Status.php
includes/StreamFile.php
includes/StringUtils.php
includes/StubObject.php
includes/Timestamp.php
includes/Title.php
includes/TitleArray.php
includes/UIDGenerator.php
includes/User.php
includes/UserMailer.php
includes/UserRightsProxy.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Wiki.php
includes/WikiError.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/XmlTypeCheck.php
includes/ZhClient.php
includes/ZipDirectoryReader.php
includes/actions/CachedAction.php
includes/actions/CreditsAction.php
includes/actions/DeleteAction.php
includes/actions/EditAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/MarkpatrolledAction.php
includes/actions/ProtectAction.php
includes/actions/PurgeAction.php
includes/actions/RawAction.php
includes/actions/RenderAction.php
includes/actions/RevisiondeleteAction.php
includes/actions/ViewAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiImageRotate.php [new file with mode: 0644]
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/GenderCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/cache/SquidUpdate.php
includes/cache/UserCache.php
includes/clientpool/RedisConnectionPool.php
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/content/WikitextContentHandler.php
includes/context/ContextSource.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/dao/IDBAccessObject.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseIbm_db2.php [deleted file]
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMRow.php
includes/db/IORMTable.php
includes/db/LBFactory.php
includes/db/LBFactory_Multi.php
includes/db/LBFactory_Single.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/diff/WikiDiff3.php
includes/externalstore/ExternalStore.php
includes/externalstore/ExternalStoreDB.php
includes/externalstore/ExternalStoreMedium.php
includes/filebackend/FSFile.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/FileOpBatch.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/FSLockManager.php
includes/filebackend/lockmanager/LSLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/QuorumLockManager.php
includes/filebackend/lockmanager/ScopedLock.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/README
includes/filerepo/RepoGroup.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Installer.php [deleted file]
includes/installer/Ibm_db2Updater.php [deleted file]
includes/installer/InstallDocFormatter.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/job/Job.php
includes/job/JobQueue.php
includes/job/JobQueueDB.php
includes/job/JobQueueGroup.php
includes/job/JobQueueRedis.php
includes/job/README
includes/job/jobs/AssembleUploadChunksJob.php [new file with mode: 0644]
includes/job/jobs/DoubleRedirectJob.php
includes/job/jobs/DuplicateJob.php
includes/job/jobs/HTMLCacheUpdateJob.php
includes/job/jobs/NullJob.php
includes/job/jobs/PublishStashedFileJob.php [new file with mode: 0644]
includes/job/jobs/RefreshLinksJob.php
includes/job/jobs/UploadFromUrlJob.php
includes/json/FormatJson.php
includes/json/Services_JSON.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/GenericArrayObject.php
includes/libs/IEContentAnalyzer.php
includes/libs/IEUrlExtension.php
includes/libs/JavaScriptMinifier.php
includes/libs/jsminplus.php
includes/limit.sh
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/ImageHandler.php
includes/media/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/SVGMetadataExtractor.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/normal/Makefile
includes/normal/UtfNormal.php
includes/normal/UtfNormalUtil.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.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/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimple.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchIBM_DB2.php [deleted file]
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBlockme.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeadendpages.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDisambiguations.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialLonelypages.php
includes/specials/SpecialLongpages.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostimages.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMostrevisions.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPopularpages.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedimages.php
includes/specials/SpecialUncategorizedpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnlockdb.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedimages.php
includes/specials/SpecialUnusedtemplates.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserlogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
includes/templates/NoLocalSettings.php
includes/upload/AssembleUploadChunks.php [deleted file]
includes/upload/PublishStashedFile.php [deleted file]
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromStash.php
includes/upload/UploadStash.php
index.php5
languages/Language.php
languages/Names.php
languages/classes/LanguageLt.php [deleted file]
languages/classes/LanguageLv.php [deleted file]
languages/messages/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAst.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBho.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGv.php
languages/messages/MessagesHe.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesNb.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSa.php
languages/messages/MessagesScn.php
languages/messages/MessagesSh.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSv.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTh.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVi.php
languages/messages/MessagesWar.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
load.php5
maintenance/README
maintenance/cleanupTitles.php
maintenance/clearCacheStats.php [new file with mode: 0644]
maintenance/clearInterwikiCache.php [new file with mode: 0644]
maintenance/clear_interwiki_cache.php [deleted file]
maintenance/clear_stats.php [deleted file]
maintenance/createAndPromote.php
maintenance/ibm_db2/foreignkeys.sql [deleted file]
maintenance/ibm_db2/patch-categorylinks-better-collation.sql [deleted file]
maintenance/ibm_db2/patch-change_tag-indexes.sql [deleted file]
maintenance/ibm_db2/patch-change_tag.sql [deleted file]
maintenance/ibm_db2/patch-change_tag_summary.sql [deleted file]
maintenance/ibm_db2/patch-change_valid_tag.sql [deleted file]
maintenance/ibm_db2/patch-cl_collation-field.sql [deleted file]
maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql [deleted file]
maintenance/ibm_db2/patch-cl_type-field.sql [deleted file]
maintenance/ibm_db2/patch-external_user.sql [deleted file]
maintenance/ibm_db2/patch-ipb_allow_usertalk.sql [deleted file]
maintenance/ibm_db2/patch-iw_api-field.sql [deleted file]
maintenance/ibm_db2/patch-iw_api_and_wikiid.sql [deleted file]
maintenance/ibm_db2/patch-iw_wikiid-field.sql [deleted file]
maintenance/ibm_db2/patch-iwlinks.sql [deleted file]
maintenance/ibm_db2/patch-l10n_cache.sql [deleted file]
maintenance/ibm_db2/patch-log_search-rename-index.sql [deleted file]
maintenance/ibm_db2/patch-log_search.sql [deleted file]
maintenance/ibm_db2/patch-log_user_text.sql [deleted file]
maintenance/ibm_db2/patch-module_deps.sql [deleted file]
maintenance/ibm_db2/patch-msg_resource.sql [deleted file]
maintenance/ibm_db2/patch-msg_resource_links.sql [deleted file]
maintenance/ibm_db2/patch-rd_interwiki.sql [deleted file]
maintenance/ibm_db2/patch-ss_active_users.sql [deleted file]
maintenance/ibm_db2/patch-ul_value.sql [deleted file]
maintenance/ibm_db2/patch-uq61_msg_resource_links.sql [deleted file]
maintenance/ibm_db2/patch-uq81_msg_resource.sql [deleted file]
maintenance/ibm_db2/patch-uq96_module_deps.sql [deleted file]
maintenance/ibm_db2/patch-user_properties.sql [deleted file]
maintenance/ibm_db2/tables.sql [deleted file]
maintenance/initSiteStats.php [new file with mode: 0644]
maintenance/initStats.php [deleted file]
maintenance/language/languages.inc
maintenance/language/messages.inc
maintenance/mcc.php
maintenance/mctest.php
maintenance/mwdoc-filter.php
maintenance/mwdocgen.php
maintenance/nextJobDB.php
maintenance/proxyCheck.php [new file with mode: 0644]
maintenance/proxy_check.php [deleted file]
maintenance/purgeParserCache.php
maintenance/runJobs.php
maintenance/showCacheStats.php [new file with mode: 0644]
maintenance/showSiteStats.php [new file with mode: 0644]
maintenance/showStats.php [deleted file]
maintenance/stats.php [deleted file]
maintenance/storage/recompressTracked.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/updateCollation.php
mw-config/index.php5
opensearch_desc.php5
redirect.php5
resources/Resources.php
resources/jquery.ui/themes/default/jquery.ui.button.css
resources/jquery.ui/themes/vector/jquery.ui.button.css
resources/jquery/jquery.badge.css
resources/jquery/jquery.badge.js
resources/jquery/jquery.delayedBind.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki.action/mediawiki.action.history.js
resources/mediawiki.action/mediawiki.action.view.postEdit.js [new file with mode: 0644]
resources/mediawiki.api/mediawiki.api.titleblacklist.js [deleted file]
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
skins/Vector.php
skins/common/commonElements.css
skins/common/shared.css
tests/RunSeleniumTests.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parserTests.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/StructureTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TimestampTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryContinueTest.php [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryTestBase.php [new file with mode: 0644]
tests/phpunit/includes/cache/MessageCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/phpunit.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/selenium/SeleniumServerManager.php
tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
tests/selenium/installer/MediaWikiInstallationCommonFunction.php
tests/selenium/installer/MediaWikiInstallationConfig.php
tests/selenium/installer/MediaWikiInstallationMessage.php
tests/selenium/installer/MediaWikiInstallationVariables.php
tests/selenium/installer/MediaWikiInstallerTestSuite.php
tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
tests/selenium/suites/AddContentToNewPageTestCase.php
tests/selenium/suites/AddNewPageTestCase.php
tests/selenium/suites/CreateAccountTestCase.php
tests/selenium/suites/DeletePageAdminTestCase.php
tests/selenium/suites/EmailPasswordTestCase.php
tests/selenium/suites/MediaWikiEditorConfig.php
tests/selenium/suites/MovePageTestCase.php
tests/selenium/suites/MyContributionsTestCase.php
tests/selenium/suites/MyWatchListTestCase.php
tests/selenium/suites/PageSearchTestCase.php
tests/selenium/suites/PreviewPageTestCase.php
tests/selenium/suites/SavePageTestCase.php
tests/selenium/suites/UserPreferencesTestCase.php
tests/testHelpers.inc
thumb.php5
thumb_handler.php5

index 8dcba4e..ca87d93 100644 (file)
@@ -17,23 +17,23 @@ project.index
 sublime-*
 
 # MediaWiki install & usage
-cache
-docs/js
-images/[0-9a-f]
-images/archive
-images/deleted
-images/lockdir
-images/temp
-images/thumb
+/cache
+/docs/js
+/images/[0-9a-f]
+/images/archive
+/images/deleted
+/images/lockdir
+/images/temp
+/images/thumb
 ## Extension:EasyTimeline
-images/timeline
-images/tmp
-maintenance/.mweval_history
-maintenance/.mwsql_history
-maintenance/dev/data
-AdminSettings.php
-LocalSettings.php
-StartProfiler.php
+/images/timeline
+/images/tmp
+/maintenance/.mweval_history
+/maintenance/.mwsql_history
+/maintenance/dev/data
+/AdminSettings.php
+/LocalSettings.php
+/StartProfiler.php
 
 # Building & testing
 node_modules/
@@ -55,6 +55,6 @@ Thumbs.db
 .idea
 .metadata*
 .settings
-favicon.ico
-static*
-tags
+/favicon.ico
+/static*
+/tags
diff --git a/HISTORY b/HISTORY
index 3a25b97..02ba8d8 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -132,7 +132,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
 * Added ResourceLoader module "jquery.badge".
 * mw.util.$content now points to the overall content area in the skin rather than just
-  page text content area. If you need the old behaviour please use $( '#mw-content-text').
+  page text content area. If you need the old behavior please use $( '#mw-content-text').
 * jsMessage has been replaced with a floating bubble notification system complete
   with auto-hide, multi-message support, and message replacement tags.
 * jquery.messageBox which appears to be unused by both core and extensions has
@@ -1135,7 +1135,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
 * New maintenance script to refresh image metadata (maintenance/refreshImageMetadata.php).
 * (bug 16428) Include permalink in printable version.
 * (bug 30722) Add an identity collation that sorts things based on what the
-  unicode code point is (aka pre-1.17 behaviour).
+  unicode code point is (aka pre-1.17 behavior).
 * (bug 30940) Add a hook in User:getDefaultOptions.
   To give extensions a better and more flexible way of providing default
   values for preferences a hook has been introdiced in User:getDefaultOptions().
@@ -2125,7 +2125,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
   make wfTempDir() return a sane value for Windows on worst-case.
 * (bug 24824) Support ImageMagick 6.5.6-2+ JPEG decoder size hint, to reduce
   memory usage when such an ImageMagick is used for scaling.
-* Disable multithreaded behaviour in recent ImageMagick, to avoid a deadlock
+* Disable multithreaded behavior in recent ImageMagick, to avoid a deadlock
   when a resource limit such as $wgMaxShellMemory is hit.
 * (bug 24981) Allow extensions to access SpecialUpload variables again.
 * (bug 20744) Wiki forgets about an uploaded file.
@@ -2518,8 +2518,8 @@ Other significant changes to MediaWiki's language support:
   exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
   it as appropriate.
 * If $wgLocaltimezone is null, use the server's timezone as the default for
-  signatures. This was always the behaviour documented in DefaultSettings.php
-  but has not been the actual behaviour for some time: instead, UTC was used
+  signatures. This was always the behavior documented in DefaultSettings.php
+  but has not been the actual behavior for some time: instead, UTC was used
   by default.
 * Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
   If not specified it will default to $wgScriptPath/extensions
@@ -4716,7 +4716,7 @@ Other changes in this release:
 * (bug 12644) Template list on edit page now sorted on preview
 * (bug 14058) Support pipe trick for namespaces and interwikis with "-"
 * Message name filter on Special:Allmessages now case-insensitive
-* (bug 13943) Fix image redirect behaviour on image pages
+* (bug 13943) Fix image redirect behavior on image pages
 * (bug 14093) Do 'sysop' => 'protect' magic in Title::isValidMoveOperation
 * (bug 14063) Power search form missing <label> for redirects check
 * (bug 14111) Similar filename warning links now lead to correct page
@@ -4939,7 +4939,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   to not check and assume they are always up to date)
 * The rollback permission can now be rate-limited using the normal mechanism.
 * New configuration variable $wgExtraLanguageNames
-* Behaviour of $wgAddGroups and $wgRemoveGroups changed. New behaviour:
+* Behavior of $wgAddGroups and $wgRemoveGroups changed. New behavior:
 * * Granting the userrights privilege allows arbitrary changing of rights.
 * * Without the userrights privilege, a user will be able to add and/or
      remove the groups specified in $wgAddGroups and $wgRemoveGroups for
@@ -5351,7 +5351,7 @@ the removal of this double-parse. Please see the wiki page for examples.
 
 Message transformation mode has been removed, and replaced with "preprocess"
 mode. This means that some MediaWiki namespace messages may need to be updated,
-especially ones which took advantage of the terribly counterintuitive behaviour
+especially ones which took advantage of the terribly counterintuitive behavior
 of the former message mode.
 
 The header identification routines for section edit and for numbering section
@@ -5361,7 +5361,7 @@ template expansion will still be rendered into a heading tag, and will get an
 entry in the TOC, but will not have a section edit link. HTML-style headings
 will also not have a section edit link. Valid wikitext headings present in the
 template source text will get a template section edit link. This is a major
-break from previous behaviour, but I believe the effects are almost entirely
+break from previous behavior, but I believe the effects are almost entirely
 beneficial.
 
 The main motivation for making these changes was performance. The new two-pass
@@ -5568,7 +5568,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   enabled by default.
 * Added option to install to MyISAM
 * (bug 9250) Remove hardcoded minimum image name length of three characters
-* Fixed DISPLAYTITLE behaviour to reject titles which don't normalise to the
+* Fixed DISPLAYTITLE behavior to reject titles which don't normalise to the
   same title as the current page, and enabled per default
 * Wrap site CSS and JavaScript in a <pre> tag, like user JS/CSS
 * (bug 10196) Add classes and dir="ltr" to the <pre>s on CSS and JS pages (new
@@ -5850,7 +5850,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
 * Fix upload form display in right-to-left languages
 * Fixed regression in blocking of username '0'
 * (bug 9437) Don't overwrite edit form submission handler when setting up
-  edit box scroll position preserve/restore behaviour
+  edit box scroll position preserve/restore behavior
 * (bug 10805) Fix "undo" link when viewing the diff of the most recent
   change to a page using "diff=0"
 * (bug 10765) img_auth.php will now refuse logged-out requests where
@@ -6396,7 +6396,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   to image/svg+xml after loading from the database.
 * Workaround for djvutoxml bug #1704049 (poor performance). Use djvudump
   instead.
-* Fixed odd behaviour in ImagePage on DjVu thumbnailing errors
+* Fixed odd behavior in ImagePage on DjVu thumbnailing errors
 * (bug 5439) "Go" title search will now jump to shared/foreign Image: and
   MediaWiki: pages that have not been locally edited.
 * (bug 9630) Limits links in Whatlinkshere forgot about namespace filter
@@ -7002,7 +7002,7 @@ setting since version 1.2.0. If you have it on, turn it *off* if you can.
 * New maintenance script to show the cached statistics : showStats.php.
 * Count deleted edits when regenerating total edits in maintenance/initStats.php
 * (bug 3706) Allow users to be exempted from IP blocks. The ipblock-exempt permission
-  key has been added to enable this behaviour, by default assigned to sysops.
+  key has been added to enable this behavior, by default assigned to sysops.
 * (bug 7948) importDump.php now warn that Recentchanges need to be rebuild.
 * (bug 7667) allow XHTML namespaces customization
 * (bug 8531) Correct local name of Lingála (patch by Raymond)
@@ -7281,7 +7281,7 @@ they will be run along with the main tests by maintenance/parserTests.php
 * (bug 6642) Don't offer to unlock the database when it isn't locked
 * cleanupTitles.php changed from --dry-run option to --fix, so default
   behavior is now a non-invasive check as with namespaceDupes.php
-* (bug 6660) Fix behaviour of EditPage::blockedPage() when the article does
+* (bug 6660) Fix behavior of EditPage::blockedPage() when the article does
   not exist; now doesn't show the source box if the user hasn't provided it
   (blocked mid-edit) and the page doesn't exist
 * Improve default value of "blockedtext"
@@ -7442,7 +7442,7 @@ they will be run along with the main tests by maintenance/parserTests.php
 * (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
   mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
 * Made {{INT:}} a core parser function instead of a special case. The syntax
-  and behaviour is largely unchanged.
+  and behavior is largely unchanged.
 * (bug 7448) Fixing the native name for Ewe (ee)
 * (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
   to allow better localisation
@@ -10320,7 +10320,7 @@ pages for purposes of page relevancy ranking.
 * (bug 1283) Use underlining and borders to highlight additions/deletions
   in diff-view
 * Use user's local timezone in Special:Log display
-* Show filename for images in gallery by default (restore beta 3 behaviour)
+* Show filename for images in gallery by default (restore beta 3 behavior)
 * (bug 1201) Double-escaping in brokenlinks, imagelinks, categorylinks, searchindex
 * When using squid reverse proxy, cache the redirect to the Main_Page
 * (bug 1302) Fix Norwegian language file
index c941089..2e3cf72 100644 (file)
@@ -20,12 +20,12 @@ production.
   disabled.
 
 === New features in 1.21 ===
-* (bug 38110) Schema changes (adding or dropping tables, indicies and
+* (bug 38110) Schema changes (adding or dropping tables, indices and
   fields) can be now be done separately from from other changes that
   update.php makes.  This is useful in environments that use database
   permissions to restrict schema changes but allow the DB user that
   MediaWiki normally runs as to perform other changes that update.php
-  makes.  Schema changes can be run seperately.  See the file UPGRADE
+  makes.  Schema changes can be run separately.  See the file UPGRADE
   for more information.
 * (bug 34876) jquery.makeCollapsible has been improved in performance.
 * Added ContentHandler facility to allow extensions to support other content
@@ -96,8 +96,8 @@ production.
 * (bug 5346) Categories that are redirects will be displayed italic in
   the category links section at the bottom of a page.
 * (bug 43915) New maintenance script deleteEqualMessages.php.
-* New collation uppercase-sv, which is like uppercase, but adapted
-  to Swedish sort order.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+  subclass in HTMLForm.
 * WikiText now permits the use of WAI-ARIA's role="presentation" inside of
   html elements and tables. This allows presentational markup, especially
   tables. To be marked up as such.
@@ -113,6 +113,13 @@ production.
   gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
   oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
   uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+  structual equality of HTML (ignoring insignificant differences like
+  quotmarks, order and whitespace in the attribute list).
 
 === Bug fixes in 1.21 ===
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
@@ -189,6 +196,14 @@ production.
   "password mismatch" error.
 * (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
   extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+  script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
@@ -225,7 +240,7 @@ production.
 * (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
   redirects.
 * On error, any warnings generated before that error will be shown in the result.
-* action=help suports generalized submodules (modules=query+value), querymodules obsolete
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
 * ApiQueryImageInfo continuation is more reliable. The only major change is
   that the imagerepository property will no longer be set on page objects not
   processed in the current query (i.e. non-images or those skipped due to
@@ -236,11 +251,26 @@ production.
 * ApiQueryImageInfo will now limit the number of calls to File::transform made
   in any one query. If there are too many, iicontinue will be returned.
 * action=query&meta=siteinfo&siprop=general will now return the regexes used for
-  link trails and link prefices. Added for Parsoid support.
+  link trails and link prefixes. Added for Parsoid support.
 * Added an API query module list=pageswithprop, which lists pages using a
   particular page property.
 * Added an API query module list=pagepropnames, which lists all page prop names
   currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+  HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+  the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+  used for action=upload's 'file' and 'chunk' parameters. This type will raise
+  an error during parameter validation if the parameter is given but not
+  recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+  querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+  proper error instead of as an uncaught exception.
 
 === API internal changes in 1.21 ===
 * For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
@@ -255,6 +285,7 @@ production.
 * ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
 * $wgAPIGeneratorModules is now obsolete and will be ignored.
 * Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
 
 === Languages updated in 1.21 ===
 
@@ -264,6 +295,7 @@ changes to languages because of Bugzilla reports.
 
 * South Azerbaijani (azb) added.
 * (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
 * (bug 34977) Now formatted numbers in Spanish use space as separator
   for thousands, as mandated by the Real Academia Española.
 * (bug 35031) Kurdish formatted numbers now use period and comma
@@ -277,14 +309,30 @@ changes to languages because of Bugzilla reports.
   were using it, you have to either copy it to your extension, or install the
   Vector extension (and possibly disable its features using config settings if
   you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+  lowerCamelCase format, and made more explicit:
+  - clear_stats.php -> clearCacheStats.php
+  - clear_interwiki_cache.php -> clearInterwikiCache.php
+  - initStats.php -> initSiteStats.php
+  - proxy_check.php -> proxyCheck.php
+  - stats.php -> showCacheStats.php
+  - showStats.php -> showSiteStats.php.
+  Class names were renamed accordingly:
+  - clear_stats -> ClearCacheStats
+  - InitStats -> InitSiteStats
+  - CacheStats -> ShowCacheStats
+  - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+  and moved it to the TitleBlacklist extension.
 
 == Compatibility ==
 
 MediaWiki 1.21 requires PHP 5.3.2 or later.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for IBM
-DB2 and Oracle.
+support for them is somewhat less mature. There is experimental support for
+Oracle.
 
 The supported versions are:
 
diff --git a/UPGRADE b/UPGRADE
index 2c6df98..7987b22 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -81,7 +81,7 @@ The names of configuration variables, and their default values and purposes,
 can change between release branches, e.g. $wgDisableUploads in 1.4 is replaced
 with $wgEnableUploads in later versions. When upgrading, consult the release
 notes to check for configuration changes which would alter the expected
-behaviour of MediaWiki.
+behavior of MediaWiki.
 
 === Check installed extensions ===
 
diff --git a/api.php b/api.php
index abf601f..bc90229 100644 (file)
--- a/api.php
+++ b/api.php
@@ -8,7 +8,7 @@
  * as an argument in the URL ('?action=') and with write-enabled set to the
  * value of $wgEnableWriteAPI as specified in LocalSettings.php.
  * It then invokes "execute()" on the ApiMain object instance, which
- * produces output in the format sepecified in the URL.
+ * produces output in the format specified in the URL.
  *
  * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
  *
index bb515c5..1828b7b 100644 (file)
--- a/api.php5
+++ b/api.php5
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of api.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index fa42c29..ded3365 100644 (file)
                }
        ],
        "license": "GPL-2.0",
-       "repositories": [
-               {
-                       "type": "vcs",
-                       "url": "https://gerrit.wikimedia.org/r/p/mediawiki/core.git"
-               }
-       ],
        "support": {
                "issues": "https://bugzilla.wikimedia.org/",
                "irc": "irc://irc.freenode.net/mediawiki",
index c0a2412..65a597b 100644 (file)
@@ -180,7 +180,6 @@ MediaWiki does support the following other DBMSs to varying degrees.
 * PostgreSQL
 * SQLite
 * Oracle
-* IBM DB2
 * MSSQL
 
 More information can be found about each of these databases (known issues,
diff --git a/docs/databases/ibm_db2.txt b/docs/databases/ibm_db2.txt
deleted file mode 100644 (file)
index 3c3f381..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-== See also ==
-*[http://www.mediawiki.org/wiki/Manual:IBM_DB2 Installation instructions]
-*[http://ca.php.net/manual/en/function.db2-connect.php PHP Manual for DB2 functions]
\ No newline at end of file
index 28eedf4..3670cbe 100644 (file)
@@ -745,6 +745,14 @@ $output: OutputPage object in use
 the defaults.
 &$namespaces: Array of namespace numbers with corresponding canonical names
 
+'CategoryAfterPageAdded': After a page is added to a category.
+$category: Category that page was added to
+$wikiPage: WikiPage that was added
+
+'CategoryAfterPageRemoved': After a page is removed from a category.
+$category: Category that page was removed from
+$wikiPage: WikiPage that was removed
+
 'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
 $catpage: CategoryPage instance
 
@@ -834,6 +842,11 @@ $title: the diff page title (nullable)
 $old: the ?old= param value from the url
 $new: the ?new= param value from the url
 
+'DiffRevisionTools': Override or extend the revision tools available from the
+diff view, i.e. undo, etc.
+$rev: Revision object
+&$links: Array of HTML links
+
 'DiffViewHeader': Called before diff display
 $diff: DifferenceEngine object that's calling
 $oldRev: Revision object of the "old" revision (may be null/invalid)
@@ -1192,6 +1205,11 @@ $result: User permissions error to add. If none, return true.
 Special:Version, use this to change the list.
 &$extTypes: associative array of repo URLS to viewer URLs.
 
+'HistoryRevisionTools': Override or extend the revision tools available from the
+page history view, i.e. undo, rollback, etc.
+$rev: Revision object
+&$links: Array of HTML links
+
 'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
 image insertion. You can skip the default logic entirely by returning false, or
 just modify a few things using call-by-reference.
@@ -1660,6 +1678,7 @@ $baseRevId: the rev ID (or false) this edit was based on
 
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 $article: the article that the history is loading for
+$context: RequestContext object
 
 'PageHistoryLineEnding' : Right before the end <li> is added to a history line.
 $row: the revision row for this line
@@ -2285,7 +2304,7 @@ $result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
   Title::isCssOrJsPage().
 
 'TitleIsAlwaysKnown': Called when determining if a page exists. Allows
-overriding default behaviour for determining if a page exists. If $isKnown is
+overriding default behavior for determining if a page exists. If $isKnown is
 kept as null, regular checks happen. If it's a boolean, this value is returned
 by the isKnown method.
 $title: Title object that is being checked
index 988ff28..27619c8 100644 (file)
@@ -15,7 +15,7 @@ subdirectories, all of which have unique purposes.
 level /maintenance directory.
 
 Example:
-  php clear_stats.php
+  php clearCacheStats.php
   
 The following parameters are available to all maintenance scripts
 --help   : Print a help message
index 971a611..f54a4e7 100644 (file)
@@ -237,9 +237,9 @@ Statistics:
        controlled by: $wgStatsMethod
        key: $wgDBname:stats:$key
        ex: wikibd:stats:request_with_session
-       stores: counter for statistics (see maintenance/stats.php script)
+       stores: counter for statistics (see maintenance/showCacheStats.php script)
        expiry: none (?)
-       cleared by: maintenance/clear_stats.php script
+       cleared by: maintenance/clearCacheStats.php script
 
 User:
        key: $wgDBname:user:id:$sId
index b3eb450..a86d7c0 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of img_auth.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 40ce478..2e0c88b 100644 (file)
@@ -32,7 +32,7 @@
  *
  * Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
  * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
- * patrol, etc). The FormAction and FormlessAction classes respresent these two groups.
+ * patrol, etc). The FormAction and FormlessAction classes represent these two groups.
  */
 abstract class Action {
 
@@ -147,7 +147,7 @@ abstract class Action {
        /**
         * Check if a given action is recognised, even if it's disabled
         *
-        * @param $name String: name of an action
+        * @param string $name name of an action
         * @return Bool
         */
        final public static function exists( $name ) {
@@ -388,7 +388,7 @@ abstract class FormAction extends Action {
        protected function alterForm( HTMLForm $form ) {}
 
        /**
-        * Get the HTMLForm to control behaviour
+        * Get the HTMLForm to control behavior
         * @return HTMLForm|null
         */
        protected function getForm() {
@@ -439,7 +439,7 @@ abstract class FormAction extends Action {
         * some stuff underneath (history etc); to do some processing on submission of that
         * form (delete, protect, etc) and to do something exciting on 'success', be that
         * display something new or redirect to somewhere.  Some actions have more exotic
-        * behaviour, but that's what subclassing is for :D
+        * behavior, but that's what subclassing is for :D
         */
        public function show() {
                $this->setHeaders();
@@ -545,8 +545,8 @@ abstract class FormlessAction extends Action {
        /**
         * Execute the action silently, not giving any output.  Since these actions don't have
         * forms, they probably won't have any data, but some (eg rollback) may do
-        * @param $data Array values that would normally be in the GET request
-        * @param $captureErrors Bool whether to catch exceptions and just return false
+        * @param array $data values that would normally be in the GET request
+        * @param bool $captureErrors whether to catch exceptions and just return false
         * @throws ErrorPageError|Exception
         * @return Bool whether execution was successful
         */
index 23c31bf..138f808 100644 (file)
@@ -172,7 +172,7 @@ class AjaxResponse {
                        # tell the client to use a cached copy, without a way to purge it.
 
                        if ( $wgUseSquid ) {
-                               # Expect explicite purge of the proxy cache, but require end user agents
+                               # Expect explicit purge of the proxy cache, but require end user agents
                                # to revalidate against the proxy on each visit.
                                # Surrogate-Control controls our Squid, Cache-Control downstream caches
 
index d1b72a0..0b74f06 100644 (file)
@@ -21,7 +21,7 @@ class ArrayUtils {
         *     various consistent hash implementations that existed before this
         *     function was introduced.
         */
-       static function consistentHashSort( &$array, $key, $separator = "\000" ) {
+       public static function consistentHashSort( &$array, $key, $separator = "\000" ) {
                $hashes = array();
                foreach ( $array as $elt ) {
                        $hashes[$elt] = md5( $elt . $separator . $key );
@@ -30,4 +30,40 @@ class ArrayUtils {
                        return strcmp( $hashes[$a], $hashes[$b] );
                } );
        }
+
+       /**
+        * Given an array of non-normalised probabilities, this function will select
+        * an element and return the appropriate key
+        *
+        * @param $weights array
+        *
+        * @return bool|int|string
+        */
+       public static function pickRandom( $weights ){
+               if ( !is_array( $weights ) || count( $weights ) == 0 ) {
+                       return false;
+               }
+
+               $sum = array_sum( $weights );
+               if ( $sum == 0 ) {
+                       # No loads on any of them
+                       # In previous versions, this triggered an unweighted random selection,
+                       # but this feature has been removed as of April 2006 to allow for strict
+                       # separation of query groups.
+                       return false;
+               }
+               $max = mt_getrandmax();
+               $rand = mt_rand( 0, $max ) / $max * $sum;
+
+               $sum = 0;
+               foreach ( $weights as $i => $w ) {
+                       $sum += $w;
+                       # Do not return keys if they have 0 weight.
+                       # Note that the "all 0 weight" case is handed above
+                       if ( $w > 0 && $sum >= $rand ) {
+                               break;
+                       }
+               }
+               return $i;
+       }
 }
index ed9c305..9b4afe4 100644 (file)
@@ -134,7 +134,7 @@ class Article implements Page {
 
        /**
         * Constructor from a page id
-        * @param $id Int article ID to load
+        * @param int $id article ID to load
         * @return Article|null
         */
        public static function newFromID( $id ) {
@@ -393,7 +393,6 @@ class Article implements Page {
                return $this->mContent;
        }
 
-
        /**
         * Get text content object
         * Does *NOT* follow redirects.
@@ -767,6 +766,8 @@ class Article implements Page {
                $this->showViewFooter();
                $this->mPage->doViewUpdates( $user );
 
+               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -852,7 +853,7 @@ class Article implements Page {
 
        /**
         * Get the robot policy to be used for the current view
-        * @param $action String the action= GET parameter
+        * @param string $action the action= GET parameter
         * @param $pOutput ParserOutput
         * @return Array the policy that should be set
         * TODO: actions other than 'view'
@@ -1210,7 +1211,7 @@ class Article implements Page {
         *   Revision as of \<date\>; view current revision
         *   \<- Previous version | Next Version -\>
         *
-        * @param $oldid int: 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 ) ) ) {
@@ -1518,7 +1519,7 @@ class Article implements Page {
        /**
         * Output deletion confirmation dialog
         * @todo FIXME: Move to another file?
-        * @param $reason String: prefilled reason
+        * @param string $reason prefilled reason
         */
        public function confirmDelete( $reason ) {
                wfDebug( "Article::confirmDelete\n" );
@@ -1726,7 +1727,7 @@ class Article implements Page {
         *
         * @param $oldid mixed integer Revision ID or null
         * @param $user User The relevant user
-        * @return ParserOutput or false if the given revsion ID is not found
+        * @return 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()
@@ -1886,8 +1887,8 @@ class Article implements Page {
         *
         * @deprecated in 1.18; call OutputPage::redirect() directly
         * @param $noRedir Boolean: add redirect=no
-        * @param $sectionAnchor String: section to redirect to, including "#"
-        * @param $extraQuery String: extra query params
+        * @param string $sectionAnchor section to redirect to, including "#"
+        * @param string $extraQuery extra query params
         */
        public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
                wfDeprecated( __METHOD__, '1.18' );
@@ -1907,7 +1908,7 @@ class Article implements Page {
         * Use PHP's magic __get handler to handle accessing of
         * raw WikiPage fields for backwards compatibility.
         *
-        * @param $fname String Field name
+        * @param string $fname Field name
         */
        public function __get( $fname ) {
                if ( property_exists( $this->mPage, $fname ) ) {
@@ -1921,7 +1922,7 @@ class Article implements Page {
         * Use PHP's magic __set handler to handle setting of
         * raw WikiPage fields for backwards compatibility.
         *
-        * @param $fname String Field name
+        * @param string $fname Field name
         * @param $fvalue mixed New value
         */
        public function __set( $fname, $fvalue ) {
@@ -1940,8 +1941,8 @@ class Article implements Page {
         * Use PHP's magic __call handler to transform instance calls to
         * WikiPage functions for backwards compatibility.
         *
-        * @param $fname String Name of called method
-        * @param $args Array Arguments to the method
+        * @param string $fname Name of called method
+        * @param array $args Arguments to the method
         * @return mixed
         */
        public function __call( $fname, $args ) {
index 2e42439..a465817 100644 (file)
@@ -46,7 +46,7 @@ class AuthPlugin {
         * you might need to munge it (for instance, for lowercase initial
         * letters).
         *
-        * @param $username String: username.
+        * @param string $username username.
         * @return bool
         */
        public function userExists( $username ) {
@@ -60,8 +60,8 @@ class AuthPlugin {
         * you might need to munge it (for instance, for lowercase initial
         * letters).
         *
-        * @param $username String: username.
-        * @param $password String: user password.
+        * @param string $username username.
+        * @param string $password user password.
         * @return bool
         */
        public function authenticate( $username, $password ) {
@@ -73,7 +73,7 @@ class AuthPlugin {
         * Modify options in the login template.
         *
         * @param $template UserLoginTemplate object.
-        * @param $type String 'signup' or 'login'. Added in 1.16.
+        * @param string $type 'signup' or 'login'. Added in 1.16.
         */
        public function modifyUITemplate( &$template, &$type ) {
                # Override this!
@@ -83,7 +83,7 @@ class AuthPlugin {
        /**
         * Set the domain this plugin is supposed to use when authenticating.
         *
-        * @param $domain String: authentication domain.
+        * @param string $domain authentication domain.
         */
        public function setDomain( $domain ) {
                $this->domain = $domain;
@@ -105,7 +105,7 @@ class AuthPlugin {
        /**
         * Check to see if the specific domain is a valid domain.
         *
-        * @param $domain String: authentication domain.
+        * @param string $domain authentication domain.
         * @return bool
         */
        public function validDomain( $domain ) {
@@ -194,7 +194,7 @@ class AuthPlugin {
         * Return true if successful.
         *
         * @param $user User object.
-        * @param $password String: password.
+        * @param string $password password.
         * @return bool
         */
        public function setPassword( $user, $password ) {
@@ -251,7 +251,7 @@ class AuthPlugin {
         * Check if a user should authenticate locally if the global authentication fails.
         * If either this or strict() returns true, local authentication is not used.
         *
-        * @param $username String: username.
+        * @param string $username username.
         * @return Boolean
         */
        public function strictUserAuth( $username ) {
index 5b64e65..7136232 100644 (file)
@@ -119,6 +119,7 @@ $wgAutoloadLocalClasses = array(
        'Html' => 'includes/Html.php',
        'HTMLApiField' => 'includes/HTMLForm.php',
        'HTMLCheckField' => 'includes/HTMLForm.php',
+       'HTMLCheckMatrix' => 'includes/HTMLForm.php',
        'HTMLEditTools' => 'includes/HTMLForm.php',
        'HTMLFloatField' => 'includes/HTMLForm.php',
        'HTMLForm' => 'includes/HTMLForm.php',
@@ -136,7 +137,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLTextField' => 'includes/HTMLForm.php',
        'Http' => 'includes/HttpFunctions.php',
        'HttpError' => 'includes/Exception.php',
-       'HttpRequest' => 'includes/HttpFunctions.old.php',
        'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
        'IdentityCollation' => 'includes/Collation.php',
@@ -168,6 +168,7 @@ $wgAutoloadLocalClasses = array(
        'MagicWord' => 'includes/MagicWord.php',
        'MagicWordArray' => 'includes/MagicWord.php',
        'MailAddress' => 'includes/UserMailer.php',
+       'MappedIterator' => 'includes/MappedIterator.php',
        'MediaWiki' => 'includes/Wiki.php',
        'MediaWiki_I18N' => 'includes/SkinTemplate.php',
        'Message' => 'includes/Message.php',
@@ -182,7 +183,7 @@ $wgAutoloadLocalClasses = array(
        'MWNamespace' => 'includes/Namespace.php',
        'OldChangesList' => 'includes/ChangesList.php',
        'OutputPage' => 'includes/OutputPage.php',
-       'Page' =>  'includes/WikiPage.php',
+       'Page' => 'includes/WikiPage.php',
        'PageQueryPage' => 'includes/PageQueryPage.php',
        'Pager' => 'includes/Pager.php',
        'PasswordError' => 'includes/User.php',
@@ -258,7 +259,6 @@ $wgAutoloadLocalClasses = array(
        'UnlistedSpecialPage' => 'includes/SpecialPage.php',
        'UploadSourceAdapter' => 'includes/Import.php',
        'UppercaseCollation' => 'includes/Collation.php',
-       'UppercaseSvCollation' => 'includes/Collation.php',
        'User' => 'includes/User.php',
        'UserArray' => 'includes/UserArray.php',
        'UserArrayFromResult' => 'includes/UserArray.php',
@@ -277,9 +277,9 @@ $wgAutoloadLocalClasses = array(
        'WikiError' => 'includes/WikiError.php',
        'WikiErrorMsg' => 'includes/WikiError.php',
        'WikiExporter' => 'includes/Export.php',
-       'WikiFilePage' =>  'includes/WikiFilePage.php',
+       'WikiFilePage' => 'includes/WikiFilePage.php',
        'WikiImporter' => 'includes/Import.php',
-       'WikiPage' =>  'includes/WikiPage.php',
+       'WikiPage' => 'includes/WikiPage.php',
        'WikiRevision' => 'includes/Import.php',
        'WikiMap' => 'includes/WikiMap.php',
        'WikiReference' => 'includes/WikiMap.php',
@@ -361,6 +361,7 @@ $wgAutoloadLocalClasses = array(
        'ApiFormatXmlRsd' => 'includes/api/ApiRsd.php',
        'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
        'ApiHelp' => 'includes/api/ApiHelp.php',
+       'ApiImageRotate' => 'includes/api/ApiImageRotate.php',
        'ApiImport' => 'includes/api/ApiImport.php',
        'ApiImportReporter' => 'includes/api/ApiImport.php',
        'ApiLogin' => 'includes/api/ApiLogin.php',
@@ -475,7 +476,6 @@ $wgAutoloadLocalClasses = array(
        'ChronologyProtector' => 'includes/db/LBFactory.php',
        'CloneDatabase' => 'includes/db/CloneDatabase.php',
        'DatabaseBase' => 'includes/db/Database.php',
-       'DatabaseIbm_db2' => 'includes/db/DatabaseIbm_db2.php',
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
        'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
        'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
@@ -494,10 +494,6 @@ $wgAutoloadLocalClasses = array(
        'DBUnexpectedError' => 'includes/db/DatabaseError.php',
        'FakeResultWrapper' => 'includes/db/DatabaseUtility.php',
        'Field' => 'includes/db/DatabaseUtility.php',
-       'IBM_DB2Blob' => 'includes/db/DatabaseIbm_db2.php',
-       'IBM_DB2Field' => 'includes/db/DatabaseIbm_db2.php',
-       'IBM_DB2Helper' => 'includes/db/DatabaseIbm_db2.php',
-       'IBM_DB2Result' => 'includes/db/DatabaseIbm_db2.php',
        'LBFactory' => 'includes/db/LBFactory.php',
        'LBFactory_Fake' => 'includes/db/LBFactory.php',
        'LBFactory_Multi' => 'includes/db/LBFactory_Multi.php',
@@ -584,8 +580,8 @@ $wgAutoloadLocalClasses = array(
        'LSLockManager' => 'includes/filebackend/lockmanager/LSLockManager.php',
        'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
        'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
-       'MySqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
-       'PostgreSqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
+       'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+       'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
        'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
        'FileOp' => 'includes/filebackend/FileOp.php',
        'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
@@ -625,8 +621,6 @@ $wgAutoloadLocalClasses = array(
        'CliInstaller' => 'includes/installer/CliInstaller.php',
        'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
        'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
-       'Ibm_db2Installer' => 'includes/installer/Ibm_db2Installer.php',
-       'Ibm_db2Updater' => 'includes/installer/Ibm_db2Updater.php',
        'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
        'Installer' => 'includes/installer/Installer.php',
        'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
@@ -680,6 +674,8 @@ $wgAutoloadLocalClasses = array(
        'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
        'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob.php',
        'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
+       'AssembleUploadChunksJob' => 'includes/job/jobs/AssembleUploadChunksJob.php',
+       'PublishStashedFileJob' => 'includes/job/jobs/PublishStashedFileJob.php',
 
        # includes/json
        'FormatJson' => 'includes/json/FormatJson.php',
@@ -869,7 +865,6 @@ $wgAutoloadLocalClasses = array(
        'SearchEngine' => 'includes/search/SearchEngine.php',
        'SearchEngineDummy' => 'includes/search/SearchEngine.php',
        'SearchHighlighter' => 'includes/search/SearchEngine.php',
-       'SearchIBM_DB2' => 'includes/search/SearchIBM_DB2.php',
        'SearchMssql' => 'includes/search/SearchMssql.php',
        'SearchMySQL' => 'includes/search/SearchMySQL.php',
        'SearchNearMatchResultSet' => 'includes/search/SearchEngine.php',
@@ -1114,7 +1109,7 @@ class AutoLoader {
        /**
         * autoload - take a class name and attempt to load it
         *
-        * @param $className String: name of class we're looking for.
+        * @param string $className name of class we're looking for.
         * @return bool Returning false is important on failure as
         * it allows Zend to try and look in other registered autoloaders
         * as well.
index d7ed2f9..604b924 100644 (file)
@@ -54,7 +54,7 @@ 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 $event String key in $wgAutopromoteOnce (each one has groups/criteria)
+        * @param string $event key in $wgAutopromoteOnce (each one has groups/criteria)
         *
         * @return array Groups the user should be promoted to.
         *
@@ -140,8 +140,8 @@ class Autopromote {
                                return true;
                        }
                }
-               # If we got here, the array presumably does not contain other condi-
-               # tions; it's not recursive.  Pass it off to self::checkCondition.
+               // If we got here, the array presumably does not contain other conditions;
+               // it's not recursive.  Pass it off to self::checkCondition.
                if ( !is_array( $cond ) ) {
                        $cond = array( $cond );
                }
@@ -152,10 +152,9 @@ class Autopromote {
        /**
         * As recCheckCondition, but *not* recursive.  The only valid conditions
         * are those whose first element is APCOND_EMAILCONFIRMED/APCOND_EDITCOUNT/
-        * APCOND_AGE.  Other types will throw an exception if no extension evalu-
-        * ates them.
+        * APCOND_AGE.  Other types will throw an exception if no extension evaluates them.
         *
-        * @param $cond Array: A condition, which must not contain other conditions
+        * @param array $cond A condition, which must not contain other conditions
         * @param $user User The user to check the condition against
         * @throws MWException
         * @return bool Whether the condition is true for the user
index 1d1e2c0..7ee36ce 100644 (file)
@@ -106,7 +106,7 @@ class Block {
         * user ID. Tries the user ID first, and if that doesn't work, tries
         * the address.
         *
-        * @param $address String: IP address of user/anon
+        * @param string $address IP address of user/anon
         * @param $user Integer: user id of user
         * @return Block Object
         * @deprecated since 1.18
@@ -199,8 +199,8 @@ class Block {
        /**
         * Get a block from the DB, with either the given address or the given username
         *
-        * @param $address string The IP address of the user, or blank to skip IP blocks
-        * @param $user int The user ID, or zero for anonymous users
+        * @param string $address The IP address of the user, or blank to skip IP blocks
+        * @param int $user The user ID, or zero for anonymous users
         * @return Boolean: the user is blocked from editing
         * @deprecated since 1.18
         */
@@ -227,7 +227,7 @@ class Block {
        /**
         * Load a block from the database which affects the already-set $this->target:
         *     1) A block directly on the given user or IP
-        *     2) A rangeblock encompasing the given IP (smallest first)
+        *     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
         *     make any sense to use TYPE_AUTO / TYPE_ID here. Leave blank to skip IP lookups.
@@ -251,7 +251,7 @@ class Block {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
                        switch( $type ) {
                                case self::TYPE_USER:
-                                       # Slightly wierd, but who are we to argue?
+                                       # Slightly weird, but who are we to argue?
                                        $conds['ipb_address'][] = (string)$target;
                                        break;
 
@@ -307,7 +307,7 @@ class Block {
 
                                # This has the nice property that a /32 block is ranked equally with a
                                # single-IP block, which is exactly what it is...
-                               $score = self::TYPE_RANGE  - 1 + ( $size / 128 );
+                               $score = self::TYPE_RANGE - 1 + ( $size / 128 );
 
                        } else {
                                $score = $block->getType();
@@ -330,9 +330,9 @@ class Block {
        }
 
        /**
-        * Get a set of SQL conditions which will select rangeblocks encompasing a given range
-        * @param $start String Hexadecimal IP representation
-        * @param $end String Hexadecimal IP represenation, or null to use $start = $end
+        * 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
         */
        public static function getRangeCond( $start, $end = null ) {
@@ -488,7 +488,7 @@ class Block {
         * Update a block in the DB with new parameters.
         * The ID field needs to be loaded first.
         *
-        * @return Int number of affected rows, which should probably be 1 or something's
+        * @return Int number of affected rows, which should probably be 1 or something has
         *     gone slightly awry
         */
        public function update() {
@@ -572,7 +572,7 @@ class Block {
         * blocked by this Block. This will use the recentchanges table.
         *
         * @param Block $block
-        * @param Array &$blockIds
+        * @param array &$blockIds
         * @return Array: block IDs of retroactive autoblocks made
         */
        protected static function defaultRetroactiveAutoblock( Block $block, array &$blockIds ) {
@@ -611,7 +611,7 @@ class Block {
         * Checks whether a given IP is on the autoblock whitelist.
         * TODO: this probably belongs somewhere else, but not sure where...
         *
-        * @param $ip String: The IP to check
+        * @param string $ip The IP to check
         * @return Boolean
         */
        public static function isWhitelistedFromAutoblocks( $ip ) {
@@ -654,7 +654,7 @@ class Block {
        /**
         * Autoblocks the given IP, referring to this Block.
         *
-        * @param $autoblockIP String: the IP to autoblock.
+        * @param string $autoblockIP the IP to autoblock.
         * @return mixed: block ID if an autoblock was inserted, false if not.
         */
        public function doAutoblock( $autoblockIP ) {
@@ -945,7 +945,7 @@ class Block {
        /**
         * Encode expiry for DB
         *
-        * @param $expiry String: timestamp for expiry, or
+        * @param string $expiry timestamp for expiry, or
         * @param $db DatabaseBase object
         * @return String
         * @deprecated since 1.18; use $dbw->encodeExpiry() instead
@@ -958,8 +958,8 @@ class Block {
        /**
         * Decode expiry which has come from the DB
         *
-        * @param $expiry String: Database expiry format
-        * @param $timestampType Int Requested timestamp format
+        * @param string $expiry Database expiry format
+        * @param int $timestampType Requested timestamp format
         * @return String
         * @deprecated since 1.18; use $wgLang->formatExpiry() instead
         */
@@ -982,9 +982,9 @@ class Block {
        }
 
        /**
-        * Gets rid of uneeded numbers in quad-dotted/octet IP strings
+        * Gets rid of unneeded numbers in quad-dotted/octet IP strings
         * For example, 127.111.113.151/24 -> 127.111.113.0/24
-        * @param $range String: IP address to normalize
+        * @param string $range IP address to normalize
         * @return string
         * @deprecated since 1.18, call IP::sanitizeRange() directly
         */
@@ -1018,7 +1018,7 @@ class Block {
        /**
         * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
         * ("24 May 2034"), into an absolute timestamp we can put into the database.
-        * @param $expiry String: whatever was typed into the form
+        * @param string $expiry whatever was typed into the form
         * @return String: timestamp or "infinity" string for th DB implementation
         * @deprecated since 1.18 moved to SpecialBlock::parseExpiryInput()
         */
@@ -1042,7 +1042,7 @@ class Block {
         * @param $vagueTarget String|User|Int 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 $fromMaster Bool 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!
@@ -1193,7 +1193,7 @@ class Block {
 
        /**
         * Set the user who implemented (or will implement) this block
-        * @param $user User|string Local User object or username string for foriegn users
+        * @param $user User|string Local User object or username string for foreign users
         */
        public function setBlocker( $user ) {
                $this->blocker = $user;
index 53e44d7..868d6c4 100644 (file)
@@ -106,7 +106,7 @@ class Category {
        /**
         * Factory function.
         *
-        * @param $name Array: A category name (no "Category:" prefix).  It need
+        * @param array $name A category name (no "Category:" prefix).  It need
         *   not be normalized, with spaces replaced by underscores.
         * @return mixed Category, or false on a totally invalid name
         */
@@ -167,7 +167,7 @@ class Category {
 
                # NOTE: the row often results from a LEFT JOIN on categorylinks. This may result in
                #       all the cat_xxx fields being null, if the category page exists, but nothing
-               #       was ever added to the category. This case should be treated linke an empty
+               #       was ever added to the category. This case should be treated link an empty
                #       category, if possible.
 
                if ( $row->cat_title === null ) {
index 3e69dd4..43ab4db 100644 (file)
@@ -40,7 +40,7 @@ class CategoryPage extends Article {
 
        /**
         * Constructor from a page id
-        * @param $id Int article ID to load
+        * @param int $id article ID to load
         * @return CategoryPage|null
         */
        public static function newFromID( $id ) {
index 7678ffe..970adb5 100644 (file)
@@ -71,9 +71,9 @@ class CategoryViewer extends ContextSource {
         * @since 1.19 $context is a second, required parameter
         * @param $title Title
         * @param $context IContextSource
-        * @param $from Array An array with keys page, subcat,
+        * @param array $from An array with keys page, subcat,
         *        and file for offset of results of each section (since 1.17)
-        * @param $until Array An array with 3 keys for until 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
         */
        function __construct( $title, IContextSource $context, $from = array(), $until = array(), $query = array() ) {
@@ -249,7 +249,7 @@ class CategoryViewer extends ContextSource {
                $link = Linker::link( $title );
                if ( $isRedirect ) {
                        // This seems kind of pointless given 'mw-redirect' class,
-                       // but keeping for back-compatiability with user css.
+                       // but keeping for back-compatibility with user css.
                        $link = '<span class="redirect-in-category">' . $link . '</span>';
                }
                $this->articles[] = $link;
@@ -288,10 +288,10 @@ class CategoryViewer extends ContextSource {
                        # the collation in the database differs from the one
                        # set in $wgCategoryCollation, pagination might go totally haywire.
                        $extraConds = array( 'cl_type' => $type );
-                       if ( $this->from[$type] !== null ) {
+                       if ( isset( $this->from[$type] ) && $this->from[$type] !== null ) {
                                $extraConds[] = 'cl_sortkey >= '
                                        . $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
-                       } elseif ( $this->until[$type] !== null ) {
+                       } elseif ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
                                $extraConds[] = 'cl_sortkey < '
                                        . $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
                                $this->flip[$type] = true;
@@ -392,7 +392,7 @@ class CategoryViewer extends ContextSource {
                $r = '';
 
                # @todo FIXME: Here and in the other two sections: we don't need to bother
-               # with this rigamarole if the entire category contents fit on one page
+               # with this rigmarole if the entire category contents fit on one page
                # and have already been retrieved.  We can just use $rescnt in that
                # case and save a query and some logic.
                $dbcnt = $this->cat->getPageCount() - $this->cat->getSubcatCount()
@@ -441,13 +441,13 @@ class CategoryViewer extends ContextSource {
         * Get the paging links for a section (subcats/pages/files), to go at the top and bottom
         * of the output.
         *
-        * @param $type String: 'page', 'subcat', or 'file'
+        * @param string $type 'page', 'subcat', or 'file'
         * @return String: HTML output, possibly empty if there are no other pages
         */
        private function getSectionPagingLinks( $type ) {
-               if ( $this->until[$type] !== null ) {
+               if ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
                        return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
-               } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
+               } elseif ( $this->nextPage[$type] !== null || ( isset( $this->from[$type] ) && $this->from[$type] !== null ) ) {
                        return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
                } else {
                        return '';
@@ -573,9 +573,9 @@ class CategoryViewer extends ContextSource {
        /**
         * Create paging links, as a helper method to getSectionPagingLinks().
         *
-        * @param $first String The 'until' parameter for the generated URL
-        * @param $last String The 'from' parameter for the genererated URL
-        * @param $type String A prefix for parameters, 'page' or 'subcat' or
+        * @param string $first The 'until' parameter for the generated URL
+        * @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
         */
@@ -616,7 +616,7 @@ class CategoryViewer extends ContextSource {
         * corresponds to the correct segment of the category.
         *
         * @param Title $title: The title (usually $this->title)
-        * @param String $section: Which section
+        * @param string $section: Which section
         * @throws MWException
         * @return Title
         */
@@ -650,9 +650,9 @@ class CategoryViewer extends ContextSource {
         * category-subcat-count-limited, category-file-count,
         * category-file-count-limited.
         *
-        * @param $rescnt Int: The number of items returned by our database query.
-        * @param $dbcnt Int: The number of items according to the category table.
-        * @param $type String: 'subcat', 'article', or 'file'
+        * @param int $rescnt The number of items returned by our database query.
+        * @param int $dbcnt The number of items according to the category table.
+        * @param string $type 'subcat', 'article', or 'file'
         * @return String: A message giving the number of items, to output to HTML.
         */
        private function getCountMessage( $rescnt, $dbcnt, $type ) {
@@ -677,7 +677,9 @@ class CategoryViewer extends ContextSource {
                }
 
                $fromOrUntil = false;
-               if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
+               if ( ( isset( $this->from[$pagingType] ) && $this->from[$pagingType] !== null ) ||
+                       ( isset( $this->until[$pagingType] ) && $this->until[$pagingType] !== null )
+               ) {
                        $fromOrUntil = true;
                }
 
index cb67aa8..6ef224b 100644 (file)
@@ -66,7 +66,7 @@ class Categoryfinder {
         * Initializes the instance. Do this prior to calling run().
         * @param $article_ids Array of article IDs
         * @param $categories FIXME
-        * @param $mode String: FIXME, default 'AND'.
+        * @param string $mode FIXME, default 'AND'.
         * @todo FIXME: $categories/$mode
         */
        function seed( $article_ids, $categories, $mode = 'AND' ) {
@@ -111,9 +111,9 @@ class Categoryfinder {
 
        /**
         * This functions recurses through the parent representation, trying to match the conditions
-        * @param $id int The article/category to check
-        * @param $conds array The array of categories to match
-        * @param $path array used to check for recursion loops
+        * @param int $id The article/category to check
+        * @param array $conds The array of categories to match
+        * @param array $path used to check for recursion loops
         * @return bool Does this match the conditions?
         */
        function check( $id, &$conds, $path = array() ) {
@@ -124,7 +124,7 @@ class Categoryfinder {
 
                $path[] = $id;
 
-               # Shortcut (runtime paranoia): No contitions=all matched
+               # Shortcut (runtime paranoia): No conditions=all matched
                if ( count( $conds ) == 0 ) {
                        return true;
                }
index 1c4587a..a142c7c 100644 (file)
@@ -144,7 +144,6 @@ class CdbReader_DBA {
        }
 }
 
-
 /**
  * Writer class which uses the DBA extension
  */
index 1dd9b59..3adf58f 100644 (file)
@@ -25,8 +25,8 @@ class ChangeTags {
        /**
         * Creates HTML for the given tags
         *
-        * @param $tags String: Comma-separated list of tags
-        * @param $page String: A label for the type of action which is being displayed,
+        * @param string $tags Comma-separated list of tags
+        * @param string $page A label for the type of action which is being displayed,
         *                     for example: 'history', 'contributions' or 'newpages'
         *
         * @return Array with two items: (html, classes)
@@ -62,7 +62,7 @@ class ChangeTags {
        /**
         * Get a short description for a tag
         *
-        * @param $tag String: tag
+        * @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
@@ -75,11 +75,11 @@ class ChangeTags {
        /**
         * Add tags to a change given its rc_id, rev_id and/or log_id
         *
-        * @param $tags String|Array: Tags to add to the change
+        * @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 $params String: params to put in the ct_params field of tabel 'change_tag'
+        * @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
@@ -160,11 +160,11 @@ class ChangeTags {
         * Handles selecting tags, and filtering.
         * Needs $tables to be set up properly, so we can figure out which join conditions to use.
         *
-        * @param $tables String|Array: Tabel names, see DatabaseBase::select
-        * @param $fields String|Array: Fields used in query, see DatabaseBase::select
-        * @param $conds String|Array: conditions used in query, see DatabaseBase::select
+        * @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 $options Array: options, see Database::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
@@ -211,7 +211,7 @@ class ChangeTags {
        /**
         * Build a text box to select a change tag
         *
-        * @param $selected String: tag to select by default
+        * @param string $selected tag to select by default
         * @param $fullForm Boolean:
         *        - if false, then it returns an array of (label, form).
         *        - if true, it returns an entire form around the selector.
index ae30272..476de5b 100644 (file)
@@ -31,8 +31,8 @@ class ChangesFeed {
        /**
         * Constructor
         *
-        * @param $format String: feed's format (either 'rss' or 'atom')
-        * @param $type String: 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,9 +42,9 @@ class ChangesFeed {
        /**
         * Get a ChannelFeed subclass object to use
         *
-        * @param $title String: feed's title
-        * @param $description String: feed's description
-        * @param $url String: url of origin page
+        * @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
         */
        public function getFeedObject( $title, $description, $url ) {
@@ -110,9 +110,9 @@ class ChangesFeed {
        /**
         * Save to feed result to $messageMemc
         *
-        * @param $feed String: feed's content
-        * @param $timekey String: memcached key of the last modification
-        * @param $key String: 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;
@@ -125,8 +125,8 @@ class ChangesFeed {
         * Try to load the feed result from $messageMemc
         *
         * @param $lastmod Integer: timestamp of the last item in the recentchanges table
-        * @param $timekey String: memcached key of the last modification
-        * @param $key String: memcached key of the content
+        * @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 ) {
index a9b9c31..8461001 100644 (file)
@@ -60,7 +60,7 @@ class ChangesList extends ContextSource {
        protected $message;
 
        /**
-        * Changeslist contructor
+        * Changeslist constructor
         *
         * @param $obj Skin or IContextSource
         */
@@ -80,7 +80,7 @@ class ChangesList extends ContextSource {
         * This first argument used to be an User object.
         *
         * @deprecated in 1.18; use newFromContext() instead
-        * @param $unused string|User Unused
+        * @param string|User $unused Unused
         * @return ChangesList|EnhancedChangesList|OldChangesList derivative
         */
        public static function newFromUser( $unused ) {
@@ -130,8 +130,8 @@ class ChangesList extends ContextSource {
 
        /**
         * Returns the appropriate flags for new page, minor change and patrolling
-        * @param $flags Array Associative array of 'flag' => Bool
-        * @param $nothing String to use for empty space
+        * @param array $flags Associative array of 'flag' => Bool
+        * @param string $nothing to use for empty space
         * @return String
         */
        protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
@@ -150,7 +150,7 @@ class ChangesList extends ContextSource {
         * unpatrolled edit.  By default in English it will contain "N", "m", "b",
         * "!" respectively, plus it will have an appropriate title and class.
         *
-        * @param $flag String: 'newpage', 'unpatrolled', 'minor', or 'bot'
+        * @param string $flag 'newpage', 'unpatrolled', 'minor', or 'bot'
         * @return String: Raw HTML
         */
        public static function flag( $flag ) {
@@ -287,7 +287,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s string HTML to update
+        * @param string $s HTML to update
         * @param $rc_timestamp mixed
         */
        public function insertDateHeader( &$s, $rc_timestamp ) {
@@ -304,7 +304,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s string HTML to update
+        * @param string $s HTML to update
         * @param $title Title
         * @param $logtype string
         */
@@ -315,7 +315,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s string HTML to update
+        * @param string $s HTML to update
         * @param $rc RecentChange
         * @param $unpatrolled
         */
@@ -358,7 +358,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s string HTML to update
+        * @param string $s HTML to update
         * @param $rc RecentChange
         * @param $unpatrolled
         * @param $watched
@@ -407,7 +407,7 @@ class ChangesList extends ContextSource {
        /**
         * Insert time timestamp string from $rc into $s
         *
-        * @param $s string HTML to update
+        * @param string $s HTML to update
         * @param $rc RecentChange
         */
        public function insertTimestamp( &$s, $rc ) {
@@ -563,7 +563,7 @@ class ChangesList extends ContextSource {
        }
 
        public function insertExtra( &$s, &$rc, &$classes ) {
-               ## Empty, used for subclassers to add anything special.
+               // Empty, used for subclasses to add anything special.
        }
 
        protected function showAsUnpatrolled( RecentChange $rc ) {
@@ -579,7 +579,6 @@ class ChangesList extends ContextSource {
        }
 }
 
-
 /**
  * Generate a list of changes using the good old system (no javascript)
  */
@@ -588,8 +587,8 @@ class OldChangesList extends ChangesList {
         * Format a line using the old system (aka without any javascript).
         *
         * @param $rc RecentChange, passed by reference
-        * @param $watched Bool (default false)
-        * @param $linenumber Int (default null)
+        * @param bool $watched (default false)
+        * @param int $linenumber (default null)
         *
         * @return string|bool
         */
@@ -692,7 +691,6 @@ class OldChangesList extends ChangesList {
        }
 }
 
-
 /**
  * Generate a list of changes using an Enhanced system (uses javascript).
  */
@@ -1139,9 +1137,9 @@ class EnhancedChangesList extends ChangesList {
 
        /**
         * Generate HTML for an arrow or placeholder graphic
-        * @param $dir String: one of '', 'd', 'l', 'r'
-        * @param $alt String: text
-        * @param $title String: text
+        * @param string $dir one of '', 'd', 'l', 'r'
+        * @param string $alt text
+        * @param string $title text
         * @return String: HTML "<img>" tag
         */
        protected function arrow( $dir, $alt = '', $title = '' ) {
index f57a14a..a0e1d2d 100644 (file)
@@ -43,8 +43,6 @@ abstract class Collation {
                switch( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
-                       case 'uppercase-sv':
-                               return new UppercaseSvCollation;
                        case 'identity':
                                return new IdentityCollation;
                        case 'uca-default':
@@ -127,22 +125,6 @@ class UppercaseCollation extends Collation {
        }
 }
 
-/**
- * Like UppercaseCollation but swaps Ä and Æ.
- *
- * This provides an ordering suitable for Swedish.
- * @author Lejonel
- */
-class UppercaseSvCollation extends UppercaseCollation {
-
-       /* Unicode code point order is ÄÅÆÖ, Swedish order is ÅÄÖ and Æ is often sorted as Ä.
-        * Replacing Ä for Æ should give a better collation. */
-       function getSortKey( $string ) {
-               $uppercase = $this->lang->uc( $string );
-               return strtr( $uppercase, array( 'Ä' => 'Æ', 'Æ' => 'Ä' ) );
-       }
-}
-
 /**
  * Collation class that's essentially a no-op.
  *
@@ -166,8 +148,9 @@ class IdentityCollation extends Collation {
        }
 }
 
-
 class IcuCollation extends Collation {
+       const FIRST_LETTER_VERSION = 1;
+
        var $primaryCollator, $mainCollator, $locale;
        var $firstLetterData;
 
@@ -199,35 +182,53 @@ class IcuCollation extends Collation {
        );
 
        /**
-        * Additional characters (or character groups) to be considered first-letters
+        * Additional characters (or character groups) to be considered separate
+        * letters for given languages, or to be removed from the list of such
+        * letters (denoted by keys starting with '-').
+        *
+        * These are additions to (or subtractions from) the data stored in the
+        * first-letters-root.ser file (which among others includes full basic latin,
+        * cyrillic and greek alphabets).
         *
-        * Generated based on the primary level of Unicode collation tailorings
-        * available at http://developer.mimer.com/charts/tailorings.htm .
+        * "Separate letter" is a letter that would have a separate heading/section
+        * for it in a dictionary or a phone book in this language. This data isn't
+        * used for sorting (the ICU library handles that), only for deciding which
+        * characters (or character groups) to use as headings.
+        *
+        * Initially generated based on the primary level of Unicode collation
+        * tailorings available at http://developer.mimer.com/charts/tailorings.htm ,
+        * later modified.
         *
         * 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(
                // Verified by native speakers
-               'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
+               'be' => array( "Ё" ),
+               'be-tarask' => array( "Ё" ),
+               'en' => array(),
                'fi' => array( "Å", "Ä", "Ö" ),
+               'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
+               'it' => array(),
+               'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
+               'pt' => array(),
+               'ru' => array(),
+               'uk' => array( "Ґ", "Ь" ),
                // Not verified, but likely correct
                'af' => array(),
-               'ast' => array( "CH", "LL", "Ñ" ),
+               'ast' => array( "Ch", "Ll", "Ñ" ),
                'az' => array( "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ),
-               'be' => array( "Ё" ),
                'bg' => array(),
-               'br' => array( "CH", "C'H" ),
-               'bs' => array( "Ä\8c", "Ä\86", "DŽ", "Ä\90", "LJ", "NJ", "Š", "Ž" ),
+               'br' => array( "Ch", "C'h" ),
+               'bs' => array( "Ä\8c", "Ä\86", "Dž", "Ä\90", "Lj", "Nj", "Š", "Ž" ),
                'ca' => array(),
                'co' => array(),
-               'cs' => array( "Č", "CH", "Ř", "Š", "Ž" ),
-               'cy' => array( "CH", "DD", "FF", "NG", "LL", "PH", "RH", "TH" ),
+               'cs' => array( "Č", "Ch", "Ř", "Š", "Ž" ),
+               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'da' => array( "Æ", "Ø", "Å" ),
                'de' => array(),
-               'dsb' => array( "Ä\8c", "Ä\86", "DŹ", "Ä\9a", "CH", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
+               'dsb' => array( "Ä\8c", "Ä\86", "Dź", "Ä\9a", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
                'el' => array(),
-               'en' => array(),
                'eo' => array( "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ),
                'es' => array( "Ñ" ),
                'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
@@ -238,12 +239,10 @@ class IcuCollation extends Collation {
                'fy' => array(),
                'ga' => array(),
                'gd' => array(),
-               'gl' => array( "CH", "LL", "Ñ" ),
-               'hr' => array( "Č", "Ć", "DŽ", "Đ", "LJ", "NJ", "Š", "Ž" ),
-               'hsb' => array( "Č", "DŹ", "Ě", "CH", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
-               'hu' => array( "CS", "DZ", "DZS", "GY", "LY", "NY", "Ö", "SZ", "TY", "Ü", "ZS" ),
+               'gl' => array( "Ch", "Ll", "Ñ" ),
+               'hr' => array( "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ),
+               'hsb' => array( "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
                'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
-               'it' => array(),
                'kk' => array( "Ү", "І" ),
                'kl' => array( "Æ", "Ø", "Å" ),
                'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
@@ -254,28 +253,26 @@ class IcuCollation extends Collation {
                'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'mk' => array(),
                'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
-               'mt' => array( "Ä\8a", "Ä ", "GĦ", "Ħ", "Ż" ),
+               'mt' => array( "Ä\8a", "Ä ", "Għ", "Ħ", "Ż" ),
                'nl' => array(),
                'no' => array( "Æ", "Ø", "Å" ),
                'oc' => array(),
-               'pt' => array(),
                'rm' => array(),
                'ro' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
-               'ru' => array(),
                'rup' => array( "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ),
                'sco' => array(),
-               'sk' => array( "Ä", "Č", "CH", "Ô", "Š", "Ž" ),
+               'sk' => array( "Ä", "Č", "Ch", "Ô", "Š", "Ž" ),
                'sl' => array( "Č", "Š", "Ž" ),
                'smn' => array( "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ),
-               'sq' => array( "Ç", "DH", "Ë", "GJ", "LL", "NJ", "RR", "SH", "TH", "XH", "ZH" ),
+               'sq' => array( "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ),
                'sr' => array(),
                'sv' => array( "Å", "Ä", "Ö" ),
+               '-sv' => array( "Þ" ), // sorted as "th" in Swedish, causing unexpected output - bug 45446
                'tk' => array( "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ),
-               'tl' => array( "Ñ", "NG" ), /* 'fil' in the data source */
+               'tl' => array( "Ñ", "Ng" ),
                'tr' => array( "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ),
                'tt' => array( "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ),
-               'uk' => array( "Ґ", "Ь" ),
-               'uz' => array( "CH", "G'", "NG", "O'", "SH" ),
+               'uz' => array( "Ch", "G'", "Ng", "O'", "Sh" ),
                'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
        );
 
@@ -352,7 +349,9 @@ class IcuCollation extends Collation {
                $cacheKey = wfMemcKey( 'first-letters', $this->locale );
                $cacheEntry = $cache->get( $cacheKey );
 
-               if ( $cacheEntry ) {
+               if ( $cacheEntry && isset( $cacheEntry['version'] )
+                       && $cacheEntry['version'] == self::FIRST_LETTER_VERSION ) 
+               {
                        $this->firstLetterData = $cacheEntry;
                        return $this->firstLetterData;
                }
@@ -361,7 +360,12 @@ class IcuCollation extends Collation {
 
                if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
                        $letters = wfGetPrecompiledData( "first-letters-root.ser" );
+                       // Append additional characters
                        $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
+                       // Remove unnecessary ones, if any
+                       if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
+                               $letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+                       }
                } else {
                        $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
                        if ( $letters === false ) {
@@ -394,7 +398,8 @@ class IcuCollation extends Collation {
                ksort( $letterMap, SORT_STRING );
                $data = array(
                        'chars' => array_values( $letterMap ),
-                       'keys' => array_keys( $letterMap )
+                       'keys' => array_keys( $letterMap ),
+                       'version' => self::FIRST_LETTER_VERSION,
                );
 
                // Reduce memory usage before caching
@@ -431,13 +436,13 @@ class IcuCollation extends Collation {
         * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
-        * @param $valueCallback array A function to call to get the value with
+        * @param array $valueCallback A function to call to get the value with
         *     a given array index.
-        * @param $valueCount int The number of items accessible via $valueCallback,
+        * @param int $valueCount The number of items accessible via $valueCallback,
         *     indexed from 0 to $valueCount - 1
-        * @param $comparisonCallback array A callback to compare two values, returning
+        * @param array $comparisonCallback A callback to compare two values, returning
         *     -1, 0 or 1 in the style of strcmp().
-        * @param $target string The target value to find.
+        * @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.
index 699e83a..1d9ca92 100644 (file)
@@ -66,7 +66,6 @@ class ConfEditor {
         */
        var $stateStack;
 
-
        /**
         * The path stack is a stack of associative arrays with the following elements:
         *    name              The name of top level of the path
@@ -128,7 +127,7 @@ class ConfEditor {
 
        /**
         * Edit the text. Returns the edited text.
-        * @param $ops Array of operations.
+        * @param array $ops of operations.
         *
         * Operations are given as an associative array, with members:
         *    type:     One of delete, set, append or insert (required)
@@ -307,7 +306,7 @@ class ConfEditor {
         * setVar( $arr, 'foo/bar', 'baz', 3 ); will set
         * $arr['foo']['bar']['baz'] = 3;
         * @param $array array
-        * @param $path string slash-delimited path
+        * @param string $path slash-delimited path
         * @param $key mixed Key
         * @param $value mixed Value
         */
index a6eb79a..27a8507 100644 (file)
@@ -43,8 +43,8 @@ class Cookie {
         * cookies. Used internally after a request to parse the
         * Set-Cookie headers.
         *
-        * @param $value String: the value of the cookie
-        * @param $attr Array: 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
@@ -84,8 +84,8 @@ class Cookie {
         * @todo fixme fails to detect 3-letter top-level domains
         * @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 $domain String: the domain to validate
-        * @param $originDomain String: (optional) the domain the cookie originates from
+        * @param string $domain the domain to validate
+        * @param string $originDomain (optional) the domain the cookie originates from
         * @return Boolean
         */
        public static function validateCookieDomain( $domain, $originDomain = null ) {
@@ -142,8 +142,8 @@ class Cookie {
        /**
         * Serialize the cookie jar into a format useful for HTTP Request headers.
         *
-        * @param $path String: the path that will be used. Required.
-        * @param $domain String: the domain that will be used. Required.
+        * @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 ) {
@@ -232,7 +232,7 @@ class CookieJar {
         * Parse the content of an Set-Cookie HTTP Response header.
         *
         * @param $cookie String
-        * @param $domain String: cookie's domain
+        * @param string $domain cookie's domain
         * @return null
         */
        public function parseCookieResponseHeader ( $cookie, $domain ) {
index 4255d56..d0305d8 100644 (file)
@@ -79,7 +79,7 @@ class MWCryptRand {
                // Include some information about the filesystem's current state in the random state
                $files = array();
 
-               // We know this file is here so grab some info about ourself
+               // We know this file is here so grab some info about ourselves
                $files[] = __FILE__;
 
                // We must also have a parent folder, and with the usual file structure, a grandparent
@@ -148,7 +148,7 @@ class MWCryptRand {
        /**
         * Randomly hash data while mixing in clock drift data for randomness
         *
-        * @param $data string The data to randomly hash.
+        * @param string $data The data to randomly hash.
         * @return String The hashed bytes
         * @author Tim Starling
         */
@@ -162,7 +162,7 @@ class MWCryptRand {
                $buffer = str_repeat( ' ', $bufLength );
                $bufPos = 0;
 
-               // Iterate for $duration seconds or at least $minIerations number of iterations
+               // Iterate for $duration seconds or at least $minIterations number of iterations
                $iterations = 0;
                $startTime = microtime( true );
                $currentTime = $startTime;
@@ -468,8 +468,8 @@ class MWCryptRand {
         * You can use MWCryptRand::wasStrong() if you wish to know if the source used
         * was cryptographically strong.
         *
-        * @param $bytes int the number of bytes of random data to generate
-        * @param $forceStrong bool Pass true if you want generate to prefer cryptographically
+        * @param int $bytes the number of bytes of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
         *                          strong sources of entropy even if reading from them may steal
         *                          more entropy from the system than optimal.
         * @return String Raw binary random data
@@ -484,8 +484,8 @@ class MWCryptRand {
         * You can use MWCryptRand::wasStrong() if you wish to know if the source used
         * was cryptographically strong.
         *
-        * @param $chars int the number of hex chars of random data to generate
-        * @param $forceStrong bool Pass true if you want generate to prefer cryptographically
+        * @param int $chars the number of hex chars of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
         *                          strong sources of entropy even if reading from them may steal
         *                          more entropy from the system than optimal.
         * @return String Hexadecimal random data
index 04029db..114ae14 100644 (file)
@@ -67,14 +67,14 @@ abstract class DataUpdate implements DeferrableUpdate {
         *
         * This methods supports transactions logic by first calling beginTransaction()
         * on all updates in the array, then calling doUpdate() on each, and, if all goes well,
-        * then calling commitTransaction() on each update. If an error occurrs,
-        * rollbackTransaction() will be called on any update object that had beginTranscation()
+        * then calling commitTransaction() on each update. If an error occurs,
+        * rollbackTransaction() will be called on any update object that had beginTransaction()
         * called but not yet commitTransaction().
         *
         * This allows for limited transactional logic across multiple backends for storing
         * secondary data.
         *
-        * @param $updates array a list of DataUpdate instances
+        * @param array $updates a list of DataUpdate instances
         * @throws Exception|null
         */
        public static function runUpdates( $updates ) {
index e33c6c0..cefd882 100644 (file)
@@ -55,13 +55,19 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 /**
  * wgConf hold the site configuration.
  * Not used for much in a default install.
+ * @since 1.5
  */
 $wgConf = new SiteConfiguration;
 
-/** MediaWiki version number */
+/**
+ * MediaWiki version number
+ * @since 1.2
+ */
 $wgVersion = '1.21alpha';
 
-/** Name of the site. It must be changed in LocalSettings.php */
+/**
+ * Name of the site. It must be changed in LocalSettings.php
+ */
 $wgSitename = 'MediaWiki';
 
 /**
@@ -87,6 +93,7 @@ $wgServer = WebRequest::detectServer();
  * Must be fully qualified, even if $wgServer is protocol-relative.
  *
  * Defaults to $wgServer, expanded to a fully qualified http:// URL if needed.
+ * @since 1.18
  */
 $wgCanonicalServer = false;
 
@@ -121,6 +128,7 @@ $wgScriptPath = '/wiki';
  * The default $wgArticlePath will be set based on this value at runtime, but if
  * you have customized it, having this incorrectly set to true can cause
  * redirect loops when "pretty URLs" are used.
+ * @since 1.2.1
  */
 $wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
        ( strpos( PHP_SAPI, 'apache2filter' ) === false ) &&
@@ -132,10 +140,10 @@ $wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
  *
  * Some hosting providers use PHP 4 for *.php files, and PHP 5 for *.php5. This
  * variable is provided to support those providers.
+ * @since 1.11
  */
 $wgScriptExtension = '.php';
 
-
 /**@}*/
 
 /************************************************************************//**
@@ -175,12 +183,14 @@ $wgRedirectScript = false;
  * The URL path to load.php.
  *
  * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ * @since 1.17
  */
 $wgLoadScript = false;
 
 /**
  * The URL path of the skins directory.
  * Defaults to "{$wgScriptPath}/skins".
+ * @since 1.3
  */
 $wgStylePath = false;
 $wgStyleSheetPath = &$wgStylePath;
@@ -188,6 +198,7 @@ $wgStyleSheetPath = &$wgStylePath;
 /**
  * The URL path of the skins directory. Should not point to an external domain.
  * Defaults to "{$wgScriptPath}/skins".
+ * @since 1.17
  */
 $wgLocalStylePath = false;
 
@@ -201,6 +212,7 @@ $wgExtensionAssetsPath = false;
 /**
  * Filesystem stylesheets directory.
  * Defaults to "{$IP}/skins".
+ * @since 1.3
  */
 $wgStyleDirectory = false;
 
@@ -238,12 +250,14 @@ $wgLogo = false;
 
 /**
  * The URL path of the shortcut icon.
+ * @since 1.6
  */
 $wgFavicon = '/favicon.ico';
 
 /**
  * The URL path of the icon for iPhone and iPod Touch web app bookmarks.
  * Defaults to no icon.
+ * @since 1.12
  */
 $wgAppleTouchIcon = false;
 
@@ -267,6 +281,7 @@ $wgTmpDirectory = false;
 /**
  * If set, this URL is added to the start of $wgUploadPath to form a complete
  * upload URL.
+ * @since 1.4
  */
 $wgUploadBaseUrl = '';
 
@@ -275,6 +290,7 @@ $wgUploadBaseUrl = '';
  * Full thumbnail URL will be like $wgUploadStashScalerBaseUrl/e/e6/Foo.jpg/123px-Foo.jpg
  * where 'e6' are the first two characters of the MD5 hash of the file name.
  * If $wgUploadStashScalerBaseUrl is set to false, thumbs are rendered locally as needed.
+ * @since 1.17
  */
 $wgUploadStashScalerBaseUrl = false;
 
@@ -290,6 +306,7 @@ $wgUploadStashScalerBaseUrl = false;
  *
  * There must be an appropriate script or rewrite rule in place to handle these
  * URLs.
+ * @since 1.5
  */
 $wgActionPaths = array();
 
@@ -311,6 +328,13 @@ $wgUploadStashMaxAge = 6 * 3600; // 6 hours
 /** Allows to move images and other media files */
 $wgAllowImageMoving = true;
 
+/**
+ * Enable deferred upload tasks that use the job queue.
+ * Only enable this if job runners are set up for both the
+ * 'AssembleUploadChunks' and 'PublishStashedFile' job types.
+ */
+$wgEnableAsyncUploads = false;
+
 /**
  * These are additional characters that should be replaced with '-' in filenames
  */
@@ -352,7 +376,7 @@ $wgImgAuthPublicTest = true;
  *                      FSRepo is also supported for backwards compatibility.
  *
  *   - name             A unique name for the repository (but $wgLocalFileRepo should be 'local').
- *                      The name should consist of alpha-numberic characters.
+ *                      The name should consist of alpha-numeric characters.
  *   - backend          A file backend name (see $wgFileBackends).
  *
  * For most core repos:
@@ -406,7 +430,7 @@ $wgImgAuthPublicTest = true;
  *
  * ForeignDBRepo:
  *   - dbType, dbServer, dbUser, dbPassword, dbName, dbFlags
- *                      equivalent to the corresponding member of $wgDBservers
+ *                       equivalent to the corresponding member of $wgDBservers
  *   - tablePrefix       Table prefix, the foreign wiki's $wgDBprefix
  *   - hasSharedCache    True if the wiki's shared cache is accessible via the local $wgMemc
  *
@@ -417,7 +441,7 @@ $wgImgAuthPublicTest = true;
  * If you leave $wgLocalFileRepo set to false, Setup will fill in appropriate values.
  * Otherwise, set $wgLocalFileRepo to a repository structure as described above.
  * If you set $wgUseInstantCommons to true, it will add an entry for Commons.
- * If you set $wgForeignFileRepos to an array of repostory structures, those will
+ * If you set $wgForeignFileRepos to an array of repository structures, those will
  * be searched after the local file repo.
  * Otherwise, you will only have access to local media files.
  *
@@ -826,6 +850,13 @@ $wgImageMagickTempDir = false;
  */
 $wgCustomConvertCommand = false;
 
+/** used for lossless jpeg rotation
+ *
+ * @since 1.21
+ * **/
+$wgJpegTran = '/usr/bin/jpegtran';
+
+
 /**
  * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
  * image formats.
@@ -960,7 +991,7 @@ $wgUseImageResize = true;
 $wgEnableAutoRotation = null;
 
 /**
- * Internal name of virus scanner. This servers as a key to the
+ * Internal name of virus scanner. This serves as a key to the
  * $wgAntivirusSetup array. Set this to NULL to disable virus scanning. If not
  * null, every file uploaded will be scanned for viruses.
  */
@@ -978,7 +1009,7 @@ $wgAntivirus = null;
  * "command" is the full command to call the virus scanner - %f will be
  * replaced with the name of the file to scan. If not present, the filename
  * will be appended to the command. Note that this must be overwritten if the
- * scanner is not in the system path; in that case, plase set
+ * scanner is not in the system path; in that case, please set
  * $wgAntivirusSetup[$wgAntivirus]['command'] to the desired command with full
  * path.
  *
@@ -988,8 +1019,8 @@ $wgAntivirus = null;
  *     the scan to be failed. This will pass the file if $wgAntivirusRequired
  *     is not set.
  *   - An exit code mapped to AV_SCAN_ABORTED causes the function to consider
- *     the file to have an usupported format, which is probably imune to
- *     virusses. This causes the file to pass.
+ *     the file to have an unsupported format, which is probably immune to
+ *     viruses. This causes the file to pass.
  *   - An exit code mapped to AV_NO_VIRUS will cause the file to pass, meaning
  *     no virus was found.
  *   - All other codes (like AV_VIRUS_FOUND) will cause the function to report
@@ -1008,14 +1039,13 @@ $wgAntivirusSetup = array(
                'codemap' => array(
                        "0" => AV_NO_VIRUS, # no virus
                        "1" => AV_VIRUS_FOUND, # virus found
-                       "52" => AV_SCAN_ABORTED, # unsupported file format (probably imune)
+                       "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
                        "*" => AV_SCAN_FAILED, # else scan failed
                ),
                'messagepattern' => '/.*?:(.*)/sim',
        ),
 );
 
-
 /** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
 $wgAntivirusRequired = true;
 
@@ -1238,7 +1268,7 @@ $wgEnableUserEmail = true;
  * instead of From. ($wgEmergencyContact will be used as From.)
  *
  * Some mailers (eg sSMTP) set the SMTP envelope sender to the From value,
- * which can cause problems with SPF validation and leak recipient addressses
+ * which can cause problems with SPF validation and leak recipient addresses
  * when bounces are sent to the sender.
  */
 $wgUserEmailUseReplyTo = false;
@@ -1437,7 +1467,7 @@ $wgAllDBsAreLocalhost = false;
  * preferences shared (preferences were stored in the user table prior to 1.16)
  *
  * $wgSharedTables may be customized with a list of tables to share in the shared
- * datbase. However it is advised to limit what tables you do share as many of
+ * database. However it is advised to limit what tables you do share as many of
  * MediaWiki's tables may have side effects if you try to share them.
  *
  * $wgSharedPrefix is the table prefix for the shared database. It defaults to
@@ -1525,7 +1555,7 @@ $wgDBerrorLog = false;
  * Timezone to use in the error log.
  * Defaults to the wiki timezone ($wgLocaltimezone).
  *
- * A list of useable timezones can found at:
+ * A list of usable timezones can found at:
  * http://php.net/manual/en/timezones.php
  *
  * @par Examples:
@@ -1592,7 +1622,6 @@ $wgOldChangeTagsIndex = false;
 
 /**@}*/ # End of DB settings }
 
-
 /************************************************************************//**
  * @name   Text storage
  * @{
@@ -1830,7 +1859,7 @@ $wgSessionsInMemcached = false;
 
 /**
  * Store sessions in an object cache, configured by $wgSessionCacheType. This
- * can be useful to improve performance, or to avoid the locking behaviour of
+ * can be useful to improve performance, or to avoid the locking behavior of
  * PHP's default session handler, which tends to prevent multiple requests for
  * the same user from acting concurrently.
  */
@@ -2200,14 +2229,14 @@ $wgUsePrivateIPs = false;
  * change it in their preferences.
  *
  * This also defines the language of pages in the wiki. The content is wrapped
- * in a html element with lang=XX attribute. This behaviour can be overriden
+ * in a html element with lang=XX attribute. This behavior can be overridden
  * via hooks, see Title::getPageLanguage.
  */
 $wgLanguageCode = 'en';
 
 /**
  * Language cache size, or really how many languages can we handle
- * simultanously without degrading to crawl speed.
+ * simultaneously without degrading to crawl speed.
  */
 $wgLangObjCacheSize = 10;
 
@@ -2233,7 +2262,7 @@ $wgExtraLanguageNames = array();
 
 /**
  * List of language codes that don't correspond to an actual language.
- * These codes are mostly leftoffs from renames, or other legacy things.
+ * These codes are mostly left-offs from renames, or other legacy things.
  * This array makes them not appear as a selectable language on the installer,
  * and excludes them when running the transstat.php script.
  */
@@ -2357,9 +2386,6 @@ $wgBrowserBlackList = array(
  * requires that the cur table be kept around for those revisions
  * to remain viewable.
  *
- * maintenance/migrateCurStubs.php can be used to complete the
- * migration in the background once the wiki is back online.
- *
  * This option affects the updaters *only*. Any present cur stub
  * revisions will be readable at runtime regardless of this setting.
  */
@@ -2473,7 +2499,7 @@ $wgForceUIMsgAsContentMsg = array();
  * Timezones can be translated by editing MediaWiki messages of type
  * timezone-nameinlowercase like timezone-utc.
  *
- * A list of useable timezones can found at:
+ * A list of usable timezones can found at:
  * http://php.net/manual/en/timezones.php
  *
  * @par Examples:
@@ -2492,7 +2518,7 @@ $wgLocaltimezone = null;
  * for anonymous users and new user accounts.
  *
  * This setting is used for most date/time displays in the software, and is
- * overrideable in user preferences. It is *not* used for signature timestamps.
+ * overridable in user preferences. It is *not* used for signature timestamps.
  *
  * By default, this will be set to match $wgLocaltimezone.
  */
@@ -2591,7 +2617,7 @@ $wgWellFormedXml = true;
  * @par Example:
  * @code
  * $wgXhtmlNamespaces['svg'] = 'http://www.w3.org/2000/svg';
- * @endCode
+ * @endcode
  * Normally we wouldn't have to define this in the root "<html>"
  * element, but IE needs it there in some circumstances.
  *
@@ -2776,7 +2802,7 @@ $wgExperimentalHtmlIds = false;
  * for the icon, the following keys are used:
  *  - src: An absolute url to the image to use for the icon, this is recommended
  *        but not required, however some skins will ignore icons without an image
- * - url: The url to use in the a element arround the text or icon, if not set an a element will not be outputted
+ * - url: The url to use in the a element around the text or icon, if not set an a element will not be outputted
  * - alt: This is the text form of the icon, it will be displayed without an image in
  *        skins like Modern or if src is not set, and will otherwise be used as
  *        the alt="" for the image. This key is required.
@@ -2846,10 +2872,9 @@ $wgBetterDirectionality = true;
  */
 $wgSend404Code = true;
 
-
 /**
  * The $wgShowRollbackEditCount variable is used to show how many edits will be
- * rollback. The numeric value of the varible are the limit up to are counted.
+ * rollback. The numeric value of the variable are the limit up to are counted.
  * If the value is false or 0, the edits are not counted. Disabling this will
  * furthermore prevent MediaWiki from hiding some useless rollback links.
  *
@@ -3051,7 +3076,6 @@ $wgResourceLoaderExperimentalAsyncLoading = false;
 
 /** @} */ # End of resource loader settings }
 
-
 /*************************************************************************//**
  * @name   Page title and interwiki link settings
  * @{
@@ -3298,7 +3322,7 @@ $wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
  *  class             The class name
  *
  *  preprocessorClass The preprocessor class. Two classes are currently available:
- *                    Preprocessor_Hash, which uses plain PHP arrays for tempoarary
+ *                    Preprocessor_Hash, which uses plain PHP arrays for temporary
  *                    storage, and Preprocessor_DOM, which uses the DOM module for
  *                    temporary storage. Preprocessor_DOM generally uses less memory;
  *                    the speed of the two is roughly the same.
@@ -3338,7 +3362,6 @@ $wgMaxPPNodeCount = 1000000;
  */
 $wgMaxGeneratedPPNodeCount = 1000000;
 
-
 /**
  * Maximum recursion depth for templates within templates.
  * The current parser adds two levels to the PHP call stack for each template,
@@ -3920,7 +3943,7 @@ $wgGroupPermissions['*']['edit'] = true;
 $wgGroupPermissions['*']['createpage'] = true;
 $wgGroupPermissions['*']['createtalk'] = true;
 $wgGroupPermissions['*']['writeapi'] = true;
-//$wgGroupPermissions['*']['patrolmarks']      = false; // let anons see what was patrolled
+#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
 
 // Implicit group for all logged-in accounts
 $wgGroupPermissions['user']['move'] = true;
@@ -3951,7 +3974,7 @@ $wgGroupPermissions['bot']['autopatrol'] = true;
 $wgGroupPermissions['bot']['suppressredirect'] = true;
 $wgGroupPermissions['bot']['apihighlimits'] = true;
 $wgGroupPermissions['bot']['writeapi'] = true;
-#$wgGroupPermissions['bot']['editprotected']    = true; // can edit all protected pages without cascade protection enabled
+#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
 
 // Most extra permission abilities go to this group
 $wgGroupPermissions['sysop']['block'] = true;
@@ -3988,8 +4011,8 @@ $wgGroupPermissions['sysop']['noratelimit'] = true;
 $wgGroupPermissions['sysop']['movefile'] = true;
 $wgGroupPermissions['sysop']['unblockself'] = true;
 $wgGroupPermissions['sysop']['suppressredirect'] = true;
-#$wgGroupPermissions['sysop']['upload_by_url']    = true;
-#$wgGroupPermissions['sysop']['mergehistory']     = true;
+#$wgGroupPermissions['sysop']['upload_by_url'] = true;
+#$wgGroupPermissions['sysop']['mergehistory'] = true;
 
 // Permission to change users' group assignments
 $wgGroupPermissions['bureaucrat']['userrights'] = true;
@@ -3999,8 +4022,8 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 // Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
 #$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
 
-#$wgGroupPermissions['sysop']['deletelogentry']  = true;
-#$wgGroupPermissions['sysop']['deleterevision']  = true;
+#$wgGroupPermissions['sysop']['deletelogentry'] = true;
+#$wgGroupPermissions['sysop']['deleterevision'] = true;
 // To hide usernames from users and Sysops
 #$wgGroupPermissions['suppress']['hideuser'] = true;
 // To hide revisions/log items from users and Sysops
@@ -4098,7 +4121,7 @@ $wgNamespaceProtection = array();
  * namespaces constants (NS_USER, NS_MAIN...).
  *
  * Among other things, this may be useful to enforce read-restrictions
- * which may otherwise be bypassed by using the template machanism.
+ * which may otherwise be bypassed by using the template mechanism.
  */
 $wgNonincludableNamespaces = array();
 
@@ -4399,7 +4422,7 @@ $wgBlockOpenProxies = false;
 /** Port we want to scan for a proxy */
 $wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
 /** Script used to scan */
-$wgProxyScriptPath = "$IP/maintenance/proxy_check.php";
+$wgProxyScriptPath = "$IP/maintenance/proxyCheck.php";
 /** */
 $wgProxyMemcExpiry = 86400;
 /** This should always be customised in LocalSettings.php */
@@ -4439,7 +4462,6 @@ $wgCookieExpiration = 180 * 86400;
  */
 $wgCookieDomain = '';
 
-
 /**
  * Set this variable if you want to restrict cookies to a certain path within
  * the domain specified by $wgCookieDomain.
@@ -4780,7 +4802,6 @@ $wgJavaScriptTestConfig = array(
        ),
 );
 
-
 /**
  * Overwrite the caching key prefix with custom value.
  * @since 1.19
@@ -4809,7 +4830,7 @@ $wgDebugToolbar = false;
 $wgDisableTextSearch = false;
 
 /**
- * Set to true to have nicer highligted text in search results,
+ * Set to true to have nicer highlighted text in search results,
  * by default off due to execution overhead
  */
 $wgAdvancedSearchHighlighting = false;
@@ -4835,7 +4856,7 @@ $wgCountTotalSearchHits = false;
 /**
  * Template for OpenSearch suggestions, defaults to API action=opensearch
  *
- * Sites with heavy load would tipically have these point to a custom
+ * Sites with heavy load would typically have these point to a custom
  * PHP wrapper to avoid firing up mediawiki for every keystroke
  *
  * Placeholders: {searchTerms}
@@ -4927,14 +4948,14 @@ $wgUseTwoButtonsSearchForm = true;
 
 /**
  * Array of namespaces to generate a Google sitemap for when the
- * maintenance/generateSitemap.php script is run, or false if one is to be ge-
- * nerated for all namespaces.
+ * maintenance/generateSitemap.php script is run, or false if one is to be
+ * generated for all namespaces.
  */
 $wgSitemapNamespaces = false;
 
 /**
  * Custom namespace priorities for sitemaps. Setting this will allow you to
- * set custom priorities to namsepaces when sitemaps are generated using the
+ * set custom priorities to namespaces when sitemaps are generated using the
  * maintenance/generateSitemap.php script.
  *
  * This should be a map of namespace IDs to priority
@@ -4964,7 +4985,7 @@ $wgEnableSearchContributorsByIP = true;
 
 /**
  * Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will
- * fall back to the old behaviour (no merging).
+ * fall back to the old behavior (no merging).
  */
 $wgDiff3 = '/usr/bin/diff3';
 
@@ -4975,7 +4996,7 @@ $wgDiff = '/usr/bin/diff';
 
 /**
  * Which namespaces have special treatment where they should be preview-on-open
- * Internaly only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
+ * Internally only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
  * can specify namespaces of pages they have special treatment for
  */
 $wgPreviewOnOpenNamespaces = array(
@@ -5238,9 +5259,9 @@ $wgAllowCategorizedRecentChanges = false;
 $wgUseTagFilter = true;
 
 /**
- * If set to an integer, pages that are watched by more users than this
- * threshold will not require the unwatchedpages permission to view the
- * number of watchers.
+ * If set to an integer, pages that are watched by this many users or more
+ * will not require the unwatchedpages permission to view the number of
+ * watchers.
  *
  * @since 1.21
  */
@@ -5455,7 +5476,7 @@ $wgAutoloadClasses = array();
  *     'version' => 1.9,
  *     'path' => __FILE__,
  *     'author' => 'Foo Barstein',
- *     'url' => 'http://wwww.example.com/Example%20Extension/',
+ *     'url' => 'http://www.example.com/Example%20Extension/',
  *     'description' => 'An example extension',
  *     'descriptionmsg' => 'exampleextension-desc',
  * );
@@ -5520,6 +5541,8 @@ $wgJobClasses = array(
        'enotifNotify' => 'EnotifNotifyJob',
        'fixDoubleRedirect' => 'DoubleRedirectJob',
        'uploadFromUrl' => 'UploadFromUrlJob',
+       'AssembleUploadChunks' => 'AssembleUploadChunksJob',
+       'PublishStashedFile' => 'PublishStashedFileJob',
        'null' => 'NullJob'
 );
 
@@ -5533,10 +5556,12 @@ $wgJobClasses = array(
  * - Jobs that you want to run on specialized machines ( like transcoding, or a particular
  *   machine on your cluster has 'outside' web access you could restrict uploadFromUrl )
  */
-$wgJobTypesExcludedFromDefaultQueue = array();
+$wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishStashedFile' );
 
 /**
  * Map of job types to configuration arrays.
+ * This determines which queue class and storage system is used for each job type.
+ * Job types that do not have explicit configuration will use the 'default' config.
  * These settings should be global to all wikis.
  */
 $wgJobTypeConf = array(
@@ -5810,111 +5835,10 @@ $wgDisableQueryPageUpdate = false;
 /**
  * List of special pages, followed by what subtitle they should go under
  * at Special:SpecialPages
+ *
+ * @deprecated 1.21 Override SpecialPage::getGroupName instead
  */
-$wgSpecialPageGroups = array(
-       'DoubleRedirects' => 'maintenance',
-       'BrokenRedirects' => 'maintenance',
-       'Lonelypages' => 'maintenance',
-       'Uncategorizedpages' => 'maintenance',
-       'Uncategorizedcategories' => 'maintenance',
-       'Uncategorizedimages' => 'maintenance',
-       'Uncategorizedtemplates' => 'maintenance',
-       'Unusedcategories' => 'maintenance',
-       'Unusedimages' => 'maintenance',
-       'Protectedpages' => 'maintenance',
-       'Protectedtitles' => 'maintenance',
-       'Unusedtemplates' => 'maintenance',
-       'Withoutinterwiki' => 'maintenance',
-       'Longpages' => 'maintenance',
-       'Shortpages' => 'maintenance',
-       'Ancientpages' => 'maintenance',
-       'Deadendpages' => 'maintenance',
-       'Wantedpages' => 'maintenance',
-       'Wantedcategories' => 'maintenance',
-       'Wantedfiles' => 'maintenance',
-       'Wantedtemplates' => 'maintenance',
-       'Unwatchedpages' => 'maintenance',
-       'Fewestrevisions' => 'maintenance',
-
-       'Userlogin' => 'login',
-       'Userlogout' => 'login',
-       'CreateAccount' => 'login',
-
-       'Recentchanges' => 'changes',
-       'Recentchangeslinked' => 'changes',
-       'Watchlist' => 'changes',
-       'Newimages' => 'changes',
-       'Newpages' => 'changes',
-       'Log' => 'changes',
-       'Tags' => 'changes',
-
-       'Upload' => 'media',
-       'Listfiles' => 'media',
-       'MIMEsearch' => 'media',
-       'FileDuplicateSearch' => 'media',
-       'Filepath' => 'media',
-
-       'Listusers' => 'users',
-       'Activeusers' => 'users',
-       'Listgrouprights' => 'users',
-       'BlockList' => 'users',
-       'Contributions' => 'users',
-       'Emailuser' => 'users',
-       'Listadmins' => 'users',
-       'Listbots' => 'users',
-       'Userrights' => 'users',
-       'Block' => 'users',
-       'Unblock' => 'users',
-       'Preferences' => 'users',
-       'ChangeEmail' => 'users',
-       'ChangePassword' => 'users',
-       'DeletedContributions' => 'users',
-       'PasswordReset' => 'users',
-
-       'Mostlinked' => 'highuse',
-       'Mostlinkedcategories' => 'highuse',
-       'Mostlinkedtemplates' => 'highuse',
-       'Mostcategories' => 'highuse',
-       'Mostimages' => 'highuse',
-       'Mostinterwikis' => 'highuse',
-       'Mostrevisions' => 'highuse',
-
-       'Allpages' => 'pages',
-       'Prefixindex' => 'pages',
-       'Listredirects' => 'pages',
-       'Categories' => 'pages',
-       'Disambiguations' => 'pages',
-       'PagesWithProp' => 'pages',
-
-       'Randompage' => 'redirects',
-       'Randomredirect' => 'redirects',
-       'Mypage' => 'redirects',
-       'Mytalk' => 'redirects',
-       'Mycontributions' => 'redirects',
-       'Search' => 'redirects',
-       'LinkSearch' => 'redirects',
-
-       'ComparePages' => 'pagetools',
-       'Movepage' => 'pagetools',
-       'MergeHistory' => 'pagetools',
-       'Revisiondelete' => 'pagetools',
-       'Undelete' => 'pagetools',
-       'Export' => 'pagetools',
-       'Import' => 'pagetools',
-       'Whatlinkshere' => 'pagetools',
-
-       'Statistics' => 'wiki',
-       'Version' => 'wiki',
-       'Lockdb' => 'wiki',
-       'Unlockdb' => 'wiki',
-       'Allmessages' => 'wiki',
-       'Popularpages' => 'wiki',
-
-       'Specialpages' => 'other',
-       'Blockme' => 'other',
-       'Booksources' => 'other',
-       'JavaScriptTest' => 'other',
-);
+$wgSpecialPageGroups = array();
 
 /** Whether or not to sort special pages in Special:Specialpages */
 
@@ -6009,8 +5933,8 @@ $wgNamespaceRobotPolicies = array();
 
 /**
  * Robot policies per article. These override the per-namespace robot policies.
- * Must be in the form of an array where the key part is a properly canonical-
- * ised text form title and the value is a robot policy.
+ * Must be in the form of an array where the key part is a properly canonicalised
+ * text form title and the value is a robot policy.
  *
  * @par Example:
  * @code
index 716e65c..89c4df6 100644 (file)
@@ -34,7 +34,7 @@ interface DeferrableUpdate {
 }
 
 /**
- * Class for mananging the deferred updates.
+ * Class for managing the deferred updates.
  *
  * @since 1.19
  */
@@ -66,7 +66,7 @@ class DeferredUpdates {
        /**
         * Do any deferred updates and clear the list
         *
-        * @param $commit String: set to 'commit' to commit after every update to
+        * @param string $commit set to 'commit' to commit after every update to
         *                prevent lock contention
         */
        public static function doUpdates( $commit = '' ) {
index 46a3773..c4a8633 100644 (file)
@@ -61,7 +61,6 @@ define( 'DB_READ', -1 );
 define( 'DB_WRITE', -2 );
 define( 'DB_LAST', -3 ); # deprecated since 2008, usage throws exception
 
-
 /**@{
  * Virtual namespaces; don't appear in the page database
  */
@@ -138,7 +137,7 @@ define( 'MEDIATYPE_ARCHIVE',    'ARCHIVE' );     // archive file (zip, tar, etc)
  */
 define( 'AV_NO_VIRUS', 0 );  #scan ok, no virus found
 define( 'AV_VIRUS_FOUND', 1 );  #virus found!
-define( 'AV_SCAN_ABORTED', -1 );  #scan aborted, the file is probably imune
+define( 'AV_SCAN_ABORTED', -1 );  #scan aborted, the file is probably immune
 define( 'AV_SCAN_FAILED', false );  #scan failed (scanner not found or error in scanner)
 /**@}*/
 
@@ -200,7 +199,6 @@ define( 'LIST_AND', 1 );
 define( 'LIST_SET', 2 );
 define( 'LIST_NAMES', 3);
 define( 'LIST_OR', 4);
-define( 'LIST_SET_PREPARED', 8);  // List of (?, ?, ?) for DatabaseIbm_db2
 /**@}*/
 
 /**
index 8a3d630..8b2dbb5 100644 (file)
@@ -40,90 +40,90 @@ class EditPage {
        /**
         * Status: Article successfully updated
         */
-       const AS_SUCCESS_UPDATE            = 200;
+       const AS_SUCCESS_UPDATE = 200;
 
        /**
         * Status: Article successfully created
         */
-       const AS_SUCCESS_NEW_ARTICLE       = 201;
+       const AS_SUCCESS_NEW_ARTICLE = 201;
 
        /**
         * Status: Article update aborted by a hook function
         */
-       const AS_HOOK_ERROR                = 210;
+       const AS_HOOK_ERROR = 210;
 
        /**
         * Status: A hook function returned an error
         */
-       const AS_HOOK_ERROR_EXPECTED       = 212;
+       const AS_HOOK_ERROR_EXPECTED = 212;
 
        /**
-        * Status: User is blocked from editting this page
+        * Status: User is blocked from editing this page
         */
-       const AS_BLOCKED_PAGE_FOR_USER     = 215;
+       const AS_BLOCKED_PAGE_FOR_USER = 215;
 
        /**
         * Status: Content too big (> $wgMaxArticleSize)
         */
-       const AS_CONTENT_TOO_BIG           = 216;
+       const AS_CONTENT_TOO_BIG = 216;
 
        /**
         * Status: User cannot edit? (not used)
         */
-       const AS_USER_CANNOT_EDIT          = 217;
+       const AS_USER_CANNOT_EDIT = 217;
 
        /**
         * Status: this anonymous user is not allowed to edit this page
         */
-       const AS_READ_ONLY_PAGE_ANON       = 218;
+       const AS_READ_ONLY_PAGE_ANON = 218;
 
        /**
         * Status: this logged in user is not allowed to edit this page
         */
-       const AS_READ_ONLY_PAGE_LOGGED     = 219;
+       const AS_READ_ONLY_PAGE_LOGGED = 219;
 
        /**
         * Status: wiki is in readonly mode (wfReadOnly() == true)
         */
-       const AS_READ_ONLY_PAGE            = 220;
+       const AS_READ_ONLY_PAGE = 220;
 
        /**
         * Status: rate limiter for action 'edit' was tripped
         */
-       const AS_RATE_LIMITED              = 221;
+       const AS_RATE_LIMITED = 221;
 
        /**
-        * Status: article was deleted while editting and param wpRecreate == false or form
+        * Status: article was deleted while editing and param wpRecreate == false or form
         * was not posted
         */
-       const AS_ARTICLE_WAS_DELETED       = 222;
+       const AS_ARTICLE_WAS_DELETED = 222;
 
        /**
         * Status: user tried to create this page, but is not allowed to do that
         * ( Title->usercan('create') == false )
         */
-       const AS_NO_CREATE_PERMISSION      = 223;
+       const AS_NO_CREATE_PERMISSION = 223;
 
        /**
         * Status: user tried to create a blank page
         */
-       const AS_BLANK_ARTICLE             = 224;
+       const AS_BLANK_ARTICLE = 224;
 
        /**
         * Status: (non-resolvable) edit conflict
         */
-       const AS_CONFLICT_DETECTED         = 225;
+       const AS_CONFLICT_DETECTED = 225;
 
        /**
         * Status: no edit summary given and the user has forceeditsummary set and the user is not
-        * editting in his own userspace or talkspace and wpIgnoreBlankSummary == false
+        * editing in his own userspace or talkspace and wpIgnoreBlankSummary == false
         */
-       const AS_SUMMARY_NEEDED            = 226;
+       const AS_SUMMARY_NEEDED = 226;
 
        /**
         * Status: user tried to create a new section without content
         */
-       const AS_TEXTBOX_EMPTY             = 228;
+       const AS_TEXTBOX_EMPTY = 228;
 
        /**
         * Status: article is too big (> $wgMaxArticleSize), after merging in the new section
@@ -133,37 +133,57 @@ class EditPage {
        /**
         * not used
         */
-       const AS_OK                        = 230;
+       const AS_OK = 230;
 
        /**
-        * Status: WikiPage::doEdit() was unsuccessfull
+        * Status: WikiPage::doEdit() was unsuccessful
         */
-       const AS_END                       = 231;
+       const AS_END = 231;
 
        /**
         * Status: summary contained spam according to one of the regexes in $wgSummarySpamRegex
         */
-       const AS_SPAM_ERROR                = 232;
+       const AS_SPAM_ERROR = 232;
 
        /**
         * Status: anonymous user is not allowed to upload (User::isAllowed('upload') == false)
         */
-       const AS_IMAGE_REDIRECT_ANON       = 233;
+       const AS_IMAGE_REDIRECT_ANON = 233;
 
        /**
         * Status: logged in user is not allowed to upload (User::isAllowed('upload') == false)
         */
-       const AS_IMAGE_REDIRECT_LOGGED     = 234;
+       const AS_IMAGE_REDIRECT_LOGGED = 234;
 
        /**
         * Status: can't parse content
         */
-       const AS_PARSE_ERROR                = 240;
+       const AS_PARSE_ERROR = 240;
 
        /**
         * HTML id and name for the beginning of the edit form.
         */
-       const EDITFORM_ID                  = 'editform';
+       const EDITFORM_ID = 'editform';
+
+       /**
+        * Prefix of key for cookie used to pass post-edit state.
+        * The revision id edited is added after this
+        */
+       const POST_EDIT_COOKIE_KEY_PREFIX = 'PostEditRevision';
+
+       /**
+        * Duration of PostEdit cookie, in seconds.
+        * 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:
+        * 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
+        * clock skew while still avoiding cookie accumulation when JavaScript is turned off.
+        */
+       const POST_EDIT_COOKIE_DURATION = 1200;
 
        /**
         * @var Article
@@ -233,7 +253,7 @@ class EditPage {
        public $previewTextAfterContent = '';
        public $mPreloadContent = null;
 
-       /* $didSave should be set to true whenever an article was succesfully altered. */
+       /* $didSave should be set to true whenever an article was successfully altered. */
        public $didSave = false;
        public $undidRev = 0;
 
@@ -377,9 +397,9 @@ class EditPage {
 
                $this->isConflict = false;
                // css / js subpages of user pages get a special treatment
-               $this->isCssJsSubpage       = $this->mTitle->isCssJsSubpage();
-               $this->isCssSubpage         = $this->mTitle->isCssSubpage();
-               $this->isJsSubpage          = $this->mTitle->isJsSubpage();
+               $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
+               $this->isCssSubpage = $this->mTitle->isCssSubpage();
+               $this->isJsSubpage = $this->mTitle->isJsSubpage();
                $this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
 
                # Show applicable editing introductions
@@ -456,7 +476,7 @@ class EditPage {
         *   "View source for ..." page displaying the source code after the error message.
         *
         * @since 1.19
-        * @param $permErrors Array of permissions errors, as returned by
+        * @param array $permErrors of permissions errors, as returned by
         *                    Title::getUserPermissionsErrors().
         * @throws PermissionsError
         */
@@ -543,7 +563,7 @@ class EditPage {
                        // Nothing *to* preview for new sections
                        return false;
                } elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) && $wgUser->getOption( 'previewonfirst' ) ) {
-                       // Standard preference behaviour
+                       // Standard preference behavior
                        return true;
                } elseif ( !$this->mTitle->exists() &&
                        isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] ) &&
@@ -694,7 +714,7 @@ class EditPage {
                                $this->starttime = null;
                        }
 
-                       $this->recreate  = $request->getCheck( 'wpRecreate' );
+                       $this->recreate = $request->getCheck( 'wpRecreate' );
 
                        $this->minoredit = $request->getCheck( 'wpMinoredit' );
                        $this->watchthis = $request->getCheck( 'wpWatchthis' );
@@ -712,18 +732,18 @@ class EditPage {
                } else {
                        # Not a posted form? Start with nothing.
                        wfDebug( __METHOD__ . ": Not a posted form.\n" );
-                       $this->textbox1     = '';
-                       $this->summary      = '';
+                       $this->textbox1 = '';
+                       $this->summary = '';
                        $this->sectiontitle = '';
-                       $this->edittime     = '';
-                       $this->starttime    = wfTimestampNow();
-                       $this->edit         = false;
-                       $this->preview      = false;
-                       $this->save         = false;
-                       $this->diff         = false;
-                       $this->minoredit    = false;
-                       $this->watchthis    = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
-                       $this->recreate     = false;
+                       $this->edittime = '';
+                       $this->starttime = wfTimestampNow();
+                       $this->edit = false;
+                       $this->preview = false;
+                       $this->save = false;
+                       $this->diff = false;
+                       $this->minoredit = false;
+                       $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overridden by request parameters
+                       $this->recreate = false;
 
                        // When creating a new section, we can preload a section title by passing it as the
                        // preloadtitle parameter in the URL (Bug 13100)
@@ -770,7 +790,7 @@ class EditPage {
        /**
         * Subpage overridable method for extracting the page content data from the
         * posted form to be placed in $this->textbox1, if using customized input
-        * this method should be overrided and return the page text that will be used
+        * this method should be overridden and return the page text that will be used
         * for saving, preview parsing and so on...
         *
         * @param $request WebRequest
@@ -952,7 +972,7 @@ class EditPage {
         * section replaced in its context (using WikiPage::replaceSection())
         * to the original text of the edit.
         *
-        * This difers from Article::getContent() that when a missing revision is
+        * This differs from Article::getContent() that when a missing revision is
         * encountered the result will be null and not the
         * 'missing-revision' message.
         *
@@ -986,7 +1006,7 @@ class EditPage {
                $rev = $this->mArticle->getRevision();
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
-               if ( $content  === false || $content === null ) {
+               if ( $content === false || $content === null ) {
                        if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
@@ -1000,7 +1020,6 @@ class EditPage {
                }
        }
 
-
        /**
         * Use this method before edit() to preload some text into the edit box
         *
@@ -1030,7 +1049,7 @@ class EditPage {
         * Get the contents to be preloaded into the box, either set by
         * an earlier setPreloadText() or by loading the given page.
         *
-        * @param $preload String: representing the title to preload from.
+        * @param string $preload representing the title to preload from.
         *
         * @return String
         *
@@ -1049,7 +1068,7 @@ class EditPage {
         * Get the contents to be preloaded into the box, either set by
         * an earlier setPreloadText() or by loading the given page.
         *
-        * @param $preload String: representing the title to preload from.
+        * @param string $preload representing the title to preload from.
         *
         * @return Content
         *
@@ -1127,6 +1146,33 @@ class EditPage {
                return $this->mTokenOk;
        }
 
+       /**
+        * Sets post-edit cookie indicating the user just saved a particular revision.
+        *
+        * This uses a temporary cookie for each revision ID so separate saves will never
+        * interfere with each other.
+        *
+        * The cookie is deleted in the mediawiki.action.view.postEdit JS module after
+        * the redirect.  It must be clearable by JavaScript code, so it must not be
+        * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
+        * variable.
+        *
+        * Since WebResponse::setcookie does not allow forcing HttpOnly for a single
+        * cookie, we have to use PHP's setcookie() directly.
+        *
+        * 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.
+        */
+       protected function setPostEditCookie() {
+               global $wgCookiePrefix, $wgCookieDomain;
+               $revisionId = $this->mArticle->getLatest();
+               $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
+
+               setcookie( $wgCookiePrefix . $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, '/', $wgCookieDomain );
+       }
+
        /**
         * Attempt submission
         * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
@@ -1142,6 +1188,9 @@ class EditPage {
                // 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();
+                       }
                }
 
                switch ( $status->value ) {
@@ -1276,8 +1325,12 @@ class EditPage {
        /**
         * Attempt submission (no UI)
         *
-        * @param $result
-        * @param $bot bool
+        * @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 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,
         *
@@ -1670,6 +1723,7 @@ class EditPage {
                        return $doEditStatus;
                }
 
+               $result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' );
                $result['redirect'] = $content->isRedirect();
                $this->updateWatchlist();
                wfProfileOut( __METHOD__ );
@@ -2001,7 +2055,7 @@ class 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
+        * @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.
         *
@@ -2127,7 +2181,7 @@ class EditPage {
                }
 
                if ( $this->hasPresetSummary ) {
-                       // If a summary has been preset using &summary= we dont want to prompt for
+                       // If a summary has been preset using &summary= we don't want to prompt for
                        // a different summary. Only prompt for a summary if the summary is blanked.
                        // (Bug 17416)
                        $this->autoSumm = md5( '' );
@@ -2153,7 +2207,7 @@ class EditPage {
                }
 
                if ( $this->isConflict ) {
-                       // In an edit conflict bypass the overrideable content form method
+                       // In an edit conflict bypass the overridable content form method
                        // and fallback to the raw wpTextbox1 since editconflicts can't be
                        // resolved between page source edits and custom ui edits using the
                        // custom edit ui.
@@ -2372,7 +2426,6 @@ class EditPage {
                $this->showHeaderCopyrightWarning();
        }
 
-
        /**
         * Standard summary input and label (wgSummary), abstracted so EditPage
         * subclasses may reorganize the form.
@@ -2380,15 +2433,15 @@ class EditPage {
         * inferred by the id given to the input. You can remove them both by
         * passing array( 'id' => false ) to $userInputAttrs.
         *
-        * @param $summary string The value of the summary input
-        * @param $labelText string The html to place inside the label
-        * @param $inputAttrs array of attrs to use on the input
-        * @param $spanLabelAttrs array of attrs to use on the span inside the label
+        * @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
         *
         * @return array An array in the format array( $label, $input )
         */
        function getSummaryInput( $summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null ) {
-               // Note: the maxlength is overriden in JS to 255 and to make it use UTF-8 bytes, not characters.
+               // 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',
                        'maxlength' => '200',
@@ -2417,7 +2470,7 @@ class EditPage {
         * @param $isSubjectPreview Boolean: true if this is the section subject/title
         *                          up top, or false if this is the comment summary
         *                          down below the textarea
-        * @param $summary String: The text of the summary to display
+        * @param string $summary The text of the summary to display
         * @return String
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
@@ -2443,7 +2496,7 @@ class EditPage {
         * @param $isSubjectPreview Boolean: true if this is the section subject/title
         *                          up top, or false if this is the comment summary
         *                          down below the textarea
-        * @param $summary String: the text of the summary to display
+        * @param string $summary the text of the summary to display
         * @return String
         */
        protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
@@ -2516,8 +2569,8 @@ HTML
         * The $textoverride method can be used by subclasses overriding showContentForm
         * to pass back to this method.
         *
-        * @param $customAttribs array of html attributes to use in the textarea
-        * @param $textoverride String: optional text to override $this->textarea1 with
+        * @param array $customAttribs 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' ) {
@@ -2621,7 +2674,7 @@ HTML
         * Append preview output to $wgOut.
         * Includes category rendering if this is a category page.
         *
-        * @param $text String: 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;
@@ -3244,8 +3297,8 @@ HTML
         * Returns an array of html code of the following checkboxes:
         * minor and watch
         *
-        * @param $tabindex int Current tabindex
-        * @param $checked Array of checkbox => bool, where bool indicates the checked
+        * @param int $tabindex Current tabindex
+        * @param array $checked of checkbox => bool, where bool indicates the checked
         *                 status of the checkbox
         *
         * @return array
@@ -3295,7 +3348,7 @@ HTML
         * Returns an array of html code of the following buttons:
         * save, diff, preview and live
         *
-        * @param $tabindex int Current tabindex
+        * @param int $tabindex Current tabindex
         *
         * @return array
         */
@@ -3424,7 +3477,7 @@ HTML
        /**
         * Produce the stock "your edit contains spam" page
         *
-        * @param $match string|bool Text which triggered one or more filters
+        * @param string|bool $match Text which triggered one or more filters
         * @deprecated since 1.17 Use method spamPageWithContent() instead
         */
        static function spamPage( $match = false ) {
@@ -3567,7 +3620,7 @@ HTML
         * @private
         */
        function makesafe( $invalue ) {
-               // Armor existing references for reversability.
+               // Armor existing references for reversibility.
                $invalue = strtr( $invalue, array( "&#x" => "&#x0" ) );
 
                $bytesleft = 0;
@@ -3619,7 +3672,7 @@ HTML
                                        $i++;
                                } while ( ctype_xdigit( $invalue[$i] ) && ( $i < strlen( $invalue ) ) );
 
-                               // Do some sanity checks. These aren't needed for reversability,
+                               // Do some sanity checks. These aren't needed for reversibility,
                                // but should help keep the breakage down if the editor
                                // breaks one of the entities whilst editing.
                                if ( ( substr( $invalue, $i, 1 ) == ";" ) and ( strlen( $hexstring ) <= 6 ) ) {
@@ -3632,7 +3685,7 @@ HTML
                                $result .= substr( $invalue, $i, 1 );
                        }
                }
-               // reverse the transform that we made for reversability reasons.
+               // reverse the transform that we made for reversibility reasons.
                return strtr( $result, array( "&#x0" => "&#x" ) );
        }
 }
index 81d1a9b..0bd7a2a 100644 (file)
@@ -64,8 +64,8 @@ class MWException extends Exception {
        /**
         * Run hook to allow extensions to modify the text of the exception
         *
-        * @param $name string: class name of the exception
-        * @param $args array: arguments to pass to the callback functions
+        * @param string $name class name of the exception
+        * @param array $args arguments to pass to the callback functions
         * @return string|null string to output or null if any hook has been called
         */
        function runHooks( $name, $args = array() ) {
@@ -83,7 +83,7 @@ class MWException extends Exception {
                $callargs = array_merge( array( $this ), $args );
 
                foreach ( $hooks as $hook ) {
-                       if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) {    // 'function' or array( 'class', hook' )
+                       if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
                                $result = call_user_func_array( $hook, $callargs );
                        } else {
                                $result = null;
@@ -99,8 +99,8 @@ class MWException extends Exception {
        /**
         * Get a message from i18n
         *
-        * @param $key string: message name
-        * @param $fallback string: default message if the message cache can't be
+        * @param string $key message name
+        * @param string $fallback default message if the message cache can't be
         *                  called by the exception
         * The function also has other parameters that are arguments for the message
         * @return string message with arguments replaced
@@ -171,7 +171,7 @@ class MWException extends Exception {
 
        /**
         * Get a random ID for this error.
-        * This allows to link the exception to its correspoding log entry when
+        * This allows to link the exception to its corresponding log entry when
         * $wgShowExceptionDetails is set to false.
         *
         * @return string
@@ -320,9 +320,9 @@ class ErrorPageError extends MWException {
        /**
         * Note: these arguments are keys into wfMessage(), not text!
         *
-        * @param $title string|Message Message key (string) for page title, or a Message object
-        * @param $msg string|Message Message key (string) for error text, or a Message object
-        * @param $params array with parameters to wfMessage()
+        * @param string|Message $title Message key (string) for page title, or a Message object
+        * @param string|Message $msg Message key (string) for error text, or a Message object
+        * @param array $params with parameters to wfMessage()
         */
        function __construct( $title, $msg, $params = null ) {
                $this->title = $title;
@@ -354,8 +354,8 @@ class ErrorPageError extends MWException {
  */
 class BadTitleError extends ErrorPageError {
        /**
-        * @param $msg string|Message A message key (default: 'badtitletext')
-        * @param $params Array parameter to wfMessage()
+        * @param string|Message $msg A message key (default: 'badtitletext')
+        * @param array $params parameter to wfMessage()
         */
        function __construct( $msg = 'badtitletext', $params = null ) {
                parent::__construct( 'badtitle', $msg, $params );
@@ -557,8 +557,8 @@ class HttpError extends MWException {
         * Constructor
         *
         * @param $httpCode Integer: HTTP status code to send to the client
-        * @param $content String|Message: content of the message
-        * @param $header String|Message: content of the header (\<title\> and \<h1\>)
+        * @param string|Message $content content of the message
+        * @param string|Message $header content of the header (\<title\> and \<h1\>)
         */
        public function __construct( $httpCode, $content, $header = null ) {
                parent::__construct( $content );
@@ -684,7 +684,7 @@ class MWExceptionHandler {
         * Print a message, if possible to STDERR.
         * Use this in command line mode only (see isCommandLine)
         *
-        * @param $message string Failure text
+        * @param string $message Failure text
         */
        public static function printError( $message ) {
                # NOTE: STDERR may not be available, especially if php-cgi is used from the command line (bug #15602).
index 9248575..d8cc024 100644 (file)
@@ -80,8 +80,8 @@ class WikiExporter {
         *                   offset: non-inclusive offset at which to start the query
         *                   limit: maximum number of rows to return
         *                   dir: "asc" or "desc" timestamp order
-        * @param $buffer Int: one of WikiExporter::BUFFER or WikiExporter::STREAM
-        * @param $text Int: one of WikiExporter::TEXT or WikiExporter::STUB
+        * @param int $buffer one of WikiExporter::BUFFER or WikiExporter::STREAM
+        * @param int $text one of WikiExporter::TEXT or WikiExporter::STUB
         */
        function __construct( $db, $history = WikiExporter::CURRENT,
                        $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
@@ -126,7 +126,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 $start Int: inclusive lower limit (this id is included)
+        * @param int $start inclusive lower limit (this id is included)
         * @param $end   Int: Exclusive upper limit (this id is not included)
         *                   If 0, no upper limit.
         */
@@ -141,7 +141,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 $start Int: inclusive lower limit (this id is included)
+        * @param int $start inclusive lower limit (this id is included)
         * @param $end   Int: Exclusive upper limit (this id is not included)
         *                   If 0, no upper limit.
         */
@@ -348,7 +348,7 @@ class WikiExporter {
                                $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
                                $opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
                        } else {
-                               # Uknown history specification parameter?
+                               # Unknown history specification parameter?
                                wfProfileOut( __METHOD__ );
                                throw new MWException( __METHOD__ . " given invalid history dump type." );
                        }
@@ -429,7 +429,7 @@ class WikiExporter {
                foreach ( $resultset as $row ) {
                        if ( $last === null ||
                                $last->page_namespace != $row->page_namespace ||
-                               $last->page_title     != $row->page_title ) {
+                               $last->page_title != $row->page_title ) {
                                if ( $last !== null ) {
                                        $output = '';
                                        if ( $this->dumpUploads ) {
@@ -649,7 +649,7 @@ class XmlDumpWriter {
                }
 
                if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
-                       $out .=  "      <minor/>\n";
+                       $out .= "      <minor/>\n";
                }
                if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
                        $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
@@ -758,7 +758,7 @@ class XmlDumpWriter {
 
        /**
         * @param $timestamp string
-        * @param $indent string Default to six spaces
+        * @param string $indent Default to six spaces
         * @return string
         */
        function writeTimestamp( $timestamp, $indent = "      " ) {
@@ -769,7 +769,7 @@ class XmlDumpWriter {
        /**
         * @param $id
         * @param $text string
-        * @param $indent string Default to six spaces
+        * @param string $indent Default to six spaces
         * @return string
         */
        function writeContributor( $id, $text, $indent = "      " ) {
@@ -871,9 +871,8 @@ class XmlDumpWriter {
        }
 }
 
-
 /**
- * Base class for output stream; prints to stdout or buffer or whereever.
+ * Base class for output stream; prints to stdout or buffer or wherever.
  * @ingroup Dump
  */
 class DumpOutput {
@@ -947,7 +946,7 @@ class DumpOutput {
         * 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 $open bool If true, a new file with the old filename will be opened again for writing (default: false)
+        * @param bool $open If true, a new file with the old filename will be opened again for writing (default: false)
         */
        function closeAndRename( $newname, $open = false ) {
        }
@@ -1399,7 +1398,6 @@ class DumpNamespaceFilter extends DumpFilter {
        }
 }
 
-
 /**
  * Dump output filter to include only the last revision in each page sequence.
  * @ingroup Dump
@@ -1444,7 +1442,7 @@ class DumpLatestFilter extends DumpFilter {
 }
 
 /**
- * Base class for output stream; prints to stdout or buffer or whereever.
+ * Base class for output stream; prints to stdout or buffer or wherever.
  * @ingroup Dump
  */
 class DumpMultiWriter {
index 3f73376..11e9423 100644 (file)
@@ -40,7 +40,7 @@ class ExternalEdit extends ContextSource {
         * Check whether external edit or diff should be used.
         *
         * @param $context IContextSource context to use
-        * @param $type String can be either 'edit' or 'diff'
+        * @param string $type can be either 'edit' or 'diff'
         * @return Bool
         */
        public static function useExternalEngine( IContextSource $context, $type ) {
index 8cf9c84..580b989 100644 (file)
@@ -278,7 +278,7 @@ abstract class ExternalUser {
         * This is part of the core code and is not overridable by specific
         * plugins.  It's in this class only for convenience.
         *
-        * @param $id int user_id
+        * @param int $id user_id
         */
        final public function linkToLocal( $id ) {
                $dbw = wfGetDB( DB_MASTER );
index b517656..2e19a09 100644 (file)
@@ -149,13 +149,12 @@ class Fallback {
                return $total;
        }
 
-
        /**
         * Fallback implementation of mb_strpos, hardcoded to UTF-8.
         * @param $haystack String
         * @param $needle String
-        * @param $offset String: optional start position
-        * @param $encoding String: optional encoding; ignored
+        * @param string $offset optional start position
+        * @param string $encoding optional encoding; ignored
         * @return int
         */
        public static function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -175,8 +174,8 @@ class Fallback {
         * Fallback implementation of mb_strrpos, hardcoded to UTF-8.
         * @param $haystack String
         * @param $needle String
-        * @param $offset String: optional start position
-        * @param $encoding String: optional encoding; ignored
+        * @param string $offset optional start position
+        * @param string $encoding optional encoding; ignored
         * @return int
         */
        public static function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
index 8e000ae..caf2e57 100644 (file)
@@ -52,11 +52,11 @@ class FeedItem {
        /**
         * Constructor
         *
-        * @param $title String|Title Item's title
+        * @param string|Title $title Item's title
         * @param $description String
-        * @param $url String: URL uniquely designating the item.
-        * @param $date String: Item's date
-        * @param $author String: Author's user name
+        * @param string $url URL uniquely designating the item.
+        * @param string $date Item's date
+        * @param string $author Author's user name
         * @param $comments String
         */
        function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) {
@@ -72,7 +72,7 @@ class FeedItem {
        /**
         * Encode $string so that it can be safely embedded in a XML document
         *
-        * @param $string String: string to encode
+        * @param string $string string to encode
         * @return String
         */
        public function xmlEncode( $string ) {
@@ -95,7 +95,7 @@ class FeedItem {
        /**
         * set the unique id of an item
         *
-        * @param $uniqueId String: unique id for the 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)
         */
        public function setUniqueId( $uniqueId, $rssIsPermalink = false ) {
@@ -170,7 +170,7 @@ class FeedItem {
        /**
         * Quickie hack... strip out wikilinks to more legible form from the comment.
         *
-        * @param $text String: wikitext
+        * @param string $text wikitext
         * @return String
         */
        public static function stripComment( $text ) {
@@ -282,7 +282,7 @@ class RSSFeed extends ChannelFeed {
        }
 
        /**
-        * Ouput an RSS 2.0 header
+        * Output an RSS 2.0 header
         */
        function outHeader() {
                global $wgVersion;
@@ -318,7 +318,7 @@ class RSSFeed extends ChannelFeed {
        }
 
        /**
-        * Ouput an RSS 2.0 footer
+        * Output an RSS 2.0 footer
         */
        function outFooter() {
        ?>
@@ -362,7 +362,7 @@ class AtomFeed extends ChannelFeed {
        }
 
        /**
-        * Atom 1.0 requires a unique, opaque IRI as a unique indentifier
+        * Atom 1.0 requires a unique, opaque IRI as a unique identifier
         * for every feed we create. For now just use the URL, but who
         * can tell if that's right? If we put options on the feed, do we
         * have to change the id? Maybe? Maybe not.
@@ -409,7 +409,7 @@ class AtomFeed extends ChannelFeed {
        }
 
        /**
-        * Outputs the footer for Atom 1.0 feed (basicly '\</feed\>').
+        * Outputs the footer for Atom 1.0 feed (basically '\</feed\>').
         */
        function outFooter() {?>
        </feed><?php
index 67011d2..adc1f78 100644 (file)
@@ -33,8 +33,8 @@ class FeedUtils {
         * If the feed should be purged; $timekey and $key will be removed from
         * $messageMemc
         *
-        * @param $timekey String: cache key of the timestamp of the last item
-        * @param $key String: 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;
@@ -48,7 +48,7 @@ class FeedUtils {
        /**
         * Check whether feeds can be used and that $type is a valid feed type
         *
-        * @param $type String: feed type, as requested by the user
+        * @param string $type feed type, as requested by the user
         * @return Boolean
         */
        public static function checkFeedOutput( $type ) {
@@ -98,15 +98,15 @@ class FeedUtils {
         * @param $oldid Integer: old revision's id
         * @param $newid Integer: new revision's id
         * @param $timestamp Integer: new revision's timestamp
-        * @param $comment String: new revision's comment
-        * @param $actiontext String: text of the action; in case of log event
+        * @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 = '' ) {
                global $wgFeedDiffCutoff, $wgLang;
                wfProfileIn( __METHOD__ );
 
-               # log enties
+               // log entries
                $completeText = '<p>' . implode( ' ',
                        array_filter(
                                array(
@@ -115,7 +115,7 @@ class FeedUtils {
 
                // NOTE: Check permissions for anonymous users, not current user.
                //       No "privileged" version should end up in the cache.
-               //       Most feed readers will not log in anway.
+               //       Most feed readers will not log in anyway.
                $anon = new User();
                $accErrors = $title->getUserPermissionsErrors( 'read', $anon, true );
 
@@ -236,18 +236,18 @@ class FeedUtils {
         * Might be 'cleaner' to use DOM or XSLT or something,
         * but *gack* it's a pain in the ass.
         *
-        * @param $text String: diff's HTML output
+        * @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;',
-                       'diff-ntitle'      => 'background-color: white; color:black;',
-                       'diff-addedline'   => 'background: #cfc; color:black; font-size: smaller;',
-                       'diff-deletedline' => 'background: #ffa; color:black; font-size: smaller;',
-                       'diff-context'     => 'background: #eee; color:black; font-size: smaller;',
-                       'diffchange'       => 'color: red; font-weight: bold; text-decoration: none;',
+                       '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;',
+                       'diffchange'       => 'font-weight: bold; text-decoration: none;',
                );
 
                foreach( $styles as $class => $style ) {
index 48073f7..28403cc 100644 (file)
@@ -140,8 +140,8 @@ class FileDeleteForm {
         *
         * @param $title Title object
         * @param File $file: file object
-        * @param $oldimage String: archive name
-        * @param $reason String: reason of the deletion
+        * @param string $oldimage archive name
+        * @param string $reason reason of the deletion
         * @param $suppress Boolean: whether to mark all deleted versions as restricted
         * @param $user User object performing the request
         * @throws MWException
@@ -309,7 +309,7 @@ class FileDeleteForm {
         * showing an appropriate message depending upon whether
         * it's a current file or an old version
         *
-        * @param $message String: message base
+        * @param string $message message base
         * @return String
         */
        private function prepareMessage( $message ) {
index 598be05..8477ed9 100644 (file)
@@ -104,7 +104,7 @@ class FormOptions implements ArrayAccess {
        /**
         * Verify the given option name exist.
         *
-        * @param $name String: option name
+        * @param string $name option name
         * @param $strict Boolean: throw an exception when the option does not exist (default false)
         * @throws MWException
         * @return Boolean: true if option exist, false otherwise
@@ -123,7 +123,7 @@ class FormOptions implements ArrayAccess {
        /**
         * Use to set the value of an option.
         *
-        * @param $name String: option name
+        * @param string $name option name
         * @param $value Mixed: value for the option
         * @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
         * @return null
@@ -143,7 +143,7 @@ class FormOptions implements ArrayAccess {
         * Get the value for the given option name.
         * Internally use getValueReal()
         *
-        * @param $name String: option name
+        * @param string $name option name
         * @return Mixed
         */
        public function getValue( $name ) {
@@ -154,7 +154,7 @@ class FormOptions implements ArrayAccess {
 
        /**
         * @todo Document
-        * @param $option Array: array structure describing the option
+        * @param array $option array structure describing the option
         * @return Mixed. Value or the default value if it is null
         */
        protected function getValueReal( $option ) {
@@ -168,7 +168,7 @@ class FormOptions implements ArrayAccess {
        /**
         * Delete the option value.
         * This will make future calls to getValue()  return the default value.
-        * @param $name String: option name
+        * @param string $name option name
         * @return null
         */
        public function reset( $name ) {
@@ -191,7 +191,7 @@ class FormOptions implements ArrayAccess {
 
        /**
         * @todo Document
-        * @param $names Array: array of option names
+        * @param array $names array of option names
         * @return null
         */
        public function consumeValues( /*Array*/ $names ) {
@@ -210,9 +210,9 @@ class FormOptions implements ArrayAccess {
         * Validate and set an option integer value
         * The value will be altered to fit in the range.
         *
-        * @param $name String: option name
-        * @param $min Int: minimum value
-        * @param $max Int: maximum value
+        * @param string $name option name
+        * @param int $min minimum value
+        * @param int $max maximum value
         * @throws MWException
         * @exception MWException Option is not of type int
         * @return null
index a0a216e..6f7f802 100644 (file)
@@ -41,11 +41,11 @@ class GitInfo {
        private static $viewers = false;
 
        /**
-        * @param $dir string The root directory of the repo where the .git dir can be found
+        * @param string $dir The root directory of the repo where the .git dir can be found
         */
        public function __construct( $dir ) {
                $this->basedir = "{$dir}/.git";
-               if ( is_readable( $this->basedir ) ) {
+               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" );
@@ -70,7 +70,7 @@ class GitInfo {
        /**
         * Check if a string looks like a hex encoded SHA1 hash
         *
-        * @param $str string The string to check
+        * @param string $str The string to check
         * @return bool Whether or not the string looks like a SHA1
         */
        public static function isSHA1( $str ) {
index a2b882f..0feddd2 100644 (file)
@@ -94,7 +94,6 @@ if( !function_exists( 'mb_strrpos' ) ) {
        }
 }
 
-
 // Support for Wietse Venema's taint feature
 if ( !function_exists( 'istainted' ) ) {
        /**
@@ -168,7 +167,7 @@ function wfArrayLookup( $a, $b ) {
  * @param $key String|Int
  * @param $value Mixed
  * @param $default Mixed
- * @param $changed Array to alter
+ * @param array $changed to alter
  * @throws MWException
  */
 function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
@@ -233,8 +232,8 @@ function wfMergeErrorArrays( /*...*/ ) {
 /**
  * Insert array into another array after the specified *KEY*
  *
- * @param $array Array: The array.
- * @param $insert Array: The array to insert.
+ * @param array $array The array.
+ * @param array $insert The array to insert.
  * @param $after Mixed: The key to insert after
  * @return Array
  */
@@ -312,12 +311,12 @@ function wfRandom() {
 }
 
 /**
- * Get a random string containing a number of pesudo-random hex
+ * Get a random string containing a number of pseudo-random hex
  * characters.
  * @note This is not secure, if you are trying to generate some sort
  *       of token please use MWCryptRand instead.
  *
- * @param $length int The length of the string to generate
+ * @param int $length The length of the string to generate
  * @return String
  * @since 1.20
  */
@@ -350,7 +349,7 @@ function wfRandomString( $length = 32 ) {
  *
  * @param $s String:
  * @return string
-*/
+ */
 function wfUrlencode( $s ) {
        static $needle;
        if ( is_null( $s ) ) {
@@ -380,8 +379,8 @@ function wfUrlencode( $s ) {
  * "days=7&limit=100". Options in the first array override options in the second.
  * Options set to null or false will not be output.
  *
- * @param $array1 Array ( String|Array )
- * @param $array2 Array ( String|Array )
+ * @param array $array1 ( String|Array )
+ * @param array $array2 ( String|Array )
  * @param $prefix String
  * @return String
  */
@@ -423,11 +422,11 @@ function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
 
 /**
  * This is the logical opposite of wfArrayToCgi(): it accepts a query string as
- * its argument and returns the same string in array form.  This allows compa-
- * tibility with legacy functions that accept raw query strings instead of nice
+ * its argument and returns the same string in array form.  This allows compatibility
+ * with legacy functions that accept raw query strings instead of nice
  * arrays.  Of course, keys and values are urldecode()d.
  *
- * @param $query String: query string
+ * @param string $query query string
  * @return array Array version of input
  */
 function wfCgiToArray( $query ) {
@@ -507,7 +506,7 @@ function wfAppendQuery( $url, $query ) {
  * @todo this won't work with current-path-relative URLs
  * like "subdir/foo.html", etc.
  *
- * @param $url String: either fully-qualified or a local path + query
+ * @param string $url either fully-qualified or a local path + query
  * @param $defaultProto Mixed: one of the PROTO_* constants. Determines the
  *                             protocol to use if $url or $wgServer is
  *                             protocol-relative
@@ -577,7 +576,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
  * @todo Need to integrate this into wfExpandUrl (bug 32168)
  *
  * @since 1.19
- * @param $urlParts Array URL parts, as output from wfParseUrl
+ * @param array $urlParts URL parts, as output from wfParseUrl
  * @return string URL assembled from its component parts
  */
 function wfAssembleUrl( $urlParts ) {
@@ -629,7 +628,7 @@ function wfAssembleUrl( $urlParts ) {
  *
  * @todo Need to integrate this into wfExpandUrl (bug 32168)
  *
- * @param $urlPath String URL path, potentially containing dot-segments
+ * @param string $urlPath URL path, potentially containing dot-segments
  * @return string URL path with all dot-segments removed
  */
 function wfRemoveDotSegments( $urlPath ) {
@@ -706,7 +705,7 @@ function wfRemoveDotSegments( $urlPath ) {
 /**
  * Returns a regular expression of url protocols
  *
- * @param $includeProtocolRelative bool If false, remove '//' from the returned protocol list.
+ * @param bool $includeProtocolRelative If false, remove '//' from the returned protocol list.
  *        DO NOT USE this directly, use wfUrlProtocolsWithoutProtRel() instead
  * @return String
  */
@@ -766,7 +765,7 @@ function wfUrlProtocolsWithoutProtRel() {
  * 2) Handles protocols that don't use :// (e.g., mailto: and news: , as well as protocol-relative URLs) correctly
  * 3) Adds a "delimiter" element to the array, either '://', ':' or '//' (see (2))
  *
- * @param $url String: a URL to parse
+ * @param string $url a URL to parse
  * @return Array: bits of the URL in an associative array, per PHP docs
  */
 function wfParseUrl( $url ) {
@@ -851,8 +850,6 @@ function wfExpandIRI_callback( $matches ) {
        return urldecode( $matches[1] );
 }
 
-
-
 /**
  * Make URL indexes, appropriate for the el_index field of externallinks.
  *
@@ -909,8 +906,8 @@ function wfMakeUrlIndexes( $url ) {
 
 /**
  * Check whether a given URL has a domain that occurs in a given set of domains
- * @param $url string URL
- * @param $domains array Array of domains (strings)
+ * @param string $url URL
+ * @param array $domains Array of domains (strings)
  * @return bool True if the host part of $url ends in one of the strings in $domains
  */
 function wfMatchesDomainList( $url, $domains ) {
@@ -938,7 +935,7 @@ function wfMatchesDomainList( $url, $domains ) {
  * $wgDebugComments - if on, some debug items may appear in comments in the HTML output.
  *
  * @param $text String
- * @param $logonly Bool: set true to avoid appearing in HTML when $wgDebugComments is set
+ * @param bool $logonly set true to avoid appearing in HTML when $wgDebugComments is set
  */
 function wfDebug( $text, $logonly = false ) {
        global $wgDebugLogFile, $wgProfileOnly, $wgDebugRawPage, $wgDebugLogPrefix;
@@ -1010,7 +1007,7 @@ function wfDebugTimer() {
 /**
  * Send a line giving PHP memory usage.
  *
- * @param $exact Bool: print exact values instead of kilobytes (default: false)
+ * @param bool $exact print exact values instead of kilobytes (default: false)
  */
 function wfDebugMem( $exact = false ) {
        $mem = memory_get_usage();
@@ -1028,7 +1025,7 @@ function wfDebugMem( $exact = false ) {
  *
  * @param $logGroup String
  * @param $text String
- * @param $public Bool: whether to log the event in the public log if no private
+ * @param bool $public whether to log the event in the public log if no private
  *                     log file is specified, (default true)
  */
 function wfDebugLog( $logGroup, $text, $public = true ) {
@@ -1049,7 +1046,7 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
 /**
  * Log for database errors
  *
- * @param $text String: database error message.
+ * @param string $text database error message.
  */
 function wfLogDBError( $text ) {
        global $wgDBerrorLog, $wgDBerrorLogTZ;
@@ -1082,9 +1079,9 @@ function wfLogDBError( $text ) {
  * Throws a warning that $function is deprecated
  *
  * @param $function String
- * @param $version String|bool: Version of MediaWiki that the function was deprecated in (Added in 1.19).
- * @param $component String|bool: Added in 1.19.
- * @param $callerOffset integer: How far up the callstack is the original
+ * @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
  *    caller. 2 = function that called the function that called
  *    wfDeprecated (Added in 1.20)
  *
@@ -1098,7 +1095,7 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
  * Send a warning either to the debug log or in a PHP error depending on
  * $wgDevelopmentWarnings
  *
- * @param $msg String: message to send
+ * @param string $msg message to send
  * @param $callerOffset Integer: number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
  * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
@@ -1115,7 +1112,7 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
  * send lines to the specified port, prefixed by the specified prefix and a space.
  *
  * @param $text String
- * @param $file String filename
+ * @param string $file filename
  * @throws MWException
  */
 function wfErrorLog( $text, $file ) {
@@ -1428,7 +1425,7 @@ function wfMessageFallback( /*...*/ ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String: lookup key for the message, usually
+ * @param string $key lookup key for the message, usually
  *    defined in languages/Language.php
  *
  * Parameters to the message, which can be used to insert variable text into
@@ -1484,7 +1481,7 @@ function wfMsgNoTrans( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String: lookup key for the message, usually
+ * @param string $key lookup key for the message, usually
  *     defined in languages/Language.php
  * @return String
  */
@@ -1531,7 +1528,7 @@ function wfMsgForContentNoTrans( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String: key to get.
+ * @param string $key key to get.
  * @param $args
  * @param $useDB Boolean
  * @param $forContent Mixed: Language code, or false for user lang, true for content lang.
@@ -1555,7 +1552,7 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
  *
  * @param $key String
  * @param $useDB Bool
- * @param $langCode String: Code of the language to get the message for, or
+ * @param string $langCode Code of the language to get the message for, or
  *                  behaves as a content language switch if it is a boolean.
  * @param $transform Boolean: whether to parse magic words, etc.
  * @return string
@@ -1653,8 +1650,8 @@ function wfMsgWikiHtml( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String: key of the message
- * @param $options Array: processing rules. Can take the following options:
+ * @param string $key key of the message
+ * @param array $options processing rules. Can take the following options:
  *   <i>parse</i>: parses wikitext to HTML
  *   <i>parseinline</i>: parses wikitext to HTML and removes the surrounding
  *       p's added by parser or tidy
@@ -1665,7 +1662,7 @@ function wfMsgWikiHtml( $key ) {
  *   <i>content</i>: fetch message for content language instead of interface
  * Also can accept a single associative argument, of the form 'language' => 'xx':
  *   <i>language</i>: Language object or language code to fetch message for
- *       (overriden by <i>content</i>).
+ *       (overridden by <i>content</i>).
  * Behavior for conflicting options (e.g., parse+parseinline) is undefined.
  *
  * @return String
@@ -1745,7 +1742,7 @@ function wfMsgExt( $key, $options ) {
 /**
  * Since wfMsg() and co suck, they don't return false if the message key they
  * looked up didn't exist but a XHTML string, this function checks for the
- * nonexistance of messages by checking the MessageCache::get() result directly.
+ * nonexistence of messages by checking the MessageCache::get() result directly.
  *
  * @deprecated since 1.18. Use Message::isDisabled().
  *
@@ -1762,7 +1759,7 @@ function wfEmptyMsg( $key ) {
  * Throw a debugging exception. This function previously once exited the process,
  * but now throws an exception instead, with similar results.
  *
- * @param $msg String: message shown when dying.
+ * @param string $msg message shown when dying.
  * @throws MWException
  */
 function wfDebugDieBacktrace( $msg = '' ) {
@@ -1828,13 +1825,13 @@ function wfReportTime() {
  *
  * With Zend Optimizer 3.2.0 loaded, this causes segfaults under somewhat
  * murky circumstances, which may be triggered in part by stub objects
- * or other fancy talkin'.
+ * or other fancy talking'.
  *
  * Will return an empty array if Zend Optimizer is detected or if
  * debug_backtrace is disabled, otherwise the output from
  * debug_backtrace() (trimmed).
  *
- * @param $limit int This parameter can be used to limit the number of stack frames returned
+ * @param int $limit This parameter can be used to limit the number of stack frames returned
  *
  * @return array of backtrace information
  */
@@ -1940,7 +1937,7 @@ function wfGetCaller( $level = 2 ) {
  * Return a string consisting of callers in the stack. Useful sometimes
  * for profiling specific points.
  *
- * @param $limit int The maximum depth of the stack frame to return, or false for
+ * @param int $limit The maximum depth of the stack frame to return, or false for
  *               the entire stack.
  * @return String
  */
@@ -1965,10 +1962,8 @@ function wfFormatStackFrame( $frame ) {
                $frame['function'];
 }
 
-
 /* Some generic result counters, pulled out of SearchEngine */
 
-
 /**
  * @todo document
  *
@@ -1986,8 +1981,8 @@ function wfShowingResults( $offset, $limit ) {
  * @param $offset String
  * @param $limit Integer
  * @param $link String
- * @param $query String: optional URL query parameter string
- * @param $atend Bool: 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 in 1.19; use Language::viewPrevNext() instead
  */
@@ -2013,8 +2008,8 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
 /**
  * Make a list item, used by various special pages
  *
- * @param $page String Page link
- * @param $details String Text between brackets
+ * @param string $page Page link
+ * @param string $details Text between brackets
  * @param $oppositedm Boolean  Add the direction mark opposite to your
  *                                                             language, to display text properly
  * @return String
@@ -2063,8 +2058,8 @@ function wfClientAcceptsGzip( $force = false ) {
  * Obtain the offset and limit values from the request string;
  * used in special pages
  *
- * @param $deflimit Int default limit if none supplied
- * @param $optionname String Name of a user preference to check against
+ * @param int $deflimit default limit if none supplied
+ * @param string $optionname Name of a user preference to check against
  * @return array
  *
  */
@@ -2079,7 +2074,7 @@ 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 $text String: text to be escaped
+ * @param string $text text to be escaped
  * @return String
  */
 function wfEscapeWikiText( $text ) {
@@ -2095,7 +2090,7 @@ function wfEscapeWikiText( $text ) {
 }
 
 /**
- * Get the current unix timetstamp with microseconds.  Useful for profiling
+ * Get the current unix timestamp with microseconds.  Useful for profiling
  * @return Float
  */
 function wfTime() {
@@ -2252,7 +2247,7 @@ function wfClearOutputBuffers() {
  * factors
  *
  * @param $accept String
- * @param $def String default
+ * @param string $def default
  * @return Array
  */
 function wfAcceptToPrefs( $accept, $def = '*/*' ) {
@@ -2312,8 +2307,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 $cprefs Array: client's acceptable type list
- * @param $sprefs Array: 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'
@@ -2434,11 +2429,6 @@ define( 'TS_ORACLE', 6 );
  */
 define( 'TS_POSTGRES', 7 );
 
-/**
- * DB2 format time
- */
-define( 'TS_DB2', 8 );
-
 /**
  * ISO 8601 basic format with no timezone: 19860209T200000Z.  This is used by ResourceLoader
  */
@@ -2554,9 +2544,9 @@ function wfTempDir() {
 /**
  * Make directory, and make all parent directories if they don't exist
  *
- * @param $dir String: full path to directory to create
+ * @param string $dir full path to directory to create
  * @param $mode Integer: chmod value to use, default is $wgDirectoryMode
- * @param $caller String: optional caller param for debugging.
+ * @param string $caller optional caller param for debugging.
  * @throws MWException
  * @return bool
  */
@@ -2681,9 +2671,9 @@ function wfIniGetBool( $setting ) {
  * Wrapper function for PHP's dl(). This doesn't work in most situations from
  * PHP 5.3 onward, and is usually disabled in shared environments anyway.
  *
- * @param $extension String A PHP extension. The file suffix (.so or .dll)
+ * @param string $extension A PHP extension. The file suffix (.so or .dll)
  *                          should be omitted
- * @param $fileName String Name of the library, if not $extension.suffix
+ * @param string $fileName Name of the library, if not $extension.suffix
  * @return Bool - Whether or not the extension is loaded
  */
 function wfDl( $extension, $fileName = null ) {
@@ -2776,12 +2766,12 @@ function wfEscapeShellArg( ) {
 /**
  * Execute a shell command, with time and memory limits mirrored from the PHP
  * configuration if supported.
- * @param $cmd String Command line, properly escaped for shell.
+ * @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 $environ Array optional environment variables which should be
+ * @param array $environ optional environment variables which should be
  *                 added to the executed command environment.
- * @param $limits Array optional array with limits(filesize, memory, time, walltime)
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
  *                 this overwrites the global wgShellMax* limits.
  * @return string collected stdout as a string (trailing newlines stripped)
  */
@@ -2900,9 +2890,9 @@ function wfShellMaintenanceCmd( $script, array $parameters = array(), array $opt
  * Generate a shell-escaped command line string to run a MediaWiki cli script.
  * Note that $parameters should be a flat array and an option with an argument
  * should consist of two consecutive items in the array (do not use "--option value").
- * @param $script string MediaWiki cli script path
- * @param $parameters Array Arguments and options to the script
- * @param $options Array Associative array of options:
+ * @param string $script MediaWiki cli script path
+ * @param array $parameters Arguments and options to the script
+ * @param array $options Associative array of options:
  *             'php': The path to the php executable
  *             'wrapper': Path to a PHP wrapper to handle the maintenance script
  * @return Array
@@ -3004,9 +2994,9 @@ function wfMerge( $old, $mine, $yours, &$result ) {
  * Returns unified plain-text diff of two texts.
  * Useful for machine processing of diffs.
  *
- * @param $before String: the text before the changes.
- * @param $after String: the text after the changes.
- * @param $params String: 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' ) {
@@ -3127,7 +3117,7 @@ function wfUseMW( $req_ver ) {
  * We'll consider it so always, as we don't want '\s' in our Unix paths either.
  *
  * @param $path String
- * @param $suffix String: to remove if present
+ * @param string $suffix to remove if present
  * @return String
  */
 function wfBaseName( $path, $suffix = '' ) {
@@ -3147,8 +3137,8 @@ function wfBaseName( $path, $suffix = '' ) {
  * May explode on non-matching case-insensitive paths,
  * funky symlinks, etc.
  *
- * @param $path String: absolute destination path including target filename
- * @param $from String: Absolute source path, directory only
+ * @param string $path absolute destination path including target filename
+ * @param string $from Absolute source path, directory only
  * @return String
  */
 function wfRelativePath( $path, $from ) {
@@ -3304,7 +3294,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
  * Create an object with a given name and an array of construct parameters
  *
  * @param $name String
- * @param $p Array: parameters
+ * @param array $p parameters
  * @return object
  * @deprecated since 1.18, warnings in 1.18, removal in 1.20
  */
@@ -3331,7 +3321,7 @@ function wfHttpOnlySafe() {
 }
 
 /**
- * Check if there is sufficent entropy in php's built-in session generation
+ * Check if there is sufficient entropy in php's built-in session generation
  * @return bool true = there is sufficient entropy
  */
 function wfCheckEntropy() {
@@ -3494,7 +3484,7 @@ function wfSplitWikiID( $wiki ) {
  *                belongs to. May contain a single string if the query is only
  *                in one group.
  *
- * @param $wiki String: the wiki ID, or false for the current wiki
+ * @param string $wiki the wiki ID, or false for the current wiki
  *
  * Note: multiple calls to wfGetDB(DB_SLAVE) during the course of one request
  * will always return the same object, unless the underlying connection or load
@@ -3512,7 +3502,7 @@ function &wfGetDB( $db, $groups = array(), $wiki = false ) {
 /**
  * Get a load balancer object.
  *
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $wiki wiki ID, or false for the current wiki
  * @return LoadBalancer
  */
 function wfGetLB( $wiki = false ) {
@@ -3532,8 +3522,8 @@ function &wfGetLBFactory() {
  * Find a file.
  * Shortcut for RepoGroup::singleton()->findFile()
  *
- * @param $title String or Title object
- * @param $options array Associative array of options:
+ * @param string $title or Title object
+ * @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
  *                     created at the specified time.
@@ -3591,7 +3581,7 @@ function wfQueriesMustScale() {
  * extensions; this is a wrapper around $wgScriptExtension etc.
  * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
- * @param $script String: script filename, sans extension
+ * @param string $script script filename, sans extension
  * @return String
  */
 function wfScript( $script = 'index' ) {
@@ -3712,8 +3702,8 @@ function wfCountDown( $n ) {
  *              characters before hashing.
  * @return string
  * @codeCoverageIgnore
- * @deprecated since 1.20; Please use MWCryptRand for security purposes and wfRandomString for pesudo-random strings
- * @warning This method is NOT secure. Additionally it has many callers that use it for pesudo-random purposes.
+ * @deprecated since 1.20; Please use MWCryptRand for security purposes and wfRandomString for pseudo-random strings
+ * @warning This method is NOT secure. Additionally it has many callers that use it for pseudo-random purposes.
  */
 function wfGenerateToken( $salt = '' ) {
        wfDeprecated( __METHOD__, '1.20' );
@@ -3802,7 +3792,7 @@ function wfShorthandToInteger( $string = '' ) {
  * Get the normalised IETF language tag
  * See unit test for examples.
  *
- * @param $code String: The language code.
+ * @param string $code The language code.
  * @return String: The language code which complying with BCP 47 standards.
  */
 function wfBCP47( $code ) {
@@ -3885,8 +3875,8 @@ function wfGetLangConverterCacheStorage() {
 /**
  * Call hook functions defined in $wgHooks
  *
- * @param $event String: event name
- * @param $args Array: parameters passed to hook functions
+ * @param string $event event name
+ * @param array $args parameters passed to hook functions
  * @return Boolean True if no handler aborted the hook
  */
 function wfRunHooks( $event, $args = array() ) {
@@ -3896,9 +3886,9 @@ function wfRunHooks( $event, $args = array() ) {
 /**
  * Wrapper around php's unpack.
  *
- * @param $format String: The format string (See php's docs)
+ * @param string $format The format string (See php's docs)
  * @param $data: A binary string of binary data
- * @param $length integer or false: The minimun length of $data. This is to
+ * @param $length integer or false: The minimum length of $data. This is to
  *     prevent reading beyond the end of $data. false to disable the check.
  *
  * Also be careful when using this function to read unsigned 32 bit integer
@@ -3938,9 +3928,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 $name string the image name to check
+ * @param string $name the image name to check
  * @param $contextTitle Title|bool the page on which the image occurs, if known
- * @param $blacklist string wikitext of a file blacklist
+ * @param string $blacklist wikitext of a file blacklist
  * @return bool
  */
 function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
index 86eb38d..6863973 100644 (file)
@@ -112,6 +112,7 @@ class HTMLForm extends ContextSource {
                'submit' => 'HTMLSubmitField',
                'hidden' => 'HTMLHiddenField',
                'edittools' => 'HTMLEditTools',
+               'checkmatrix' => 'HTMLCheckMatrix',
 
                // HTMLTextField will output the correct type="" attribute automagically.
                // There are about four zillion other HTML5 input types, like url, but
@@ -189,10 +190,10 @@ class HTMLForm extends ContextSource {
 
        /**
         * Build a new HTMLForm from an array of field attributes
-        * @param $descriptor Array of Field constructs, as described above
+        * @param array $descriptor of Field constructs, as described above
         * @param $context IContextSource available since 1.18, will become compulsory in 1.18.
         *     Obviates the need to call $form->setTitle()
-        * @param $messagePrefix String 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 = '' ) {
                if ( $context instanceof IContextSource ) {
@@ -247,7 +248,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Set format in which to display the form
-        * @param $format String the name of the format to use, must be one of
+        * @param string $format the name of the format to use, must be one of
         *        $this->availableDisplayFormats
         * @throws MWException
         * @since 1.20
@@ -280,7 +281,7 @@ class HTMLForm extends ContextSource {
        /**
         * Initialise a new Object for the field
         * @param $fieldname string
-        * @param $descriptor string input Descriptor, as described above
+        * @param string $descriptor input Descriptor, as described above
         * @throws MWException
         * @return HTMLFormField subclass
         */
@@ -377,7 +378,7 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Validate all the fields, and call the submision callback
+        * Validate all the fields, and call the submission callback
         * function if everything is kosher.
         * @throws MWException
         * @return Mixed Bool true == Successful submission, Bool false
@@ -416,7 +417,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set a callback to a function to do something with the form
         * once it's been successfully validated.
-        * @param $cb String 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.
@@ -440,7 +441,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Set the introductory message, overwriting any existing message.
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setIntro( $msg ) {
@@ -451,7 +452,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the introductory message, overwriting any existing message.
         * @since 1.19
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setPreText( $msg ) {
@@ -461,7 +462,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add introductory text.
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function addPreText( $msg ) {
@@ -471,8 +472,8 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add header text, inside the form.
-        * @param $msg String complete text of message to display
-        * @param $section string 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)
         */
        function addHeaderText( $msg, $section = null ) {
@@ -490,7 +491,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set header text, inside the form.
         * @since 1.19
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @param $section The section to add the header to
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -505,8 +506,8 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add footer text, inside the form.
-        * @param $msg String complete text of message to display
-        * @param $section string The section to add the footer text to
+        * @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)
         */
        function addFooterText( $msg, $section = null ) {
@@ -524,8 +525,8 @@ class HTMLForm extends ContextSource {
        /**
         * Set footer text, inside the form.
         * @since 1.19
-        * @param $msg String complete text of message to display
-        * @param $section string The section to add the footer text to
+        * @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)
         */
        function setFooterText( $msg, $section = null ) {
@@ -539,7 +540,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add text to the end of the display.
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function addPostText( $msg ) {
@@ -549,7 +550,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Set text at the end of the display.
-        * @param $msg String complete text of message to display
+        * @param string $msg complete text of message to display
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setPostText( $msg ) {
@@ -559,8 +560,8 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add a hidden field to the output
-        * @param $name String field name.  This will be used exactly as entered
-        * @param $value String field value
+        * @param string $name field name.  This will be used exactly as entered
+        * @param string $value field value
         * @param $attribs Array
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -572,9 +573,9 @@ class HTMLForm extends ContextSource {
 
        /**
         * Add a button to the form
-        * @param $name String field name.
-        * @param $value String field value
-        * @param $id String DOM id for the button (default: null)
+        * @param string $name field name.
+        * @param string $value field value
+        * @param string $id DOM id for the button (default: null)
         * @param $attribs Array
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -624,7 +625,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Wrap the form innards in an actual "<form>" element
-        * @param $html String HTML contents to wrap.
+        * @param string $html HTML contents to wrap.
         * @return String wrapped HTML.
         */
        function wrapForm( $html ) {
@@ -764,7 +765,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Format a stack of error messages into a single HTML string
-        * @param $errors Array of message keys/values
+        * @param array $errors of message keys/values
         * @return String HTML, a "<ul>" list of errors
         */
        public static function formatErrors( $errors ) {
@@ -792,7 +793,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Set the text for the submit button
-        * @param $t String plaintext.
+        * @param string $t plaintext.
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setSubmitText( $t ) {
@@ -803,7 +804,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the text for the submit button to a message
         * @since 1.19
-        * @param $msg String message key
+        * @param string $msg message key
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setSubmitTextMsg( $msg ) {
@@ -822,7 +823,7 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * @param $name String Submit button name
+        * @param string $name Submit button name
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setSubmitName( $name ) {
@@ -831,7 +832,7 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * @param $name String Tooltip for the submit button
+        * @param string $name Tooltip for the submit button
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setSubmitTooltip( $name ) {
@@ -851,7 +852,7 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * @param $id String DOM id for the form
+        * @param string $id DOM id for the form
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setId( $id ) {
@@ -861,7 +862,7 @@ class HTMLForm extends ContextSource {
        /**
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this text as its "<legend>" element.
-        * @param $legend String HTML to go inside the "<legend>" element.
+        * @param string $legend HTML to go inside the "<legend>" element.
         *       Will be escaped
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -874,7 +875,7 @@ class HTMLForm extends ContextSource {
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this message as its "<legend>" element.
         * @since 1.19
-        * @param $msg String message key
+        * @param string $msg message key
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setWrapperLegendMsg( $msg ) {
@@ -885,7 +886,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the prefix for various default messages
         * @todo currently only used for the "<fieldset>" legend on forms
-        * with multiple sections; should be used elsewhre?
+        * with multiple sections; should be used elsewhere?
         * @param $p String
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -931,8 +932,8 @@ class HTMLForm extends ContextSource {
        /**
         * @todo Document
         * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
-        * @param $sectionName string ID attribute of the "<table>" tag for this section, ignored if empty
-        * @param $fieldsetIDPrefix string ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
+        * @param string $sectionName ID attribute of the "<table>" tag for this section, ignored if empty
+        * @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
         * @return String
         */
        public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
@@ -956,7 +957,7 @@ class HTMLForm extends ContextSource {
                                        $hasLabel = true;
                                }
                        } elseif ( is_array( $value ) ) {
-                               $section = $this->displaySection( $value, $key );
+                               $section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
                                $legend = $this->getLegend( $key );
                                if ( isset( $this->mSectionHeaders[$key] ) ) {
                                        $section = $this->mSectionHeaders[$key] . $section;
@@ -1029,7 +1030,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Stop a reset button being shown for this form
-        * @param $suppressReset Bool set to false to re-enable the
+        * @param bool $suppressReset set to false to re-enable the
         *       button again
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1099,7 +1100,7 @@ abstract class HTMLFormField {
         * This function must be implemented to return the HTML to generate
         * the input object itself.  It should not implement the surrounding
         * table cells/rows, or labels/help messages.
-        * @param $value String the value to set the input to; eg a default
+        * @param string $value the value to set the input to; eg a default
         *       text for a text input.
         * @return String valid HTML.
         */
@@ -1108,7 +1109,7 @@ abstract class HTMLFormField {
        /**
         * Get a translated interface message
         *
-        * This is a wrapper arround $this->mParent->msg() if $this->mParent is set
+        * This is a wrapper around $this->mParent->msg() if $this->mParent is set
         * and wfMessage() otherwise.
         *
         * Parameters are the same as wfMessage().
@@ -1131,8 +1132,8 @@ abstract class HTMLFormField {
         * 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 $value String the value the field was submitted with
-        * @param $alldata Array the data collected from the form
+        * @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.
         */
        function validate( $value, $alldata ) {
@@ -1181,7 +1182,7 @@ abstract class HTMLFormField {
 
        /**
         * Initialise the object
-        * @param $params array Associative Array. See HTMLForm doc for syntax.
+        * @param array $params Associative Array. See HTMLForm doc for syntax.
         * @throws MWException
         */
        function __construct( $params ) {
@@ -1250,7 +1251,7 @@ abstract class HTMLFormField {
        /**
         * Get the complete table row for the input, including help text,
         * labels, and whatever.
-        * @param $value String the value to set the input to.
+        * @param string $value the value to set the input to.
         * @return String complete HTML table row.
         */
        function getTableRow( $value ) {
@@ -1294,7 +1295,7 @@ abstract class HTMLFormField {
         * Get the complete div for the input, including help text,
         * labels, and whatever.
         * @since 1.20
-        * @param $value String the value to set the input to.
+        * @param string $value the value to set the input to.
         * @return String complete HTML table row.
         */
        public function getDiv( $value ) {
@@ -1321,11 +1322,11 @@ abstract class HTMLFormField {
         * Get the complete raw fields for the input, including help text,
         * labels, and whatever.
         * @since 1.20
-        * @param $value String the value to set the input to.
+        * @param string $value the value to set the input to.
         * @return String complete HTML table row.
         */
        public function getRaw( $value ) {
-               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+               list( $errors, ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
                $helptext = $this->getHelpTextHtmlRaw( $this->getHelpText() );
                $cellAttributes = array();
@@ -1419,7 +1420,7 @@ abstract class HTMLFormField {
        /**
         * Determine form errors to display and their classes
         * @since 1.20
-        * @param $value String the value of the input
+        * @param string $value the value of the input
         * @return Array
         */
        public function getErrorsAndErrorClass( $value ) {
@@ -1487,7 +1488,7 @@ abstract class HTMLFormField {
        /**
         * flatten an array of options to a single array, for instance,
         * a set of "<options>" inside "<optgroups>".
-        * @param $options array Associative Array with values either Strings
+        * @param array $options Associative Array with values either Strings
         *       or Arrays
         * @return Array flattened input
         */
@@ -1781,6 +1782,170 @@ class HTMLCheckField extends HTMLFormField {
        }
 }
 
+/**
+ * A checkbox matrix
+ * Operates similarly to HTMLMultiSelectField, but instead of using an array of
+ * options, uses an array of rows and an array of columns to dynamically
+ * construct a matrix of options.
+ */
+class HTMLCheckMatrix extends HTMLFormField {
+
+       function validate( $value, $alldata ) {
+               $rows = $this->mParams['rows'];
+               $columns = $this->mParams['columns'];
+
+               // Make sure user-defined validation callback is run
+               $p = parent::validate( $value, $alldata );
+               if ( $p !== true ) {
+                       return $p;
+               }
+
+               // Make sure submitted value is an array
+               if ( !is_array( $value ) ) {
+                       return false;
+               }
+
+               // If all options are valid, array_intersect of the valid options
+               // and the provided options will return the provided options.
+               $validOptions = array();
+               foreach ( $rows as $rowTag ) {
+                       foreach ( $columns as $columnTag ) {
+                               $validOptions[] = $columnTag . '-' . $rowTag;
+                       }
+               }
+               $validValues = array_intersect( $value, $validOptions );
+               if ( count( $validValues ) == count( $value ) ) {
+                       return true;
+               } else {
+                       return $this->msg( 'htmlform-select-badoption' )->parse();
+               }
+       }
+
+       /**
+        * Build a table containing a matrix of checkbox options.
+        * The value of each option is a combination of the row tag and column tag.
+        * 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
+        * @return String
+        */
+       function getInputHTML( $value ) {
+               $html = '';
+               $tableContents = '';
+               $attribs = array();
+               $rows = $this->mParams['rows'];
+               $columns = $this->mParams['columns'];
+
+               // If the disabled param is set, disable all the options
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $attribs['disabled'] = 'disabled';
+               }
+
+               // Build the column headers
+               $headerContents = Html::rawElement( 'td', array(), '&#160;' );
+               foreach ( $columns as $columnLabel => $columnTag ) {
+                       $headerContents .= Html::rawElement( 'td', array(), $columnLabel );
+               }
+               $tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
+
+               // Build the options matrix
+               foreach ( $rows as $rowLabel => $rowTag ) {
+                       $rowContents = Html::rawElement( 'td', array(), $rowLabel );
+                       foreach ( $columns as $columnTag ) {
+                               // Knock out any options that are not wanted
+                               if ( isset( $this->mParams['remove-options'] )
+                                       && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
+                               {
+                                       $rowContents .= Html::rawElement( 'td', array(), '&#160;' );
+                               } else {
+                                       // Construct the checkbox
+                                       $thisAttribs = array(
+                                               'id' => "{$this->mID}-$columnTag-$rowTag",
+                                               'value' => $columnTag . '-' . $rowTag
+                                       );
+                                       $checkbox = Xml::check(
+                                               $this->mName . '[]',
+                                               in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
+                                               $attribs + $thisAttribs );
+                                       $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+                               }
+                       }
+                       $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
+               }
+
+               // Put it all in a table
+               $html .= Html::rawElement( 'table', array( 'class' => 'mw-htmlform-matrix' ),
+                       Html::rawElement( 'tbody', array(), "\n$tableContents\n" ) ) . "\n";
+
+               return $html;
+       }
+
+       /**
+        * Get the complete table row for the input, including help text,
+        * labels, and whatever.
+        * We override this function since the label should always be on a separate
+        * 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
+        * @return String complete HTML table row
+        */
+       function getTableRow( $value ) {
+               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+               $inputHtml = $this->getInputHTML( $value );
+               $fieldType = get_class( $this );
+               $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
+               $cellAttributes = array( 'colspan' => 2 );
+
+               $label = $this->getLabelHtml( $cellAttributes );
+
+               $field = Html::rawElement(
+                       'td',
+                       array( 'class' => 'mw-input' ) + $cellAttributes,
+                       $inputHtml . "\n$errors"
+               );
+
+               $html = Html::rawElement( 'tr',
+                       array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+               $html .= Html::rawElement( 'tr',
+                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                       $field );
+
+               return $html . $helptext;
+       }
+
+       /**
+        * @param $request WebRequest
+        * @return Array
+        */
+       function loadDataFromRequest( $request ) {
+               if ( $this->mParent->getMethod() == 'post' ) {
+                       if ( $request->wasPosted() ) {
+                               // Checkboxes are not added to the request arrays if they're not checked,
+                               // so it's perfectly possible for there not to be an entry at all
+                               return $request->getArray( $this->mName, array() );
+                       } else {
+                               // That's ok, the user has not yet submitted the form, so show the defaults
+                               return $this->getDefault();
+                       }
+               } else {
+                       // This is the impossible case: if we look at $_GET and see no data for our
+                       // field, is it because the user has not yet submitted the form, or that they
+                       // have submitted it with all the options unchecked. We will have to assume the
+                       // latter, which basically means that you can't specify 'positive' defaults
+                       // for GET forms.
+                       return $request->getArray( $this->mName, array() );
+               }
+       }
+
+       function getDefault() {
+               if ( isset( $this->mDefault ) ) {
+                       return $this->mDefault;
+               } else {
+                       return array();
+               }
+       }
+}
+
 /**
  * A select dropdown field.  Basically a wrapper for Xmlselect class
  */
@@ -2057,8 +2222,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
        /**
         * Build a drop-down box from a textual list.
-        * @param $string String message text
-        * @param $otherName String name of "other reason" option
+        * @param string $string message text
+        * @param string $otherName name of "other reason" option
         * @return Array
         * TODO: this is copied from Xml::listDropDown(), deprecate/avoid duplication?
         */
@@ -2192,7 +2357,6 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
  */
 class HTMLRadioField extends HTMLFormField {
 
-
        function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
index 5974173..1af733a 100644 (file)
@@ -183,7 +183,6 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
        }
 }
 
-
 /**
  * Pointer object for an item within a CGZ blob stored in the text table.
  */
@@ -199,7 +198,7 @@ class HistoryBlobStub {
        var $mOldId, $mHash, $mRef;
 
        /**
-        * @param $hash string the content hash of the text
+        * @param string $hash the content hash of the text
         * @param $oldid Integer the old_id for the CGZ object
         */
        function __construct( $hash = '', $oldid = 0 ) {
@@ -285,7 +284,6 @@ class HistoryBlobStub {
        }
 }
 
-
 /**
  * To speed up conversion from 1.4 to 1.5 schema, text rows can refer to the
  * leftover cur table as the backend. This avoids expensively copying hundreds
index a29e5fe..8cc7ace 100644 (file)
@@ -45,7 +45,7 @@ class Hooks {
         *
         * @since 1.21
         *
-        * @param $name String: the name of the hook to clear.
+        * @param string $name the name of the hook to clear.
         *
         * @throws MWException if not in testing mode.
         */
@@ -57,13 +57,12 @@ class Hooks {
                unset( self::$handlers[$name] );
        }
 
-
        /**
         * Attach an event handler to a given hook
         *
         * @since 1.18
         *
-        * @param $name String: name of hook
+        * @param string $name name of hook
         * @param $callback Mixed: callback function to attach
         */
        public static function register( $name, $callback ) {
@@ -80,7 +79,7 @@ class Hooks {
         *
         * @since 1.18
         *
-        * @param $name String: name of hook
+        * @param string $name name of hook
         * @return Boolean: true if the hook has a function registered to it
         */
        public static function isRegistered( $name ) {
@@ -96,7 +95,7 @@ class Hooks {
         *
         * @throws MWException
         * @throws FatalError
-        * @param $name String: name of the hook
+        * @param string $name name of the hook
         *
         * @return array
         */
@@ -135,7 +134,7 @@ class Hooks {
        /**
         * Call hook functions defined in Hooks::register
         *
-        * @param $event String: event name
+        * @param string $event event name
         * @param $args  Array: parameters passed to hook functions
         *
         * @throws MWException
@@ -303,8 +302,8 @@ class Hooks {
         *
         * @since 1.18
         *
-        * @param $errno int Unused
-        * @param $errstr String: error message
+        * @param int $errno Unused
+        * @param string $errstr error message
         * @throws MWHookException
         * @return Boolean: false
         */
index 60be863..af4b4bb 100644 (file)
@@ -126,11 +126,11 @@ class Html {
         * content model.  If $wgWellFormedXml is false, then a few bytes will be
         * shaved off the HTML output as well.
         *
-        * @param $element string The element's name, e.g., 'a'
-        * @param $attribs array  Associative array of attributes, e.g., array(
+        * @param string $element The element's name, e.g., 'a'
+        * @param array $attribs  Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
         *   further documentation.
-        * @param $contents string The raw HTML contents of the element: *not*
+        * @param string $contents The raw HTML contents of the element: *not*
         *   escaped!
         * @return string Raw HTML
         */
@@ -250,7 +250,7 @@ class Html {
         * it returns the empty string when that's guaranteed to be safe.
         *
         * @since 1.17
-        * @param $element string Name of the element, e.g., 'a'
+        * @param string $element Name of the element, e.g., 'a'
         * @return string A closing tag, if required
         */
        public static function closeElement( $element ) {
@@ -287,8 +287,8 @@ class Html {
         * only guarantees that the output array should be functionally identical
         * to the input array (currently per the HTML 5 draft as of 2009-09-06).
         *
-        * @param $element string Name of the element, e.g., 'a'
-        * @param $attribs array  Associative array of attributes, e.g., array(
+        * @param string $element Name of the element, e.g., 'a'
+        * @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
@@ -435,7 +435,7 @@ class Html {
         *     // gives '<em class="bar quux"></em>'
         * @endcode
         *
-        * @param $attribs array Associative array of attributes, e.g., array(
+        * @param array $attribs Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ).  Values will be HTML-escaped.
         *   A value of false means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., array( 'checked' ) instead of
@@ -500,7 +500,7 @@ class Html {
                        if ( in_array( $key, $spaceSeparatedListAttributes ) ) {
                                // Apply some normalization and remove duplicates
 
-                               // Convert into correct array. Array can contain space-seperated
+                               // Convert into correct array. Array can contain space-separated
                                // values. Implode/explode to get those into the main array as well.
                                if ( is_array( $value ) ) {
                                        // If input wasn't an array, we can skip this step
@@ -512,7 +512,7 @@ class Html {
                                                        if ( !isset( $value[$v] ) ) {
                                                                // As a special case don't set 'foo' if a
                                                                // separate 'foo' => true/false exists in the array
-                                                               // keys should be authoritive
+                                                               // keys should be authoritative
                                                                $newValue[] = $v;
                                                        }
                                                } elseif ( $v ) {
@@ -598,7 +598,7 @@ class Html {
         * @todo do some useful escaping as well, like if $contents contains
         * literal "</script>" or (for XML) literal "]]>".
         *
-        * @param $contents string JavaScript
+        * @param string $contents JavaScript
         * @return string Raw HTML
         */
        public static function inlineScript( $contents ) {
@@ -641,7 +641,7 @@ class Html {
         * (if any).  TODO: do some useful escaping as well, like if $contents
         * contains literal "</style>" (admittedly unlikely).
         *
-        * @param $contents string CSS
+        * @param string $contents CSS
         * @param $media mixed A media type string, like 'screen'
         * @return string Raw HTML
         */
@@ -683,7 +683,7 @@ class Html {
         * @param $name    string name attribute
         * @param $value   mixed  value attribute
         * @param $type    string type attribute
-        * @param $attribs array  Associative array of miscellaneous extra
+        * @param array $attribs  Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -700,7 +700,7 @@ class Html {
         *
         * @param $name    string name attribute
         * @param $value   string value attribute
-        * @param $attribs array  Associative array of miscellaneous extra
+        * @param array $attribs  Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -718,7 +718,7 @@ class Html {
         *
         * @param $name    string name attribute
         * @param $value   string value attribute
-        * @param $attribs array  Associative array of miscellaneous extra
+        * @param array $attribs  Associative array of miscellaneous extra
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
@@ -757,7 +757,7 @@ class Html {
         * - 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 $selectAttribs array HTML attributes for the generated select element.
+        * @param array $selectAttribs HTML attributes for the generated select element.
         * - id:   [optional], default: 'namespace'
         * - name: [optional], default: 'namespace'
         * @return string HTML code to select a namespace.
@@ -796,7 +796,7 @@ class Html {
                        // Value is provided by user, the name shown is localized for the user.
                        $options[$params['all']] = wfMessage( 'namespacesall' )->text();
                }
-               // Add all namespaces as options (in the content langauge)
+               // Add all namespaces as options (in the content language)
                $options += $wgContLang->getFormattedNamespaces();
 
                // Convert $options to HTML and filter out namespaces below 0
@@ -807,7 +807,7 @@ class Html {
                        }
                        if ( $nsId === NS_MAIN ) {
                                // For other namespaces use use the namespace prefix as label, but for
-                               // main we don't use "" but the user message descripting it (e.g. "(Main)" or "(Article)")
+                               // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
                                $nsName = wfMessage( 'blanknamespace' )->text();
                        } elseif ( is_int( $nsId ) ) {
                                $nsName = $wgContLang->convertNamespace( $nsId );
@@ -852,7 +852,7 @@ class Html {
         * Constructs the opening html-tag with necessary doctypes depending on
         * global variables.
         *
-        * @param $attribs array  Associative array of miscellaneous extra
+        * @param array $attribs  Associative array of miscellaneous extra
         *   attributes, passed to Html::element() of html tag.
         * @return string  Raw HTML
         */
@@ -914,10 +914,10 @@ class Html {
        /**
         * Get HTML for an info box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMessage()->plain()
-        * @param $icon String: icon name, file in skins/common/images
-        * @param $alt String: alternate text for the icon
-        * @param $class String: additional class name to add to the wrapper div
+        * @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
         *
         * @return string
diff --git a/includes/HttpFunctions.old.php b/includes/HttpFunctions.old.php
deleted file mode 100644 (file)
index feb9b93..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Class alias kept for backward compatibility.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup HTTP
- */
-
-/**
- * HttpRequest was renamed to MWHttpRequest in order
- * to prevent conflicts with PHP's HTTP extension
- * which also defines an HttpRequest class.
- * http://www.php.net/manual/en/class.httprequest.php
- *
- * This is for backwards compatibility.
- * @since 1.17
- */
-class HttpRequest extends MWHttpRequest { }
index 6a348a6..dc65c67 100644 (file)
@@ -35,9 +35,9 @@ class Http {
        /**
         * Perform an HTTP request
         *
-        * @param $method String: HTTP method. Usually GET/POST
-        * @param $url String: full URL to act on. If protocol-relative, will be expanded to an http:// URL
-        * @param $options Array: options to pass to MWHttpRequest object.
+        * @param string $method HTTP method. Usually GET/POST
+        * @param string $url full URL to act on. If protocol-relative, will be expanded to an http:// URL
+        * @param array $options options to pass to MWHttpRequest object.
         *      Possible keys for the array:
         *    - timeout             Timeout length in seconds
         *    - postData            An array of key-value pairs or a url-encoded form data
@@ -45,9 +45,7 @@ class Http {
         *                          Otherwise it will use $wgHTTPProxy (if set)
         *                          Otherwise it will use the environment variable "http_proxy" (if set)
         *    - noProxy             Don't use any proxy at all. Takes precedence over proxy value(s).
-        *    - sslVerifyHost       (curl only) Set to 2 to verify hostname against certificate
-        *                                  Setting to 1 (or true) will NOT verify the host name. It will
-        *                                  only check its existence. Setting to 0 (or false) disables entirely.
+        *    - sslVerifyHost       (curl only) Verify hostname against certificate
         *    - sslVerifyCert       (curl only) Verify SSL certificate
         *    - caInfo              (curl only) Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
@@ -105,7 +103,7 @@ class Http {
        /**
         * Check if the URL can be served by localhost
         *
-        * @param $url String: full url to check
+        * @param string $url full url to check
         * @return Boolean
         */
        public static function isLocalURL( $url ) {
@@ -187,15 +185,7 @@ class MWHttpRequest {
        protected $postData = null;
        protected $proxy = null;
        protected $noProxy = false;
-       /**
-        * Parameter passed to Curl that specifies whether
-        * to validate SSL certificates.
-        *
-        * Setting to 0 disables entirely. Setting to 1 checks
-        * the existence of a CN, but doesn't verify it. Setting
-        * to 2 (the default) actually verifies the host.
-        */
-       protected $sslVerifyHost = 2;
+       protected $sslVerifyHost = true;
        protected $sslVerifyCert = true;
        protected $caInfo = null;
        protected $method = "GET";
@@ -219,8 +209,8 @@ class MWHttpRequest {
        public $status;
 
        /**
-        * @param $url String: url to use. If protocol-relative, will be expanded to an http:// URL
-        * @param $options Array: (optional) extra params to pass (see Http::request())
+        * @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() ) {
                global $wgHTTPTimeout;
@@ -273,8 +263,8 @@ class MWHttpRequest {
 
        /**
         * Generate a new request object
-        * @param $url String: url to use
-        * @param $options Array: (optional) extra params to pass (see Http::request())
+        * @param string $url url to use
+        * @param array $options (optional) extra params to pass (see Http::request())
         * @throws MWException
         * @return CurlHttpRequest|PhpHttpRequest
         * @see MWHttpRequest::__construct
@@ -345,7 +335,7 @@ class MWHttpRequest {
        }
 
        /**
-        * Set the refererer header
+        * Set the referrer header
         */
        public function setReferer( $url ) {
                $this->setHeader( 'Referer', $url );
@@ -460,7 +450,7 @@ class MWHttpRequest {
 
        /**
         * Parses the headers, including the HTTP status code and any
-        * Set-Cookie headers.  This function expectes the headers to be
+        * Set-Cookie headers.  This function expects the headers to be
         * found in an array in the member variable headerList.
         */
        protected function parseHeader() {
@@ -516,7 +506,6 @@ class MWHttpRequest {
                return (int)$this->respStatus;
        }
 
-
        /**
         * Returns true if the last status code was a redirect.
         *
@@ -653,7 +642,7 @@ class MWHttpRequest {
 
                                if ( isset( $url['host'] ) ) {
                                        $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
-                                       break;  //found correct URI (with host)
+                                       break; //found correct URI (with host)
                                } else {
                                        $foundRelativeURI = true;
                                }
@@ -731,13 +720,8 @@ class CurlHttpRequest extends MWHttpRequest {
                }
                $this->curlOptions[CURLOPT_USERAGENT] = $this->reqHeaders['User-Agent'];
 
-               if ( isset( $this->sslVerifyHost ) ) {
-                       $this->curlOptions[CURLOPT_SSL_VERIFYHOST] = $this->sslVerifyHost;
-               }
-
-               if ( isset( $this->sslVerifyCert ) ) {
-                       $this->curlOptions[CURLOPT_SSL_VERIFYPEER] = $this->sslVerifyCert;
-               }
+               $this->curlOptions[CURLOPT_SSL_VERIFYHOST] = $this->sslVerifyHost ? 2 : 0;
+               $this->curlOptions[CURLOPT_SSL_VERIFYPEER] = $this->sslVerifyCert;
 
                if ( $this->caInfo ) {
                        $this->curlOptions[CURLOPT_CAINFO] = $this->caInfo;
index 5c50c22..72b9a52 100644 (file)
@@ -77,7 +77,7 @@ class IP {
         * SIIT IPv4-translated addresses are rejected.
         * Note: canonicalize() tries to convert translated addresses to IPv4.
         *
-        * @param $ip String: possible IP address
+        * @param string $ip possible IP address
         * @return Boolean
         */
        public static function isIPAddress( $ip ) {
@@ -88,7 +88,7 @@ class IP {
         * Given a string, determine if it as valid IP in IPv6 only.
         * Note: Unlike isValid(), this looks for networks too.
         *
-        * @param $ip String: possible IP address
+        * @param string $ip possible IP address
         * @return Boolean
         */
        public static function isIPv6( $ip ) {
@@ -99,7 +99,7 @@ class IP {
         * Given a string, determine if it as valid IP in IPv4 only.
         * Note: Unlike isValid(), this looks for networks too.
         *
-        * @param $ip String: possible IP address
+        * @param string $ip possible IP address
         * @return Boolean
         */
        public static function isIPv4( $ip ) {
@@ -137,7 +137,7 @@ class IP {
         * IPv6 addresses in octet notation are expanded to 8 words.
         * IPv4 addresses are just trimmed.
         *
-        * @param $ip String: IP address in quad or octet form (CIDR or not).
+        * @param string $ip IP address in quad or octet form (CIDR or not).
         * @return String
         */
        public static function sanitizeIP( $ip ) {
@@ -180,7 +180,7 @@ class IP {
                                $ip
                        );
                }
-               // Remove leading zereos from each bloc as needed
+               // Remove leading zeros from each bloc as needed
                $ip = preg_replace( '/(^|:)0+(' . RE_IPV6_WORD . ')/', '$1$2', $ip );
                return $ip;
        }
@@ -241,7 +241,7 @@ class IP {
         *
         * A bare IPv6 address is accepted despite the lack of square brackets.
         *
-        * @param $both string The string with the host and port
+        * @param string $both The string with the host and port
         * @return array
         */
        public static function splitHostAndPort( $both ) {
@@ -316,7 +316,7 @@ class IP {
        /**
         * Convert an IPv4 or IPv6 hexadecimal representation back to readable format
         *
-        * @param $hex String: number, with "v6-" prefix if it is IPv6
+        * @param string $hex number, with "v6-" prefix if it is IPv6
         * @return String: quad-dotted (IPv4) or octet notation (IPv6)
         */
        public static function formatHex( $hex ) {
@@ -444,7 +444,7 @@ class IP {
         * function for an IPv6 address will be prefixed with "v6-", a non-
         * hexadecimal string which sorts after the IPv4 addresses.
         *
-        * @param $ip String: quad dotted/octet IP address.
+        * @param string $ip quad dotted/octet IP address.
         * @return String
         */
        public static function toHex( $ip ) {
@@ -462,7 +462,7 @@ class IP {
        /**
         * Given an IPv6 address in octet notation, returns a pure hex string.
         *
-        * @param $ip String: octet ipv6 IP address.
+        * @param string $ip octet ipv6 IP address.
         * @return String: pure hex (uppercase)
         */
        private static function IPv6ToRawHex( $ip ) {
@@ -482,7 +482,7 @@ class IP {
         * Like ip2long() except that it actually works and has a consistent error return value.
         * Comes from ProxyTools.php
         *
-        * @param $ip String: quad dotted IP address.
+        * @param string $ip quad dotted IP address.
         * @return Mixed: string/int/false
         */
        public static function toUnsigned( $ip ) {
@@ -509,7 +509,7 @@ class IP {
         * Convert a network specification in CIDR notation
         * to an integer network and a number of bits
         *
-        * @param $range String: IP with CIDR prefix
+        * @param string $range IP with CIDR prefix
         * @return array(int or string, int)
         */
        public static function parseCIDR( $range ) {
@@ -551,7 +551,7 @@ class IP {
         *     2001:0db8:85a3::7344/96                                   CIDR
         *     2001:0db8:85a3::7344 - 2001:0db8:85a3::7344   Explicit range
         *     2001:0db8:85a3::7344                                      Single IP
-        * @param $range String: IP range
+        * @param string $range IP range
         * @return array(string, string)
         */
        public static function parseRange( $range ) {
@@ -692,8 +692,8 @@ class IP {
        /**
         * Determine if a given IPv4/IPv6 address is in a given CIDR network
         *
-        * @param $addr String: the address to check against the given range.
-        * @param $range String: the range to check the given address against.
+        * @param string $addr the address to check against the given range.
+        * @param string $range the range to check the given address against.
         * @return Boolean: whether or not the given address is in the given range.
         */
        public static function isInRange( $addr, $range ) {
@@ -710,7 +710,7 @@ class IP {
         * This currently only checks a few IPV4-to-IPv6 related cases.  More
         * unusual representations may be added later.
         *
-        * @param $addr String: something that might be an IP address
+        * @param string $addr something that might be an IP address
         * @return String: valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
@@ -742,13 +742,13 @@ class IP {
                        return long2ip( ( hexdec( $m[1] ) << 16 ) + hexdec( $m[2] ) );
                }
 
-               return null;  // give up
+               return null; // give up
        }
 
        /**
-        * Gets rid of uneeded numbers in quad-dotted/octet IP strings
+        * Gets rid of unneeded numbers in quad-dotted/octet IP strings
         * For example, 127.111.113.151/24 -> 127.111.113.0/24
-        * @param $range String: IP address to normalize
+        * @param string $range IP address to normalize
         * @return string
         */
        public static function sanitizeRange( $range ) {
index 037093a..1556ad9 100644 (file)
@@ -93,7 +93,7 @@ class ImageGallery {
        /**
         * Set the caption (as plain text)
         *
-        * @param $caption string Caption
+        * @param string $caption Caption
         */
        function setCaption( $caption ) {
                $this->mCaption = htmlspecialchars( $caption );
@@ -102,7 +102,7 @@ class ImageGallery {
        /**
         * Set the caption (as HTML)
         *
-        * @param $caption String: Caption
+        * @param string $caption Caption
         */
        public function setCaptionHtml( $caption ) {
                $this->mCaption = $caption;
@@ -220,7 +220,7 @@ class ImageGallery {
         * Note -- if taking from user input, you should probably run through
         * Sanitizer::validateAttributes() first.
         *
-        * @param $attribs Array of HTML attribute pairs
+        * @param array $attribs of HTML attribute pairs
         */
        function setAttributes( $attribs ) {
                $this->mAttribs = $attribs;
@@ -238,8 +238,6 @@ class ImageGallery {
         * @return string
         */
        function toHTML() {
-               global $wgLang;
-
                if ( $this->mPerRow > 0 ) {
                        $maxwidth = $this->mPerRow * ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING + self::GB_BORDERS );
                        $oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
@@ -255,6 +253,7 @@ class ImageGallery {
                        $output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
                }
 
+               $lang = $this->getLang();
                $params = array(
                        'width' => $this->mWidths,
                        'height' => $this->mHeights
@@ -337,7 +336,7 @@ class ImageGallery {
 
                        if( $this->mShowBytes ) {
                                if( $img ) {
-                                       $fileSize = htmlspecialchars( $wgLang->formatSize( $img->getSize() ) );
+                                       $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
                                } else {
                                        $fileSize = wfMessage( 'filemissing' )->escaped();
                                }
@@ -349,7 +348,7 @@ class ImageGallery {
                        $textlink = $this->mShowFilename ?
                                Linker::link(
                                        $nt,
-                                       htmlspecialchars( $wgLang->truncate( $nt->getText(), $this->mCaptionLength ) ),
+                                       htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
                                        array(),
                                        array(),
                                        array( 'known', 'noclasses' )
@@ -361,7 +360,7 @@ class ImageGallery {
                        # http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
 
                        # Weird double wrapping (the extra div inside the li) needed due to FF2 bug
-                       # Can be safely removed if FF2 falls completely out of existance
+                       # Can be safely removed if FF2 falls completely out of existence
                        $output .=
                                "\n\t\t" . '<li class="gallerybox" style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
                                        . '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
@@ -403,4 +402,15 @@ class ImageGallery {
                        : false;
        }
 
+       /**
+        * Determines the correct language to be used for this image gallery
+        * @return Language object
+        */
+       private function getLang() {
+               global $wgLang;
+               return $this->mParser
+                       ? $this->mParser->getTargetLanguage()
+                       : $wgLang;
+       }
+
 } //class
index 0b814ec..b3a485a 100644 (file)
@@ -50,7 +50,7 @@ class ImagePage extends Article {
 
        /**
         * Constructor from a page id
-        * @param $id Int article ID to load
+        * @param int $id article ID to load
         * @return ImagePage|null
         */
        public static function newFromID( $id ) {
@@ -108,7 +108,7 @@ class ImagePage extends Article {
                $diff = $request->getVal( 'diff' );
                $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
 
-               if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
+               if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
                        parent::view();
                        return;
                }
@@ -116,7 +116,7 @@ class ImagePage extends Article {
                $this->loadFile();
 
                if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
-                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || isset( $diff ) ) {
+                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
                                // mTitle is the same as the redirect target so ask Article
                                // to perform the redirect for us.
                                $request->setVal( 'diffonly', 'true' );
@@ -250,7 +250,7 @@ class ImagePage extends Article {
         *
         * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
         *
-        * @param $metadata Array: the array containing the EXIF data
+        * @param array $metadata the array containing the EXIF data
         * @return String The metadata table. This is treated as Wikitext (!)
         */
        protected function makeMetadataTable( $metadata ) {
@@ -262,7 +262,7 @@ class ImagePage extends Article {
                                # @todo FIXME: Why is this using escapeId for a class?!
                                $class = Sanitizer::escapeId( $v['id'] );
                                if ( $type == 'collapsed' ) {
-                                       $class .= ' collapsable';
+                                       $class .= ' collapsable'; // sic
                                }
                                $r .= "<tr class=\"$class\">\n";
                                $r .= "<th>{$v['name']}</th>\n";
@@ -330,13 +330,13 @@ class ImagePage extends Article {
                                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 divison by 0. bug 36911
-                                               $height = round( $height * $maxWidth / $width ); // FIXME: Possible divison by 0. bug 36911
+                                       if ( $width / $height >= $maxWidth / $maxHeight ) { // FIXME: Possible division by 0. bug 36911
+                                               $height = round( $height * $maxWidth / $width ); // FIXME: Possible division by 0. bug 36911
                                                $width = $maxWidth;
                                                # Note that $height <= $maxHeight now.
                                        } else {
-                                               $newwidth = floor( $width * $maxHeight / $height ); // FIXME: Possible divison by 0. bug 36911
-                                               $height = round( $height * $newwidth / $width ); // FIXME: Possible divison by 0. bug 36911
+                                               $newwidth = floor( $width * $maxHeight / $height ); // FIXME: Possible division by 0. bug 36911
+                                               $height = round( $height * $newwidth / $width ); // FIXME: Possible division by 0. bug 36911
                                                $width = $newwidth;
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
@@ -550,7 +550,7 @@ EOT
                                $nofile = 'filepage-nofile';
                        }
                        // Note, if there is an image description page, but
-                       // no image, then this setRobotPolicy is overriden
+                       // no image, then this setRobotPolicy is overridden
                        // by Article::View().
                        $out->setRobotPolicy( 'noindex,nofollow' );
                        $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
@@ -565,7 +565,7 @@ EOT
 
        /**
         * Creates an thumbnail of specified size and returns an HTML link to it
-        * @param $params array Scaler parameters
+        * @param array $params Scaler parameters
         * @param $width int
         * @param $height int
         * @return string
@@ -906,17 +906,17 @@ EOT
        }
 
        /**
-        * Returns the corrosponding $wgImageLimits entry for the selected user option
+        * Returns the corresponding $wgImageLimits entry for the selected user option
         *
         * @param $user User
-        * @param $optionName string Name of a option to check, typically imagesize or thumbsize
+        * @param string $optionName Name of a option to check, typically imagesize or thumbsize
         * @return array
         * @since 1.21
         */
        public function getImageLimitsFromOption( $user, $optionName ) {
                global $wgImageLimits;
 
-               $option = intval( $user->getOption( $optionName ) );
+               $option = $user->getIntOption( $optionName );
                if ( !isset( $wgImageLimits[$option] ) ) {
                        $option = User::getDefaultOption( $optionName );
                }
index 15e6620..fee636f 100644 (file)
@@ -225,7 +225,7 @@ class WikiImporter {
                                } else {
                                        // set namespace to 'all', so the namespace check in processTitle() can passed
                                        $this->setTargetNamespace( null );
-                                       $this->mTargetRootPage = $title->getPrefixedDBKey();
+                                       $this->mTargetRootPage = $title->getPrefixedDBkey();
                                }
                        }
                }
@@ -330,8 +330,8 @@ class WikiImporter {
         * @param $title Title
         * @param $origTitle Title
         * @param $revCount Integer
-        * @param $sucCount Int: number of revisions for which callback returned true
-        * @param $pageInfo Array: associative array of page information
+        * @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 ) ) {
@@ -1531,7 +1531,7 @@ class WikiRevision {
                }
 
                if ( $status->isGood() ) {
-                       wfDebug( __METHOD__ . ": Succesful\n" );
+                       wfDebug( __METHOD__ . ": Successful\n" );
                        return true;
                } else {
                        wfDebug( __METHOD__ . ': failed: ' . $status->getXml() . "\n" );
@@ -1646,7 +1646,7 @@ class ImportStreamSource {
        static function newFromUpload( $fieldname = "xmlimport" ) {
                $upload =& $_FILES[$fieldname];
 
-               if( !isset( $upload ) || !$upload['name'] ) {
+               if( $upload === null || !$upload['name'] ) {
                        return Status::newFatal( 'importnofile' );
                }
                if( !empty( $upload['error'] ) ) {
index a8540f2..66f9544 100644 (file)
@@ -120,7 +120,7 @@ class MWInit {
         *
         *    require( MWInit::extSetupPath( 'ParserFunctions/ParserFunctions.php' ) );
         *
-        * @param $extRel string The path relative to the extensions directory, as defined by
+        * @param string $extRel The path relative to the extensions directory, as defined by
         *   $wgExtensionsDirectory.
         *
         * @return string
@@ -173,7 +173,7 @@ class MWInit {
        }
 
        /**
-        * Determine wether a method exists within a class, using a method which works
+        * Determine whether a method exists within a class, using a method which works
         * under HipHop.
         *
         * Note that under HipHop when method_exists is given a string for it's class
index 4d2229f..e8aee0b 100644 (file)
@@ -211,7 +211,7 @@ class License {
        /**
         * Constructor
         *
-        * @param $str String: license name??
+        * @param string $str license name??
         */
        function __construct( $str ) {
                list( $text, $template ) = explode( '|', strrev( $str ), 2 );
index 28379c7..11b6559 100644 (file)
@@ -20,7 +20,6 @@
  * @file
  */
 
-
 /**
  * Some functions to help implement an external link filter for spam control.
  *
@@ -37,7 +36,7 @@ class LinkFilter {
         * Check whether $content contains a link to $filterEntry
         *
         * @param $content Content: content to check
-        * @param $filterEntry String: domainparts, see makeRegex() for more details
+        * @param string $filterEntry domainparts, see makeRegex() for more details
         * @return Integer: 0 if no match or 1 if there's at least one match
         */
        static function matchEntry( Content $content, $filterEntry ) {
@@ -57,7 +56,7 @@ class LinkFilter {
        /**
         * Builds a regex pattern for $filterEntry.
         *
-        * @param $filterEntry String: URL, if it begins with "*.", it'll be
+        * @param string $filterEntry URL, if it begins with "*.", it'll be
         *        replaced to match any subdomain
         * @return String: regex pattern, for preg_match()
         */
@@ -85,7 +84,7 @@ class LinkFilter {
         *
         * Asterisks in any other location are considered invalid.
         *
-        * @param $filterEntry String: domainparts
+        * @param string $filterEntry domainparts
         * @param $prot        String: protocol
         * @return Array to be passed to DatabaseBase::buildLike() or false on error
         */
@@ -119,13 +118,13 @@ class LinkFilter {
                // Reverse the labels in the hostname, convert to lower case
                // For emails reverse domainpart only
                if ( $prot == 'mailto:' && strpos( $host, '@' ) ) {
-                       // complete email adress
+                       // complete email address
                        $mailparts = explode( '@', $host );
                        $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
                        $host = $domainpart . '@' . $mailparts[0];
                        $like = array( "$prot$host", $db->anyString() );
                } elseif ( $prot == 'mailto:' ) {
-                       // domainpart of email adress only. do not add '.'
+                       // domainpart of email address only. do not add '.'
                        $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
                        $like = array( "$prot$host", $db->anyString() );
                } else {
@@ -149,7 +148,7 @@ class LinkFilter {
        /**
         * Filters an array returned by makeLikeArray(), removing everything past first pattern placeholder.
         *
-        * @param $arr array: array to filter
+        * @param array $arr array to filter
         * @return array filtered array
         */
        public static function keepOneWildcard( $arr ) {
index a96bc5f..972adfc 100644 (file)
@@ -36,10 +36,10 @@ class Linker {
        const TOOL_LINKS_EMAIL = 2;
 
        /**
-        * Get the appropriate HTML attributes to add to the "a" element of an ex-
-        * ternal link, as created by [wikisyntax].
+        * Get the appropriate HTML attributes to add to the "a" element of an
+        * external link, as created by [wikisyntax].
         *
-        * @param $class String: 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
@@ -50,13 +50,12 @@ class Linker {
        }
 
        /**
-        * Get the appropriate HTML attributes to add to the "a" element of an in-
-        * terwiki link.
+        * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
         *
-        * @param $title String: 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 $unused String: unused
-        * @param $class String: 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
         */
@@ -73,13 +72,12 @@ class Linker {
        }
 
        /**
-        * Get the appropriate HTML attributes to add to the "a" element of an in-
-        * ternal link.
+        * Get the appropriate HTML attributes to add to the "a" element of an internal link.
         *
-        * @param $title String: 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 $unused String: unused
-        * @param $class String: 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 = '' ) {
@@ -89,12 +87,12 @@ class Linker {
        }
 
        /**
-        * Get the appropriate HTML attributes to add to the "a" element of an in-
-        * ternal link, given the Title object for the page we want to link to.
+        * 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 $unused String: unused
-        * @param $class String: the contents of the class attribute, default none
+        * @param string $unused unused
+        * @param string $class the contents of the class attribute, default none
         * @param $title Mixed: optional (unescaped) string to use in the title
         *   attribute; if false, default to the name of the page we're linking to
         * @return string
@@ -171,15 +169,15 @@ class Linker {
         *   the link text.  This is raw HTML and will not be escaped.  If null,
         *   defaults to the prefixed text of the Title; or if the Title is just a
         *   fragment, the contents of the fragment.
-        * @param $customAttribs array  A key => value array of extra HTML attri-
-        *   butes, such as title and class.  (href is ignored.)  Classes will be
+        * @param array $customAttribs  A key => value array of extra HTML attributes,
+        *   such as title and class.  (href is ignored.)  Classes will be
         *   merged with the default classes, while other attributes will replace
         *   default attributes.  All passed attribute values will be HTML-escaped.
         *   A false attribute value means to suppress that attribute.
         * @param $query         array  The query string to append to the URL
         *   you're linking to, in key => value array form.  Query keys and values
         *   will be URL-encoded.
-        * @param $options string|array  String or array of strings:
+        * @param string|array $options  String or array of strings:
         *     'known': Page is known to exist, so don't check if it does.
         *     'broken': Page is known not to exist, so don't check if it does.
         *     'noclasses': Don't add any classes automatically (includes "new",
@@ -275,7 +273,7 @@ class Linker {
         * Returns the Url used to link to a Title
         *
         * @param $target Title
-        * @param $query Array: query parameters
+        * @param array $query query parameters
         * @param $options Array
         * @return String
         */
@@ -382,13 +380,13 @@ class Linker {
         * @return string
         */
        private static function linkText( $target ) {
-               # We might be passed a non-Title by make*LinkObj().  Fail gracefully.
+               // We might be passed a non-Title by make*LinkObj().  Fail gracefully.
                if ( !$target instanceof Title ) {
                        return '';
                }
 
-               # If the target is just a fragment, with no title, we return the frag-
-               # ment text.  Otherwise, we return the title text itself.
+               // If the target is just a fragment, with no title, we return the fragment
+               // text.  Otherwise, we return the title text itself.
                if ( $target->getPrefixedText() === '' && $target->getFragment() !== '' ) {
                        return htmlspecialchars( $target->getFragment() );
                }
@@ -424,10 +422,10 @@ class Linker {
         * despite $query not being used.
         *
         * @param $nt Title
-        * @param $html String [optional]
-        * @param $query String [optional]
-        * @param $trail String [optional]
-        * @param $prefix String [optional]
+        * @param string $html [optional]
+        * @param string $query [optional]
+        * @param string $trail [optional]
+        * @param string $prefix [optional]
         *
         *
         * @return string
@@ -446,8 +444,8 @@ class Linker {
         * a value indicating that the title object is invalid.
         *
         * @param $context IContextSource context to use to get the messages
-        * @param $namespace int Namespace number
-        * @param $title string Text of the title, without the namespace part
+        * @param int $namespace Namespace number
+        * @param string $title Text of the title, without the namespace part
         * @return string
         */
        public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
@@ -534,7 +532,7 @@ class Linker {
         * @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 $frameParams Array: associative array of parameters external to the media handler.
+        * @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
@@ -552,13 +550,13 @@ class Linker {
         *          caption         HTML for image caption.
         *          link-url        URL to link to
         *          link-title      Title object to link to
-        *          link-target     Value for the target attribue, only with link-url
+        *          link-target     Value for the target attribute, only with link-url
         *          no-link         Boolean, suppress description link
         *
-        * @param $handlerParams Array: associative array of media handler parameters, to be passed
+        * @param array $handlerParams associative array of media handler parameters, to be passed
         *       to transform(). Typical keys are "width" and "page".
-        * @param $time String: timestamp of the file, set as false for current
-        * @param $query String: query params for desc url
+        * @param string $time timestamp of the file, set as false for current
+        * @param string $query query params for desc url
         * @param $widthOption: Used by the parser to remember the user preference thumbnailsize
         * @since 1.20
         * @return String: HTML for an image, with links, wrappers, etc.
@@ -616,7 +614,7 @@ class Linker {
 
                        if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
                                global $wgThumbLimits, $wgThumbUpright;
-                               if ( !isset( $widthOption ) || !isset( $wgThumbLimits[$widthOption] ) ) {
+                               if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
                                        $widthOption = User::getDefaultOption( 'thumbsize' );
                                }
 
@@ -660,7 +658,7 @@ 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 behaviour as the "thumb" option does it already.
+                       # This is the same behavior as the "thumb" option does it already.
                        if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
                                $hp['width'] = $srcWidth;
                        }
@@ -683,6 +681,7 @@ class Linker {
                                'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false,
                                'img-class' => $fp['class'] );
                        if ( isset( $fp['border'] ) ) {
+                               // TODO: BUG? Both values are identical
                                $params['img-class'] .= ( $params['img-class'] !== '' ) ? ' thumbborder' : 'thumbborder';
                        }
                        $params = self::getImageLinkMTOParams( $fp, $query, $parser ) + $params;
@@ -709,8 +708,8 @@ class Linker {
        /**
         * Get the link parameters for MediaTransformOutput::toHtml() from given
         * frame parameters supplied by the Parser.
-        * @param $frameParams array The frame parameters
-        * @param $query string An optional query string to add to description page links
+        * @param array $frameParams The frame parameters
+        * @param string $query An optional query string to add to description page links
         * @return array
         */
        private static function getImageLinkMTOParams( $frameParams, $query = '', $parser = null ) {
@@ -819,7 +818,7 @@ class Linker {
                                $noscale = true;
                        } else {
                                # Do not present an image bigger than the source, for bitmap-style images
-                               # This is a hack to maintain compatibility with arbitrary pre-1.10 behaviour
+                               # This is a hack to maintain compatibility with arbitrary pre-1.10 behavior
                                $srcWidth = $file->getWidth( $page );
                                if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
                                        $hp['width'] = $srcWidth;
@@ -914,8 +913,8 @@ class Linker {
         * Make a "broken" link to an image
         *
         * @param $title Title object
-        * @param $label String: link label (plain text)
-        * @param $query String: query string
+        * @param string $label link label (plain text)
+        * @param string $query query string
         * @param $unused1 Unused parameter kept for b/c
         * @param $unused2 Unused parameter kept for b/c
         * @param $time Boolean: a file of a certain timestamp was requested
@@ -957,7 +956,7 @@ class Linker {
         * Get the URL to upload a certain file
         *
         * @param $destFile Title object of the file to upload
-        * @param $query String: urlencoded query string to prepend
+        * @param string $query urlencoded query string to prepend
         * @return String: urlencoded URL
         */
        protected static function getUploadUrl( $destFile, $query = '' ) {
@@ -980,8 +979,8 @@ class Linker {
         * Create a direct link to a given uploaded file.
         *
         * @param $title Title object.
-        * @param $html String: pre-sanitized HTML
-        * @param $time string: MW timestamp of file creation time
+        * @param string $html pre-sanitized HTML
+        * @param string $time MW timestamp of file creation time
         * @return String: HTML
         */
        public static function makeMediaLinkObj( $title, $html = '', $time = false ) {
@@ -995,7 +994,7 @@ class Linker {
         *
         * @param $title Title object.
         * @param $file File|bool mixed File object or false
-        * @param $html String: pre-sanitized HTML
+        * @param string $html pre-sanitized HTML
         * @return String: HTML
         *
         * @todo Handle invalid or missing images better.
@@ -1033,11 +1032,11 @@ class Linker {
 
        /**
         * Make an external link
-        * @param $url String: URL to link to
-        * @param $text String: text of link
+        * @param string $url URL to link to
+        * @param string $text text of link
         * @param $escape Boolean: do we escape the link text?
-        * @param $linktype String: type of external link. Gets added to the classes
-        * @param $attribs Array of extra attributes to <a>
+        * @param string $linktype type of external link. Gets added to the classes
+        * @param array $attribs of extra attributes to <a>
         * @param $title Title|null Title object used for title specific link attributes
         * @return string
         */
@@ -1074,8 +1073,8 @@ class Linker {
        /**
         * Make user link (or user contributions for unregistered users)
         * @param $userId   Integer: user id in database.
-        * @param $userName String: user name in database.
-        * @param $altUserName String: text to display instead of the user name (optional)
+        * @param string $userName user name in database.
+        * @param string $altUserName text to display instead of the user name (optional)
         * @return String: HTML fragment
         * @since 1.19 Method exists for a long time. $altUserName was added in 1.19.
         */
@@ -1100,7 +1099,7 @@ class Linker {
         * Generate standard user tool links (talk, contributions, block link, etc.)
         *
         * @param $userId Integer: user identifier
-        * @param $userText String: user name or IP address
+        * @param string $userText user name or IP address
         * @param $redContribsWhenNoEdits Boolean: should the contributions link be
         *        red if the user has no edits?
         * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
@@ -1158,7 +1157,7 @@ class Linker {
        /**
         * Alias for userToolLinks( $userId, $userText, true );
         * @param $userId Integer: user identifier
-        * @param $userText String: user name or IP address
+        * @param string $userText user name or IP address
         * @param $edits Integer: user edit count (optional, for performance)
         * @return String
         */
@@ -1166,10 +1165,9 @@ class Linker {
                return self::userToolLinks( $userId, $userText, true, 0, $edits );
        }
 
-
        /**
         * @param $userId Integer: user id in database.
-        * @param $userText String: user name in database.
+        * @param string $userText user name in database.
         * @return String: HTML fragment with user talk link
         */
        public static function userTalkLink( $userId, $userText ) {
@@ -1180,7 +1178,7 @@ class Linker {
 
        /**
         * @param $userId Integer: userid
-        * @param $userText String: user name in database.
+        * @param string $userText user name in database.
         * @return String: HTML fragment with block link
         */
        public static function blockLink( $userId, $userText ) {
@@ -1191,7 +1189,7 @@ class Linker {
 
        /**
         * @param $userId Integer: userid
-        * @param $userText String: user name in database.
+        * @param string $userText user name in database.
         * @return String: HTML fragment with e-mail user link
         */
        public static function emailLink( $userId, $userText ) {
@@ -1292,7 +1290,7 @@ class Linker {
         * add a separator where needed and format the comment itself with CSS
         * Called by Linker::formatComment.
         *
-        * @param $comment String: comment text
+        * @param string $comment comment text
         * @param $title Title|null An optional title object used to links to sections
         * @param $local Boolean: whether section links should refer to local page
         * @return String: formatted comment
@@ -1376,7 +1374,7 @@ class Linker {
         * is ignored
         *
         * @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
-        * @param $comment String: text to format links in
+        * @param string $comment text to format links in
         * @param $title Title|null An optional title object used to links to sections
         * @param $local Boolean: whether section links should refer to local page
         * @return String
@@ -1566,7 +1564,7 @@ class Linker {
        public static function commentBlock( $comment, $title = null, $local = false ) {
                // '*' used to be the comment inserted by the software way back
                // in antiquity in case none was provided, here for backwards
-               // compatability, acc. to brion -ævar
+               // compatibility, acc. to brion -ævar
                if ( $comment == '' || $comment == '*' ) {
                        return '';
                } else {
@@ -1664,7 +1662,7 @@ class Linker {
        /**
         * Wraps the TOC in a table and provides the hide/collapse javascript.
         *
-        * @param $toc String: html of the Table Of Contents
+        * @param string $toc html of the Table Of Contents
         * @param $lang String|Language|false: Language for the toc title, defaults to user language
         * @return String: full html of the TOC
         */
@@ -1682,7 +1680,7 @@ class Linker {
         * Generate a table of contents from a section tree
         * Currently unused.
         *
-        * @param $tree array Return value of ParserOutput::getSections()
+        * @param array $tree Return value of ParserOutput::getSections()
         * @return String: HTML fragment
         */
        public static function generateTOC( $tree ) {
@@ -1710,12 +1708,12 @@ class Linker {
         * Create a headline for content
         *
         * @param $level Integer: the level of the headline (1-6)
-        * @param $attribs String: any attributes for the headline, starting with
+        * @param string $attribs any attributes for the headline, starting with
         *                 a space and ending with '>'
         *                 This *must* be at least '>' for no attribs
-        * @param $anchor String: the anchor to give the headline (the bit after the #)
-        * @param $html String: html for the text of the header
-        * @param $link String: HTML to add for the section edit link
+        * @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 $legacyAnchor Mixed: a second, optional anchor to give for
         *   backward compatibility (false to omit)
         *
@@ -1809,7 +1807,7 @@ class Linker {
         * is set and the user is the only contributor of the page.
         *
         * @param $rev Revision object
-        * @param $verify Bool Try to verfiy that this revision can really be rolled back
+        * @param bool $verify Try to verify that this revision can really be rolled back
         * @return integer|bool|null
         */
        public static function getRollbackEditCount( $rev, $verify ) {
@@ -2015,7 +2013,7 @@ class Linker {
        /**
         * Returns HTML for the "hidden categories on this page" list.
         *
-        * @param $hiddencats Array of hidden categories from Article::getHiddenCategories
+        * @param array $hiddencats of hidden categories from Article::getHiddenCategories
         * or similar
         * @return String: HTML output
         */
@@ -2042,7 +2040,7 @@ class Linker {
         * Format a size in bytes for output, using an appropriate
         * unit (B, KB, MB or GB) according to the magnitude in question
         *
-        * @param $size int Size to format
+        * @param int $size Size to format
         * @return String
         */
        public static function formatSize( $size ) {
@@ -2056,7 +2054,7 @@ class Linker {
         * isn't always, because sometimes the accesskey needs to go on a different
         * element than the id, for reverse-compatibility, etc.)
         *
-        * @param $name String: id of the element, minus prefixes.
+        * @param string $name id of the element, minus prefixes.
         * @param $options Mixed: null or the string 'withaccess' to add an access-
         *   key hint
         * @return String: contents of the title attribute (which you must HTML-
@@ -2102,7 +2100,7 @@ class Linker {
         * the id but isn't always, because sometimes the accesskey needs to go on
         * a different element than the id, for reverse-compatibility, etc.)
         *
-        * @param $name String: id of the element, minus prefixes.
+        * @param string $name id of the element, minus prefixes.
         * @return String: contents of the accesskey attribute (which you must HTML-
         *   escape), or false for no accesskey attribute
         */
@@ -2177,7 +2175,7 @@ class Linker {
        /**
         * Creates a (show/hide) link for deleting revisions/log entries
         *
-        * @param $query Array: query parameters to be passed to link()
+        * @param array $query query parameters to be passed to link()
         * @param $restricted Boolean: set to true to use a "<strong>" instead of a "<span>"
         * @param $delete Boolean: set to true to use (show/hide) rather than (show)
         *
@@ -2216,10 +2214,10 @@ class Linker {
         * This function is a shortcut to makeBrokenLinkObj(Title::newFromText($title),...). Do not call
         * it if you already have a title object handy. See makeBrokenLinkObj for further documentation.
         *
-        * @param $title String: The text of the title
-        * @param $text String: Link text
-        * @param $query String: Optional query part
-        * @param $trail String: Optional trail. Alphabetic characters at the start of this string will
+        * @param string $title The text of the title
+        * @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
         *               be included in the link text. Other characters will be appended after
         *               the end of the link.
         * @return string
@@ -2246,11 +2244,11 @@ class Linker {
         * @param $nt     Title: the title object to make the link from, e.g. from
         *                      Title::newFromText.
         * @param $text  String: link text
-        * @param $query String: optional query part
-        * @param $trail String: 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 $prefix String: 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 = '' ) {
@@ -2280,8 +2278,8 @@ class Linker {
         * @param $text   String: text to replace the title
         * @param $query  String: link target
         * @param $trail  String: text after link
-        * @param $prefix String: text before link text
-        * @param $aprops String: extra attributes to the a-element
+        * @param string $prefix text before link text
+        * @param string $aprops extra attributes to the a-element
         * @param $style  String: style to apply - if empty, use getInternalLinkAttributesObj instead
         * @return string the a-element
         */
@@ -2316,11 +2314,11 @@ class Linker {
         *
         * @param $title Title object of the target page
         * @param $text  String: Link text
-        * @param $query String: Optional query part
-        * @param $trail String: 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 $prefix String: Optional prefix
+        * @param string $prefix Optional prefix
         * @return string
         */
        static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
@@ -2352,7 +2350,7 @@ class Linker {
         * @param $trail  String:  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 $prefix String: Optional prefix
+        * @param string $prefix Optional prefix
         * @return string
         */
        static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
@@ -2414,8 +2412,8 @@ class DummyLinker {
         * Use PHP's magic __call handler to transform instance calls to a dummy instance
         * into static calls to the new Linker for backwards compatibility.
         *
-        * @param $fname String Name of called method
-        * @param $args Array Arguments to the method
+        * @param string $fname Name of called method
+        * @param array $args Arguments to the method
         * @return mixed
         */
        public function __call( $fname, $args ) {
index 83883b5..d99ae22 100644 (file)
@@ -265,8 +265,8 @@ class LinksUpdate extends SqlDataUpdate {
 
        /**
         * Update all the appropriate counts in the category table.
-        * @param $added array associative array of category name => sort key
-        * @param $deleted array associative array of category name => sort key
+        * @param array $added associative array of category name => sort key
+        * @param array $deleted associative array of category name => sort key
         */
        function updateCategoryCounts( $added, $deleted ) {
                $a = WikiPage::factory( $this->mTitle );
@@ -430,7 +430,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Get an array of category insertions
         *
-        * @param $existing array mapping existing category names to sort keys. If both
+        * @param array $existing mapping existing category names to sort keys. If both
         * match a link in $this, the link will be omitted from the output
         *
         * @return array
@@ -474,7 +474,7 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Get an array of interlanguage link insertions
         *
-        * @param $existing Array mapping existing language codes to titles
+        * @param array $existing mapping existing language codes to titles
         *
         * @return array
         */
@@ -884,8 +884,8 @@ class LinksDeletionUpdate extends SqlDataUpdate {
 
        /**
         * Update all the appropriate counts in the category table.
-        * @param $added array associative array of category name => sort key
-        * @param $deleted array associative array of category name => sort key
+        * @param array $added associative array of category name => sort key
+        * @param array $deleted associative array of category name => sort key
         */
        function updateCategoryCounts( $added, $deleted ) {
                $a = WikiPage::factory( $this->mTitle );
index 257a46d..7b66924 100644 (file)
@@ -464,7 +464,6 @@ class MagicWord {
                }
        }
 
-
        /**
         * Returns true if the text matches the word, and alters the
         * input string, removing all instances of the word
diff --git a/includes/MappedIterator.php b/includes/MappedIterator.php
new file mode 100644 (file)
index 0000000..b4376f4
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * @since 1.21
+ */
+class MappedIterator implements Iterator {
+       /** @var Iterator */
+       protected $baseIterator;
+       /** @var Closure */
+       protected $vCallback;
+
+       /**
+        * Build an new iterator from a base iterator by having the former wrap the
+        * later, returning the result of "value" callback for each current() invocation.
+        * The callback takes the result of current() on the base iterator as an argument.
+        * The keys of the base iterator are reused verbatim.
+        *
+        * @param Iterator|Array $iter
+        * @param Closure $vCallback
+        * @throws MWException
+        */
+    public function __construct( $iter, Closure $vCallback ) {
+               if ( is_array( $iter ) ) {
+                       $this->baseIterator = new ArrayIterator( $iter );
+               } elseif ( $iter instanceof Iterator ) {
+                       $this->baseIterator = $iter;
+               } else {
+                       throw new MWException( "Invalid base iterator provided." );
+               }
+               $this->vCallback = $vCallback;
+    }
+
+       /**
+        * @return void
+        */
+       public function rewind() {
+               $this->baseIterator->rewind();
+       }
+
+       /**
+        * @return Mixed|null Returns null if out of range
+        */
+       public function current() {
+               if ( !$this->baseIterator->valid() ) {
+                       return null; // out of range
+               }
+               return call_user_func_array( $this->vCallback, array( $this->baseIterator->current() ) );
+       }
+
+       /**
+        * @return Mixed|null Returns null if out of range
+        */
+       public function key() {
+               if ( !$this->baseIterator->valid() ) {
+                       return null; // out of range
+               }
+               return $this->baseIterator->key();
+       }
+
+       /**
+        * @return void
+        */
+       public function next() {
+               $this->baseIterator->next();
+       }
+
+       /**
+        * @return bool
+        */
+       public function valid() {
+               return $this->baseIterator->valid();
+       }
+}
index 6e533a3..5719f83 100644 (file)
  */
 
 /**
- * The Message class provides methods which fullfil two basic services:
+ * The Message class provides methods which fulfil two basic services:
  *  - fetching interface messages
  *  - processing messages into a variety of formats
  *
- * First implemented with MediaWiki 1.17, the Message class is intented to
+ * First implemented with MediaWiki 1.17, the Message class is intended to
  * replace the old wfMsg* functions that over time grew unusable.
  * @see https://www.mediawiki.org/wiki/Manual:Messages_API for equivalences
  * between old and new functions.
@@ -216,7 +216,7 @@ class Message {
         * Constructor.
         * @since 1.17
         * @param $key: message key, or array of message keys to try and use the first non-empty message for
-        * @param $params Array message parameters
+        * @param array $params message parameters
         * @return Message: $this
         */
        public function __construct( $key, $params = array() ) {
@@ -261,10 +261,10 @@ class Message {
 
        /**
         * Factory function that is just wrapper for the real constructor. It is
-        * intented to be used instead of the real constructor, because it allows
+        * intended to be used instead of the real constructor, because it allows
         * chaining method calls, while new objects don't.
         * @since 1.17
-        * @param $key String: message key
+        * @param string $key message key
         * @param Varargs: parameters as Strings
         * @return Message: $this
         */
@@ -554,7 +554,7 @@ class Message {
        }
 
        /**
-        * Returns the message text as-is, only parameters are subsituted.
+        * Returns the message text as-is, only parameters are substituted.
         * @since 1.17
         * @return String: Unescaped untransformed message text.
         */
@@ -633,10 +633,10 @@ class Message {
        }
 
        /**
-        * Substitutes any paramaters into the message text.
+        * Substitutes any parameters into the message text.
         * @since 1.17
-        * @param $message String: the message text
-        * @param $type String: either before or after
+        * @param string $message the message text
+        * @param string $type either before or after
         * @return String
         */
        protected function replaceParameters( $message, $type = 'before' ) {
@@ -654,7 +654,7 @@ class Message {
        /**
         * Extracts the parameter type and preprocessed the value if needed.
         * @since 1.18
-        * @param $param String|Array: Parameter as defined in this class.
+        * @param string|array $param Parameter as defined in this class.
         * @return Tuple(type, value)
         */
        protected function extractParam( $param ) {
@@ -678,7 +678,7 @@ class Message {
        /**
         * Wrapper for what ever method we use to parse wikitext.
         * @since 1.17
-        * @param $string String: Wikitext message contents
+        * @param string $string Wikitext message contents
         * @return string Wikitext parsed into HTML
         */
        protected function parseText( $string ) {
@@ -689,7 +689,7 @@ class Message {
        /**
         * Wrapper for what ever method we use to {{-transform wikitext.
         * @since 1.17
-        * @param $string String: Wikitext message contents
+        * @param string $string Wikitext message contents
         * @return string Wikitext with {{-constructs replaced with their values.
         */
        protected function transformText( $string ) {
@@ -743,8 +743,8 @@ class RawMessage extends Message {
         * Call the parent constructor, then store the key as
         * the message.
         *
-        * @param $key Message to use
-        * @param $params Parameters for the message
+        * @param string $key Message to use
+        * @param array $params Parameters for the message
         * @see Message::__construct
         */
        public function __construct( $key, $params = array() ) {
index 6322be7..8a8142b 100644 (file)
@@ -29,7 +29,7 @@
  * A message blob is a JSON object containing the interface messages for a
  * certain resource in a certain language. These message blobs are cached
  * in the msg_resource table and automatically invalidated when one of their
- * consistuent messages or the resource itself is changed.
+ * constituent messages or the resource itself is changed.
  */
 class MessageBlobStore {
 
@@ -37,8 +37,8 @@ class MessageBlobStore {
         * Get the message blobs for a set of modules
         *
         * @param $resourceLoader ResourceLoader object
-        * @param $modules array Array of module objects keyed by module name
-        * @param $lang string Language code
+        * @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
         */
        public static function get( ResourceLoader $resourceLoader, $modules, $lang ) {
@@ -68,9 +68,9 @@ class MessageBlobStore {
         * present, it is not regenerated; instead, the preexisting blob
         * is fetched and returned.
         *
-        * @param $name String: module name
+        * @param string $name module name
         * @param $module ResourceLoaderModule object
-        * @param $lang String: language code
+        * @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,9 +125,9 @@ class MessageBlobStore {
        /**
         * Update the message blob for a given module in a given language
         *
-        * @param $name String: module name
+        * @param string $name module name
         * @param $module ResourceLoaderModule object
-        * @param $lang String: language code
+        * @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 ) {
@@ -195,7 +195,7 @@ class MessageBlobStore {
        /**
         * Update a single message in all message blobs it occurs in.
         *
-        * @param $key String: message key
+        * @param string $key message key
         */
        public static function updateMessage( $key ) {
                try {
@@ -255,8 +255,8 @@ class MessageBlobStore {
        /**
         * Create an update queue for updateMessage()
         *
-        * @param $key String: message key
-        * @param $prevUpdates Array: updates queue to refresh or null to build a fresh update 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 ) {
@@ -306,9 +306,9 @@ class MessageBlobStore {
        /**
         * Reencode a message blob with the updated value for a message
         *
-        * @param $blob String: message blob (JSON object)
-        * @param $key String: message key
-        * @param $lang String: language code
+        * @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
         */
        private static function reencodeBlob( $blob, $key, $lang ) {
@@ -323,8 +323,8 @@ class MessageBlobStore {
         * Modules whose blobs are not in the database are silently dropped.
         *
         * @param $resourceLoader ResourceLoader object
-        * @param $modules Array of module names
-        * @param $lang String: language code
+        * @param array $modules of module names
+        * @param string $lang language code
         * @throws MWException
         * @return array Array mapping module names to blobs
         */
@@ -361,7 +361,7 @@ class MessageBlobStore {
         * Generate the message blob for a given module in a given language.
         *
         * @param $module ResourceLoaderModule object
-        * @param $lang String: language code
+        * @param string $lang language code
         * @return String: JSON object
         */
        private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
index e787fbd..edabd54 100644 (file)
@@ -144,21 +144,21 @@ END_STRING
 class MimeMagic {
 
        /**
-       * Mapping of media types to arrays of mime types.
-       * This is used by findMediaType and getMediaType, respectively
-       */
+        * Mapping of media types to arrays of mime types.
+        * This is used by findMediaType and getMediaType, respectively
+        */
        var $mMediaTypes = null;
 
        /** Map of mime type aliases
-       */
+        */
        var $mMimeTypeAliases = null;
 
-       /** map of mime types to file extensions (as a space seprarated list)
-       */
+       /** map of mime types to file extensions (as a space separated list)
+        */
        var $mMimeToExt = null;
 
-       /** map of file extensions types to mime types (as a space seprarated list)
-       */
+       /** map of file extensions types to mime types (as a space separated list)
+        */
        var $mExtToMime = null;
 
        /** IEContentAnalyzer instance
@@ -179,8 +179,8 @@ class MimeMagic {
         */
        function __construct() {
                /**
-               *   --- load mime.types ---
-               */
+                *   --- load mime.types ---
+                */
 
                global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
 
@@ -346,7 +346,7 @@ class MimeMagic {
         * @return MimeMagic
         */
        public static function &singleton() {
-               if ( !isset( self::$instance ) ) {
+               if ( self::$instance === null ) {
                        self::$instance = new MimeMagic;
                }
                return self::$instance;
@@ -413,7 +413,6 @@ class MimeMagic {
                return $m;
        }
 
-
        /**
         * Tests if the extension matches the given mime type. Returns true if a
         * match was found, null if the mime type is unknown, and false if the
@@ -427,7 +426,7 @@ class MimeMagic {
                $ext = $this->getExtensionsForType( $mime );
 
                if ( !$ext ) {
-                       return null;  // Unknown mime type
+                       return null; // Unknown mime type
                }
 
                $ext = explode( ' ', $ext );
@@ -503,8 +502,8 @@ class MimeMagic {
         * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
         * gives true, return the result of guessTypesForExtension($ext).
         *
-        * @param $mime String: the mime type, typically guessed from a file's content.
-        * @param $ext String: 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
         */
@@ -542,11 +541,11 @@ class MimeMagic {
        /**
         * Mime type detection. This uses detectMimeType to detect the mime type
         * of the file, but applies additional checks to determine some well known
-        * file formats that may be missed or misinterpreter by the default mime
+        * file formats that may be missed or misinterpreted by the default mime
         * detection (namely XML based formats like XHTML or SVG, as well as ZIP
         * based formats like OPC/ODF files).
         *
-        * @param $file String: the file to check
+        * @param string $file the file to check
         * @param $ext Mixed: 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.
@@ -755,7 +754,7 @@ class MimeMagic {
         * header data.  Currently works for OpenDocument and OpenXML types...
         * If can't tell, returns 'application/zip'.
         *
-        * @param $header String: some reasonably-sized chunk of file header
+        * @param string $header some reasonably-sized chunk of file header
         * @param $tail   String: the tail of the file
         * @param $ext Mixed: the file extension, or true to extract it from the filename.
         *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
@@ -802,12 +801,13 @@ class MimeMagic {
                        # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
                        if ( $ext !== true && $ext !== false ) {
                                /** This is the mode used by getPropsFromPath
-                               * These mime's are stored in the database, where we don't really want
-                               * x-opc+zip, because we use it only for internal purposes
-                               */
+                                * These mime's are stored in the database, where we don't really want
+                                * x-opc+zip, because we use it only for internal purposes
+                                */
                                if ( $this->isMatchingExtension( $ext, $mime) ) {
                                        /* A known file extension for an OPC file,
-                                       * find the proper mime type for that file extension */
+                                        * find the proper mime type for that file extension
+                                        */
                                        $mime = $this->guessTypesForExtension( $ext );
                                } else {
                                        $mime = "application/zip";
@@ -853,14 +853,14 @@ class MimeMagic {
         * Internal mime type detection. Detection is done using an external
         * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
         * extension and mime_content_type are tried (in this order), if they
-        * are available. If the dections fails and $ext is not false, the mime
+        * are available. If the detections fails and $ext is not false, the mime
         * type is guessed from the file extension, using guessTypesForExtension.
         *
         * If the mime type is still unknown, getimagesize is used to detect the
         * mime type if the file is an image. If no mime type can be determined,
         * this function returns 'unknown/unknown'.
         *
-        * @param $file String: the file to check
+        * @param string $file the file to check
         * @param $ext Mixed: 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.
@@ -904,7 +904,7 @@ class MimeMagic {
                        # NOTE: this function is available since PHP 4.3.0, but only if
                        # PHP was compiled with --with-mime-magic or, before 4.3.2, with --enable-mime-magic.
                        #
-                       # On Windows, you must set mime_magic.magicfile in php.ini to point to the mime.magic file bundeled with PHP;
+                       # 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.
                        #
                        # Also note that this has been DEPRECATED in favor of the fileinfo extension by PECL, see above.
@@ -961,9 +961,9 @@ class MimeMagic {
         * @todo analyse file if need be
         * @todo look at multiple extension, separately and together.
         *
-        * @param $path String: 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 $mime String: 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.
         */
@@ -1041,7 +1041,7 @@ class MimeMagic {
         * File extensions are represented by a string starting with a dot (.) to
         * distinguish them from mime types.
         *
-        * This funktion relies on the mapping defined by $this->mMediaTypes
+        * This function relies on the mapping defined by $this->mMediaTypes
         * @access private
         * @return int|string
         */
@@ -1078,9 +1078,9 @@ class MimeMagic {
         * Get the MIME types that various versions of Internet Explorer would
         * detect from a chunk of the content.
         *
-        * @param $fileName String: the file name (unused at present)
-        * @param $chunk String: the first 256 bytes of the file
-        * @param $proposed String: the MIME type proposed by the server
+        * @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 ) {
index e35bf07..fccfbed 100644 (file)
@@ -61,7 +61,7 @@ class MWNamespace {
        /**
         * Can pages in the given namespace be moved?
         *
-        * @param $index Int: namespace index
+        * @param int $index namespace index
         * @return bool
         */
        public static function isMovable( $index ) {
@@ -80,7 +80,7 @@ class MWNamespace {
        /**
         * Is the given namespace is a subject (non-talk) namespace?
         *
-        * @param $index Int: namespace index
+        * @param int $index namespace index
         * @return bool
         * @since 1.19
         */
@@ -101,7 +101,7 @@ class MWNamespace {
        /**
         * Is the given namespace a talk namespace?
         *
-        * @param $index Int: 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 $index Int: namespace index
+        * @param int $index namespace index
         * @return int
         */
        public static function getTalk( $index ) {
@@ -126,7 +126,7 @@ class MWNamespace {
         * Get the subject namespace index for a given namespace
         * Special namespaces (NS_MEDIA, NS_SPECIAL) are always the subject.
         *
-        * @param $index Int: Namespace index
+        * @param int $index Namespace index
         * @return int
         */
        public static function getSubject( $index ) {
@@ -145,7 +145,7 @@ class MWNamespace {
         * For talk namespaces, returns the subject (non-talk) namespace
         * For subject (non-talk) namespaces, returns the talk namespace
         *
-        * @param $index Int: namespace index
+        * @param int $index namespace index
         * @return int or null if no associated namespace could be found
         */
        public static function getAssociated( $index ) {
@@ -181,8 +181,8 @@ class MWNamespace {
         * of this function rather than directly doing comparison will make
         * sure that code will not potentially break.
         *
-        * @param $ns1 int The first namespace index
-        * @param $ns2 int The second namespae index
+        * @param int $ns1 The first namespace index
+        * @param int $ns2 The second namespace index
         *
         * @return bool
         * @since 1.19
@@ -196,8 +196,8 @@ class MWNamespace {
         * eg: NS_USER and NS_USER wil return true, as well
         *     NS_USER and NS_USER_TALK will return true.
         *
-        * @param $ns1 int The first namespace index
-        * @param $ns2 int The second namespae index
+        * @param int $ns1 The first namespace index
+        * @param int $ns2 The second namespace index
         *
         * @return bool
         * @since 1.19
@@ -231,7 +231,7 @@ class MWNamespace {
        /**
         * Returns the canonical (English) name for a given index
         *
-        * @param $index Int: namespace index
+        * @param int $index namespace index
         * @return string or false if no canonical definition.
         */
        public static function getCanonicalName( $index ) {
@@ -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 $name String: 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 $index Int: 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 $index Int: index to check
+        * @param int $index index to check
         * @return bool
         */
        public static function isContent( $index ) {
@@ -319,7 +319,7 @@ class MWNamespace {
        /**
         * Does the namespace allow subpages?
         *
-        * @param $index int Index to check
+        * @param int $index Index to check
         * @return bool
         */
        public static function hasSubpages( $index ) {
@@ -372,7 +372,7 @@ class MWNamespace {
        /**
         * Is the namespace first-letter capitalized?
         *
-        * @param $index int Index to check
+        * @param int $index Index to check
         * @return bool
         */
        public static function isCapitalized( $index ) {
@@ -400,7 +400,7 @@ class MWNamespace {
         * genders. Not all languages make a distinction here.
         *
         * @since 1.18
-        * @param $index int Index to check
+        * @param int $index Index to check
         * @return bool
         */
        public static function hasGenderDistinction( $index ) {
@@ -411,7 +411,7 @@ class MWNamespace {
         * It is not possible to use pages from this namespace as template?
         *
         * @since 1.20
-        * @param $index int Index to check
+        * @param int $index Index to check
         * @return bool
         */
        public static function isNonincludable( $index ) {
@@ -424,7 +424,7 @@ class MWNamespace {
         * This does not mean that all pages in that namespace have the model
         *
         * @since 1.21
-        * @param $index int Index to check
+        * @param int $index Index to check
         * @return null|string default model name for the given namespace, if set
         */
        public static function getNamespaceContentModel( $index ) {
index abf091e..6b40c30 100644 (file)
@@ -92,7 +92,7 @@ function wfRequestExtension() {
  */
 function wfGzipHandler( $s ) {
        if( !function_exists( 'gzencode' ) ) {
-               wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavaible)\n" );
+               wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavailable)\n" );
                return $s;
        }
        if( headers_sent() ) {
index f719421..1e0c396 100644 (file)
@@ -123,7 +123,7 @@ class OutputPage extends ContextSource {
        var $mScripts = '';
 
        /**
-        * Inline CSS styles. Use addInlineStyle() sparsingly
+        * Inline CSS styles. Use addInlineStyle() sparingly
         */
        var $mInlineStyles = '';
 
@@ -270,8 +270,8 @@ class OutputPage extends ContextSource {
        /**
         * Redirect to $url rather than displaying the normal page
         *
-        * @param $url String: URL
-        * @param $responsecode String: HTTP status code
+        * @param string $url URL
+        * @param string $responsecode HTTP status code
         */
        public function redirect( $url, $responsecode = '302' ) {
                # Strip newlines as a paranoia check for header injection in PHP<5.1.2
@@ -301,8 +301,8 @@ class OutputPage extends ContextSource {
         * Add a new "<meta>" tag
         * To add an http-equiv meta tag, precede the name with "http:"
         *
-        * @param $name String tag name
-        * @param $val String tag value
+        * @param string $name tag name
+        * @param string $val tag value
         */
        function addMeta( $name, $val ) {
                array_push( $this->mMetatags, array( $name, $val ) );
@@ -311,7 +311,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a keyword or a list of keywords in the page header
         *
-        * @param $text String or array of strings
+        * @param string $text or array of strings
         */
        function addKeyword( $text ) {
                if( is_array( $text ) ) {
@@ -326,7 +326,7 @@ class OutputPage extends ContextSource {
         *
         * Note: use setCanonicalUrl() for rel=canonical.
         *
-        * @param $linkarr Array: associative array of attributes.
+        * @param array $linkarr associative array of attributes.
         */
        function addLink( $linkarr ) {
                array_push( $this->mLinktags, $linkarr );
@@ -335,7 +335,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a new \<link\> with "rel" attribute set to "meta"
         *
-        * @param $linkarr Array: associative array mapping attribute names to their
+        * @param array $linkarr associative array mapping attribute names to their
         *                 values, both keys and values will be escaped, and the
         *                 "rel" attribute will be automatically added
         */
@@ -371,7 +371,7 @@ class OutputPage extends ContextSource {
        /**
         * Add raw HTML to the list of scripts (including \<script\> tag, etc.)
         *
-        * @param $script String: raw HTML
+        * @param string $script raw HTML
         */
        function addScript( $script ) {
                $this->mScripts .= $script . "\n";
@@ -380,7 +380,7 @@ class OutputPage extends ContextSource {
        /**
         * Register and add a stylesheet from an extension directory.
         *
-        * @param $url String path to sheet.  Provide either a full url (beginning
+        * @param string $url path to sheet.  Provide either a full url (beginning
         *             with 'http', etc) or a relative path from the document root
         *             (beginning with '/').  Otherwise it behaves identically to
         *             addStyle() and draws from the /skins folder.
@@ -401,9 +401,9 @@ class OutputPage extends ContextSource {
        /**
         * Add a JavaScript file out of skins/common, or a given relative path.
         *
-        * @param $file String: filename in skins/common or complete on-server path
+        * @param string $file filename in skins/common or complete on-server path
         *              (/foo/bar.js)
-        * @param $version String: style version of the file. Defaults to $wgStyleVersion
+        * @param string $version style version of the file. Defaults to $wgStyleVersion
         */
        public function addScriptFile( $file, $version = null ) {
                global $wgStylePath, $wgStyleVersion;
@@ -421,7 +421,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a self-contained script tag with the given contents
         *
-        * @param $script String: JavaScript text, no "<script>" tags
+        * @param string $script JavaScript text, no "<script>" tags
         */
        public function addInlineScript( $script ) {
                $this->mScripts .= Html::inlineScript( "\n$script\n" ) . "\n";
@@ -440,7 +440,7 @@ class OutputPage extends ContextSource {
         * Filter an array of modules to remove insufficiently trustworthy members, and modules
         * which are no longer registered (eg a page is cached before an extension is disabled)
         * @param $modules Array
-        * @param $position String if not null, only return modules with this position
+        * @param string $position if not null, only return modules with this position
         * @param $type string
         * @return Array
         */
@@ -462,8 +462,8 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of modules to include on this page
         *
-        * @param $filter Bool whether to filter out insufficiently trustworthy modules
-        * @param $position String if not null, only return modules with this position
+        * @param bool $filter whether to filter out insufficiently trustworthy modules
+        * @param string $position if not null, only return modules with this position
         * @param $param string
         * @return Array of module names
         */
@@ -521,9 +521,11 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only CSS of one or more modules recognized by the resource loader. Module
-        * styles added through this function will be loaded by the resource loader when
-        * the page loads.
+        * Add only CSS of one or more modules recognized by the resource loader.
+        *
+        * Module styles added through this function will be added using standard link CSS
+        * tags, rather than as a combined Javascript and CSS package. Thus, they will
+        * load when JavaScript is disabled (unless CSS also happens to be disabled).
         *
         * @param $modules Mixed: module name (string) or array of module names
         */
@@ -579,8 +581,8 @@ class OutputPage extends ContextSource {
        /**
         * Add or replace an header item to the output
         *
-        * @param $name String: item name
-        * @param $value String: raw HTML
+        * @param string $name item name
+        * @param string $value raw HTML
         */
        public function addHeadItem( $name, $value ) {
                $this->mHeadItems[$name] = $value;
@@ -589,7 +591,7 @@ class OutputPage extends ContextSource {
        /**
         * Check if the header item $name is already set
         *
-        * @param $name String: item name
+        * @param string $name item name
         * @return Boolean
         */
        public function hasHeadItem( $name ) {
@@ -599,7 +601,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the value of the ETag HTTP header, only used if $wgUseETag is true
         *
-        * @param $tag String: value of "ETag" header
+        * @param string $tag value of "ETag" header
         */
        function setETag( $tag ) {
                $this->mETag = $tag;
@@ -746,7 +748,7 @@ class OutputPage extends ContextSource {
        /**
         * Override the last modified timestamp
         *
-        * @param $timestamp String: new timestamp, in a format readable by
+        * @param string $timestamp new timestamp, in a format readable by
         *        wfTimestamp()
         */
        public function setLastModified( $timestamp ) {
@@ -756,7 +758,7 @@ class OutputPage extends ContextSource {
        /**
         * Set the robot policy for the page: <http://www.robotstxt.org/meta.html>
         *
-        * @param $policy String: the literal string to output as the contents of
+        * @param string $policy the literal string to output as the contents of
         *   the meta tag.  Will be parsed according to the spec and output in
         *   standardized form.
         * @return null
@@ -776,7 +778,7 @@ class OutputPage extends ContextSource {
         * Set the index policy for the page, but leave the follow policy un-
         * touched.
         *
-        * @param $policy string Either 'index' or 'noindex'.
+        * @param string $policy Either 'index' or 'noindex'.
         * @return null
         */
        public function setIndexPolicy( $policy ) {
@@ -790,7 +792,7 @@ class OutputPage extends ContextSource {
         * Set the follow policy for the page, but leave the index policy un-
         * touched.
         *
-        * @param $policy String: either 'follow' or 'nofollow'.
+        * @param string $policy either 'follow' or 'nofollow'.
         * @return null
         */
        public function setFollowPolicy( $policy ) {
@@ -804,7 +806,7 @@ class OutputPage extends ContextSource {
         * Set the new value of the "action text", this will be added to the
         * "HTML title", separated from it with " - ".
         *
-        * @param $text String: new value of the "action text"
+        * @param string $text new value of the "action text"
         */
        public function setPageTitleActionText( $text ) {
                $this->mPageTitleActionText = $text;
@@ -895,9 +897,9 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Replace the subtile with $str
+        * Replace the subtitle with $str
         *
-        * @param $str String|Message: new value of the subtitle. String should be safe HTML.
+        * @param string|Message $str new value of the subtitle. String should be safe HTML.
         */
        public function setSubtitle( $str ) {
                $this->clearSubtitle();
@@ -908,7 +910,7 @@ class OutputPage extends ContextSource {
         * Add $str to the subtitle
         *
         * @deprecated in 1.19; use addSubtitle() instead
-        * @param $str String|Message to add to the subtitle
+        * @param string|Message $str to add to the subtitle
         */
        public function appendSubtitle( $str ) {
                $this->addSubtitle( $str );
@@ -917,7 +919,7 @@ class OutputPage extends ContextSource {
        /**
         * Add $str to the subtitle
         *
-        * @param $str String|Message to add to the subtitle. String should be safe HTML.
+        * @param string|Message $str to add to the subtitle. String should be safe HTML.
         */
        public function addSubtitle( $str ) {
                if ( $str instanceof Message ) {
@@ -1029,7 +1031,7 @@ class OutputPage extends ContextSource {
         * for the new version
         * @see addFeedLink()
         *
-        * @param $val String: query to append to feed links or false to output
+        * @param string $val query to append to feed links or false to output
         *        default links
         */
        public function setFeedAppendQuery( $val ) {
@@ -1049,8 +1051,8 @@ class OutputPage extends ContextSource {
        /**
         * Add a feed link to the page header
         *
-        * @param $format String: feed type, should be a key of $wgFeedClasses
-        * @param $href String: URL
+        * @param string $format feed type, should be a key of $wgFeedClasses
+        * @param string $href URL
         */
        public function addFeedLink( $format, $href ) {
                global $wgAdvertisedFeedTypes;
@@ -1134,7 +1136,7 @@ class OutputPage extends ContextSource {
        /**
         * Add new language links
         *
-        * @param $newLinkArray array Associative array mapping language code to the page
+        * @param array $newLinkArray Associative array mapping language code to the page
         *                      name
         */
        public function addLanguageLinks( $newLinkArray ) {
@@ -1144,7 +1146,7 @@ class OutputPage extends ContextSource {
        /**
         * Reset the language links and add new language links
         *
-        * @param $newLinkArray array Associative array mapping language code to the page
+        * @param array $newLinkArray Associative array mapping language code to the page
         *                      name
         */
        public function setLanguageLinks( $newLinkArray ) {
@@ -1163,7 +1165,7 @@ class OutputPage extends ContextSource {
        /**
         * Add an array of categories, with names in the keys
         *
-        * @param $categories Array mapping category name => sort key
+        * @param array $categories mapping category name => sort key
         */
        public function addCategoryLinks( $categories ) {
                global $wgContLang;
@@ -1224,7 +1226,7 @@ class OutputPage extends ContextSource {
        /**
         * Reset the category links (but not the category list) and add $categories
         *
-        * @param $categories Array mapping category name => sort key
+        * @param array $categories mapping category name => sort key
         */
        public function setCategoryLinks( $categories ) {
                $this->mCategoryLinks = array();
@@ -1278,7 +1280,7 @@ class OutputPage extends ContextSource {
        /**
         * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
         * @see ResourceLoaderModule::$origin
-        * @param $type String ResourceLoaderModule TYPE_ constant
+        * @param string $type ResourceLoaderModule TYPE_ constant
         * @return Int ResourceLoaderModule ORIGIN_ class constant
         */
        public function getAllowedModules( $type ) {
@@ -1301,7 +1303,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * As for setAllowedModules(), but don't inadvertantly make the page more accessible
+        * As for setAllowedModules(), but don't inadvertently make the page more accessible
         * @param  $type String
         * @param  $level Int ResourceLoaderModule class constant
         */
@@ -1312,7 +1314,7 @@ class OutputPage extends ContextSource {
        /**
         * Prepend $text to the body HTML
         *
-        * @param $text String: HTML
+        * @param string $text HTML
         */
        public function prependHTML( $text ) {
                $this->mBodytext = $text . $this->mBodytext;
@@ -1321,7 +1323,7 @@ class OutputPage extends ContextSource {
        /**
         * Append $text to the body HTML
         *
-        * @param $text String: HTML
+        * @param string $text HTML
         */
        public function addHTML( $text ) {
                $this->mBodytext .= $text;
@@ -1465,7 +1467,7 @@ class OutputPage extends ContextSource {
         * @param $interface Boolean: is this text in the user interface language?
         */
        public function addWikiText( $text, $linestart = true, $interface = true ) {
-               $title = $this->getTitle(); // Work arround E_STRICT
+               $title = $this->getTitle(); // Work around E_STRICT
                if ( !$title ) {
                        throw new MWException( 'Title is null' );
                }
@@ -1475,7 +1477,7 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object
         *
-        * @param $text String: wikitext
+        * @param string $text wikitext
         * @param $title Title object
         * @param $linestart Boolean: is this the start of a line?
         */
@@ -1486,7 +1488,7 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object and tidy enabled.
         *
-        * @param $text String: wikitext
+        * @param string $text wikitext
         * @param $title Title object
         * @param $linestart Boolean: is this the start of a line?
         */
@@ -1497,7 +1499,7 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with tidy enabled
         *
-        * @param $text String: wikitext
+        * @param string $text wikitext
         * @param $linestart Boolean: is this the start of a line?
         */
        public function addWikiTextTidy( $text, $linestart = true ) {
@@ -1508,7 +1510,7 @@ class OutputPage extends ContextSource {
        /**
         * Add wikitext with a custom Title object
         *
-        * @param $text String: wikitext
+        * @param string $text wikitext
         * @param $title Title object
         * @param $linestart Boolean: is this the start of a line?
         * @param $tidy Boolean: whether to use tidy
@@ -1595,7 +1597,6 @@ class OutputPage extends ContextSource {
                $this->addHTML( $text );
        }
 
-
        /**
         * Add the output of a QuickTemplate to the output buffer
         *
@@ -1741,7 +1742,7 @@ class OutputPage extends ContextSource {
        /**
         * Add an HTTP header that will influence on the cache
         *
-        * @param $header String: header name
+        * @param string $header header name
         * @param $option Array|null
         * @todo FIXME: Document the $option parameter; it appears to be for
         *        X-Vary-Options but what format is acceptable?
@@ -1938,7 +1939,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get the message associed with the HTTP response code $code
+        * Get the message associated with the HTTP response code $code
         *
         * @param $code Integer: status code
         * @return String or null: message or null if $code is not in the list of
@@ -2047,7 +2048,7 @@ class OutputPage extends ContextSource {
        /**
         * Actually output something with print().
         *
-        * @param $ins String: the string to output
+        * @param string $ins the string to output
         */
        public function out( $ins ) {
                print $ins;
@@ -2066,8 +2067,8 @@ class OutputPage extends ContextSource {
         * indexing, clear the current text and redirect, set the page's title
         * and optionally an custom HTML title (content of the "<title>" tag).
         *
-        * @param $pageTitle String|Message will be passed directly to setPageTitle()
-        * @param $htmlTitle String|Message will be passed directly to setHTMLTitle();
+        * @param string|Message $pageTitle will be passed directly to setPageTitle()
+        * @param string|Message $htmlTitle will be passed directly to setHTMLTitle();
         *                   optional, if not passed the "<title>" attribute will be
         *                   based on $pageTitle
         */
@@ -2093,7 +2094,7 @@ class OutputPage extends ContextSource {
         *
         * @param $title Mixed: message key (string) for page title, or a Message object
         * @param $msg Mixed: message key (string) for page text, or a Message object
-        * @param $params Array: message parameters; ignored if $msg is a Message object
+        * @param array $params message parameters; ignored if $msg is a Message object
         */
        public function showErrorPage( $title, $msg, $params = array() ) {
                if( !$title instanceof Message ) {
@@ -2114,8 +2115,8 @@ class OutputPage extends ContextSource {
        /**
         * Output a standard permission error page
         *
-        * @param $errors Array: error message keys
-        * @param $action String: action that was denied or null if unknown
+        * @param array $errors error message keys
+        * @param string $action action that was denied or null if unknown
         */
        public function showPermissionsErrorPage( $errors, $action = null ) {
                // For some action (read, edit, create and upload), display a "login to do this action"
@@ -2199,7 +2200,7 @@ class OutputPage extends ContextSource {
        /**
         * Display an error page noting that a given permission bit is required.
         * @deprecated since 1.18, just throw the exception directly
-        * @param $permission String: key required
+        * @param string $permission key required
         * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
@@ -2218,8 +2219,8 @@ class OutputPage extends ContextSource {
        /**
         * Format a list of error messages
         *
-        * @param $errors Array of arrays returned by Title::getUserPermissionsErrors
-        * @param $action String: action that was denied or null if unknown
+        * @param array $errors of arrays returned by Title::getUserPermissionsErrors
+        * @param string $action action that was denied or null if unknown
         * @return String: the wikitext error-messages, formatted into a list.
         */
        public function formatPermissionsErrorMessage( $errors, $action = null ) {
@@ -2330,7 +2331,7 @@ $templates
        }
 
        /**
-        * Turn off regular page output and return an error reponse
+        * Turn off regular page output and return an error response
         * for when rate limiting has triggered.
         */
        public function rateLimited() {
@@ -2387,8 +2388,8 @@ $templates
         * Add a "return to" link pointing to a specified title
         *
         * @param $title Title to link
-        * @param $query Array query string parameters
-        * @param $text String text of the link (input is not escaped)
+        * @param array $query query string parameters
+        * @param string $text text of the link (input is not escaped)
         * @param $options Options array to pass to Linker
         */
        public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
@@ -2412,7 +2413,7 @@ $templates
         *
         * @param $unused
         * @param $returnto Title or String to return to
-        * @param $returntoquery String: query string for the return to link
+        * @param string $returntoquery query string for the return to link
         */
        public function returnToMain( $unused = null, $returnto = null, $returntoquery = null ) {
                if ( $returnto == null ) {
@@ -2569,9 +2570,9 @@ $templates
        /**
         * TODO: Document
         * @param $modules Array/string with the module name(s)
-        * @param $only String ResourceLoaderModule TYPE_ class constant
+        * @param string $only ResourceLoaderModule TYPE_ class constant
         * @param $useESI boolean
-        * @param $extraQuery Array with extra query parameters to add to each request. array( param => value )
+        * @param array $extraQuery with extra query parameters to add to each request. array( param => value )
         * @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
         * @return string html "<script>" and "<style>" tags
         */
@@ -2694,7 +2695,7 @@ $templates
                        }
                        // Special handling for the user group; because users might change their stuff
                        // on-wiki like user pages, or user preferences; we need to find the highest
-                       // timestamp of these user-changable modules so we can ensure cache misses on change
+                       // timestamp of these user-changeable modules so we can ensure cache misses on change
                        // This should NOT be done for the site group (bug 27564) because anons get that too
                        // and we shouldn't be putting timestamps in Squid-cached HTML
                        $version = null;
@@ -2950,7 +2951,6 @@ $templates
                $this->mJsConfigVars[$keys] = $value;
        }
 
-
        /**
         * Get an array containing the variables to be set in mw.config in JavaScript.
         *
@@ -3002,18 +3002,20 @@ $templates
                        implode( "\t", $digitTransTable ),
                );
 
+               $user = $this->getUser();
+
                $vars = array(
                        'wgCanonicalNamespace' => $nsname,
                        'wgCanonicalSpecialPageName' => $canonicalName,
                        'wgNamespaceNumber' => $title->getNamespace(),
-                       'wgPageName' => $title->getPrefixedDBKey(),
+                       'wgPageName' => $title->getPrefixedDBkey(),
                        'wgTitle' => $title->getText(),
                        'wgCurRevisionId' => $latestRevID,
                        'wgArticleId' => $pageID,
                        'wgIsArticle' => $this->isArticle(),
                        'wgAction' => Action::getActionName( $this->getContext() ),
-                       'wgUserName' => $this->getUser()->isAnon() ? null : $this->getUser()->getName(),
-                       'wgUserGroups' => $this->getUser()->getEffectiveGroups(),
+                       'wgUserName' => $user->isAnon() ? null : $user->getName(),
+                       'wgUserGroups' => $user->getEffectiveGroups(),
                        'wgCategories' => $this->getCategories(),
                        'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
                        'wgPageContentLanguage' => $lang->getCode(),
@@ -3022,8 +3024,14 @@ $templates
                        'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
                        'wgMonthNames' => $lang->getMonthNamesArray(),
                        'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
-                       'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey(),
+                       'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
                );
+               if ( $user->isLoggedIn() ) {
+                       $vars['wgUserId'] = $user->getId();
+                       $vars['wgUserEditCount'] = $user->getEditCount();
+                       $userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
+                       $vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+               }
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
                }
@@ -3034,7 +3042,7 @@ $templates
                        $vars['wgIsMainPage'] = true;
                }
                if ( $this->mRedirectedFrom ) {
-                       $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBKey();
+                       $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBkey();
                }
 
                // Allow extensions to add their custom variables to the mw.config map.
@@ -3072,7 +3080,7 @@ $templates
        }
 
        /**
-        * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
+        * @param bool $addContentType Whether "<meta>" specifying content type should be returned
         *
         * @return array in format "link name or number => 'link html'".
         */
@@ -3213,7 +3221,6 @@ $templates
                        ) );
                }
 
-
                # Language variants
                if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
                        $lang = $this->getTitle()->getPageLanguage();
@@ -3323,7 +3330,7 @@ $templates
 
        /**
         * @param $unused
-        * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
+        * @param bool $addContentType Whether "<meta>" specifying content type should be returned
         *
         * @return string HTML tag links to be put in the header.
         */
@@ -3334,9 +3341,9 @@ $templates
        /**
         * Generate a "<link rel/>" for a feed.
         *
-        * @param $type String: feed type
-        * @param $url String: URL to the feed
-        * @param $text String: value of the "title" attribute
+        * @param string $type feed type
+        * @param string $url URL to the feed
+        * @param string $text value of the "title" attribute
         * @return String: HTML fragment
         */
        private function feedLink( $type, $url, $text ) {
@@ -3352,10 +3359,10 @@ $templates
         * Add a local or specified stylesheet, with the given media options.
         * Meant primarily for internal use...
         *
-        * @param $style String: URL to the file
-        * @param $media String: to specify a media type, 'screen', 'printable', 'handheld' or any.
-        * @param $condition String: for IE conditional comments, specifying an IE version
-        * @param $dir String: set to 'rtl' or 'ltr' for direction-specific sheets
+        * @param string $style URL to the file
+        * @param string $media to specify a media type, 'screen', 'printable', 'handheld' or any.
+        * @param string $condition for IE conditional comments, specifying an IE version
+        * @param string $dir set to 'rtl' or 'ltr' for direction-specific sheets
         */
        public function addStyle( $style, $media = '', $condition = '', $dir = '' ) {
                $options = array();
@@ -3376,7 +3383,7 @@ $templates
        /**
         * Adds inline CSS styles
         * @param $style_css Mixed: inline CSS
-        * @param $flip String: Set to 'flip' to flip the CSS if needed
+        * @param string $flip Set to 'flip' to flip the CSS if needed
         */
        public function addInlineStyle( $style_css, $flip = 'noflip' ) {
                if( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
@@ -3393,8 +3400,7 @@ $templates
         * @return string
         */
        public function buildCssLinks() {
-               global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs,
-                       $wgLang, $wgContLang;
+               global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs, $wgContLang;
 
                $this->getSkin()->setupSkinUserCss( $this );
 
@@ -3428,7 +3434,7 @@ $templates
                                // If needed, Janus it first. This is user-supplied CSS, so it's
                                // assumed to be right for the content language directionality.
                                $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
-                               if ( $wgLang->getDir() !== $wgContLang->getDir() ) {
+                               if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
                                        $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
                                }
                                $otherTags .= Html::inlineStyle( $previewedCSS );
@@ -3503,8 +3509,8 @@ $templates
        /**
         * Generate \<link\> tags for stylesheets
         *
-        * @param $style String: URL to the file
-        * @param $options Array: option, can contain 'condition', 'dir', 'media'
+        * @param string $style URL to the file
+        * @param array $options option, can contain 'condition', 'dir', 'media'
         *                 keys
         * @return String: HTML fragment
         */
@@ -3545,7 +3551,7 @@ $templates
        /**
         * Transform "media" attribute based on request parameters
         *
-        * @param $media String: current value of the "media" attribute
+        * @param string $media current value of the "media" attribute
         * @return String: modified value of the "media" attribute, or null to skip
         * this stylesheet
         */
@@ -3570,7 +3576,7 @@ $templates
                                        // 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 styesheets
+                                       // 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),
                                        // we don't want simple 'screen' but we might want screen queries that
                                        // have a max-width or something, so we'll pass all others on and let the
@@ -3673,7 +3679,7 @@ $templates
         * Include jQuery core. Use this to avoid loading it multiple times
         * before we get a usable script loader.
         *
-        * @param $modules Array: list of jQuery modules which should be loaded
+        * @param array $modules list of jQuery modules which should be loaded
         * @return Array: the list of modules which were not loaded.
         * @since 1.16
         * @deprecated since 1.17
index 6421350..7749bf1 100644 (file)
 
 /**
  * Display something vaguely comprehensible in the event of a totally unrecoverable error.
- * Does not assume access to *anything*; no globals, no autloader, no database, no localisation.
+ * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation.
  * Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php
  * no longer need to be).
  *
  * Calling this function kills execution immediately.
  *
- * @param $type String Which entry point we are protecting. One of:
+ * @param string $type Which entry point we are protecting. One of:
  *   - index.php
  *   - load.php
  *   - api.php
index 9e937e4..d2ac904 100644 (file)
@@ -143,7 +143,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                $this->mOffset = $this->mRequest->getText( 'offset' );
 
                # Use consistent behavior for the limit options
-               $this->mDefaultLimit = intval( $this->getUser()->getOption( 'rclimit' ) );
+               $this->mDefaultLimit = $this->getUser()->getIntOption( 'rclimit' );
                if ( !$this->mLimit ) {
                        // Don't override if a subclass calls $this->setLimit() in its constructor.
                        list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
@@ -269,7 +269,7 @@ 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 $offset String: index offset, inclusive
+        * @param string $offset index offset, inclusive
         * @param $limit Integer: exact query limit
         * @param $res ResultWrapper
         */
@@ -335,7 +335,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Do a query with specified parameters, rather than using the object
         * context
         *
-        * @param $offset String: index offset, inclusive
+        * @param string $offset index offset, inclusive
         * @param $limit Integer: exact query limit
         * @param $descending Boolean: query direction, false for ascending, true for descending
         * @return ResultWrapper
@@ -348,7 +348,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Build variables to use by the database wrapper.
         *
-        * @param $offset String: index offset, inclusive
+        * @param string $offset index offset, inclusive
         * @param $limit Integer: exact query limit
         * @param $descending Boolean: query direction, false for ascending, true for descending
         * @return array
@@ -431,9 +431,9 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Make a self-link
         *
-        * @param $text String: text displayed on the link
-        * @param $query Array: associative array of paramter to be in the query string
-        * @param $type String: 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
         */
@@ -688,8 +688,8 @@ abstract class IndexPager extends ContextSource implements Pager {
        protected function getExtraSortFields() { return array(); }
 
        /**
-        * Return the default sorting direction: false for ascending, true for de-
-        * scending.  You can also have an associative array of ordertype => dir,
+        * Return the default sorting direction: false for ascending, true for
+        * descending.  You can also have an associative array of ordertype => dir,
         * if multiple order types are supported.  In this case getIndexField()
         * must return an array, and the keys of that must exactly match the keys
         * of this.
@@ -709,7 +709,6 @@ abstract class IndexPager extends ContextSource implements Pager {
        protected function getDefaultDirections() { return false; }
 }
 
-
 /**
  * IndexPager with an alphabetic list and a formatted navigation bar
  * @ingroup Pager
@@ -785,8 +784,8 @@ abstract class AlphabeticPager extends IndexPager {
 
        /**
         * If this supports multiple order type messages, give the message key for
-        * enabling each one in getNavigationBar.  The return type is an associa-
-        * tive array whose keys must exactly match the keys of the array returned
+        * enabling each one in getNavigationBar.  The return type is an associative
+        * array whose keys must exactly match the keys of the array returned
         * by getIndexField(), and whose values are message keys.
         *
         * @return Array
@@ -1048,8 +1047,8 @@ abstract class TablePager extends IndexPager {
         *
         * @protected
         *
-        * @param $field String The column
-        * @param $value String The cell contents
+        * @param string $field The column
+        * @param string $value The cell contents
         * @return Array of attr => value
         */
        function getCellAttrs( $field, $value ) {
@@ -1178,7 +1177,7 @@ abstract class TablePager extends IndexPager {
         * Resubmits all defined elements of the query string, except for a
         * blacklist, passed in the $blacklist parameter.
         *
-        * @param $blacklist Array parameters from the request query which should not be resubmitted
+        * @param array $blacklist parameters from the request query which should not be resubmitted
         * @return String: HTML fragment
         */
        function getHiddenFields( $blacklist = array() ) {
@@ -1244,8 +1243,8 @@ abstract class TablePager extends IndexPager {
         *
         * @protected
         *
-        * @param $name String: the database field name
-        * @param $value String: 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 );
 
index 3be504a..fc891bb 100644 (file)
@@ -153,9 +153,9 @@ class PathRouter {
        /**
         * Add a new path pattern to the path router
         *
-        * @param $path string|array The path pattern to add
-        * @param $params array The params for this path pattern
-        * @param $options array The options for this path pattern
+        * @param string|array $path The path pattern to add
+        * @param array $params The params for this path pattern
+        * @param array $options The options for this path pattern
         */
        public function add( $path, $params = array(), $options = array() ) {
                if ( is_array( $path ) ) {
@@ -232,7 +232,7 @@ class PathRouter {
        /**
         * Parse a path and return the query matches for the path
         *
-        * @param $path string The path to parse
+        * @param string $path The path to parse
         * @return Array The array of matches for the path
         */
        public function parse( $path ) {
index 452dbc5..2ebef04 100644 (file)
 abstract class PoolCounter {
 
        /* Return codes */
-       const LOCKED   = 1; /* Lock acquired */
+       const LOCKED = 1; /* Lock acquired */
        const RELEASED = 2; /* Lock released */
-       const DONE     = 3; /* Another worker did the work for you */
+       const DONE = 3; /* Another worker did the work for you */
 
-       const ERROR      = -1; /* Indeterminate error */
+       const ERROR = -1; /* Indeterminate error */
        const NOT_LOCKED = -2; /* Called release() with no lock held */
        const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */
-       const TIMEOUT    = -4; /* Timeout exceeded */
-       const LOCK_HELD  = -5; /* Cannot acquire another lock while you have one lock held */
+       const TIMEOUT = -4; /* Timeout exceeded */
+       const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
 
        /**
         * I want to do this task and I need to do it myself.
@@ -107,9 +107,9 @@ abstract class PoolCounter {
 
        protected function __construct( $conf, $type, $key ) {
                $this->key = $key;
-               $this->workers  = $conf['workers'];
+               $this->workers = $conf['workers'];
                $this->maxqueue = $conf['maxqueue'];
-               $this->timeout  = $conf['timeout'];
+               $this->timeout = $conf['timeout'];
        }
 }
 
index 76e1760..56dba05 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Form to edit user perferences.
+ * Form to edit user preferences.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -129,7 +129,7 @@ class Preferences {
        static function getOptionFromUser( $name, $info, $user ) {
                $val = $user->getOption( $name );
 
-               // Handling for array-type preferences
+               // Handling for multiselect preferences
                if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
                                ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
                        $options = HTMLFormField::flattenOptions( $info['options'] );
@@ -143,6 +143,23 @@ class Preferences {
                        }
                }
 
+               // Handling for checkmatrix preferences
+               if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+                               ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+                       $columns = HTMLFormField::flattenOptions( $info['columns'] );
+                       $rows = HTMLFormField::flattenOptions( $info['rows'] );
+                       $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+                       $val = array();
+
+                       foreach ( $columns as $column ) {
+                               foreach ( $rows as $row ) {
+                                       if ( $user->getOption( "$prefix-$column-$row" ) ) {
+                                               $val[] = "$column-$row";
+                                       }
+                               }
+                       }
+               }
+
                return $val;
        }
 
@@ -185,7 +202,7 @@ class Preferences {
                                // Skip the default * group, seems useless here
                                continue;
                        }
-                       $groupName  = User::getGroupName( $ueg );
+                       $groupName = User::getGroupName( $ueg );
                        $userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
 
                        $memberName = User::getGroupMember( $ueg, $userName );
@@ -380,7 +397,6 @@ class Preferences {
                                );
                        }
 
-
                        $defaultPreferences['emailaddress'] = array(
                                'type' => 'info',
                                'raw' => true,
@@ -809,7 +825,6 @@ class Preferences {
                        'label-message' => 'tog-forceeditsummary',
                );
 
-
                $defaultPreferences['uselivepreview'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -992,7 +1007,6 @@ class Preferences {
                        'min' => 0,
                );
 
-
                if ( $wgVectorUseSimpleSearch ) {
                        $defaultPreferences['vector-simplesearch'] = array(
                                'type' => 'toggle',
@@ -1230,7 +1244,7 @@ class Preferences {
         * @param $user User
         * @param $context IContextSource
         * @param $formClass string
-        * @param $remove Array: array of items to remove
+        * @param array $remove array of items to remove
         * @return HtmlForm
         */
        static function getFormObject( $user, IContextSource $context, $formClass = 'PreferencesForm', array $remove = array() ) {
@@ -1459,7 +1473,7 @@ class Preferences {
         *
         * @deprecated in 1.20; use User::setEmailWithConfirmation() instead.
         * @param $user User
-        * @param $newaddr string New email address
+        * @param string $newaddr New email address
         * @return Array (true on success or Status on failure, info string)
         */
        public static function trySetUserEmail( User $user, $newaddr ) {
@@ -1560,10 +1574,11 @@ class PreferencesForm extends HTMLForm {
         * @return array
         */
        function filterDataForSubmit( $data ) {
-               // Support for separating MultiSelect preferences into multiple preferences
+               // Support for separating multi-option preferences into multiple preferences
                // Due to lack of array support.
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        $info = $field->mParams;
+
                        if ( $field instanceof HTMLMultiSelectField ) {
                                $options = HTMLFormField::flattenOptions( $info['options'] );
                                $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
@@ -1572,6 +1587,23 @@ class PreferencesForm extends HTMLForm {
                                        $data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
                                }
 
+                               unset( $data[$fieldname] );
+
+                       } elseif ( $field instanceof HTMLCheckMatrix ) {
+                               $columns = HTMLFormField::flattenOptions( $info['columns'] );
+                               $rows = HTMLFormField::flattenOptions( $info['rows'] );
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+                               foreach ( $columns as $column ) {
+                                       foreach ( $rows as $row ) {
+                                               // Make sure option hasn't been removed
+                                               if ( !isset( $info['remove-options'] )
+                                                       || !in_array( "$column-$row", $info['remove-options'] ) )
+                                               {
+                                                       $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
+                                               }
+                                       }
+                               }
+
                                unset( $data[$fieldname] );
                        }
                }
index 7df6a50..d37d9e8 100644 (file)
@@ -32,7 +32,7 @@ class PrefixSearch {
         *
         * @param $search String
         * @param $limit Integer
-        * @param $namespaces Array: used if query is not explicitely prefixed
+        * @param array $namespaces used if query is not explicitly prefixed
         * @return Array of strings
         */
        public static function titleSearch( $search, $limit, $namespaces = array() ) {
@@ -91,7 +91,7 @@ class PrefixSearch {
        /**
         * Prefix search special-case for Special: namespace.
         *
-        * @param $search String: term
+        * @param string $search term
         * @param $limit Integer: max number of items to return
         * @return Array
         */
@@ -147,8 +147,8 @@ class PrefixSearch {
         * be automatically capitalized by Title::secureAndSpit()
         * later on depending on $wgCapitalLinks)
         *
-        * @param $namespaces Array: namespaces to search in
-        * @param $search String: term
+        * @param array $namespaces namespaces to search in
+        * @param string $search term
         * @param $limit Integer: max number of items to return
         * @return Array of title strings
         */
index 17e4372..d7b8840 100644 (file)
@@ -201,7 +201,7 @@ class ProtectionForm {
        /**
         * Show the input form with optional error message
         *
-        * @param $err String: 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;
@@ -482,7 +482,7 @@ class ProtectionForm {
 
                # Add manual and custom reason field/selects as well as submit
                if( !$this->disabled ) {
-                       $out .=  Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
+                       $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= "
                                <tr>
@@ -554,8 +554,8 @@ class ProtectionForm {
        /**
         * Build protection level selector
         *
-        * @param $action String: action to protect
-        * @param $selected String: current protection level
+        * @param string $action action to protect
+        * @param string $selected current protection level
         * @return String: HTML fragment
         */
        function buildSelector( $action, $selected ) {
@@ -594,7 +594,7 @@ class ProtectionForm {
        /**
         * Prepare the label for a protection selector option
         *
-        * @param $permission String: permission required
+        * @param string $permission permission required
         * @return String
         */
        private function getOptionLabel( $permission ) {
index 1a147b1..b54a9a3 100644 (file)
@@ -60,8 +60,8 @@ function wfGetIP() {
 }
 
 /**
- * Checks if an IP is a trusted proxy providor.
- * Useful to tell if X-Fowarded-For data is possibly bogus.
+ * 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.
  *
  * @param $ip String
index a01ac68..e1f24fa 100644 (file)
@@ -72,7 +72,6 @@ global $wgDisableCounters;
 if ( !$wgDisableCounters )
        $wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
 
-
 /**
  * This is a class for doing query pages; since they're almost all the same,
  * we factor out some of the functionality into a superclass, and let
@@ -150,7 +149,7 @@ abstract class QueryPage extends SpecialPage {
 
        /**
         * For back-compat, subclasses may return a raw SQL query here, as a string.
-        * This is stronly deprecated; getQueryInfo() should be overridden instead.
+        * This is strongly deprecated; getQueryInfo() should be overridden instead.
         * @throws MWException
         * @return string
         */
@@ -229,7 +228,7 @@ abstract class QueryPage extends SpecialPage {
        }
 
        /**
-        * Sometime we dont want to build rss / atom feeds.
+        * Sometime we don't want to build rss / atom feeds.
         *
         * @return Boolean
         */
index 6af7597..d7cf995 100644 (file)
@@ -110,7 +110,7 @@ class RecentChange {
        /**
         * Obtain the recent change with a given rc_id value
         *
-        * @param $rcid Int rc_id value to retrieve
+        * @param int $rcid rc_id value to retrieve
         * @return RecentChange
         */
        public static function newFromId( $rcid ) {
@@ -120,7 +120,7 @@ class RecentChange {
        /**
         * Find the first recent change matching some specific conditions
         *
-        * @param $conds Array of conditions
+        * @param array $conds of conditions
         * @param $fname Mixed: override the method name in profiling/logs
         * @return RecentChange
         */
@@ -292,10 +292,10 @@ class RecentChange {
        /**
         * Send some text to UDP.
         * @see RecentChange::cleanupForIRC
-        * @param $line String: text to send
-        * @param $address String: defaults to $wgRC2UDPAddress.
-        * @param $prefix String: defaults to $wgRC2UDPPrefix.
-        * @param $port Int: defaults to $wgRC2UDPPort. (Since 1.17)
+        * @param string $line text to send
+        * @param string $address defaults to $wgRC2UDPAddress.
+        * @param string $prefix defaults to $wgRC2UDPPrefix.
+        * @param int $port defaults to $wgRC2UDPPort. (Since 1.17)
         * @return Boolean: success
         */
        public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
@@ -321,7 +321,7 @@ class RecentChange {
        }
 
        /**
-        * Remove newlines, carriage returns and decode html entites
+        * Remove newlines, carriage returns and decode html entities
         * @param $text String
         * @return String
         */
@@ -459,7 +459,7 @@ class RecentChange {
                        'rc_params'     => ''
                );
 
-               $rc->mExtra =  array(
+               $rc->mExtra = array(
                        'prefixedDBkey' => $title->getPrefixedDBkey(),
                        'lastTimestamp' => $lastTimestamp,
                        'oldSize'       => $oldSize,
@@ -518,7 +518,7 @@ class RecentChange {
                        'rc_params'         => ''
                );
 
-               $rc->mExtra =  array(
+               $rc->mExtra = array(
                        'prefixedDBkey' => $title->getPrefixedDBkey(),
                        'lastTimestamp' => 0,
                        'oldSize' => 0,
@@ -627,7 +627,7 @@ class RecentChange {
                        'rc_params'     => $params
                );
 
-               $rc->mExtra =  array(
+               $rc->mExtra = array(
                        'prefixedDBkey' => $title->getPrefixedDBkey(),
                        'lastTimestamp' => 0,
                        'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
@@ -685,7 +685,7 @@ class RecentChange {
        /**
         * Get an attribute value
         *
-        * @param $name String Attribute name
+        * @param string $name Attribute name
         * @return mixed
         */
        public function getAttribute( $name ) {
index 4bdce87..2b34984 100644 (file)
@@ -383,7 +383,7 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * Return the value of a select() page conds array for the paeg table.
+        * 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
@@ -558,7 +558,6 @@ class Revision implements IDBAccessObject {
                        // Build a new revision to be saved...
                        global $wgUser; // ugh
 
-
                        # if we have a content object, use it to set the model and type
                        if ( !empty( $row['content'] ) ) {
                                //@todo: when is that set? test with external store setup! check out insertOn() [dk]
@@ -889,7 +888,7 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * @param $field int one of DELETED_* bitfield constants
+        * @param int $field one of DELETED_* bitfield constants
         *
         * @return Boolean
         */
@@ -1095,7 +1094,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get previous revision for this title
         *
-        * @return Revision or null
+        * @return Revision|null
         */
        public function getPrevious() {
                if( $this->getTitle() ) {
@@ -1153,8 +1152,8 @@ class Revision implements IDBAccessObject {
          * field must be included
          *
          * @param $row Object: the text data
-         * @param $prefix String: table prefix (default 'old_')
-         * @param $wiki String|false: the name of the wiki to load the revision text from
+         * @param string $prefix table prefix (default 'old_')
+         * @param string|false $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.
@@ -1327,7 +1326,7 @@ class Revision implements IDBAccessObject {
 
                if ( $wgContentHandlerUseDB ) {
                        //NOTE: Store null for the default model and format, to save space.
-                       //XXX: Makes the DB sensitive to changed defaults. Make this behaviour optional? Only in miser mode?
+                       //XXX: Makes the DB sensitive to changed defaults. Make this behavior optional? Only in miser mode?
 
                        $model = $this->getContentModel();
                        $format = $this->getContentFormat();
@@ -1480,7 +1479,7 @@ class Revision implements IDBAccessObject {
         *
         * @param $dbw DatabaseBase
         * @param $pageId Integer: ID number of the page to read from
-        * @param $summary String: revision's summary
+        * @param string $summary revision's summary
         * @param $minor Boolean: whether the revision should be considered as minor
         * @return Revision|null on error
         */
@@ -1587,7 +1586,7 @@ class Revision implements IDBAccessObject {
         */
        static function getTimestampFromId( $title, $id ) {
                $dbr = wfGetDB( DB_SLAVE );
-               // Casting fix for DB2
+               // Casting fix for databases that can't take '' for rev_id
                if ( $id == '' ) {
                        $id = 0;
                }
index 3c5cfa8..d87c540 100644 (file)
@@ -190,7 +190,7 @@ abstract class RevisionItemBase {
        }
 
        /**
-        * Get the date, formatted in user's languae
+        * Get the date, formatted in user's language
         * @return String
         */
        public function formatDate() {
@@ -199,7 +199,7 @@ abstract class RevisionItemBase {
        }
 
        /**
-        * Get the time, formatted in user's languae
+        * Get the time, formatted in user's language
         * @return String
         */
        public function formatTime() {
index ff79c59..2dff081 100644 (file)
@@ -358,9 +358,9 @@ class Sanitizer {
         * @private
         * @param $text String
         * @param $processCallback Callback to do any variable or parameter replacements in HTML attribute values
-        * @param $args Array for the processing callback
-        * @param $extratags Array for any extra tags to include
-        * @param $removetags Array for any tags (default or extra) to exclude
+        * @param array $args 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
         */
        static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
@@ -372,7 +372,7 @@ class Sanitizer {
                wfProfileIn( __METHOD__ );
 
                // Base our staticInitialised variable off of the global config state so that if the globals
-               // are changed (like in the secrewed up test system) we will re-initialise the settings.
+               // are changed (like in the screwed up test system) we will re-initialise the settings.
                $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
                if ( !$staticInitialised || $staticInitialised != $globalContext ) {
 
@@ -514,7 +514,7 @@ class Sanitizer {
                                                isset( $htmlpairs[$t] ) ) {
                                                        $badtag = true;
                                                } elseif ( isset( $htmlsingleonly[$t] ) ) {
-                                                       # Hack to force empty tag for uncloseable elements
+                                                       # Hack to force empty tag for unclosable elements
                                                        $brace = '/>';
                                                } elseif ( isset( $htmlsingle[$t] ) ) {
                                                        # Hack to not close $htmlsingle tags
@@ -676,7 +676,7 @@ class Sanitizer {
         *
         * - Discards attributes not on a whitelist for the given element
         * - Unsafe style attributes are discarded
-        * - Invalid id attributes are reencoded
+        * - Invalid id attributes are re-encoded
         *
         * @param $attribs Array
         * @param $element String
@@ -696,10 +696,10 @@ class Sanitizer {
         *
         * - Discards attributes not the given whitelist
         * - Unsafe style attributes are discarded
-        * - Invalid id attributes are reencoded
+        * - Invalid id attributes are re-encoded
         *
         * @param $attribs Array
-        * @param $whitelist Array: list of allowed attribute names
+        * @param array $whitelist list of allowed attribute names
         * @return Array
         *
         * @todo Check for legal values where the DTD limits things.
@@ -1013,7 +1013,7 @@ class Sanitizer {
         * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
-        * @param $id String: id to escape
+        * @param string $id id to escape
         * @param $options Mixed: 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
@@ -1077,10 +1077,10 @@ class Sanitizer {
        }
 
        /**
-        * Given HTML input, escape with htmlspecialchars but un-escape entites.
+        * Given HTML input, escape with htmlspecialchars but un-escape entities.
         * This allows (generally harmless) entities like &#160; to survive.
         *
-        * @param $html String to escape
+        * @param string $html to escape
         * @return String: escaped input
         */
        static function escapeHtmlAllowEntities( $html ) {
@@ -1332,7 +1332,7 @@ class Sanitizer {
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
         *
-        * @param $text String (already normalized, containing entities)
+        * @param string $text (already normalized, containing entities)
         * @return String (still normalized, without entities)
         */
        public static function decodeCharReferencesAndNormalize( $text ) {
@@ -1448,7 +1448,7 @@ class Sanitizer {
                }
 
                if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
-                       # add HTML5 microdata tages as pecified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
+                       # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
                        $common = array_merge( $common, array(
                            'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
                        ) );
@@ -1634,7 +1634,7 @@ class Sanitizer {
         * Warning: this return value must be further escaped for literal
         * inclusion in HTML output as of 1.10!
         *
-        * @param $text String: HTML fragment
+        * @param string $text HTML fragment
         * @return String
         */
        static function stripAllTags( $text ) {
@@ -1746,7 +1746,7 @@ class Sanitizer {
         *
         * @since 1.18
         *
-        * @param $addr String E-mail address
+        * @param string $addr E-mail address
         * @return Bool
         */
        public static function validateEmail( $addr ) {
@@ -1758,7 +1758,7 @@ class Sanitizer {
                // Please note strings below are enclosed in brackets [], this make the
                // hyphen "-" a range indicator. Hence it is double backslashed below.
                // See bug 26948
-               $rfc5322_atext   = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
+               $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
                $rfc1034_ldh_str = "a-z0-9\\-";
 
                $HTML5_email_regexp = "/
index 0e4decf..7715484 100644 (file)
@@ -64,7 +64,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
        }
 
        $testIncludes = array(); // array containing all the includes needed for this test
-       $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
+       $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
        call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
@@ -109,7 +109,7 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
        }
 
        $testIncludes = array(); // array containing all the includes needed for this test
-       $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
+       $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$testSuiteName];
        call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
index 0853df1..e87b200 100644 (file)
@@ -70,7 +70,7 @@ if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
 
 if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
 if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory   = "$IP/skins";
+if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
 if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
 
 if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
index 11d7fd6..bbc14a1 100644 (file)
@@ -169,11 +169,11 @@ class SiteConfiguration {
 
        /**
         * Retrieves a configuration setting for a given wiki.
-        * @param $settingName String ID of the setting name to retrieve
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @param string $settingName ID of the setting name to retrieve
+        * @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.
+        * @param array $wikiTags The tags assigned to the wiki.
         * @return Mixed the value of the setting requested.
         */
        public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
@@ -184,9 +184,9 @@ class SiteConfiguration {
        /**
         * Really retrieves a configuration setting for a given wiki.
         *
-        * @param $settingName String ID of the setting name to retrieve.
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $params Array: array of parameters.
+        * @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.
         */
        protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
@@ -280,10 +280,10 @@ class SiteConfiguration {
 
        /**
         * Gets all settings for a wiki
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @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.
+        * @param array $wikiTags The tags assigned to the wiki.
         * @return Array Array of settings requested.
         */
        public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
@@ -310,10 +310,10 @@ class SiteConfiguration {
 
        /**
         * Retrieves a configuration setting for a given wiki, forced to a boolean.
-        * @param $setting String ID of the setting name to retrieve
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @param string $setting ID of the setting name to retrieve
+        * @param string $wiki Wiki ID of the wiki in question.
+        * @param string $suffix The suffix of the wiki in question.
+        * @param array $wikiTags The tags assigned to the wiki.
         * @return bool The value of the setting requested.
         */
        public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
@@ -331,12 +331,12 @@ class SiteConfiguration {
 
        /**
         * Retrieves the value of a given setting, and places it in a variable passed by reference.
-        * @param $setting String ID of the setting name to retrieve
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $var array Reference The variable to insert the value into.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @param string $setting ID of the setting name to retrieve
+        * @param string $wiki Wiki ID of the wiki in question.
+        * @param string $suffix The suffix of the wiki in question.
+        * @param array $var Reference The variable to insert the value into.
+        * @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() ) {
                $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
@@ -347,11 +347,11 @@ class SiteConfiguration {
 
        /**
         * Retrieves the value of a given setting, and places it in its corresponding global variable.
-        * @param $setting String ID of the setting name to retrieve
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @param string $setting ID of the setting name to retrieve
+        * @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.
+        * @param array $wikiTags The tags assigned to the wiki.
         */
        public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
@@ -381,10 +381,10 @@ class SiteConfiguration {
 
        /**
         * Retrieves the values of all settings, and places them in their corresponding global variables.
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @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.
+        * @param array $wikiTags The tags assigned to the wiki.
         */
        public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
@@ -433,11 +433,11 @@ class SiteConfiguration {
         * by self::$siteParamsCallback for backward compatibility
         * Values returned by self::getWikiParams() have the priority.
         *
-        * @param $wiki String Wiki ID of the wiki in question.
-        * @param $suffix String The suffix of the wiki in question.
-        * @param $params Array List of parameters. $.'key' is replaced by $value in
+        * @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.
-        * @param $wikiTags Array The tags assigned to the wiki.
+        * @param array $wikiTags The tags assigned to the wiki.
         * @return array
         */
        protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ) {
index addaddd..b7be29d 100644 (file)
@@ -160,7 +160,7 @@ class SiteStats {
 
        /**
         * Find the number of users in a given user group.
-        * @param $group String: name of group
+        * @param string $group name of group
         * @return Integer
         */
        static function numberingroup( $group ) {
@@ -398,7 +398,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
 
        /**
         * @param $type string
-        * @param $sign string ('+' or '-')
+        * @param string $sign ('+' or '-')
         * @return string
         */
        private function getTypeCacheKey( $type, $sign ) {
@@ -451,7 +451,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
 
        /**
         * Reduce pending delta counters after updates have been applied
-        * @param Array $pd Result of getPendingDeltas(), used for DB update
+        * @param array $pd Result of getPendingDeltas(), used for DB update
         * @return void
         */
        protected function removePendingDeltas( array $pd ) {
@@ -574,7 +574,7 @@ class SiteStatsInit {
         * @param $database DatabaseBase|bool
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
-        * @param $options Array of options, may contain the following values
+        * @param array $options of options, may contain the following values
         * - update Boolean: whether to update the current stats (true) or write fresh (false) (default: false)
         * - views Boolean: when true, do not update the number of page views (default: true)
         * - activeUsers Boolean: whether to update the number of active users (default: false)
index 723ede4..0cc1086 100644 (file)
@@ -107,7 +107,7 @@ abstract class Skin extends ContextSource {
         * Normalize a skin preference value to a form that can be loaded.
         * If a skin can't be found, it will fall back to the configured
         * default (or the old 'Classic' skin if that's broken).
-        * @param $key String: 'monobook', 'standard', etc.
+        * @param string $key 'monobook', 'standard', etc.
         * @return string
         */
        static function normalizeKey( $key ) {
@@ -148,7 +148,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Factory method for loading a skin of a given type
-        * @param $key String: 'monobook', 'standard', etc.
+        * @param string $key 'monobook', 'standard', etc.
         * @return Skin
         */
        static function &newFromKey( $key ) {
@@ -167,7 +167,7 @@ abstract class Skin extends ContextSource {
                                require_once( "{$wgStyleDirectory}/{$skinName}.php" );
                        }
 
-                       # Check if we got if not failback to default skin
+                       # Check if we got if not fallback to default skin
                        if ( !MWInit::classExists( $className ) ) {
                                # DO NOT die if the class isn't found. This breaks maintenance
                                # scripts and can cause a user account to be unrecoverable
@@ -481,8 +481,8 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Render the array as a serie of links.
-        * @param $tree Array: categories tree returned by Title::getParentCategoryTree
+        * 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"
         */
        function drawCategoryBrowser( $tree ) {
@@ -613,7 +613,6 @@ abstract class Skin extends ContextSource {
                        ( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) {
                        $n = $this->getTitle()->isDeleted();
 
-
                        if ( $n ) {
                                if ( $this->getUser()->isAllowed( 'undelete' ) ) {
                                        $msg = 'thisisdeleted';
@@ -851,9 +850,9 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Renders a $wgFooterIcons icon acording to the method's arguments
-        * @param $icon Array: The icon to build the html for, see $wgFooterIcons for the format of this array
-        * @param $withImage Bool|String: Whether to use the icon's image or output a text-only footericon
+        * 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
         */
        function makeFooterIcon( $icon, $withImage = 'withImage' ) {
@@ -969,7 +968,7 @@ abstract class Skin extends ContextSource {
         * Return a fully resolved style path url to images or styles stored in the common folder.
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
-        * @param $name String: The name or path of a skin resource file
+        * @param string $name The name or path of a skin resource file
         * @return String The fully resolved style path url including styleversion
         */
        function getCommonStylePath( $name ) {
@@ -978,10 +977,10 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Return a fully resolved style path url to images or styles stored in the curent skins's folder.
+        * Return a fully resolved style path url to images or styles stored in the current skins's folder.
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
-        * @param $name String: The name or path of a skin resource file
+        * @param string $name The name or path of a skin resource file
         * @return String The fully resolved style path url including styleversion
         */
        function getSkinStylePath( $name ) {
@@ -1008,8 +1007,8 @@ abstract class Skin extends ContextSource {
         * If $proto is set to null, make a local URL. Otherwise, make a full
         * URL with the protocol specified.
         *
-        * @param $name string Name of the Special page
-        * @param $urlaction string Query to append
+        * @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
         */
@@ -1102,7 +1101,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Make URL details where the article exists (or at least it's convenient to think so)
-        * @param $name String Article name
+        * @param string $name Article name
         * @param $urlaction String
         * @return Array
         */
@@ -1382,7 +1381,7 @@ abstract class Skin extends ContextSource {
        /**
         * Get a cached notice
         *
-        * @param $name String: message name, or 'default' for $wgSiteNotice
+        * @param string $name message name, or 'default' for $wgSiteNotice
         * @return String: HTML fragment
         */
        private function getCachedNotice( $name ) {
@@ -1490,9 +1489,9 @@ abstract class Skin extends ContextSource {
         *
         * @param $nt      Title  The title being linked to (may not be the same as
         *   $wgTitle, if the section is included from a template)
-        * @param $section string The designation of the section being pointed to,
+        * @param string $section The designation of the section being pointed to,
         *   to be included in the link, like "&section=$section"
-        * @param $tooltip string The tooltip to use for the link: will be escaped
+        * @param string $tooltip The tooltip to use for the link: will be escaped
         *   and wrapped in the 'editsectionhint' message
         * @param $lang    string Language code
         * @return         string HTML to use for edit link
@@ -1550,8 +1549,8 @@ abstract class Skin extends ContextSource {
         * Use PHP's magic __call handler to intercept legacy calls to the linker
         * for backwards compatibility.
         *
-        * @param $fname String Name of called method
-        * @param $args Array Arguments to the method
+        * @param string $fname Name of called method
+        * @param array $args Arguments to the method
         * @throws MWException
         * @return mixed
         */
index c1c7219..b9766a9 100644 (file)
@@ -786,7 +786,7 @@ class LegacyTemplate extends BaseTemplate {
                        return '';
                }
 
-               # __NEWSECTIONLINK___ changes behaviour here
+               # __NEWSECTIONLINK___ changes behavior here
                # If it is present, the link points to this page, otherwise
                # it points to the talk page
                if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
index 86972ee..59e1ccf 100644 (file)
@@ -113,7 +113,7 @@ class SkinTemplate extends Skin {
         * roughly equivalent to PHPTAL 0.7.
         *
         * @param $classname String
-        * @param $repository string: subdirectory where we keep template files
+        * @param string $repository subdirectory where we keep template files
         * @param $cache_dir string
         * @return QuickTemplate
         * @private
@@ -262,7 +262,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'helppage', $this->msg( 'helppage' )->text() );
                */
                $tpl->set( 'searchaction', $this->escapeSearchLink() );
-               $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBKey() );
+               $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBkey() );
                $tpl->set( 'search', trim( $request->getVal( 'search' ) ) );
                $tpl->setRef( 'stylepath', $wgStylePath );
                $tpl->setRef( 'articlepath', $wgArticlePath );
@@ -273,7 +273,7 @@ class SkinTemplate extends Skin {
 
                $userLang = $this->getLanguage();
                $userLangCode = $userLang->getHtmlCode();
-               $userLangDir  = $userLang->getDir();
+               $userLangDir = $userLang->getDir();
 
                $tpl->set( 'lang', $userLangCode );
                $tpl->set( 'dir', $userLangDir );
@@ -505,7 +505,7 @@ class SkinTemplate extends Skin {
         * Format language name for use in sidebar interlanguage links list.
         * By default it is capitalized.
         *
-        * @param $name string Language name, e.g. "English" or "español"
+        * @param string $name Language name, e.g. "English" or "español"
         * @return string
         * @private
         */
@@ -526,7 +526,7 @@ class SkinTemplate extends Skin {
        }
 
        /**
-        * Output a boolean indiciating if buildPersonalUrls should output separate
+        * Output a boolean indicating if buildPersonalUrls should output separate
         * login and create account links or output a combined link
         * By default we simply return a global config setting that affects most skins
         * This is setup as a method so that like with $wgLogo and getLogo() a skin
@@ -779,7 +779,7 @@ class SkinTemplate extends Skin {
         * variants: Used to list the language variants for the page
         *
         * Each section's value is a key/value array of links for that section.
-        * The links themseves have these common keys:
+        * The links themselves have these common keys:
         * - class: The css classes to apply to the tab
         * - text: The text to display on the tab
         * - href: The href for the tab to point to
@@ -1073,8 +1073,8 @@ class SkinTemplate extends Skin {
                # We don't want to give the watch tab an accesskey if the
                # page is being edited, because that conflicts with the
                # accesskey on the watch checkbox.  We also don't want to
-               # give the edit tab an accesskey, because that's fairly su-
-               # perfluous and conflicts with an accesskey (Ctrl-E) often
+               # give the edit tab an accesskey, because that's fairly
+               # superfluous and conflicts with an accesskey (Ctrl-E) often
                # used for editing in Safari.
                if ( in_array( $action, array( 'edit', 'submit' ) ) ) {
                        if ( isset( $content_navigation['views']['edit'] ) ) {
@@ -1174,6 +1174,7 @@ class SkinTemplate extends Skin {
                $nav_urls['log'] = false;
                $nav_urls['blockip'] = false;
                $nav_urls['emailuser'] = false;
+               $nav_urls['userrights'] = false;
 
                // A print stylesheet is attached to all pages, but nobody ever
                // figures that out. :)  Add a link...
@@ -1241,6 +1242,13 @@ class SkinTemplate extends Skin {
                                        'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser )
                                );
                        }
+
+                       $sur = new UserrightsPage;
+                       if ( $sur->userCanExecute( $this->getUser() ) ) {
+                               $nav_urls['userrights'] = array(
+                                       'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+                               );
+                       }
                }
 
                wfProfileOut( __METHOD__ );
@@ -1389,7 +1397,7 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * Get a Message object with its context set
         *
-        * @param $name string message name
+        * @param string $name message name
         * @return Message
         */
        public function getMsg( $name ) {
@@ -1411,7 +1419,7 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * Create an array of common toolbox items from the data in the quicktemplate
         * stored by SkinTemplate.
-        * The resulting array is built acording to a format intended to be passed
+        * The resulting array is built according to a format intended to be passed
         * through makeListItem to generate the html.
         * @return array
         */
@@ -1439,7 +1447,7 @@ abstract class BaseTemplate extends QuickTemplate {
                                $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
                        }
                }
-               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', '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";
@@ -1475,7 +1483,7 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * Create an array of personal tools items from the data in the quicktemplate
         * stored by SkinTemplate.
-        * The resulting array is built acording to a format intended to be passed
+        * The resulting array is built according to a format intended to be passed
         * through makeListItem to generate the html.
         * This is in reality the same list as already stored in personal_urls
         * however it is reformatted so that you can just pass the individual items
@@ -1638,9 +1646,9 @@ abstract class BaseTemplate extends QuickTemplate {
         * Makes a link, usually used by makeListItem to generate a link for an item
         * in a list used in navigation lists, portlets, portals, sidebars, etc...
         *
-        * @param $key string usually a key from the list you are generating this
+        * @param string $key usually a key from the list you are generating this
         * link from.
-        * @param $item array contains some of a specific set of keys.
+        * @param array $item contains some of a specific set of keys.
         *
         * The text of the link will be generated either from the contents of the
         * "text" key in the $item array, if a "msg" key is present a message by
@@ -1657,7 +1665,7 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If you don't want an accesskey, set $item['tooltiponly'] = true;
         *
-        * @param $options array can be used to affect the output of a link.
+        * @param array $options can be used to affect the output of a link.
         * Possible options are:
         *   - 'text-wrapper' key to specify a list of elements to wrap the text of
         *   a link in. This should be an array of arrays containing a 'tag' and
index 3b3a5ee..c32738f 100644 (file)
@@ -135,7 +135,7 @@ class SpecialPage {
         * preferred method is now to add a SpecialPage_initList hook.
         * @deprecated since 1.18
         *
-        * @param $name String the page to remove
+        * @param string $name the page to remove
         */
        static function removePage( $name ) {
                wfDeprecated( __METHOD__, '1.18' );
@@ -145,7 +145,7 @@ class SpecialPage {
        /**
         * Check if a given name exist as a special page or as a special page alias
         *
-        * @param $name String: name of a special page
+        * @param string $name name of a special page
         * @return Boolean: true if a special page exists with this name
         * @deprecated since 1.18 call SpecialPageFactory method directly
         */
@@ -253,8 +253,8 @@ class SpecialPage {
         * Get a localised Title object for a specified special page name
         *
         * @param $name String
-        * @param $subpage String|Bool subpage string, or false to not use a subpage
-        * @param $fragment String the link fragment (after the "#")
+        * @param string|Bool $subpage subpage string, or false to not use a subpage
+        * @param string $fragment the link fragment (after the "#")
         * @throws MWException
         * @return Title object
         */
@@ -271,7 +271,7 @@ class SpecialPage {
         * Get a localised Title object for a page name with a possibly unvalidated subpage
         *
         * @param $name String
-        * @param $subpage String|Bool subpage string, or false to not use a subpage
+        * @param string|Bool $subpage subpage string, or false to not use a subpage
         * @return Title object or null if the page doesn't exist
         */
        public static function getSafeTitleFor( $name, $subpage = false ) {
@@ -302,15 +302,15 @@ class SpecialPage {
         *     be displayed by the default execute() method, without the global function ever
         *     being called.
         *
-        *     If you override execute(), you can recover the default behaviour with userCanExecute()
+        *     If you override execute(), you can recover the default behavior with userCanExecute()
         *     and displayRestrictionError()
         *
-        * @param $name String: name of the special page, as seen in links and URLs
-        * @param $restriction String: user right required, e.g. "block" or "delete"
-        * @param $listed Bool: whether the page is listed in Special:Specialpages
+        * @param string $name name of the special page, as seen in links and URLs
+        * @param string $restriction user right required, e.g. "block" or "delete"
+        * @param bool $listed whether the page is listed in Special:Specialpages
         * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-        * @param $file String: file which is included by execute(). It is also constructed from $name by default
-        * @param $includable Bool: whether the page can be included in normal pages
+        * @param string $file file which is included by execute(). It is also constructed from $name by default
+        * @param bool $includable whether the page can be included in normal pages
         */
        public function __construct(
                $name = '', $restriction = '', $listed = true,
@@ -322,12 +322,12 @@ class SpecialPage {
        /**
         * Do the real work for the constructor, mainly so __call() can intercept
         * calls to SpecialPage()
-        * @param $name String: name of the special page, as seen in links and URLs
-        * @param $restriction String: user right required, e.g. "block" or "delete"
-        * @param $listed Bool: whether the page is listed in Special:Specialpages
+        * @param string $name name of the special page, as seen in links and URLs
+        * @param string $restriction user right required, e.g. "block" or "delete"
+        * @param bool $listed whether the page is listed in Special:Specialpages
         * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-        * @param $file String: file which is included by execute(). It is also constructed from $name by default
-        * @param $includable Bool: whether the page can be included in normal pages
+        * @param string $file file which is included by execute(). It is also constructed from $name by default
+        * @param bool $includable whether the page can be included in normal pages
         */
        private function init( $name, $restriction, $listed, $function, $file, $includable ) {
                $this->mName = $name;
@@ -350,8 +350,8 @@ class SpecialPage {
         * Use PHP's magic __call handler to get calls to the old PHP4 constructor
         * because PHP E_STRICT yells at you for having __construct() and SpecialPage()
         *
-        * @param $fName String Name of called method
-        * @param $a Array Arguments to the method
+        * @param string $fName Name of called method
+        * @param array $a Arguments to the method
         * @throws MWException
         * @deprecated since 1.17, call parent::__construct()
         */
@@ -670,10 +670,10 @@ class SpecialPage {
        /**
         * Outputs a summary message on top of special pages
         * Per default the message key is the canonical name of the special page
-        * May be overriden, i.e. by extensions to stick with the naming conventions
+        * May be overridden, i.e. by extensions to stick with the naming conventions
         * for message keys: 'extensionname-xxx'
         *
-        * @param $summaryMessageKey String: message key of the summary
+        * @param string $summaryMessageKey message key of the summary
         */
        function outputHeader( $summaryMessageKey = '' ) {
                global $wgContLang;
@@ -695,7 +695,7 @@ class SpecialPage {
         * also the name that will be listed in Special:Specialpages
         *
         * Derived classes can override this, but usually it is easier to keep the
-        * default behaviour. Messages can be added at run-time, see
+        * default behavior. Messages can be added at run-time, see
         * MessageCache.php.
         *
         * @return String
@@ -827,7 +827,7 @@ class SpecialPage {
                // RequestContext passes context to wfMessage, and the language is set from
                // the context, but setting the language for Message class removes the
                // interface message status, which breaks for example usernameless gender
-               // invokations. Restore the flag when not including special page in content.
+               // invocations. Restore the flag when not including special page in content.
                if ( $this->including() ) {
                        $message->setInterfaceMessageFlag( false );
                }
@@ -850,6 +850,57 @@ class SpecialPage {
                        $this->getOutput()->addFeedLink( $format, $url );
                }
        }
+
+       /**
+        * Get the group that the special page belongs in on Special:SpecialPage
+        * Use this method, instead of getGroupName to allow customization
+        * of the group name from the wiki side
+        *
+        * @return string Group of this special page
+        * @since 1.21
+        */
+       public function getFinalGroupName() {
+               global $wgSpecialPageGroups;
+               $name = $this->getName();
+               $group = '-';
+
+               // Allow overbidding the group from the wiki side
+               $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
+               if ( !$msg->isBlank() ) {
+                       $group = $msg->text();
+               } else {
+                       // Than use the group from this object
+                       $group = $this->getGroupName();
+
+                       // Group '-' is used as default to have the chance to determine,
+                       // if the special pages overrides this method,
+                       // if not overridden, $wgSpecialPageGroups is checked for b/c
+                       if ( $group === '-' && isset( $wgSpecialPageGroups[$name] ) ) {
+                               $group = $wgSpecialPageGroups[$name];
+                       }
+               }
+
+               // never give '-' back, change to 'other'
+               if ( $group === '-' ) {
+                       $group = 'other';
+               }
+
+               return $group;
+       }
+
+       /**
+        * Under which header this special page is listed in Special:SpecialPages
+        * See messages 'specialpages-group-*' for valid names
+        * This method defaults to group 'other'
+        *
+        * @return string
+        * @since 1.21
+        */
+       protected function getGroupName() {
+               // '-' used here to determine, if this group is overridden or has a hardcoded 'other'
+               // Needed for b/c in getFinalGroupName
+               return '-';
+       }
 }
 
 /**
@@ -889,7 +940,7 @@ abstract class FormSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get the HTMLForm to control behaviour
+        * Get the HTMLForm to control behavior
         * @return HTMLForm|null
         */
        protected function getForm() {
@@ -932,7 +983,7 @@ abstract class FormSpecialPage extends SpecialPage {
        /**
         * Basic SpecialPage workflow: get a form, send it to the user; get some data back,
         *
-        * @param $par String Subpage string if one was specified
+        * @param string $par Subpage string if one was specified
         */
        public function execute( $par ) {
                $this->setParameter( $par );
@@ -1031,7 +1082,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
        // Query parameters that can be passed through redirects
        protected $mAllowedRedirectParams = array();
 
-       // Query parameteres added by redirects
+       // Query parameters added by redirects
        protected $mAddedRedirectParams = array();
 
        public function execute( $par ) {
@@ -1058,7 +1109,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
         * If the special page is a redirect, then get the Title object it redirects to.
         * False otherwise.
         *
-        * @param $par String Subpage string
+        * @param string $par Subpage string
         * @return Title|bool
         */
        abstract public function getRedirect( $par );
@@ -1140,7 +1191,7 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
 }
 /**
  * SpecialMypage, SpecialMytalk and SpecialMycontributions special pages
- * are used to get user independant links pointing to the user page, talk
+ * are used to get user independent links pointing to the user page, talk
  * page and list of contributions.
  * This can let us cache a single copy of any generated content for all
  * users.
index c94c358..7368ab7 100644 (file)
@@ -222,7 +222,7 @@ class SpecialPageFactory {
        /**
         * Initialise and return the list of special page aliases.  Returns an object with
         * properties which can be accessed $obj->pagename - each property is an array of
-        * aliases; the first in the array is the cannonical alias.  All registered special
+        * 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
@@ -286,8 +286,11 @@ class SpecialPageFactory {
         *
         * @param $page Mixed: SpecialPage or string
         * @param $group String
+        * @deprecated 1.21 Override SpecialPage::getGroupName
         */
        public static function setGroup( $page, $group ) {
+               wfDeprecated( __METHOD__, '1.21' );
+
                global $wgSpecialPageGroups;
                $name = is_object( $page ) ? $page->getName() : $page;
                $wgSpecialPageGroups[$name] = $group;
@@ -298,34 +301,18 @@ class SpecialPageFactory {
         *
         * @param $page SpecialPage
         * @return String
+        * @deprecated 1.21 Use SpecialPage::getFinalGroupName
         */
        public static function getGroup( &$page ) {
-               $name = $page->getName();
+               wfDeprecated( __METHOD__, '1.21' );
 
-               global $wgSpecialPageGroups;
-               static $specialPageGroupsCache = array();
-               if ( isset( $specialPageGroupsCache[$name] ) ) {
-                       return $specialPageGroupsCache[$name];
-               }
-               $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $name ) );
-               if ( !$msg->isBlank() ) {
-                       $group = $msg->text();
-               } else {
-                       $group = isset( $wgSpecialPageGroups[$name] )
-                               ? $wgSpecialPageGroups[$name]
-                               : '-';
-               }
-               if ( $group == '-' ) {
-                       $group = 'other';
-               }
-               $specialPageGroupsCache[$name] = $group;
-               return $group;
+               return $page->getFinalGroupName();
        }
 
        /**
         * Check if a given name exist as a special page or as a special page alias
         *
-        * @param $name String: name of a special page
+        * @param string $name name of a special page
         * @return Boolean: true if a special page exists with this name
         */
        public static function exists( $name ) {
@@ -336,7 +323,7 @@ class SpecialPageFactory {
        /**
         * Find the object with a given name and return it (or NULL)
         *
-        * @param $name String Special page name, may be localised and/or an alias
+        * @param string $name Special page name, may be localised and/or an alias
         * @return SpecialPage|null SpecialPage object or null if the page doesn't exist
         */
        public static function getPage( $name ) {
index 449b656..5d6236f 100644 (file)
@@ -47,7 +47,7 @@ class Status {
        /**
         * Factory function for fatal errors
         *
-        * @param $message String|Message: message name or object
+        * @param string|Message $message message name or object
         * @return Status
         */
        static function newFatal( $message /*, parameters...*/ ) {
@@ -103,7 +103,7 @@ class Status {
        /**
         * Add a new warning
         *
-        * @param $message String|Message: message name or object
+        * @param string|Message $message message name or object
         */
        function warning( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -117,7 +117,7 @@ class Status {
         * Add an error, do not set fatal flag
         * This can be used for non-fatal errors
         *
-        * @param $message String|Message: message name or object
+        * @param string|Message $message message name or object
         */
        function error( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -131,7 +131,7 @@ class Status {
         * Add an error and set OK to false, indicating that the operation
         * as a whole was fatal
         *
-        * @param $message String|Message: message name or object
+        * @param string|Message $message message name or object
         */
        function fatal( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -167,9 +167,9 @@ class Status {
        /**
         * Get the error list as a wikitext formatted list
         *
-        * @param $shortContext String: 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 $longContext String: a long enclosing context message name, for a list
+        * @param string $longContext a long enclosing context message name, for a list
         * @return String
         */
        function getWikiText( $shortContext = false, $longContext = false ) {
@@ -330,7 +330,7 @@ class Status {
         * 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 $msg String: message name
+        * @param string $msg message name
         * @return Boolean
         */
        function hasMessage( $msg ) {
index b0e6c12..f5e4acf 100644 (file)
@@ -32,9 +32,9 @@ class StreamFile {
         * Headers sent include: Content-type, Content-Length, Last-Modified,
         * and Content-Disposition.
         *
-        * @param $fname string Full name and path of the file to stream
-        * @param $headers array Any additional headers to send
-        * @param $sendErrors bool Send error messages if errors occur (like 404)
+        * @param string $fname Full name and path of the file to stream
+        * @param array $headers Any additional headers to send
+        * @param bool $sendErrors Send error messages if errors occur (like 404)
         * @throws MWException
         * @return bool Success
         */
@@ -71,10 +71,10 @@ class StreamFile {
         * (b) cancels any PHP output buffering and automatic gzipping of output
         * (c) sends Content-Length header based on HTTP_IF_MODIFIED_SINCE check
         *
-        * @param $path string Storage path or file system path
-        * @param $info Array|bool File stat info with 'mtime' and 'size' fields
-        * @param $headers Array Additional headers to send
-        * @param $sendErrors bool Send error messages if errors occur (like 404)
+        * @param string $path Storage path or file system path
+        * @param array|bool $info File stat info with 'mtime' and 'size' fields
+        * @param array $headers Additional headers to send
+        * @param bool $sendErrors Send error messages if errors occur (like 404)
         * @return int|bool READY_STREAM, NOT_MODIFIED, or false on failure
         */
        public static function prepareForStream(
@@ -143,8 +143,8 @@ class StreamFile {
        /**
         * Determine the file type of a file based on the path
         *
-        * @param $filename string Storage path or file system path
-        * @param $safe bool Whether to do retroactive upload blacklist checks
+        * @param string $filename Storage path or file system path
+        * @param bool $safe Whether to do retroactive upload blacklist checks
         * @return null|string
         */
        public static function contentTypeFromPath( $filename, $safe = true ) {
index 6647de4..f4c98f1 100644 (file)
@@ -49,7 +49,7 @@ class StringUtils {
        static function isUtf8( $value, $disableMbstring = false ) {
 
                if ( preg_match( '/[\x80-\xff]/', $value ) === 0 ) {
-                       # no high bit set, this is pure ASCII which is defacto
+                       # no high bit set, this is pure ASCII which is de facto
                        # valid UTF-8
                        return true;
                }
@@ -110,16 +110,16 @@ class StringUtils {
         * memory. The delimiters are literal strings, not regular expressions.
         *
         * If the start delimiter ends with an initial substring of the end delimiter,
-        * e.g. in the case of C-style comments, the behaviour differs from the model
+        * e.g. in the case of C-style comments, the behavior differs from the model
         * regex. In this implementation, the end must share no characters with the
         * start, so e.g. /*\/ is not considered to be both the start and end of a
         * comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
         *
-        * @param $startDelim String: start delimiter
-        * @param $endDelim String: end delimiter
+        * @param string $startDelim start delimiter
+        * @param string $endDelim end delimiter
         * @param $callback Callback: function to call on each match
         * @param $subject String
-        * @param $flags String: regular expression flags
+        * @param string $flags regular expression flags
         * @throws MWException
         * @return string
         */
@@ -200,12 +200,12 @@ class StringUtils {
         *
         *   preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
         *
-        * @param $startDelim String: start delimiter regular expression
-        * @param $endDelim String: end delimiter regular expression
-        * @param $replace String: replacement string. May contain $1, which will be
+        * @param string $startDelim start delimiter regular expression
+        * @param string $endDelim end delimiter regular expression
+        * @param string $replace replacement string. May contain $1, which will be
         *                 replaced by the text between the delimiters
-        * @param $subject String to search
-        * @param $flags String: regular expression flags
+        * @param string $subject to search
+        * @param string $flags regular expression flags
         * @return String: The string with the matches replaced
         */
        static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
@@ -405,7 +405,7 @@ class ReplacementArray {
        /**
         * Set an element of the replacement array
         * @param $from string
-        * @param $to stromg
+        * @param $to string
         */
        function setPair( $from, $to ) {
                $this->data[$from] = $to;
index 8a1e758..f0a3574 100644 (file)
@@ -41,9 +41,9 @@ class StubObject {
        /**
         * Constructor.
         *
-        * @param $global String: name of the global variable.
-        * @param $class String: name of the class of the real object.
-        * @param $params Array: parameters to pass to contructor of the real
+        * @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() ) {
@@ -53,7 +53,7 @@ class StubObject {
        }
 
        /**
-        * Returns a bool value whetever $obj is a stub object. Can be used to break
+        * 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.
@@ -70,8 +70,8 @@ class StubObject {
         * This function will also call the function with the same name in the real
         * object.
         *
-        * @param $name String: name of the function called
-        * @param $args Array: arguments
+        * @param string $name name of the function called
+        * @param array $args arguments
         * @return mixed
         */
        function _call( $name, $args ) {
@@ -91,8 +91,8 @@ class StubObject {
         * Function called by PHP if no function with that name exists in this
         * object.
         *
-        * @param $name String: name of the function called
-        * @param $args Array: arguments
+        * @param string $name name of the function called
+        * @param array $args arguments
         * @return mixed
         */
        function __call( $name, $args ) {
@@ -105,8 +105,8 @@ class StubObject {
         * This is public, for the convenience of external callers wishing to access
         * properties, e.g. eval.php
         *
-        * @param $name String: name of the method called in this object.
-        * @param $level Integer: level to go in the stact trace to get the function
+        * @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.
         * @throws MWException
         */
index 630ac53..1cf99a7 100644 (file)
@@ -42,7 +42,6 @@ class MWTimestamp {
                TS_RFC2822 => 'D, d M Y H:i:s',
                TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
                TS_POSTGRES => 'Y-m-d H:i:s',
-               TS_DB2 => 'Y-m-d H:i:s',
        );
 
        /**
@@ -73,7 +72,7 @@ class MWTimestamp {
         *
         * @since 1.20
         *
-        * @param $timestamp bool|string Timestamp to set, or false for current time
+        * @param bool|string $timestamp Timestamp to set, or false for current time
         */
        public function __construct( $timestamp = false ) {
                $this->setTimestamp( $timestamp );
@@ -87,7 +86,7 @@ class MWTimestamp {
         *
         * @since 1.20
         *
-        * @param $ts string|bool Timestamp to store, or false for now
+        * @param string|bool $ts Timestamp to store, or false for now
         * @throws TimestampException
         */
        public function setTimestamp( $ts = false ) {
@@ -118,8 +117,6 @@ class MWTimestamp {
                        # TS_POSTGRES
                } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
                        # TS_POSTGRES
-               } elseif (preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/', $ts, $da ) ) {
-                       # TS_DB2
                } 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
@@ -162,7 +159,7 @@ class MWTimestamp {
         *
         * @since 1.20
         *
-        * @param $style int Constant Output format for timestamp
+        * @param int $style Constant Output format for timestamp
         * @throws TimestampException
         * @return string The formatted timestamp
         */
index 40e5b09..e81023a 100644 (file)
@@ -88,7 +88,6 @@ class Title {
        var $mHasSubpage;                 // /< Whether a page has any subpages
        // @}
 
-
        /**
         * Constructor
         */
@@ -97,7 +96,7 @@ class Title {
        /**
         * Create a new Title from a prefixed DB key
         *
-        * @param $key String 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
@@ -116,10 +115,10 @@ 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 $text String 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 $defaultNamespace Int the namespace to use if none is speci-
-        *   fied by a prefix.  If you want to force a specific namespace even if
+        * @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
@@ -179,7 +178,7 @@ class Title {
         * Create a new Title from URL-encoded text. Ensures that
         * the given title's length does not exceed the maximum.
         *
-        * @param $url String the title, as might be taken from a URL
+        * @param string $url the title, as might be taken from a URL
         * @return Title the new object, or NULL on an error
         */
        public static function newFromURL( $url ) {
@@ -224,8 +223,8 @@ class Title {
        /**
         * Create a new Title from an article ID
         *
-        * @param $id Int the page_id corresponding to the Title to create
-        * @param $flags Int use Title::GAID_FOR_UPDATE to use master
+        * @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 the new object, or NULL on an error
         */
        public static function newFromID( $id, $flags = 0 ) {
@@ -247,7 +246,7 @@ class Title {
        /**
         * Make an array of titles from an array of IDs
         *
-        * @param $ids Array of Int Array of IDs
+        * @param array $ids of Int Array of IDs
         * @return Array of Titles
         */
        public static function newFromIDs( $ids ) {
@@ -318,10 +317,10 @@ class Title {
         * For convenience, spaces are converted to underscores so that
         * eg user_text fields can be used directly.
         *
-        * @param $ns Int the namespace of the article
-        * @param $title String the unprefixed database key form
-        * @param $fragment String the link fragment (after the "#")
-        * @param $interwiki String the interwiki prefix
+        * @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 = '' ) {
@@ -342,10 +341,10 @@ class Title {
         * The parameters will be checked for validity, which is a bit slower
         * than makeTitle() but safer for user-provided data.
         *
-        * @param $ns Int the namespace of the article
-        * @param $title String database key form
-        * @param $fragment String the link fragment (after the "#")
-        * @param $interwiki String interwiki prefix
+        * @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 = '' ) {
@@ -382,7 +381,7 @@ class Title {
         * This will only return the very next target, useful for
         * the redirect table and other checks that don't need full recursion
         *
-        * @param $text String: Text with possible redirect
+        * @param string $text Text with possible redirect
         * @return Title: The corresponding Title
         * @deprecated since 1.21, use Content::getRedirectTarget instead.
         */
@@ -399,7 +398,7 @@ class Title {
         * This will recurse down $wgMaxRedirects times or until a non-redirect target is hit
         * in order to provide (hopefully) the Title of the final destination instead of another redirect
         *
-        * @param $text String Text with possible redirect
+        * @param string $text Text with possible redirect
         * @return Title
         * @deprecated since 1.21, use Content::getUltimateRedirectTarget instead.
         */
@@ -416,7 +415,7 @@ class Title {
         * The last element in the array is the final destination after all redirects
         * have been resolved (up to $wgMaxRedirects times)
         *
-        * @param $text String Text with possible redirect
+        * @param string $text Text with possible redirect
         * @return Array of Titles, with the destination last
         * @deprecated since 1.21, use Content::getRedirectChain instead.
         */
@@ -430,7 +429,7 @@ class Title {
        /**
         * Get the prefixed DB key associated with an ID
         *
-        * @param $id Int the page_id of the article
+        * @param int $id the page_id of the article
         * @return Title an object representing the article, or NULL if no such article was found
         */
        public static function nameOf( $id ) {
@@ -491,8 +490,8 @@ class Title {
         * Get a string representation of a title suitable for
         * including in a search index
         *
-        * @param $ns Int a namespace index
-        * @param $title String text-form main part
+        * @param int $ns a namespace index
+        * @param string $title text-form main part
         * @return String a stripped-down title string ready for the search index
         */
        public static function indexTitle( $ns, $title ) {
@@ -518,10 +517,10 @@ class Title {
        /**
         * Make a prefixed DB key from a DB key and a namespace index
         *
-        * @param $ns Int numerical representation of the namespace
-        * @param $title String the DB key form the title
-        * @param $fragment String The link fragment (after the "#")
-        * @param $interwiki String The interwiki prefix
+        * @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
         */
        public static function makeName( $ns, $title, $fragment = '', $interwiki = '' ) {
@@ -541,7 +540,7 @@ class Title {
        /**
         * Escape a text fragment, say from a link, for a URL
         *
-        * @param $fragment string containing a URL or link fragment (after the "#")
+        * @param string $fragment containing a URL or link fragment (after the "#")
         * @return String: escaped string
         */
        static function escapeFragmentForURL( $fragment ) {
@@ -699,7 +698,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).
+        * @param string $id The content model ID (use the CONTENT_MODEL_XXX constants).
         * @return Boolean true if $this->getContentModel() == $id
         */
        public function hasContentModel( $id ) {
@@ -795,7 +794,7 @@ class Title {
        /**
         * Returns true if this title resolves to the named special page
         *
-        * @param $name String The special page name
+        * @param string $name The special page name
         * @return boolean
         */
        public function isSpecial( $name ) {
@@ -833,7 +832,7 @@ class Title {
         * Please make use of this instead of comparing to getNamespace()
         * This function is much more resistant to changes we may make
         * to namespaces than code that makes direct comparisons.
-        * @param $ns int The namespace
+        * @param int $ns The namespace
         * @return bool
         * @since 1.19
         */
@@ -870,7 +869,7 @@ class Title {
         * is either NS_USER or NS_USER_TALK since both of them have NS_USER
         * as their subject namespace.
         *
-        * This is MUCH simpler than individually testing for equivilance
+        * 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
@@ -912,7 +911,7 @@ class Title {
         * Is this the mainpage?
         * @note Title::newFromText seems to be sufficiently optimized by the title
         * cache that we don't need to over-optimize by doing direct comparisons and
-        * acidentally creating new bugs where $title->equals( Title::newFromText() )
+        * accidentally creating new bugs where $title->equals( Title::newFromText() )
         * ends up reporting something differently than $title->isMainPage();
         *
         * @since 1.18
@@ -971,7 +970,7 @@ class Title {
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
                #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
-               #      hook funktions can force this method to return true even outside the mediawiki namespace.
+               #      hook functions can force this method to return true even outside the mediawiki namespace.
 
                wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
 
@@ -1103,7 +1102,7 @@ class Title {
         * Deprecated for public use, use Title::makeTitle() with fragment parameter.
         * Still in active use privately.
         *
-        * @param $fragment String text
+        * @param string $fragment text
         */
        public function setFragment( $fragment ) {
                $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
@@ -1113,7 +1112,7 @@ class Title {
         * Prefix some arbitrary text with the namespace or interwiki prefix
         * of this object
         *
-        * @param $name String the text
+        * @param string $name the text
         * @return String the prefixed text
         * @private
         */
@@ -1284,7 +1283,7 @@ class Title {
         * # returns: Title{User:Foo/Bar/Baz/Asdf}
         * @endcode
         *
-        * @param $text String The subpage name to add to the title
+        * @param string $text The subpage name to add to the title
         * @return Title Subpage title
         * @since 1.20
         */
@@ -1297,6 +1296,7 @@ class Title {
         * Used for the title field in <a> tags.
         *
         * @return String the text, including any prefixes
+        * @deprecated since 1.19
         */
        public function getEscapedText() {
                wfDeprecated( __METHOD__, '1.19' );
@@ -1331,7 +1331,7 @@ class Title {
         * second argument named variant. This was deprecated in favor
         * of passing an array of option with a "variant" key
         * Once $query2 is removed for good, this helper can be dropped
-        * andthe wfArrayToCgi moved to getLocalURL();
+        * and the wfArrayToCgi moved to getLocalURL();
         *
         * @since 1.19 (r105919)
         * @param $query
@@ -1399,7 +1399,7 @@ class Title {
         * with action=render, $wgServer is prepended.
         *
 
-        * @param $query string|array an optional query string,
+        * @param string|array $query an optional query string,
         *   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.
@@ -1528,6 +1528,7 @@ class Title {
         * @param $query string
         * @param $query2 bool|string
         * @return String the URL
+        * @deprecated since 1.19
         */
        public function escapeLocalURL( $query = '', $query2 = false ) {
                wfDeprecated( __METHOD__, '1.19' );
@@ -1542,6 +1543,7 @@ class Title {
         *
         * @see self::getLocalURL
         * @return String the URL
+        * @deprecated since 1.19
         */
        public function escapeFullURL( $query = '', $query2 = false ) {
                wfDeprecated( __METHOD__, '1.19' );
@@ -1599,6 +1601,7 @@ class Title {
         * @see self::getLocalURL
         * @since 1.18
         * @return string
+        * @deprecated since 1.19
         */
        public function escapeCanonicalURL( $query = '', $query2 = false ) {
                wfDeprecated( __METHOD__, '1.19' );
@@ -1661,7 +1664,7 @@ class Title {
         *
         * May provide false positives, but should never provide a false negative.
         *
-        * @param $action String action that permission needs to be checked for
+        * @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
@@ -1673,10 +1676,10 @@ class Title {
        /**
         * Can $user perform $action on this page?
         *
-        * @param $action String action that permission needs to be checked for
+        * @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.
-        * @param $doExpensiveQueries Bool Set this to false to avoid doing
+        * @param bool $doExpensiveQueries Set this to false to avoid doing
         *   unnecessary queries.
         * @return Bool
         */
@@ -1693,11 +1696,11 @@ class Title {
         *
         * @todo FIXME: This *does not* check throttles (User::pingLimiter()).
         *
-        * @param $action String action that permission needs to be checked for
+        * @param string $action action that permission needs to be checked for
         * @param $user User to check
-        * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary
+        * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary
         *   queries by skipping checks for cascading protections and user blocks.
-        * @param $ignoreErrors Array of Strings Set this to a list of message keys
+        * @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.
         */
@@ -1719,9 +1722,9 @@ class Title {
        /**
         * Permissions checks that fail most often, and which are easiest to test.
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User user to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1777,7 +1780,7 @@ class Title {
        /**
         * Add the resulting error code to the errors array
         *
-        * @param $errors Array list of current errors
+        * @param array $errors list of current errors
         * @param $result Mixed result of errors
         *
         * @return Array list of errors
@@ -1802,9 +1805,9 @@ class Title {
        /**
         * Check various permission hooks
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User user to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1835,9 +1838,9 @@ class Title {
        /**
         * Check permissions on special pages & namespaces
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User user to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1864,9 +1867,9 @@ class Title {
        /**
         * Check CSS/JS sub-page permissions
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User user to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1893,9 +1896,9 @@ class Title {
         * page. The user must possess all required rights for this
         * action.
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User user to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1924,9 +1927,9 @@ class Title {
        /**
         * Check restrictions on cascading pages.
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -1963,9 +1966,9 @@ class Title {
        /**
         * Check action permissions not already checked in checkQuickPermissions
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -2017,11 +2020,11 @@ class Title {
        }
 
        /**
-        * Check that the user isn't blocked from editting.
+        * Check that the user isn't blocked from editing.
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -2084,9 +2087,9 @@ class Title {
        /**
         * Check that the user is allowed to read this page.
         *
-        * @param $action String the action to check
+        * @param string $action the action to check
         * @param $user User to check
-        * @param $errors Array list of current errors
+        * @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
         *
@@ -2137,7 +2140,7 @@ class Title {
                        # Time to check the whitelist
                        # Only do these checks is there's something to check against
                        $name = $this->getPrefixedText();
-                       $dbName = $this->getPrefixedDBKey();
+                       $dbName = $this->getPrefixedDBkey();
 
                        // Check for explicit whitelisting with and without underscores
                        if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) ) {
@@ -2187,7 +2190,7 @@ 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 $action String the action to check
+        * @param string $action the action to check
         * @param $short Boolean short circuit on first error
         * @return Array list of errors
         */
@@ -2217,10 +2220,10 @@ class Title {
         * which checks ONLY that previously checked by userCan (i.e. it leaves out
         * checks on wfReadOnly() and blocks)
         *
-        * @param $action String action that permission needs to be checked for
+        * @param string $action action that permission needs to be checked for
         * @param $user User to check
-        * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary queries.
-        * @param $short Bool Set this to true to stop after the first permission error.
+        * @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.
         */
        protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
@@ -2369,8 +2372,8 @@ class Title {
         *
         * @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
         * @param $create_perm String Permission required for creation
-        * @param $reason String Reason for protection
-        * @param $expiry String Expiry timestamp
+        * @param string $reason Reason for protection
+        * @param string $expiry Expiry timestamp
         * @return boolean true
         */
        public function updateTitleProtection( $create_perm, $reason, $expiry ) {
@@ -2405,7 +2408,7 @@ class Title {
        /**
         * Is this page "semi-protected" - the *only* protection is autoconfirm?
         *
-        * @param $action String Action to check (default: edit)
+        * @param string $action Action to check (default: edit)
         * @return Bool
         */
        public function isSemiProtected( $action = 'edit' ) {
@@ -2431,7 +2434,7 @@ class Title {
        /**
         * Does the title correspond to a protected article?
         *
-        * @param $action String the action the page is protected from,
+        * @param string $action the action the page is protected from,
         * by default checks all actions.
         * @return Bool
         */
@@ -2493,7 +2496,7 @@ class Title {
        /**
         * Cascading protection: Get the source of any cascading restrictions on this page.
         *
-        * @param $getPages Bool Whether or not to retrieve the actual pages
+        * @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
         *     have come, false for none, or true if such restrictions exist, but $getPages
@@ -2593,7 +2596,7 @@ class Title {
        /**
         * Accessor/initialisation for mRestrictions
         *
-        * @param $action String action that permission needs to be checked for
+        * @param string $action action that permission needs to be checked for
         * @return Array of Strings the array of groups allowed to edit this article
         */
        public function getRestrictions( $action ) {
@@ -2636,7 +2639,7 @@ class Title {
         * Loads a string into mRestrictions array
         *
         * @param $res Resource restrictions as an SQL result.
-        * @param $oldFashionedRestrictions String comma-separated list of page
+        * @param string $oldFashionedRestrictions comma-separated list of page
         *        restrictions from page table (pre 1.10)
         */
        private function loadRestrictionsFromResultWrapper( $res, $oldFashionedRestrictions = null ) {
@@ -2654,8 +2657,8 @@ class Title {
         * and page_restrictions table for this existing page.
         * Public for usage by LiquidThreads.
         *
-        * @param $rows array of db result objects
-        * @param $oldFashionedRestrictions string comma-separated list of page
+        * @param array $rows 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 ) {
@@ -2737,7 +2740,7 @@ class Title {
        /**
         * Load restrictions from the page_restrictions table
         *
-        * @param $oldFashionedRestrictions String comma-separated list of page
+        * @param string $oldFashionedRestrictions comma-separated list of page
         *        restrictions from page table (pre 1.10)
         */
        public function loadRestrictions( $oldFashionedRestrictions = null ) {
@@ -2837,7 +2840,7 @@ class Title {
        /**
         * Get all subpages of this page.
         *
-        * @param $limit Int maximum number of subpages to fetch; -1 for no limit
+        * @param int $limit maximum number of subpages to fetch; -1 for no limit
         * @return mixed TitleArray, or empty array if this page's namespace
         *  doesn't allow subpages
         */
@@ -2915,7 +2918,7 @@ class Title {
         * Get the article ID for this Title from the link cache,
         * adding it if necessary
         *
-        * @param $flags Int 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
         */
@@ -2941,7 +2944,7 @@ class Title {
         * Is this an article that is a redirect page?
         * Uses link cache, adding it if necessary
         *
-        * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
         * @return Bool
         */
        public function isRedirect( $flags = 0 ) {
@@ -2971,7 +2974,7 @@ class Title {
         * What is the length of this page?
         * Uses link cache, adding it if necessary
         *
-        * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
         * @return Int
         */
        public function getLength( $flags = 0 ) {
@@ -3000,7 +3003,7 @@ class Title {
        /**
         * What is the page_latest field for this page?
         *
-        * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
         * @throws MWException
         * @return Int or 0 if the page doesn't exist
         */
@@ -3035,7 +3038,7 @@ class Title {
         * loading of the new page_id. It's also called from
         * WikiPage::doDeleteArticleReal()
         *
-        * @param $newid Int the new Article ID
+        * @param int $newid the new Article ID
         */
        public function resetArticleID( $newid ) {
                $linkCache = LinkCache::singleton();
@@ -3058,8 +3061,8 @@ class Title {
        /**
         * Capitalize a text string for a title if it belongs to a namespace that capitalizes
         *
-        * @param $text String containing title to capitalize
-        * @param $ns int namespace index, defaults to NS_MAIN
+        * @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 ) {
@@ -3208,10 +3211,10 @@ class Title {
                        strpos( $dbkey, '.' ) !== false &&
                        (
                                $dbkey === '.' || $dbkey === '..' ||
-                               strpos( $dbkey, './' ) === 0  ||
+                               strpos( $dbkey, './' ) === 0 ||
                                strpos( $dbkey, '../' ) === 0 ||
                                strpos( $dbkey, '/./' ) !== false ||
-                               strpos( $dbkey, '/../' ) !== false  ||
+                               strpos( $dbkey, '/../' ) !== false ||
                                substr( $dbkey, -2 ) == '/.' ||
                                substr( $dbkey, -3 ) == '/..'
                        )
@@ -3280,9 +3283,9 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param $options Array: may be FOR UPDATE
-        * @param $table String: table name
-        * @param $prefix String: fields prefix
+        * @param array $options may be FOR UPDATE
+        * @param string $table table name
+        * @param string $prefix fields prefix
         * @return Array of Title objects linking here
         */
        public function getLinksTo( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
@@ -3324,7 +3327,7 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param $options Array: may be FOR UPDATE
+        * @param array $options may be FOR UPDATE
         * @return Array of Title the Title objects linking here
         */
        public function getTemplateLinksTo( $options = array() ) {
@@ -3338,9 +3341,9 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param $options Array: may be FOR UPDATE
-        * @param $table String: table name
-        * @param $prefix String: fields prefix
+        * @param array $options may be FOR UPDATE
+        * @param string $table table name
+        * @param string $prefix fields prefix
         * @return Array of Title objects linking here
         */
        public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
@@ -3399,7 +3402,7 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param $options Array: may be FOR UPDATE
+        * @param array $options may be FOR UPDATE
         * @return Array of Title the Title objects used here
         */
        public function getTemplateLinksFrom( $options = array() ) {
@@ -3442,7 +3445,6 @@ class Title {
                return $retVal;
        }
 
-
        /**
         * Get a list of URLs to purge from the Squid cache when this
         * page changes
@@ -3493,9 +3495,9 @@ class Title {
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
         *
         * @param $nt Title the new title
-        * @param $auth Bool indicates whether $wgUser's permissions
+        * @param bool $auth indicates whether $wgUser's permissions
         *  should be checked
-        * @param $reason String is the log summary of the move, used for spam checking
+        * @param string $reason is the log summary of the move, used for spam checking
         * @return Mixed True on success, getUserPermissionsErrors()-like array on failure
         */
        public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
@@ -3637,10 +3639,10 @@ class Title {
         * Move a title to a new location
         *
         * @param $nt Title the new title
-        * @param $auth Bool indicates whether $wgUser's permissions
+        * @param bool $auth indicates whether $wgUser's permissions
         *  should be checked
-        * @param $reason String the reason for the move
-        * @param $createRedirect Bool Whether to create a redirect from the old title to the new title.
+        * @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
         */
@@ -3755,8 +3757,8 @@ class Title {
         * source page or nonexistent
         *
         * @param $nt Title the page to move to, which should be a redirect or nonexistent
-        * @param $reason String The reason for the move
-        * @param $createRedirect Bool Whether to leave a redirect at the old title. Does not check
+        * @param string $reason The reason for the move
+        * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
         *   if the user has the suppressredirect right
         * @throws MWException
         */
@@ -3879,9 +3881,9 @@ class Title {
         * Move this page's subpages to be subpages of $nt
         *
         * @param $nt Title Move target
-        * @param $auth bool Whether $wgUser's permissions should be checked
-        * @param $reason string The reason for the move
-        * @param $createRedirect bool Whether to create redirects from the old subpages to
+        * @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
         *     arrays (errors) as values, or an error array with numeric indices if no pages
@@ -4078,7 +4080,7 @@ class Title {
        /**
         * Get a tree of parent categories
         *
-        * @param $children Array with the children in the keys, to check for circular refs
+        * @param array $children with the children in the keys, to check for circular refs
         * @return Array Tree of parent categories
         */
        public function getParentCategoryTree( $children = array() ) {
@@ -4120,8 +4122,8 @@ class Title {
        /**
         * Get the revision ID of the previous revision
         *
-        * @param $revId Int Revision ID. Get the revision that was before this one.
-        * @param $flags Int Title::GAID_FOR_UPDATE
+        * @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
         */
        public function getPreviousRevisionID( $revId, $flags = 0 ) {
@@ -4145,8 +4147,8 @@ class Title {
        /**
         * Get the revision ID of the next revision
         *
-        * @param $revId Int Revision ID. Get the revision that was after this one.
-        * @param $flags Int Title::GAID_FOR_UPDATE
+        * @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
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
@@ -4170,7 +4172,7 @@ class Title {
        /**
         * Get the first revision of the page
         *
-        * @param $flags Int Title::GAID_FOR_UPDATE
+        * @param int $flags Title::GAID_FOR_UPDATE
         * @return Revision|Null if page doesn't exist
         */
        public function getFirstRevision( $flags = 0 ) {
@@ -4192,7 +4194,7 @@ class Title {
        /**
         * Get the oldest revision timestamp of this page
         *
-        * @param $flags Int Title::GAID_FOR_UPDATE
+        * @param int $flags Title::GAID_FOR_UPDATE
         * @return String: MW timestamp
         */
        public function getEarliestRevTime( $flags = 0 ) {
@@ -4249,8 +4251,8 @@ class Title {
         * Get the number of revisions between the given revision.
         * Used for diffs and other things that really need it.
         *
-        * @param $old int|Revision Old revision or rev ID (first before range)
-        * @param $new int|Revision New revision or rev ID (first after range)
+        * @param int|Revision $old Old revision or rev ID (first before range)
+        * @param int|Revision $new New revision or rev ID (first after range)
         * @return Int Number of revisions between these revisions.
         */
        public function countRevisionsBetween( $old, $new ) {
@@ -4278,10 +4280,10 @@ class Title {
         * Get the number of authors between the given revisions or revision IDs.
         * Used for diffs and other things that really need it.
         *
-        * @param $old int|Revision Old revision or rev ID (first before range by default)
-        * @param $new int|Revision New revision or rev ID (first after range by default)
-        * @param $limit int Maximum number of authors
-        * @param $options string|array (Optional): Single option, or an array of options:
+        * @param int|Revision $old Old revision or rev ID (first before range by default)
+        * @param int|Revision $new New revision or rev ID (first after range by default)
+        * @param int $limit Maximum number of authors
+        * @param string|array $options (Optional): Single option, or an array of options:
         *     'include_old' Include $old in the range; $new is excluded.
         *     'include_new' Include $new in the range; $old is excluded.
         *     'include_both' Include both $old and $new in the range.
@@ -4393,7 +4395,7 @@ class Title {
                $isKnown = null;
 
                /**
-                * Allows overriding default behaviour for determining if a page exists.
+                * Allows overriding default behavior for determining if a page exists.
                 * If $isKnown is kept as null, regular checks happen. If it's
                 * a boolean, this value is returned by the isKnown method.
                 *
@@ -4462,7 +4464,7 @@ class Title {
                        // Use always content language to avoid loading hundreds of languages
                        // to get the link color.
                        global $wgContLang;
-                       list( $name, $lang ) = 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();
                }
@@ -4495,7 +4497,7 @@ class Title {
        /**
         * Updates page_touched for this page; called from LinksUpdate.php
         *
-        * @return Bool true if the update succeded
+        * @return Bool true if the update succeeded
         */
        public function invalidateCache() {
                global $wgMemc;
@@ -4589,14 +4591,14 @@ class Title {
        /**
         * Generate strings used for xml 'id' names in monobook tabs
         *
-        * @param $prepend string defaults to 'nstab-'
+        * @param string $prepend defaults to 'nstab-'
         * @return String XML 'id' name
         */
        public function getNamespaceKey( $prepend = 'nstab-' ) {
                global $wgContLang;
                // Gets the subject namespace if this title
                $namespace = MWNamespace::getSubject( $this->getNamespace() );
-               // Checks if cononical namespace name exists for namespace
+               // Checks if canonical namespace name exists for namespace
                if ( MWNamespace::exists( $this->getNamespace() ) ) {
                        // Uses canonical namespace name
                        $namespaceKey = MWNamespace::getCanonicalName( $namespace );
@@ -4620,7 +4622,7 @@ class Title {
        /**
         * Get all extant redirects to this Title
         *
-        * @param $ns Int|Null Single namespace to consider; NULL to consider all namespaces
+        * @param int|Null $ns Single namespace to consider; NULL to consider all namespaces
         * @return Array of Title redirects to this title
         */
        public function getRedirectsHere( $ns = null ) {
@@ -4662,7 +4664,7 @@ class Title {
        public function isValidRedirectTarget() {
                global $wgInvalidRedirectTargets;
 
-               // invalid redirect targets are stored in a global array, but explicity disallow Userlogout here
+               // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
                if ( $this->isSpecial( 'Userlogout' ) ) {
                        return false;
                }
@@ -4706,7 +4708,7 @@ class Title {
         * prefix.  This will be fed to Collation::getSortKey() to get a
         * binary sortkey that can be used for actual sorting.
         *
-        * @param $prefix string The prefix to be used, specified using
+        * @param string $prefix The prefix to be used, specified using
         *   {{defaultsort:}} or like [[Category:Foo|prefix]].  Empty for no
         *   prefix.
         * @return string
index 5cdec16..90fb861 100644 (file)
@@ -3,8 +3,8 @@
  * Classes to walk into a list of Title objects.
  *
  * Note: this entire file is a byte-for-byte copy of UserArray.php with
- * s/User/Title/.  If anyone can figure out how to do this nicely with inheri-
- * tance or something, please do so.
+ * s/User/Title/.  If anyone can figure out how to do this nicely with
+ * inheritance or something, please do so.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 99642b7..b042d8c 100644 (file)
@@ -39,7 +39,7 @@ class UIDGenerator {
        /** @var Array */
        protected $fileHandles = array(); // cache file handles
 
-       const QUICK_RAND = 1; // get randomness from fast and unsecure sources
+       const QUICK_RAND = 1; // get randomness from fast and insecure sources
 
        protected function __construct() {
                $idFile = wfTempDir() . '/mw-' . __CLASS__ . '-UID-nodeid';
@@ -110,7 +110,7 @@ class UIDGenerator {
        }
 
        /**
-        * @param $time array (UIDGenerator::millitime(), clock sequence)
+        * @param array $time (UIDGenerator::millitime(), clock sequence)
         * @return string 88 bits
         */
        protected function getTimestampedID88( array $info ) {
@@ -152,7 +152,7 @@ class UIDGenerator {
        }
 
        /**
-        * @param $info array (UIDGenerator::milltime(), counter, clock sequence)
+        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
         * @return string 128 bits
         */
        protected function getTimestampedID128( array $info ) {
@@ -214,7 +214,7 @@ class UIDGenerator {
         * than any previous (time,counter) value for the given clock sequence.
         * This is useful for making UIDs sequential on a per-node bases.
         *
-        * @param $lockFile string Name of a local lock file
+        * @param string $lockFile Name of a local lock file
         * @param $clockSeqSize integer The number of possible clock sequence values
         * @param $counterSize integer The number of possible counter values
         * @return Array (result of UIDGenerator::millitime(), counter, clock sequence)
@@ -295,7 +295,7 @@ class UIDGenerator {
         * Wait till the current timestamp reaches $time and return the current
         * timestamp. This returns false if it would have to wait more than 10ms.
         *
-        * @param $time array Result of UIDGenerator::millitime()
+        * @param array $time Result of UIDGenerator::millitime()
         * @return Array|bool UIDGenerator::millitime() result or false
         */
        protected function timeWaitUntil( array $time ) {
@@ -310,7 +310,7 @@ class UIDGenerator {
        }
 
        /**
-        * @param $time array Result of UIDGenerator::millitime()
+        * @param array $time Result of UIDGenerator::millitime()
         * @return string 46 MSBs of "milliseconds since epoch" in binary (rolls over in 4201)
         */
        protected function millisecondsSinceEpochBinary( array $time ) {
index de34bfc..6b7348a 100644 (file)
@@ -369,8 +369,8 @@ class User {
         * This is slightly less efficient than newFromId(), so use newFromId() if
         * you have both an ID and a name handy.
         *
-        * @param $name String Username, validated by Title::newFromText()
-        * @param $validate String|Bool Validate username. Takes the same parameters as
+        * @param string $name Username, validated by Title::newFromText()
+        * @param string|Bool $validate Validate username. Takes the same parameters as
         *    User::getCanonicalName(), except that true is accepted as an alias
         *    for 'valid', for BC.
         *
@@ -399,7 +399,7 @@ class User {
        /**
         * Static factory method for creation from a given user ID.
         *
-        * @param $id Int Valid user ID
+        * @param int $id Valid user ID
         * @return User The corresponding User object
         */
        public static function newFromId( $id ) {
@@ -417,7 +417,7 @@ class User {
         *
         * If the code is invalid or has expired, returns NULL.
         *
-        * @param $code String Confirmation code
+        * @param string $code Confirmation code
         * @return User object, or null
         */
        public static function newFromConfirmationCode( $code ) {
@@ -437,8 +437,7 @@ 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 $request WebRequest object to use; $wgRequest will be used if
-        *        ommited.
+        * @param $request WebRequest object to use; $wgRequest will be used if omitted.
         * @return User object
         */
        public static function newFromSession( WebRequest $request = null ) {
@@ -458,8 +457,8 @@ class User {
         * user_name and user_real_name are not provided because the whole row
         * will be loaded once more from the database when accessing them.
         *
-        * @param $row Array A row from the user table
-        * @param $data Array Further data to load into the object (see User::loadFromRow for valid keys)
+        * @param array $row A row from the user table
+        * @param array $data Further data to load into the object (see User::loadFromRow for valid keys)
         * @return User
         */
        public static function newFromRow( $row, $data = null ) {
@@ -472,7 +471,7 @@ class User {
 
        /**
         * Get the username corresponding to a given user ID
-        * @param $id Int User ID
+        * @param int $id User ID
         * @return String|bool The corresponding username
         */
        public static function whoIs( $id ) {
@@ -482,7 +481,7 @@ class User {
        /**
         * Get the real name of a user given their user ID
         *
-        * @param $id Int User ID
+        * @param int $id User ID
         * @return String|bool The corresponding user's real name
         */
        public static function whoIsReal( $id ) {
@@ -491,7 +490,7 @@ class User {
 
        /**
         * Get database id given a user name
-        * @param $name String Username
+        * @param string $name Username
         * @return Int|Null The corresponding user's ID, or null if user is nonexistent
         */
        public static function idFromName( $name ) {
@@ -543,7 +542,7 @@ class User {
         * addresses like this, if we allowed accounts like this to be created
         * new users could get the old edits of these anonymous users.
         *
-        * @param $name String to match
+        * @param string $name to match
         * @return Bool
         */
        public static function isIP( $name ) {
@@ -554,11 +553,11 @@ class User {
         * Is the input a valid username?
         *
         * Checks if the input is a valid username, we don't want an empty string,
-        * an IP address, anything that containins slashes (would mess up subpages),
+        * an IP address, anything that contains slashes (would mess up subpages),
         * is longer than the maximum allowed username size or doesn't begin with
         * a capital letter.
         *
-        * @param $name String to match
+        * @param string $name to match
         * @return Bool
         */
        public static function isValidUserName( $name ) {
@@ -574,7 +573,6 @@ class User {
                        return false;
                }
 
-
                // Ensure that the name can't be misresolved as a different title,
                // such as with extra namespace keys at the start.
                $parsed = Title::newFromText( $name );
@@ -613,7 +611,7 @@ class User {
         * If an account already exists in this form, login will be blocked
         * by a failure to pass this function.
         *
-        * @param $name String to match
+        * @param string $name to match
         * @return Bool
         */
        public static function isUsableName( $name ) {
@@ -650,7 +648,7 @@ class User {
         * Additional blacklisting may be added here rather than in
         * isValidUserName() to avoid disrupting existing accounts.
         *
-        * @param $name String to match
+        * @param string $name to match
         * @return Bool
         */
        public static function isCreatableName( $name ) {
@@ -680,7 +678,7 @@ class User {
        /**
         * Is the input a valid password for this user?
         *
-        * @param $password String Desired password
+        * @param string $password Desired password
         * @return Bool
         */
        public function isValidPassword( $password ) {
@@ -691,7 +689,7 @@ class User {
        /**
         * Given unvalidated password input, return error message on failure.
         *
-        * @param $password String Desired password
+        * @param string $password Desired password
         * @return mixed: true on success, string or array of error message on failure
         */
        public function getPasswordValidity( $password ) {
@@ -751,7 +749,7 @@ class User {
         * to be liberal enough for wide use. Some invalid addresses will still
         * pass validation here.
         *
-        * @param $addr String E-mail address
+        * @param string $addr E-mail address
         * @return Bool
         * @deprecated since 1.18 call Sanitizer::isValidEmail() directly
         */
@@ -763,8 +761,8 @@ class User {
        /**
         * Given unvalidated user input, return a canonical username, or false if
         * the username is invalid.
-        * @param $name String User input
-        * @param $validate String|Bool type of validation to use:
+        * @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
@@ -823,7 +821,7 @@ class User {
        /**
         * Count the number of edits of a user
         *
-        * @param $uid Int User ID to check
+        * @param int $uid User ID to check
         * @return Int the user's edit count
         *
         * @deprecated since 1.21 in favour of User::getEditCount
@@ -857,7 +855,7 @@ class User {
         * @note This no longer clears uncached lazy-initialised properties;
         *       the constructor does that instead.
         *
-        * @param $name string
+        * @param $name string|bool
         */
        public function loadDefaults( $name = false ) {
                wfProfileIn( __METHOD__ );
@@ -893,11 +891,11 @@ class User {
        /**
         * Return whether an item has been loaded.
         *
-        * @param $item String: item to check. Current possibilities:
+        * @param string $item item to check. Current possibilities:
         *              - id
         *              - name
         *              - realname
-        * @param $all String: 'all' to check if the whole object has been loaded
+        * @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
@@ -980,10 +978,13 @@ 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' ) ) {
-                       $passwordCorrect = $proposedUser->getToken( false ) === $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
+                       $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        # No session or persistent login cookie
@@ -1040,8 +1041,8 @@ class User {
        /**
         * Initialize this object from a row from the user table.
         *
-        * @param $row Array Row from the user table to load.
-        * @param $data Array Further user data to load into the object
+        * @param array $row Row from the user table to load.
+        * @param array $data Further user data to load into the object
         *
         *      user_groups             Array with groups out of the user_groups table
         *      user_properties         Array with properties out of the user_properties table
@@ -1154,7 +1155,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 $event String 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.
         *
@@ -1193,7 +1194,7 @@ class User {
         * Clear various cached data stored in this object. The cache of the user table
         * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
         *
-        * @param $reloadFrom bool|String Reload user and user_groups table data from a
+        * @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.
         */
@@ -1250,7 +1251,7 @@ class User {
        /**
         * Get a given default option value.
         *
-        * @param $opt String Name of option to retrieve
+        * @param string $opt Name of option to retrieve
         * @return String Default option value
         */
        public static function getDefaultOption( $opt ) {
@@ -1262,10 +1263,9 @@ class User {
                }
        }
 
-
        /**
         * Get blocking information
-        * @param $bFromSlave Bool Whether to check the slave database first. To
+        * @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.
@@ -1339,8 +1339,8 @@ class User {
        /**
         * Whether the given IP is in a DNS blacklist.
         *
-        * @param $ip String IP to check
-        * @param $checkWhitelist Bool: whether to check the whitelist first
+        * @param string $ip IP to check
+        * @param bool $checkWhitelist whether to check the whitelist first
         * @return Bool True if blacklisted.
         */
        public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
@@ -1360,8 +1360,8 @@ class User {
        /**
         * Whether the given IP is in a given DNS blacklist.
         *
-        * @param $ip String IP to check
-        * @param $bases String|Array of Strings: URL of the DNS blacklist
+        * @param string $ip IP to check
+        * @param string|array $bases of Strings: URL of the DNS blacklist
         * @return Bool True if blacklisted.
         */
        public function inDnsBlacklist( $ip, $bases ) {
@@ -1461,7 +1461,7 @@ class User {
         * @note When using a shared cache like memcached, IP-address
         * last-hit counters will be shared across wikis.
         *
-        * @param $action String Action to enforce; 'edit' if unspecified
+        * @param string $action Action to enforce; 'edit' if unspecified
         * @return Bool True if a rate limiter was tripped
         */
        public function pingLimiter( $action = 'edit' ) {
@@ -1556,7 +1556,7 @@ class User {
        /**
         * Check if user is blocked
         *
-        * @param $bFromSlave Bool 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 True if blocked, false otherwise
         */
        public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
@@ -1566,7 +1566,7 @@ class User {
        /**
         * Get the block affecting the user, or null if the user is not blocked
         *
-        * @param $bFromSlave Bool Whether to check the slave database instead of the master
+        * @param bool $bFromSlave Whether to check the slave database instead of the master
         * @return Block|null
         */
        public function getBlock( $bFromSlave = true ) {
@@ -1578,7 +1578,7 @@ class User {
         * Check if user is blocked from editing a particular article
         *
         * @param $title Title to check
-        * @param $bFromSlave Bool 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
         */
        function isBlockedFrom( $title, $bFromSlave = false ) {
@@ -1630,9 +1630,9 @@ class User {
        /**
         * Check if user is blocked on all wikis.
         * Do not use for actual edit permission checks!
-        * This is intented for quick UI checks.
+        * This is intended for quick UI checks.
         *
-        * @param $ip String IP address, uses current client if none given
+        * @param string $ip IP address, uses current client if none given
         * @return Bool True if blocked, false otherwise
         */
        public function isBlockedGlobally( $ip = '' ) {
@@ -1702,7 +1702,7 @@ class User {
 
        /**
         * Set the user and reload all fields according to a given ID
-        * @param $v Int User ID to reload
+        * @param int $v User ID to reload
         */
        public function setId( $v ) {
                $this->mId = $v;
@@ -1736,9 +1736,9 @@ class User {
         * address for an anonymous user to something other than the current
         * remote IP.
         *
-        * @note User::newFromName() has rougly the same function, when the named user
+        * @note User::newFromName() has roughly the same function, when the named user
         * does not exist.
-        * @param $str String New user name to set
+        * @param string $str New user name to set
         */
        public function setName( $str ) {
                $this->load();
@@ -1818,9 +1818,9 @@ class User {
         * Internal uncached check for new messages
         *
         * @see getNewtalk()
-        * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param $id String|Int User's IP address for anonymous users, User ID otherwise
-        * @param $fromMaster Bool true to fetch from the master, false for a slave
+        * @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 bool $fromMaster true to fetch from the master, false for a slave
         * @return Bool True if the user has new messages
         */
        protected function checkNewtalk( $field, $id, $fromMaster = false ) {
@@ -1836,8 +1836,8 @@ class User {
 
        /**
         * Add or update the new messages flag
-        * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param $id String|Int User's IP address for anonymous users, User ID otherwise
+        * @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.
         * @return Bool True if successful, false otherwise
         */
@@ -1862,8 +1862,8 @@ class User {
 
        /**
         * Clear the new messages flag for the given user
-        * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param $id String|Int User's IP address for anonymous users, User ID otherwise
+        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+        * @param string|Int $id User's IP address for anonymous users, User ID otherwise
         * @return Bool True if successful, false otherwise
         */
        protected function deleteNewtalk( $field, $id ) {
@@ -1882,7 +1882,7 @@ class User {
 
        /**
         * Update the 'You have new messages!' status.
-        * @param $val Bool Whether the user has new messages
+        * @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.
         */
        public function setNewtalk( $val, $curRev = null ) {
@@ -1978,7 +1978,7 @@ class User {
 
        /**
         * Validate the cache for this account.
-        * @param $timestamp String A timestamp in TS_MW format
+        * @param string $timestamp A timestamp in TS_MW format
         *
         * @return bool
         */
@@ -2007,7 +2007,7 @@ class User {
         * wipes it, so the account cannot be logged in until
         * a new password is set, for instance via e-mail.
         *
-        * @param $str String New password to set
+        * @param string $str New password to set
         * @throws PasswordError on failure
         *
         * @return bool
@@ -2046,7 +2046,7 @@ class User {
        /**
         * Set the password and reset the random token unconditionally.
         *
-        * @param $str string|null New password to set or null to set an invalid
+        * @param string|null $str New password to set or null to set an invalid
         *        password hash meaning that the user will not be able to log in
         *        through the web interface.
         */
@@ -2066,7 +2066,7 @@ class User {
 
        /**
         * Get the user's current token.
-        * @param $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 ) {
@@ -2081,7 +2081,7 @@ class User {
         * Set the random token (used for persistent authentication)
         * Called from loadDefaults() among other places.
         *
-        * @param $token String|bool If specified, set the token to this value
+        * @param string|bool $token If specified, set the token to this value
         */
        public function setToken( $token = false ) {
                $this->load();
@@ -2095,8 +2095,8 @@ class User {
        /**
         * Set the password for a password reminder or new account email
         *
-        * @param $str String New password to set
-        * @param $throttle Bool If true, reset the throttle timestamp to the present
+        * @param string $str New password to set
+        * @param bool $throttle If true, reset the throttle timestamp to the present
         */
        public function setNewpassword( $str, $throttle = true ) {
                $this->load();
@@ -2143,7 +2143,7 @@ class User {
 
        /**
         * Set the user's e-mail address
-        * @param $str String New e-mail address
+        * @param string $str New e-mail address
         */
        public function setEmail( $str ) {
                $this->load();
@@ -2159,7 +2159,7 @@ class User {
         * Set the user's e-mail address and a confirmation mail if needed.
         *
         * @since 1.20
-        * @param $str String New e-mail address
+        * @param string $str New e-mail address
         * @return Status
         */
        public function setEmailWithConfirmation( $str ) {
@@ -2205,7 +2205,7 @@ class User {
 
        /**
         * Set the user's real name
-        * @param $str String New real name
+        * @param string $str New real name
         */
        public function setRealName( $str ) {
                $this->load();
@@ -2215,9 +2215,9 @@ class User {
        /**
         * Get the user's current setting for a given option.
         *
-        * @param $oname String The option to check
-        * @param $defaultOverride String A default value returned if the option does not exist
-        * @param $ignoreHidden Bool = whether to ignore the effects of $wgHiddenPrefs
+        * @param string $oname The option to check
+        * @param string $defaultOverride A default value returned if the option does not exist
+        * @param bool $ignoreHidden = whether to ignore the effects of $wgHiddenPrefs
         * @return String User's current value for the option
         * @see getBoolOption()
         * @see getIntOption()
@@ -2270,7 +2270,7 @@ class User {
        /**
         * Get the user's current setting for a given option, as a boolean value.
         *
-        * @param $oname String The option to check
+        * @param string $oname The option to check
         * @return Bool User's current value for the option
         * @see getOption()
         */
@@ -2281,8 +2281,8 @@ class User {
        /**
         * Get the user's current setting for a given option, as a boolean value.
         *
-        * @param $oname String The option to check
-        * @param $defaultOverride Int A default value returned if the option does not exist
+        * @param string $oname The option to check
+        * @param int $defaultOverride A default value returned if the option does not exist
         * @return Int User's current value for the option
         * @see getOption()
         */
@@ -2297,7 +2297,7 @@ class User {
        /**
         * Set the given option for a user.
         *
-        * @param $oname String The option to set
+        * @param string $oname The option to set
         * @param $val mixed New value to set
         */
        public function setOption( $oname, $val ) {
@@ -2319,6 +2319,7 @@ class User {
         * - 'registered' - preferences which are registered in core MediaWiki or
         *                  by extensions using the UserGetDefaultOptions hook.
         * - 'registered-multiselect' - as above, using the 'multiselect' type.
+        * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
         * - 'userjs' - preferences with names starting with 'userjs-', intended to
         *              be used by user scripts.
         * - 'unused' - preferences about which MediaWiki doesn't know anything.
@@ -2335,6 +2336,7 @@ class User {
                return array(
                        'registered',
                        'registered-multiselect',
+                       'registered-checkmatrix',
                        'userjs',
                        'unused'
                );
@@ -2348,7 +2350,7 @@ class User {
         *
         * @see User::listOptionKinds
         * @param $context IContextSource
-        * @param $options array assoc. array with options keys to check as keys. Defaults to $this->mOptions.
+        * @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 ) {
@@ -2360,8 +2362,8 @@ class User {
                $prefs = Preferences::getPreferences( $this, $context );
                $mapping = array();
 
-               // Multiselect options are stored in the database with one key per
-               // option, each having a boolean value. Extract those keys.
+               // Multiselect and checkmatrix options are stored in the database with
+               // one key per option, each having a boolean value. Extract those keys.
                $multiselectOptions = array();
                foreach ( $prefs as $name => $info ) {
                        if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
@@ -2376,6 +2378,23 @@ class User {
                                unset( $prefs[$name] );
                        }
                }
+               $checkmatrixOptions = array();
+               foreach ( $prefs as $name => $info ) {
+                       if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+                               $columns = HTMLFormField::flattenOptions( $info['columns'] );
+                               $rows = HTMLFormField::flattenOptions( $info['rows'] );
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+                               foreach ( $columns as $column ) {
+                                       foreach ( $rows as $row ) {
+                                               $checkmatrixOptions["$prefix-$column-$row"] = true;
+                                       }
+                               }
+
+                               unset( $prefs[$name] );
+                       }
+               }
 
                // $value is ignored
                foreach ( $options as $key => $value ) {
@@ -2383,6 +2402,8 @@ class User {
                                $mapping[$key] = 'registered';
                        } elseif( isset( $multiselectOptions[$key] ) ) {
                                $mapping[$key] = 'registered-multiselect';
+                       } elseif( isset( $checkmatrixOptions[$key] ) ) {
+                               $mapping[$key] = 'registered-checkmatrix';
                        } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
                                $mapping[$key] = 'userjs';
                        } else {
@@ -2400,15 +2421,15 @@ 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 $resetKinds array|string which kinds of preferences to reset. Defaults to
-        *                                 array( 'registered', 'registered-multiselect', 'unused' )
-        *                                 for backwards-compatibility.
+        * @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
-        *                                     does not contain 'all', passed to getOptionKinds().
-        *                                     Defaults to RequestContext::getMain() when null.
+        *             does not contain 'all', passed to getOptionKinds().
+        *             Defaults to RequestContext::getMain() when null.
         */
        public function resetOptions(
-               $resetKinds = array( 'registered', 'registered-multiselect', 'unused' ),
+               $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
                IContextSource $context = null
        ) {
                $this->load();
@@ -2471,7 +2492,7 @@ class User {
         */
        public function getStubThreshold() {
                global $wgMaxArticleSize; # Maximum article size, in Kb
-               $threshold = intval( $this->getOption( 'stubthreshold' ) );
+               $threshold = $this->getIntOption( 'stubthreshold' );
                if ( $threshold > $wgMaxArticleSize * 1024 ) {
                        # If they have set an impossible value, disable the preference
                        # so we can use the parser cache again.
@@ -2509,7 +2530,7 @@ class User {
         * Get the list of implicit group memberships this user has.
         * This includes all explicit groups, plus 'user' if logged in,
         * '*' for all accounts, and autopromoted groups
-        * @param $recache Bool Whether to avoid the cache
+        * @param bool $recache Whether to avoid the cache
         * @return Array of String internal group names
         */
        public function getEffectiveGroups( $recache = false ) {
@@ -2532,7 +2553,7 @@ class User {
         * Get the list of implicit group memberships this user has.
         * This includes 'user' if logged in, '*' for all accounts,
         * and autopromoted groups
-        * @param $recache Bool Whether to avoid the cache
+        * @param bool $recache Whether to avoid the cache
         * @return Array of String internal group names
         */
        public function getAutomaticGroups( $recache = false ) {
@@ -2614,7 +2635,7 @@ class User {
        /**
         * Add the user to the given group.
         * This takes immediate effect.
-        * @param $group String Name of the group to add
+        * @param string $group Name of the group to add
         */
        public function addGroup( $group ) {
                if( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
@@ -2639,7 +2660,7 @@ class User {
        /**
         * Remove the user from the given group.
         * This takes immediate effect.
-        * @param $group String Name of the group to remove
+        * @param string $group Name of the group to remove
         */
        public function removeGroup( $group ) {
                $this->load();
@@ -2902,7 +2923,7 @@ class User {
 
        /**
         * Set this user's options from an encoded string
-        * @param $str String Encoded options to import
+        * @param string $str Encoded options to import
         *
         * @deprecated in 1.19 due to removal of user_options from the user table
         */
@@ -2930,9 +2951,9 @@ class User {
        /**
         * Set a cookie on the user's client. Wrapper for
         * WebResponse::setCookie
-        * @param $name String Name of the cookie to set
-        * @param $value String Value to set
-        * @param $exp Int Expiration time, as a UNIX time value;
+        * @param string $name Name of the cookie to set
+        * @param string $value Value to set
+        * @param int $exp Expiration time, as a UNIX time value;
         *                   if 0 or not specified, use the default $wgCookieExpiration
         * @param $secure Bool
         *  true: Force setting the secure attribute when setting the cookie
@@ -2945,7 +2966,7 @@ class User {
 
        /**
         * Clear a cookie on the user's client
-        * @param $name String Name of the cookie to clear
+        * @param string $name Name of the cookie to clear
         */
        protected function clearCookie( $name ) {
                $this->setCookie( $name, '', time() - 86400 );
@@ -2956,7 +2977,7 @@ class User {
         *
         * @param $request WebRequest object to use; $wgRequest will be used if null
         *        is passed.
-        * @param $secure Whether to force secure/insecure cookies or use default
+        * @param bool $secure Whether to force secure/insecure cookies or use default
         */
        public function setCookies( $request = null, $secure = null ) {
                if ( $request === null ) {
@@ -2964,7 +2985,9 @@ class User {
                }
 
                $this->load();
-               if ( 0 == $this->mId ) return;
+               if ( 0 == $this->mId ) {
+                       return;
+               }
                if ( !$this->mToken ) {
                        // When token is empty or NULL generate a new one and then save it to the database
                        // This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
@@ -3098,8 +3121,8 @@ class User {
        /**
         * Add a user to the database, return the user object
         *
-        * @param $name String Username to add
-        * @param $params Array of Strings Non-default parameters to save to the database as user_* fields:
+        * @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
@@ -3114,6 +3137,7 @@ class User {
        public static function createNew( $name, $params = array() ) {
                $user = new User;
                $user->load();
+               $user->setToken(); // init token
                if ( isset( $params['options'] ) ) {
                        $user->mOptions = $params['options'] + (array)$user->mOptions;
                        unset( $params['options'] );
@@ -3175,6 +3199,9 @@ class User {
         */
        public function addToDatabase() {
                $this->load();
+               if ( !$this->mToken ) {
+                       $this->setToken(); // init token
+               }
 
                $this->mTouched = self::newTouchedTimestamp();
 
@@ -3279,7 +3306,7 @@ class User {
                // since it disables the parser cache, its value will always
                // be 0 when this function is called by parsercache.
 
-               $confstr =        $this->getOption( 'math' );
+               $confstr = $this->getOption( 'math' );
                $confstr .= '!' . $this->getStubThreshold();
                $confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
                $confstr .= '!' . $wgLang->getCode();
@@ -3371,7 +3398,7 @@ class User {
 
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
-        * @param $password String: user password.
+        * @param string $password user password.
         * @return Boolean: True if the given password is correct, otherwise False.
         */
        public function checkPassword( $password ) {
@@ -3438,7 +3465,7 @@ class User {
         * Alias for getEditToken.
         * @deprecated since 1.19, use getEditToken instead.
         *
-        * @param $salt String|Array of Strings Optional function-specific data for hashing
+        * @param string|array $salt of Strings Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
         * @return String The new edit token
         */
@@ -3455,7 +3482,7 @@ class User {
         *
         * @since 1.19
         *
-        * @param $salt String|Array of Strings Optional function-specific data for hashing
+        * @param string|array $salt of Strings Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
         * @return String The new edit token
         */
@@ -3482,11 +3509,10 @@ class User {
        /**
         * Generate a looking random token for various uses.
         *
-        * @param $salt String Optional salt value
         * @return String The new random token
-        * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pesudo-randomness
+        * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
         */
-       public static function generateToken( $salt = '' ) {
+       public static function generateToken() {
                return MWCryptRand::generateHex( 32 );
        }
 
@@ -3496,8 +3522,8 @@ class User {
         * user's own login session, not a form submission from a third-party
         * site.
         *
-        * @param $val String Input value to compare
-        * @param $salt String Optional function-specific data for hashing
+        * @param string $val Input value to compare
+        * @param string $salt Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
         * @return Boolean: Whether the token matches
         */
@@ -3513,8 +3539,8 @@ class User {
         * Check given value against the token value stored in the session,
         * ignoring the suffix.
         *
-        * @param $val String Input value to compare
-        * @param $salt String Optional function-specific data for hashing
+        * @param string $val Input value to compare
+        * @param string $salt Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
         * @return Boolean: Whether the token matches
         */
@@ -3527,7 +3553,7 @@ class User {
         * Generate a new e-mail confirmation token and send a confirmation/invalidation
         * mail to the user's given address.
         *
-        * @param $type String: message to send, either "created", "changed" or "set"
+        * @param string $type message to send, either "created", "changed" or "set"
         * @return Status object
         */
        public function sendConfirmationMail( $type = 'created' ) {
@@ -3561,10 +3587,10 @@ class User {
         * Send an e-mail to this user's account. Does not check for
         * confirmed status or validity.
         *
-        * @param $subject String Message subject
-        * @param $body String Message body
-        * @param $from String Optional From address; if unspecified, default $wgPasswordSender will be used
-        * @param $replyto String Reply-To address
+        * @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 $replyto Reply-To address
         * @return Status
         */
        public function sendMail( $subject, $body, $from = null, $replyto = null ) {
@@ -3603,8 +3629,8 @@ class User {
        }
 
        /**
-       * Return a URL the user can use to confirm their email address.
-        * @param $token String Accepts the email confirmation token
+        * Return a URL the user can use to confirm their email address.
+        * @param string $token Accepts the email confirmation token
         * @return String New token URL
         */
        private function confirmationTokenUrl( $token ) {
@@ -3613,7 +3639,7 @@ class User {
 
        /**
         * Return a URL the user can use to invalidate their email address.
-        * @param $token String Accepts the email confirmation token
+        * @param string $token Accepts the email confirmation token
         * @return String New token URL
         */
        private function invalidationTokenUrl( $token ) {
@@ -3630,8 +3656,8 @@ class User {
         * also sometimes can get corrupted in some browsers/mailers
         * (bug 6957 with Gmail and Internet Explorer).
         *
-        * @param $page String Special page
-        * @param $token String Token
+        * @param string $page Special page
+        * @param string $token Token
         * @return String Formatted URL
         */
        protected function getTokenUrl( $page, $token ) {
@@ -3671,7 +3697,7 @@ class User {
 
        /**
         * Set the e-mail authentication timestamp.
-        * @param $timestamp String TS_MW timestamp
+        * @param string $timestamp TS_MW timestamp
         */
        function setEmailAuthenticationTimestamp( $timestamp ) {
                $this->load();
@@ -3748,8 +3774,9 @@ class User {
        /**
         * Get the timestamp of account creation.
         *
-        * @return String|Bool Timestamp of account creation, or false for
-        *     non-existent/anonymous user accounts.
+        * @return String|Bool|Null Timestamp of account creation, false for
+        *     non-existent/anonymous user accounts, or null if existing account
+        *     but information is not in database.
         */
        public function getRegistration() {
                if ( $this->isAnon() ) {
@@ -3784,7 +3811,7 @@ class User {
        /**
         * Get the permissions associated with a given list of groups
         *
-        * @param $groups Array of Strings List of internal group names
+        * @param array $groups of Strings List of internal group names
         * @return Array of Strings List of permission key names for given groups combined
         */
        public static function getGroupPermissions( $groups ) {
@@ -3811,7 +3838,7 @@ class User {
        /**
         * Get all the groups who have a given permission
         *
-        * @param $role String Role to check
+        * @param string $role Role to check
         * @return Array of Strings List of internal group names with the given permission
         */
        public static function getGroupsWithPermission( $role ) {
@@ -3828,8 +3855,8 @@ class User {
        /**
         * Check, if the given group has the given permission
         *
-        * @param $group String Group to check
-        * @param $role String Role to check
+        * @param string $group Group to check
+        * @param string $role Role to check
         * @return bool
         */
        public static function groupHasPermission( $group, $role ) {
@@ -3841,7 +3868,7 @@ class User {
        /**
         * Get the localized descriptive name for a group, if it exists
         *
-        * @param $group String Internal group name
+        * @param string $group Internal group name
         * @return String Localized descriptive group name
         */
        public static function getGroupName( $group ) {
@@ -3852,8 +3879,8 @@ class User {
        /**
         * Get the localized descriptive name for a member of a group, if it exists
         *
-        * @param $group String Internal group name
-        * @param $username String Username for gender (since 1.19)
+        * @param string $group Internal group name
+        * @param string $username Username for gender (since 1.19)
         * @return String Localized name for group member
         */
        public static function getGroupMember( $group, $username = '#' ) {
@@ -3906,7 +3933,7 @@ class User {
        /**
         * Get the title of a page describing a particular group
         *
-        * @param $group String Internal group name
+        * @param string $group Internal group name
         * @return Title|Bool Title of the page if it exists, false otherwise
         */
        public static function getGroupPage( $group ) {
@@ -3923,8 +3950,8 @@ class User {
         * Create a link to the group in HTML, if available;
         * else return the group name.
         *
-        * @param $group String Internal name of the group
-        * @param $text String The text of the link
+        * @param string $group Internal name of the group
+        * @param string $text The text of the link
         * @return String HTML link to the group
         */
        public static function makeGroupLinkHTML( $group, $text = '' ) {
@@ -3943,8 +3970,8 @@ class User {
         * Create a link to the group in Wikitext, if available;
         * else return the group name.
         *
-        * @param $group String Internal name of the group
-        * @param $text String The text of the link
+        * @param string $group Internal name of the group
+        * @param string $text The text of the link
         * @return String Wikilink to the group
         */
        public static function makeGroupLinkWiki( $group, $text = '' ) {
@@ -3963,7 +3990,7 @@ class User {
        /**
         * Returns an array of the groups that a particular group can add/remove.
         *
-        * @param $group String: the group to check for whether it can add/remove
+        * @param string $group the group to check for whether it can add/remove
         * @return Array array( 'add' => array( addablegroups ),
         *     'remove' => array( removablegroups ),
         *     'add-self' => array( addablegroups to self),
@@ -4136,7 +4163,7 @@ class User {
        /**
         * Get the description of a given right
         *
-        * @param $right String Right to query
+        * @param string $right Right to query
         * @return String Localized description of the right
         */
        public static function getRightDescription( $right ) {
@@ -4148,8 +4175,8 @@ class User {
        /**
         * Make an old-style password hash
         *
-        * @param $password String Plain-text password
-        * @param $userId String User ID
+        * @param string $password Plain-text password
+        * @param string $userId User ID
         * @return String Password hash
         */
        public static function oldCrypt( $password, $userId ) {
@@ -4164,7 +4191,7 @@ class User {
        /**
         * Make a new-style password hash
         *
-        * @param $password String Plain-text password
+        * @param string $password Plain-text password
         * @param bool|string $salt Optional salt, may be random or the user ID.
 
         *                     If unspecified or false, will generate one automatically
@@ -4192,9 +4219,9 @@ class User {
         * Compare a password hash with a plain-text password. Requires the user
         * ID if there's a chance that the hash is an old-style hash.
         *
-        * @param $hash String Password hash
-        * @param $password String Plain-text password to compare
-        * @param $userId String|bool User ID for old-style password salt
+        * @param string $hash Password hash
+        * @param string $password Plain-text password to compare
+        * @param string|bool $userId User ID for old-style password salt
         *
         * @return Boolean
         */
@@ -4223,7 +4250,7 @@ class User {
         * Add a newuser log entry for this user.
         * Before 1.19 the return value was always true.
         *
-        * @param $action string|bool: 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,
@@ -4235,7 +4262,7 @@ class User {
         *     - false will be converted to 'create' if this object is the same as
         *       $wgUser and to 'create2' otherwise
         *
-        * @param $reason String: 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
         */
@@ -4293,7 +4320,7 @@ class User {
        /**
         * Load the user options either from cache, the database or an array
         *
-        * @param $data Rows for the current user out of the user_properties table
+        * @param array $data Rows for the current user out of the user_properties table
         */
        protected function loadOptions( $data = null ) {
                global $wgContLang;
index 7d11342..6eb9917 100644 (file)
@@ -24,7 +24,6 @@
  * @author Luke Welling lwelling@wikimedia.org
  */
 
-
 /**
  * Stores a single person's name and email address.
  * These are passed in via the constructor, and will be returned in SMTP
@@ -32,9 +31,9 @@
  */
 class MailAddress {
        /**
-        * @param $address string|User string with an email address, or a User object
-        * @param $name String: human-readable name if a string address is given
-        * @param $realName String: 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 ) {
@@ -78,7 +77,6 @@ class MailAddress {
        }
 }
 
-
 /**
  * Collection of static functions for sending mail
  */
@@ -110,9 +108,9 @@ class UserMailer {
        /**
         * Creates a single string from an associative array
         *
-        * @param $headers array Associative Array: keys are header field names,
+        * @param array $headers Associative Array: keys are header field names,
         *                 values are ... values.
-        * @param $endl String: The end of line character.  Defaults to "\n"
+        * @param string $endl The end of line character.  Defaults to "\n"
         *
         * Note RFC2822 says newlines must be CRLF (\r\n)
         * but php mail naively "corrects" it and requires \n for the "correction" to work
@@ -153,10 +151,10 @@ class UserMailer {
         *
         * @param $to MailAddress: recipient's email (or an array of them)
         * @param $from MailAddress: sender's email
-        * @param $subject String: email's subject.
-        * @param $body String: email's text or Array of two strings to be the text and html bodies
+        * @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 $contentType String: optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @param string $contentType optional custom Content-Type (default: text/plain; charset=UTF-8)
         * @throws MWException
         * @return Status object
         */
@@ -257,7 +255,7 @@ class UserMailer {
 
                if ( is_array( $body ) ) {
                        // we are sending a multipart message
-                       wfDebug( "Assembling mulitpart mime email\n" );
+                       wfDebug( "Assembling multipart mime email\n" );
                        if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
                                wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
                        }
@@ -270,7 +268,7 @@ class UserMailer {
                                $mime = new Mail_mime( array( 'eol' => $endl ) );
                                $mime->setTXTBody( $body['text'] );
                                $mime->setHTMLBody( $body['html'] );
-                               $body = $mime->get();  // must call get() before headers()
+                               $body = $mime->get(); // must call get() before headers()
                                $headers = $mime->headers( $headers );
                        }
                }
@@ -382,7 +380,7 @@ class UserMailer {
         * Set the mail error message in self::$mErrorString
         *
         * @param $code Integer: error number
-        * @param $string String: error message
+        * @param string $string error message
         */
        static function errorHandler( $code, $string ) {
                self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
@@ -491,7 +489,7 @@ class EmailNotification {
                        return;
                }
 
-               // Build a list of users to notfiy
+               // Build a list of users to notify
                $watchers = array();
                if ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) {
                        $dbw = wfGetDB( DB_MASTER );
@@ -572,11 +570,11 @@ class EmailNotification {
         *
         * @param $editor User object
         * @param $title Title object
-        * @param $timestamp string Edit timestamp
-        * @param $summary string Edit summary
+        * @param string $timestamp Edit timestamp
+        * @param string $summary Edit summary
         * @param $minorEdit bool
-        * @param $oldid int Revision ID
-        * @param $watchers array of user IDs
+        * @param int $oldid Revision ID
+        * @param array $watchers of user IDs
         * @param string $pageStatus
         * @throws MWException
         */
index 26ac3dc..cd5dff8 100644 (file)
@@ -32,8 +32,8 @@ class UserRightsProxy {
         * @see newFromId()
         * @see newFromName()
         * @param $db DatabaseBase: db connection
-        * @param $database String: database name
-        * @param $name String: user name
+        * @param string $database database name
+        * @param string $name user name
         * @param $id Integer: user ID
         */
        private function __construct( $db, $database, $name, $id ) {
@@ -56,7 +56,7 @@ class UserRightsProxy {
        /**
         * Confirm the selected database name is a valid local interwiki database name.
         *
-        * @param $database String: database name
+        * @param string $database database name
         * @return Boolean
         */
        public static function validDatabase( $database ) {
@@ -67,7 +67,7 @@ class UserRightsProxy {
        /**
         * Same as User::whoIs()
         *
-        * @param $database String: database name
+        * @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
@@ -84,7 +84,7 @@ class UserRightsProxy {
        /**
         * Factory function; get a remote user entry by ID number.
         *
-        * @param $database String: database name
+        * @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
@@ -96,8 +96,8 @@ class UserRightsProxy {
        /**
         * Factory function; get a remote user entry by name.
         *
-        * @param $database String: database name
-        * @param $name String: user 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
         */
index 240ebc7..5ac92f7 100644 (file)
@@ -205,7 +205,7 @@ class WatchedItem {
                        $success = true;
                }
 
-               # the following code compensates the new behaviour, introduced by the
+               # the following code compensates the new behavior, introduced by the
                # enotif patch, that every single watched page needs now to be listed
                # in watchlist namespace:page and namespace_talk:page had separate
                # entries: clear them
index cd43ffb..98007ef 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Deal with importing all those nasssty globals and things
+ * Deal with importing all those nasty globals and things
  *
  * Copyright © 2003 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -70,7 +70,7 @@ class WebRequest {
         * If the REQUEST_URI is not provided we'll fall back on the PATH_INFO
         * provided by the server if any and use that to set a 'title' parameter.
         *
-        * @param $want string: If this is not 'all', then the function
+        * @param string $want If this is not 'all', then the function
         * will return an empty array if it determines that the URL is
         * inside a rewrite path.
         *
@@ -206,7 +206,7 @@ class WebRequest {
         * @return string
         */
        public static function detectProtocol() {
-               list( $proto, $stdPort ) = self::detectProtocolAndStdPort();
+               list( $proto, ) = self::detectProtocolAndStdPort();
                return $proto;
        }
 
@@ -233,9 +233,9 @@ class WebRequest {
         * URL rewriting function; tries to extract page title and,
         * optionally, one other fixed parameter value from a URL path.
         *
-        * @param $path string: the URL path given from the client
-        * @param $bases array: one or more URLs, optionally with $1 at the end
-        * @param $key string: if provided, the matching key in $bases will be
+        * @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
         */
@@ -262,8 +262,8 @@ class WebRequest {
         * Recursively strips slashes from the given array;
         * used for undoing the evil that is magic_quotes_gpc.
         *
-        * @param $arr array: will be modified
-        * @param $topLevel bool Specifies if the array passed is from the top
+        * @param array $arr will be modified
+        * @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
@@ -359,7 +359,7 @@ class WebRequest {
         * selected by a drop-down menu). For freeform input, see getText().
         *
         * @param $name String
-        * @param $default String: optional default (or NULL)
+        * @param string $default optional default (or NULL)
         * @return String
         */
        public function getVal( $name, $default = null ) {
@@ -377,7 +377,7 @@ class WebRequest {
        /**
         * Set an arbitrary value into our get/post data.
         *
-        * @param $key String: key name to use
+        * @param string $key key name to use
         * @param $value Mixed: value to set
         * @return Mixed: old value if one was present, null otherwise
         */
@@ -390,7 +390,7 @@ class WebRequest {
        /**
         * Unset an arbitrary value from our get/post data.
         *
-        * @param $key String: key name to use
+        * @param string $key key name to use
         * @return Mixed: old value if one was present, null otherwise
         */
        public function unsetVal( $key ) {
@@ -409,7 +409,7 @@ class WebRequest {
         * If no source and no default, returns NULL.
         *
         * @param $name String
-        * @param $default Array: optional default (or NULL)
+        * @param array $default optional default (or NULL)
         * @return Array
         */
        public function getArray( $name, $default = null ) {
@@ -428,7 +428,7 @@ class WebRequest {
         * If an array is returned, contents are guaranteed to be integers.
         *
         * @param $name String
-        * @param $default Array: option default (or NULL)
+        * @param array $default option default (or NULL)
         * @return Array of ints
         */
        public function getIntArray( $name, $default = null ) {
@@ -503,7 +503,7 @@ class WebRequest {
         */
        public function getCheck( $name ) {
                # Checkboxes and buttons are only present when clicked
-               # Presence connotes truth, abscense false
+               # Presence connotes truth, absence false
                return $this->getVal( $name, null ) !== null;
        }
 
@@ -516,7 +516,7 @@ class WebRequest {
         * be required - e.g.  Esperanto x-coding).
         *
         * @param $name String
-        * @param $default String: optional
+        * @param string $default optional
         * @return String
         */
        public function getText( $name, $default = '' ) {
@@ -609,8 +609,8 @@ class WebRequest {
        /**
         * Get a cookie from the $_COOKIE jar
         *
-        * @param $key String: the name of the cookie
-        * @param $prefix String: a prefix to use for the cookie name, if not $wgCookiePrefix
+        * @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
         */
@@ -678,7 +678,7 @@ class WebRequest {
 
        /**
         * Take an arbitrary query and rewrite the present URL to include it
-        * @param $query String: query string fragment; do not include initial '?'
+        * @param string $query query string fragment; do not include initial '?'
         *
         * @return String
         */
@@ -690,7 +690,7 @@ class WebRequest {
         * HTML-safe version of appendQuery().
         * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
         *
-        * @param $query String: query string fragment; do not include initial '?'
+        * @param string $query query string fragment; do not include initial '?'
         * @return String
         */
        public function escapeAppendQuery( $query ) {
@@ -710,8 +710,8 @@ class WebRequest {
        /**
         * Appends or replaces value of query variables.
         *
-        * @param $array Array of values to replace/add to query
-        * @param $onlyquery Bool: whether to only return the query string and not
+        * @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
         */
@@ -730,7 +730,7 @@ class WebRequest {
         * 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 $optionname String: to specify an option other than rclimit to pull from.
+        * @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' ) {
@@ -741,7 +741,7 @@ class WebRequest {
                        $limit = 0;
                }
                if( ( $limit == 0 ) && ( $optionname != '' ) ) {
-                       $limit = (int)$wgUser->getOption( $optionname );
+                       $limit = $wgUser->getIntOption( $optionname );
                }
                if( $limit <= 0 ) {
                        $limit = $deflimit;
@@ -870,7 +870,7 @@ class WebRequest {
 
        /**
         * Get a request header, or false if it isn't set
-        * @param $name String: case-insensitive header name
+        * @param string $name case-insensitive header name
         *
         * @return string|bool False on failure
         */
@@ -887,7 +887,7 @@ class WebRequest {
        /**
         * Get data from $_SESSION
         *
-        * @param $key String: name of key in $_SESSION
+        * @param string $key name of key in $_SESSION
         * @return Mixed
         */
        public function getSessionData( $key ) {
@@ -900,7 +900,7 @@ class WebRequest {
        /**
         * Set session data
         *
-        * @param $key String: name of key in $_SESSION
+        * @param string $key name of key in $_SESSION
         * @param $data Mixed
         */
        public function setSessionData( $key, $data ) {
@@ -1124,6 +1124,15 @@ HTML;
                $this->ip = $ip;
                return $ip;
        }
+
+       /**
+        * @param string $ip
+        * @return void
+        * @since 1.21
+        */
+       public function setIP( $ip ) {
+               $this->ip = $ip;
+       }
 }
 
 /**
@@ -1138,7 +1147,7 @@ class WebRequestUpload {
         * Constructor. Should only be called by WebRequest
         *
         * @param $request WebRequest The associated request
-        * @param $key string Key in $_FILES array (name of form field)
+        * @param string $key Key in $_FILES array (name of form field)
         */
        public function __construct( $request, $key ) {
                $this->request = $request;
@@ -1250,9 +1259,9 @@ class FauxRequest extends WebRequest {
        private $session = array();
 
        /**
-        * @param $data Array of *non*-urlencoded key => value pairs, the
+        * @param array $data of *non*-urlencoded key => value pairs, the
         *   fake GET/POST values
-        * @param $wasPosted Bool: whether to treat the data as POST
+        * @param bool $wasPosted whether to treat the data as POST
         * @param $session Mixed: session array or null
         * @throws MWException
         */
@@ -1263,8 +1272,9 @@ class FauxRequest extends WebRequest {
                        throw new MWException( "FauxRequest() got bogus data" );
                }
                $this->wasPosted = $wasPosted;
-               if( $session )
+               if( $session ) {
                        $this->session = $session;
+               }
        }
 
        /**
index 4276fb0..8e15d71 100644 (file)
@@ -30,8 +30,8 @@ class WebResponse {
        /**
         * Output a HTTP header, wrapper for PHP's
         * header()
-        * @param $string String: header to output
-        * @param $replace Bool: replace current similar header
+        * @param string $string header to output
+        * @param bool $replace replace current similar header
         * @param $http_response_code null|int Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
@@ -40,12 +40,12 @@ class WebResponse {
 
        /**
         * Set the browser cookie
-        * @param $name String: name of cookie
-        * @param $value String: value to give cookie
-        * @param $expire Int: Unix timestamp (in seconds) when the cookie should expire.
+        * @param string $name name of cookie
+        * @param string $value value to give cookie
+        * @param int $expire Unix timestamp (in seconds) when the cookie should expire.
         *        0 (the default) causes it to expire $wgCookieExpiration seconds from now.
-        * @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
-        * @param $domain String: Cookie domain to use, if not $wgCookieDomain
+        * @param string $prefix Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
+        * @param string $domain Cookie domain to use, if not $wgCookieDomain
         * @param $forceSecure Bool:
         *   true: force the cookie to be set with the secure attribute
         *   false: force the cookie to be set without the secure attribute
@@ -105,8 +105,8 @@ class FauxResponse extends WebResponse {
 
        /**
         * Stores a HTTP header
-        * @param $string String: header to output
-        * @param $replace Bool: replace current similar header
+        * @param string $string header to output
+        * @param bool $replace replace current similar header
         * @param $http_response_code null|int Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
@@ -149,9 +149,9 @@ class FauxResponse extends WebResponse {
        /**
         * @todo document. It just ignore optional parameters.
         *
-        * @param $name String: name of cookie
-        * @param $value String: value to give cookie
-        * @param $expire Int: number of seconds til cookie expires (Default: 0)
+        * @param string $name name of cookie
+        * @param string $value value to give cookie
+        * @param int $expire number of seconds til cookie expires (Default: 0)
         * @param $prefix TODO DOCUMENT (Default: null)
         * @param $domain TODO DOCUMENT (Default: null)
         * @param $forceSecure TODO DOCUMENT (Default: null)
index 48767d0..e6f3135 100644 (file)
@@ -57,7 +57,7 @@ if ( ini_get( 'register_globals' ) ) {
        }
 }
 
-# bug 15461: Make IE8 turn off content sniffing. Everbody else should ignore this
+# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
 header( 'X-Content-Type-Options: nosniff' );
index 21a7d9a..f8f699c 100644 (file)
@@ -247,7 +247,7 @@ class MediaWiki {
                // Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
                } elseif ( $request->getVal( 'action', 'view' ) == 'view' && !$request->wasPosted()
                        && ( $request->getVal( 'title' ) === null ||
-                               $title->getPrefixedDBKey() != $request->getVal( 'title' ) )
+                               $title->getPrefixedDBkey() != $request->getVal( 'title' ) )
                        && !count( $request->getValueNames( array( 'action', 'title' ) ) )
                        && wfRunHooks( 'TestCanonicalRedirect', array( $request, $title, $output ) ) )
                {
@@ -356,10 +356,10 @@ class MediaWiki {
                // Check for redirects ...
                $action = $request->getVal( 'action', 'view' );
                $file = ( $title->getNamespace() == NS_FILE ) ? $article->getFile() : null;
-               if ( ( $action == 'view' || $action == 'render' )       // ... for actions that show content
-                       && !$request->getVal( 'oldid' ) &&    // ... and are not old revisions
-                       !$request->getVal( 'diff' ) &&    // ... and not when showing diff
-                       $request->getVal( 'redirect' ) != 'no' &&       // ... unless explicitly told not to
+               if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
+                       && !$request->getVal( 'oldid' ) && // ... and are not old revisions
+                       !$request->getVal( 'diff' ) && // ... and not when showing diff
+                       $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
                        // ... and the article is not a non-redirect image page with associated file
                        !( is_object( $file ) && $file->exists() && !$file->getRedirected() ) )
                {
index 45ee20c..6278121 100644 (file)
@@ -82,7 +82,7 @@ class WikiError {
  */
 class WikiErrorMsg extends WikiError {
        /**
-        * @param $message String: wiki message name
+        * @param string $message wiki message name
         * @param ... parameters to pass to wfMsg()
         *
         * @deprecated since 1.17
index 4a5e2bc..b04a784 100644 (file)
@@ -28,7 +28,7 @@ class WikiMap {
        /**
         * Get a WikiReference object for $wikiID
         *
-        * @param $wikiID String: wiki'd id (generally database name)
+        * @param string $wikiID wiki'd id (generally database name)
         * @return WikiReference object or null if the wiki was not found
         */
        public static function getWiki( $wikiID ) {
@@ -53,7 +53,7 @@ class WikiMap {
         * Convenience to get the wiki's display name
         *
         * @todo We can give more info than just the wiki id!
-        * @param $wikiID String: 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 ) {
@@ -68,9 +68,9 @@ class WikiMap {
        /**
         * Convenience to get a link to a user page on a foreign wiki
         *
-        * @param $wikiID String: wiki'd id (generally database name)
-        * @param $user String: user name (must be normalised before calling this function!)
-        * @param $text String: link's text; optional, default to "User:$user"
+        * @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 ) {
@@ -80,9 +80,9 @@ class WikiMap {
        /**
         * Convenience to get a link to a page on a foreign wiki
         *
-        * @param $wikiID String: wiki'd id (generally database name)
-        * @param $page String: page name (must be normalised before calling this function!)
-        * @param $text String: link's text; optional, default to $page
+        * @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 ) {
@@ -101,8 +101,8 @@ class WikiMap {
        /**
         * Convenience to get a url to a page on a foreign wiki
         *
-        * @param $wikiID String: wiki'd id (generally database name)
-        * @param $page String: page name (must be normalised before calling this function!)
+        * @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
         */
        public static function getForeignURL( $wikiID, $page ) {
@@ -176,7 +176,7 @@ class WikiReference {
         * Helper function for getUrl()
         *
         * @todo FIXME: This may be generalized...
-        * @param $page String: page name (must be normalised before calling this function!)
+        * @param string $page page name (must be normalised before calling this function!)
         * @return String: Url fragment
         */
        private function getLocalUrl( $page ) {
@@ -186,7 +186,7 @@ class WikiReference {
        /**
         * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
         *
-        * @param $page String: page name (must be normalised before calling this function!)
+        * @param string $page page name (must be normalised before calling this function!)
         * @return String: Url
         */
        public function getCanonicalUrl( $page ) {
@@ -214,7 +214,7 @@ class WikiReference {
         * Get a URL based on $wgServer, like Title::getFullUrl() would produce
         * when called locally on the wiki.
         *
-        * @param $page String: page name (must be normalized before calling this function!)
+        * @param string $page page name (must be normalized before calling this function!)
         * @return String: URL
         */
        public function getFullUrl( $page ) {
index 6048294..6e24527 100644 (file)
@@ -50,6 +50,11 @@ class WikiPage implements Page, IDBAccessObject {
        public $mPreparedEdit = false;       // !< Array
        /**@}}*/
 
+       /**
+        * @var int
+        */
+       protected $mId = null;
+
        /**
         * @var int; one of the READ_* constants
         */
@@ -121,8 +126,8 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Constructor from a page id
         *
-        * @param $id Int article ID to load
-        * @param $from string|int 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
         *
@@ -144,7 +149,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.20
         * @param $row object: database row containing at least fields returned
         *        by selectFields().
-        * @param $from string|int: source of $data:
+        * @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
@@ -228,6 +233,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return void
         */
        protected function clearCacheFields() {
+               $this->mId = null;
                $this->mCounter = null;
                $this->mRedirectTarget = null; // Title object if set
                $this->mLastRevision = null; // Latest revision
@@ -339,7 +345,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                } elseif ( $from === self::READ_NORMAL ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
-                       // Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
+                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
                        // Note that DB also stores the master position in the session and checks it.
                        $touched = $this->getCachedLastEditTime();
                        if ( $touched ) { // key set
@@ -363,7 +369,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.20
         * @param $data object: database row containing at least fields returned
         *        by selectFields()
-        * @param $from string|int One of the following:
+        * @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
         *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
@@ -371,6 +377,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function loadFromRow( $data, $from ) {
                $lc = LinkCache::singleton();
+               $lc->clearLink( $this->mTitle );
 
                if ( $data ) {
                        $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
@@ -380,10 +387,11 @@ class WikiPage implements Page, IDBAccessObject {
                        // Old-fashioned restrictions
                        $this->mTitle->loadRestrictions( $data->page_restrictions );
 
-                       $this->mCounter     = intval( $data->page_counter );
-                       $this->mTouched     = wfTimestamp( TS_MW, $data->page_touched );
-                       $this->mIsRedirect  = intval( $data->page_is_redirect );
-                       $this->mLatest      = intval( $data->page_latest );
+                       $this->mId = intval( $data->page_id );
+                       $this->mCounter = intval( $data->page_counter );
+                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+                       $this->mIsRedirect = intval( $data->page_is_redirect );
+                       $this->mLatest = intval( $data->page_latest );
                        // Bug 37225: $latest may no longer match the cached latest Revision object.
                        // Double-check the ID of any cached latest Revision object for consistency.
                        if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
@@ -396,6 +404,8 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mTitle->loadFromRow( false );
 
                        $this->clearCacheFields();
+
+                       $this->mId = 0;
                }
 
                $this->mDataLoaded = true;
@@ -406,14 +416,20 @@ class WikiPage implements Page, IDBAccessObject {
         * @return int Page ID
         */
        public function getId() {
-               return $this->mTitle->getArticleID();
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId;
        }
 
        /**
         * @return bool Whether or not the page exists in the database
         */
        public function exists() {
-               return $this->mTitle->exists();
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId > 0;
        }
 
        /**
@@ -425,7 +441,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function hasViewableContent() {
-               return $this->mTitle->exists() || $this->mTitle->isAlwaysKnown();
+               return $this->exists() || $this->mTitle->isAlwaysKnown();
        }
 
        /**
@@ -666,7 +682,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Set the page timestamp (use only to avoid DB queries)
-        * @param $ts string MW timestamp of last article revision
+        * @param string $ts MW timestamp of last article revision
         * @return void
         */
        public function setTimestamp( $ts ) {
@@ -1006,7 +1022,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the last N authors
         * @param $num Integer: number of revisions to get
-        * @param $revLatest String: the latest rev_id, selected from the master (optional)
+        * @param 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 ) {
@@ -1067,7 +1083,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                return $wgEnableParserCache
                        && $parserOptions->getStubThreshold() == 0
-                       && $this->mTitle->exists()
+                       && $this->exists()
                        && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
                        && $this->getContentHandler()->isParserCacheSupported();
        }
@@ -1123,7 +1139,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Don't update page view counters on views from bot users (bug 14044)
-               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
+               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
                        DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
                        DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
                }
@@ -1160,7 +1176,7 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo: move this logic to MessageCache
 
-                       if ( $this->mTitle->exists() ) {
+                       if ( $this->exists() ) {
                                // NOTE: use transclusion text for messages.
                                //       This is consistent with  MessageCache::getMsgFromNamespace()
 
@@ -1209,6 +1225,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $affected ) {
                        $newid = $dbw->insertId();
+                       $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
                }
                wfProfileOut( __METHOD__ );
@@ -1406,9 +1423,9 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
-        * @param $text String: new text of the section
-        * @param $sectionTitle String: new section's subject, only if $section is 'new'
-        * @param $edittime String: revision timestamp or null to use the current revision
+        * @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
         * @throws MWException
         * @return String new complete article text, or null if error
         *
@@ -1449,8 +1466,8 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
         * @param $sectionContent Content: new content of the section
-        * @param $sectionTitle String: new section's subject, only if $section is 'new'
-        * @param $edittime String: revision timestamp or null to use the current revision
+        * @param string $sectionTitle new section's subject, only if $section is 'new'
+        * @param string $edittime revision timestamp or null to use the current revision
         *
         * @throws MWException
         * @return Content new complete article content, or null if error
@@ -1506,7 +1523,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        function checkFlags( $flags ) {
                if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
-                       if ( $this->mTitle->getArticleID() ) {
+                       if ( $this->exists() ) {
                                $flags |= EDIT_UPDATE;
                        } else {
                                $flags |= EDIT_NEW;
@@ -1520,8 +1537,8 @@ 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 $text String: new text
-        * @param $summary String: edit summary
+        * @param string $text new text
+        * @param string $summary edit summary
         * @param $flags Integer bitfield:
         *      EDIT_NEW
         *          Article is known or assumed to be non-existent, create a new one
@@ -1578,7 +1595,7 @@ class WikiPage implements Page, IDBAccessObject {
         * optionally via the deferred update array.
         *
         * @param $content Content: new content
-        * @param $summary String: edit summary
+        * @param string $summary edit summary
         * @param $flags Integer bitfield:
         *      EDIT_NEW
         *          Article is known or assumed to be non-existent, create a new one
@@ -1688,7 +1705,7 @@ class WikiPage implements Page, IDBAccessObject {
                $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
                $serialized = $editInfo->pst;
                $content = $editInfo->pstContent;
-               $newsize =  $content->getSize();
+               $newsize = $content->getSize();
 
                $dbw = wfGetDB( DB_MASTER );
                $now = wfTimestampNow();
@@ -2012,7 +2029,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param $revision Revision object
         * @param $user User object that did the revision
-        * @param $options Array of options, following indexes are used:
+        * @param array $options 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):
@@ -2068,7 +2085,7 @@ class WikiPage implements Page, IDBAccessObject {
                        }
                }
 
-               if ( !$this->mTitle->exists() ) {
+               if ( !$this->exists() ) {
                        wfProfileOut( __METHOD__ );
                        return;
                }
@@ -2140,9 +2157,9 @@ class WikiPage implements Page, IDBAccessObject {
         * The article must already exist; link tables etc
         * are not updated, caches are not flushed.
         *
-        * @param $text String: text submitted
+        * @param string $text text submitted
         * @param $user User The relevant user
-        * @param $comment String: comment submitted
+        * @param string $comment comment submitted
         * @param $minor Boolean: whereas it's a minor modification
         *
         * @deprecated since 1.21, use doEditContent() instead.
@@ -2161,7 +2178,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param $content Content: content submitted
         * @param $user User The relevant user
-        * @param $comment String: comment submitted
+        * @param string $comment comment submitted
         * @param $serialisation_format String: format for storing the content in the database
         * @param $minor Boolean: whereas it's a minor modification
         */
@@ -2191,10 +2208,10 @@ 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 $limit Array: set of restriction keys
+        * @param array $limit set of restriction keys
         * @param $reason String
         * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
-        * @param $expiry Array: per restriction type expiration
+        * @param array $expiry per restriction type expiration
         * @param $user User The user updating the restrictions
         * @return Status
         */
@@ -2207,7 +2224,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $restrictionTypes = $this->mTitle->getRestrictionTypes();
 
-               $id = $this->mTitle->getArticleID();
+               $id = $this->getId();
 
                if ( !$cascade ) {
                        $cascade = false;
@@ -2256,7 +2273,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $changed = true;
                }
 
-               // If nothing's changed, do nothing
+               // If nothing has changed, do nothing
                if ( !$changed ) {
                        return Status::newGood();
                }
@@ -2461,10 +2478,10 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * Deletes the article with database consistency, writes logs, purges caches
         *
-        * @param $reason string delete reason for deletion log
+        * @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 $id int article ID
+        * @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
@@ -2483,10 +2500,10 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @since 1.19
         *
-        * @param $reason string delete reason for deletion log
+        * @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 $id int article ID
+        * @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
@@ -2588,7 +2605,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Now that it's safely backed up, delete it
                $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // getArticleID() uses slave, could be laggy
+               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
 
                if ( !$ok ) {
                        $dbw->rollback( __METHOD__ );
@@ -2620,7 +2637,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Do some database updates after deletion
         *
-        * @param $id Int: page_id value of the page being deleted (B/C, currently unused)
+        * @param int $id page_id value of the page being deleted (B/C, currently unused)
         * @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.
         */
@@ -2635,11 +2652,8 @@ class WikiPage implements Page, IDBAccessObject {
                // Clear caches
                WikiPage::onArticleDelete( $this->mTitle );
 
-               // Reset this object
-               $this->clear();
-
-               // Clear the cached article id so the interface doesn't act like we exist
-               $this->mTitle->resetArticleID( 0 );
+               // Reset this object and the Title object
+               $this->loadFromRow( false, self::READ_LATEST );
        }
 
        /**
@@ -2649,14 +2663,14 @@ class WikiPage implements Page, IDBAccessObject {
         * performs permissions checks on $user, then calls commitRollback()
         * to do the dirty work
         *
-        * @todo: seperate the business/permission stuff out from backend code
+        * @todo: separate the business/permission stuff out from backend code
         *
-        * @param $fromP String: Name of the user whose edits to rollback.
-        * @param $summary String: Custom summary. Set to default summary if empty.
-        * @param $token String: Rollback token.
+        * @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 $resultDetails Array: contains result-specific array of additional values
+        * @param array $resultDetails contains result-specific array of additional values
         *    'alreadyrolled' : 'current' (rev)
         *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
         *
@@ -2700,11 +2714,11 @@ class WikiPage implements Page, IDBAccessObject {
         * rollback to the DB. Therefore, you should only call this function direct-
         * ly if you want to use custom permissions checks. If you don't, use
         * doRollback() instead.
-        * @param $fromP String: Name of the user whose edits to rollback.
-        * @param $summary String: Custom summary. Set to default summary if empty.
+        * @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 $resultDetails Array: contains result-specific array of additional values
+        * @param array $resultDetails contains result-specific array of additional values
         * @param $guser User The user performing the rollback
         * @return array
         */
@@ -2943,7 +2957,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function getHiddenCategories() {
                $result = array();
-               $id = $this->mTitle->getArticleID();
+               $id = $this->getId();
 
                if ( $id == 0 ) {
                        return array();
@@ -2966,14 +2980,14 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-       * Return an applicable autosummary if one exists for the given edit.
-       * @param $oldtext String|null: the previous text of the page.
-       * @param $newtext String|null: The submitted text of the page.
-       * @param $flags Int 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
-       */
+        * Return an applicable autosummary if one exists for the given edit.
+        * @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.
+        * @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.
 
@@ -3001,8 +3015,8 @@ 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 $added array   The names of categories that were added
-        * @param $deleted array The names of categories that were deleted
+        * @param array $added   The names of categories that were added
+        * @param array $deleted The names of categories that were deleted
         */
        public function updateCategoryCounts( $added, $deleted ) {
                $ns = $this->mTitle->getNamespace();
@@ -3030,7 +3044,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
                $dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
 
-               $addFields    = array( 'cat_pages = cat_pages + 1' );
+               $addFields = array( 'cat_pages = cat_pages + 1' );
                $removeFields = array( 'cat_pages = cat_pages - 1' );
 
                if ( $ns == NS_CATEGORY ) {
@@ -3058,6 +3072,15 @@ class WikiPage implements Page, IDBAccessObject {
                                __METHOD__
                        );
                }
+
+               foreach( $added as $catName ) {
+                       $cat = Category::newFromName( $catName );
+                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
+               }
+               foreach( $deleted as $catName ) {
+                       $cat = Category::newFromName( $catName );
+                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
+               }
        }
 
        /**
@@ -3078,7 +3101,7 @@ class WikiPage implements Page, IDBAccessObject {
                // are visible.
 
                // Get templates from templatelinks
-               $id = $this->mTitle->getArticleID();
+               $id = $this->getId();
 
                $tlTemplates = array();
 
@@ -3144,7 +3167,7 @@ class WikiPage implements Page, IDBAccessObject {
         * so we can do things like signatures and links-in-context.
         *
         * @deprecated in 1.19; use Parser::preSaveTransform() instead
-        * @param $text String article contents
+        * @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
@@ -3191,10 +3214,10 @@ class WikiPage implements Page, IDBAccessObject {
         * Update the article's restriction field, and leave a log entry.
         *
         * @deprecated since 1.19
-        * @param $limit Array: set of restriction keys
+        * @param array $limit set of restriction keys
         * @param $reason String
         * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
-        * @param $expiry Array: per restriction type expiration
+        * @param array $expiry per restriction type expiration
         * @param $user User The user updating the restrictions
         * @return bool true on success
         */
index 158a6b5..57a4fcf 100644 (file)
@@ -30,16 +30,16 @@ class Xml {
         * Strings are assumed to not contain XML-illegal characters; special
         * characters (<, >, &) are escaped but illegals are not touched.
         *
-        * @param $element String: element name
-        * @param $attribs Array: Name=>value pairs. Values will be escaped.
-        * @param $contents String: NULL to make an open tag only; '' for a contentless closed tag (default)
-        * @param $allowShortTag Bool: whether '' in $contents will result in a contentless closed tag
+        * @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
         * @return string
         */
        public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
                $out = '<' . $element;
                if( !is_null( $attribs ) ) {
-                       $out .=  self::expandAttributes( $attribs );
+                       $out .= self::expandAttributes( $attribs );
                }
                if( is_null( $contents ) ) {
                        $out .= '>';
@@ -58,7 +58,7 @@ class Xml {
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
         * Return null if no attributes given.
-        * @param $attribs Array of attributes for an XML element
+        * @param array $attribs of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
@@ -82,8 +82,8 @@ class Xml {
         * is passed.
         *
         * @param $element String:
-        * @param $attribs Array: Name=>value pairs. Values will be escaped.
-        * @param $contents String: NULL to make an open tag only; '' for a contentless closed tag (default)
+        * @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)
         * @return string
         */
        public static function elementClean( $element, $attribs = array(), $contents = '' ) {
@@ -102,8 +102,8 @@ class Xml {
        /**
         * This opens an XML element
         *
-        * @param $element String name of the element
-        * @param $attribs array of attributes, see Xml::expandAttributes()
+        * @param string $element name of the element
+        * @param array $attribs of attributes, see Xml::expandAttributes()
         * @return string
         */
        public static function openElement( $element, $attribs = null ) {
@@ -112,7 +112,7 @@ class Xml {
 
        /**
         * Shortcut to close an XML element
-        * @param $element String element name
+        * @param string $element element name
         * @return string
         */
        public static function closeElement( $element ) { return "</$element>"; }
@@ -121,9 +121,9 @@ class Xml {
         * Same as Xml::element(), but does not escape contents. Handy when the
         * content you have is already valid xml.
         *
-        * @param $element String element name
-        * @param $attribs array of attributes
-        * @param $contents String content of the element
+        * @param string $element element name
+        * @param array $attribs of attributes
+        * @param string $contents content of the element
         * @return string
         */
        public static function tags( $element, $attribs = null, $contents ) {
@@ -136,7 +136,7 @@ class Xml {
         * @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 $label String: optional label to add to the field
+        * @param string $label optional label to add to the field
         * @return string
         * @deprecated since 1.19
         */
@@ -157,8 +157,8 @@ class Xml {
         * Create a date selector
         *
         * @param $selected Mixed: the month which should be selected, default ''
-        * @param $allmonths String: value of a special item denoting all month. Null to not include (default)
-        * @param $id String: Element identifier
+        * @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
         */
        public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
@@ -256,9 +256,9 @@ class Xml {
 
        /**
         * Shortcut to make a span element
-        * @param $text String content of the element, will be escaped
-        * @param $class String class name of the span element
-        * @param $attribs array 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() ) {
@@ -267,10 +267,10 @@ class Xml {
 
        /**
         * Shortcut to make a specific element with a class attribute
-        * @param $text string content of the element, will be escaped
-        * @param $class string class name of the span element
-        * @param $tag string element name
-        * @param $attribs array 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() ) {
@@ -279,10 +279,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML text input field
-        * @param $name String value of the name attribute
-        * @param $size int value of the size attribute
+        * @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 $attribs array other attributes
+        * @param array $attribs other attributes
         * @return string HTML
         */
        public static function input( $name, $size = false, $value = false, $attribs = array() ) {
@@ -301,10 +301,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML password input field
-        * @param $name string value of the name attribute
-        * @param $size int value of the size attribute
+        * @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 $attribs array other attributes
+        * @param array $attribs other attributes
         * @return string HTML
         */
        public static function password( $name, $size = false, $value = false, $attribs = array() ) {
@@ -325,9 +325,9 @@ class Xml {
 
        /**
         * Convenience function to build an HTML checkbox
-        * @param $name String value of the name attribute
-        * @param $checked Bool Whether the checkbox is checked or not
-        * @param $attribs Array other attributes
+        * @param string $name value of the name attribute
+        * @param bool $checked Whether the checkbox is checked or not
+        * @param array $attribs other attributes
         * @return string HTML
         */
        public static function check( $name, $checked = false, $attribs=array() ) {
@@ -342,10 +342,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML radio button
-        * @param $name String value of the name attribute
-        * @param $value String value of the value attribute
-        * @param $checked Bool Whether the checkbox is checked or not
-        * @param $attribs Array other attributes
+        * @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
         * @return string HTML
         */
        public static function radio( $name, $value, $checked = false, $attribs = array() ) {
@@ -357,9 +357,9 @@ class Xml {
 
        /**
         * Convenience function to build an HTML form label
-        * @param $label String text of the label
+        * @param string $label text of the label
         * @param $id
-        * @param $attribs Array an attribute array.  This will usuall be
+        * @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.
@@ -381,12 +381,12 @@ class Xml {
 
        /**
         * Convenience function to build an HTML text input field with a label
-        * @param $label String text of the label
-        * @param $name String value of the name attribute
-        * @param $id String id of the input
-        * @param $size Int|Bool value of the size attribute
-        * @param $value String|Bool value of the value attribute
-        * @param $attribs array 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() ) {
@@ -450,8 +450,8 @@ class Xml {
 
        /**
         * Convenience function to build an HTML submit button
-        * @param $value String: label text for the button
-        * @param $attribs Array: 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() ) {
@@ -460,10 +460,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML drop-down list item.
-        * @param $text String: text for this item
-        * @param $value String: form submission value; if empty, use text
+        * @param string $text text for this item
+        * @param string $value form submission value; if empty, use text
         * @param $selected boolean: if true, will be the default selected item
-        * @param $attribs array: optional additional HTML attributes
+        * @param array $attribs optional additional HTML attributes
         * @return string HTML
         */
        public static function option( $text, $value=null, $selected = false,
@@ -542,9 +542,9 @@ class Xml {
        /**
         * Shortcut for creating fieldsets.
         *
-        * @param $legend string|bool Legend of the fieldset. If evaluates to false, legend is not added.
-        * @param $content string Pre-escaped content for the fieldset. If false, only open fieldset is returned.
-        * @param $attribs array Any attributes to fieldset-element.
+        * @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
         */
@@ -566,11 +566,11 @@ class Xml {
        /**
         * Shortcut for creating textareas.
         *
-        * @param $name string The 'name' for the textarea
-        * @param $content string Content for the textarea
-        * @param $cols int The number of columns for the textarea
-        * @param $rows int The number of rows for the textarea
-        * @param $attribs array Any other attributes for the textarea
+        * @param string $name The 'name' for the textarea
+        * @param string $content Content for the textarea
+        * @param int $cols The number of columns for the textarea
+        * @param int $rows The number of rows for the textarea
+        * @param array $attribs Any other attributes for the textarea
         *
         * @return string
         */
@@ -590,7 +590,7 @@ class Xml {
         * for JavaScript source code.
         * Illegal control characters are assumed not to be present.
         *
-        * @param $string String to escape
+        * @param string $string to escape
         * @return String
         */
        public static function escapeJsString( $string ) {
@@ -673,9 +673,9 @@ class Xml {
         * Create a call to a JavaScript function. The supplied arguments will be
         * encoded using Xml::encodeJsVar().
         *
-        * @param $name String The name of the function to call, or a JavaScript expression
+        * @param string $name The name of the function to call, or a JavaScript expression
         *    which evaluates to a function object which is called.
-        * @param $args Array of arguments to pass to the function.
+        * @param array $args of arguments to pass to the function.
         *
         * @since 1.17
         *
@@ -693,7 +693,7 @@ class Xml {
         * Check if a string is well-formed XML.
         * Must include the surrounding tag.
         *
-        * @param $text String: string to test.
+        * @param string $text string to test.
         * @return bool
         *
         * @todo Error position reporting return
@@ -740,7 +740,7 @@ class Xml {
         * Replace " > and < with their respective HTML entities ( &quot;,
         * &gt;, &lt;)
         *
-        * @param $in String: text that might contain HTML tags.
+        * @param string $in text that might contain HTML tags.
         * @return string Escaped string
         */
        public static function escapeTagsOnly( $in ) {
@@ -751,12 +751,12 @@ class Xml {
        }
 
        /**
-       * Generate a form (without the opening form element).
-       * Output optionally includes a submit button.
-       * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
-       * @param $submitLabel String A message containing a label for the submit button.
-       * @return string HTML form.
-       */
+        * Generate a form (without the opening form element).
+        * Output optionally includes a submit button.
+        * @param array $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
+        * @param string $submitLabel A message containing a label for the submit button.
+        * @return string HTML form.
+        */
        public static function buildForm( $fields, $submitLabel = null ) {
                $form = '';
                $form .= "<table><tbody>";
@@ -783,9 +783,9 @@ class Xml {
 
        /**
         * Build a table of data
-        * @param $rows array An array of arrays of strings, each to be a row in a table
-        * @param $attribs array An array of attributes to apply to the table tag [optional]
-        * @param $headers array An array of strings to use as table headers [optional]
+        * @param array $rows An array of arrays of strings, each to be a row in a table
+        * @param array $attribs An array of attributes to apply to the table tag [optional]
+        * @param array $headers An array of strings to use as table headers [optional]
         * @return string
         */
        public static function buildTable( $rows, $attribs = array(), $headers = null ) {
@@ -823,8 +823,8 @@ class Xml {
 
        /**
         * Build a row for a table
-        * @param $attribs array An array of attributes to apply to the tr tag
-        * @param $cells array An array of strings to put in <td>
+        * @param array $attribs An array of attributes to apply to the tr tag
+        * @param array $cells An array of strings to put in <td>
         * @return string
         */
        public static function buildTableRow( $attribs, $cells ) {
index b95dd6a..2e18460 100644 (file)
@@ -40,7 +40,7 @@ class XmlTypeCheck {
        public $rootElement = '';
 
        /**
-        * @param $file string filename
+        * @param string $file filename
         * @param $filterCallback callable (optional)
         *        Function to call to do additional custom validity checks from the
         *        SAX element handler event. This gives you access to the element
index 4299841..fd03ec4 100644 (file)
@@ -50,7 +50,7 @@ class ZhClient {
        }
 
        /**
-        * Establish conncetion
+        * Establish connection
         *
         * @access private
         *
@@ -100,8 +100,8 @@ class ZhClient {
        /**
         * Convert the input to a different language variant
         *
-        * @param $text String: input text
-        * @param $tolang String: language variant
+        * @param string $text input text
+        * @param string $tolang language variant
         * @return string the converted text
         */
        function convert( $text, $tolang ) {
@@ -117,7 +117,7 @@ class ZhClient {
        /**
         * Convert the input to all possible variants
         *
-        * @param $text String: input text
+        * @param string $text input text
         * @return array langcode => converted_string
         */
        function convertToAllVariants( $text ) {
@@ -142,7 +142,7 @@ class ZhClient {
        /**
         * Perform word segmentation
         *
-        * @param $text String: input text
+        * @param string $text input text
         * @return string segmented text
         */
        function segment( $text ) {
index fc36b1f..646180d 100644 (file)
@@ -34,10 +34,10 @@ class ZipDirectoryReader {
         *
         * Because this class is aimed at verification, an error is raised on
         * suspicious or ambiguous input, instead of emulating some standard
-        * behaviour.
+        * behavior.
         *
-        * @param $fileName string The archive file name
-        * @param $callback Array The callback function. It will be called for each file
+        * @param string $fileName The archive file name
+        * @param array $callback The callback function. It will be called for each file
         *   with a single associative array each time, with members:
         *
         *      - name: The file name. Directories conventionally have a trailing
@@ -47,7 +47,7 @@ class ZipDirectoryReader {
         *
         *      - size: The uncompressed file size
         *
-        * @param $options Array An associative array of read options, with the option
+        * @param array $options An associative array of read options, with the option
         *    name in the key. This may currently contain:
         *
         *      - zip64: If this is set to true, then we will emulate a
@@ -494,8 +494,8 @@ class ZipDirectoryReader {
         * Get the file contents from a given offset. If there are not enough bytes
         * in the file to satisfy the request, an exception will be thrown.
         *
-        * @param $start int The byte offset of the start of the block.
-        * @param $length int The number of bytes to return. If omitted, the remainder
+        * @param int $start The byte offset of the start of the block.
+        * @param int $length The number of bytes to return. If omitted, the remainder
         *    of the file will be returned.
         *
         * @return string
@@ -538,7 +538,7 @@ class ZipDirectoryReader {
         * of length self::SEGSIZE. The result is cached. This is a helper function
         * for getBlock().
         *
-        * If there are not enough bytes in the file to satsify the request, the
+        * 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.
         * @return string
@@ -570,7 +570,7 @@ class ZipDirectoryReader {
                $size = 0;
                foreach ( $struct as $type ) {
                        if ( is_array( $type ) ) {
-                               list( $typeName, $fieldSize ) = $type;
+                               list( , $fieldSize ) = $type;
                                $size += $fieldSize;
                        } else {
                                $size += $type;
@@ -583,9 +583,9 @@ class ZipDirectoryReader {
         * Unpack a binary structure. This is like the built-in unpack() function
         * except nicer.
         *
-        * @param $string string The binary data input
+        * @param string $string The binary data input
         *
-        * @param $struct array An associative array giving structure members and their
+        * @param array $struct An associative array giving structure members and their
         *    types. In the key is the field name. The value may be either an
         *    integer, in which case the field is a little-endian unsigned integer
         *    encoded in the given number of bytes, or an array, in which case the
@@ -594,7 +594,7 @@ class ZipDirectoryReader {
         *       - "string": The second array element gives the length of string.
         *          Not null terminated.
         *
-        * @param $offset int The offset into the string at which to start unpacking.
+        * @param int $offset The offset into the string at which to start unpacking.
         *
         * @throws MWException
         * @return array Unpacked associative array. Note that large integers in the input
@@ -651,7 +651,7 @@ class ZipDirectoryReader {
         * boolean.
         *
         * @param $value integer
-        * @param $bitIndex int The index of the bit, where 0 is the LSB.
+        * @param int $bitIndex The index of the bit, where 0 is the LSB.
         * @return bool
         */
        function testBit( $value, $bitIndex ) {
index d21f9ae..bfdda7b 100644 (file)
@@ -1,22 +1,8 @@
 <?php
-
 /**
  * Abstract action class with scaffolding for caching HTML and other values
  * in a single blob.
  *
- * Before using any of the caching functionality, call startCache.
- * After the last call to either getCachedValue or addCachedHTML, call saveCache.
- *
- * To get a cached value or compute it, use getCachedValue like this:
- * $this->getCachedValue( $callback );
- *
- * To add HTML that should be cached, use addCachedHTML like this:
- * $this->addCachedHTML( $callback );
- *
- * The callback function is only called when needed, so do all your expensive
- * computations here. This function should returns the HTML to be cached.
- * It should not add anything to the PageOutput object!
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @ingroup Action
+ * @ingroup Actions
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  * @since 1.20
  */
+
+/**
+ * Abstract action class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * @ingroup Actions
+ */
 abstract class CachedAction extends FormlessAction implements ICacheHelper {
 
        /**
index d0bc22c..4d3c41b 100644 (file)
@@ -23,6 +23,9 @@
  * @author <evan@wikitravel.org>
  */
 
+/**
+ * @ingroup Actions
+ */
 class CreditsAction extends FormlessAction {
 
        public function getName() {
@@ -55,8 +58,8 @@ class CreditsAction extends FormlessAction {
        /**
         * Get a list of contributors
         *
-        * @param $cnt Int: maximum list of contributors to show
-        * @param $showIfMax Bool: whether to contributors if there more than $cnt
+        * @param int $cnt maximum list of contributors to show
+        * @param bool $showIfMax whether to contributors if there more than $cnt
         * @return String: html
         */
        public function getCredits( $cnt, $showIfMax = true ) {
@@ -97,8 +100,8 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get a list of contributors of $article
-        * @param $cnt Int: maximum list of contributors to show
-        * @param $showIfMax Bool: whether to contributors if there more than $cnt
+        * @param int $cnt maximum list of contributors to show
+        * @param bool $showIfMax whether to contributors if there more than $cnt
         * @return String: html
         */
        protected function getContributors( $cnt, $showIfMax ) {
index 3cb24e6..db7123d 100644 (file)
  * @author Timo Tijhof
  */
 
+/**
+ * Handle page deletion
+ *
+ * This is a wrapper that will call Article::delete().
+ *
+ * @ingroup Actions
+ */
 class DeleteAction extends FormlessAction {
 
        public function getName() {
index eb261fc..dec3d84 100644 (file)
  * @author Timo Tijhof
  */
 
+/**
+ * Page edition handler
+ *
+ * This is a wrapper that will call the EditPage class, or ExternalEdit
+ * if $wgUseExternalEditor is set to true and requested by the user.
+ *
+ * @ingroup Actions
+ */
 class EditAction extends FormlessAction {
 
        public function getName() {
@@ -56,6 +64,13 @@ class EditAction extends FormlessAction {
 
 }
 
+/**
+ * Edit submission handler
+ *
+ * This is the same as EditAction; except that it sets the session cookie.
+ *
+ * @ingroup Actions
+ */
 class SubmitAction extends EditAction {
 
        public function getName() {
index d26228a..f2e61a5 100644 (file)
@@ -20,6 +20,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
+ * @ingroup Actions
  */
 
 /**
@@ -30,6 +31,7 @@
  * Construct it by passing in an Article, and call $h->history() to print the
  * history.
  *
+ * @ingroup Actions
  */
 class HistoryAction extends FormlessAction {
        const DIR_PREV = 0;
@@ -145,9 +147,9 @@ class HistoryAction extends FormlessAction {
                /**
                 * Add date selector to quickly get to a certain time
                 */
-               $year        = $request->getInt( 'year' );
-               $month       = $request->getInt( 'month' );
-               $tagFilter   = $request->getVal( 'tagfilter' );
+               $year = $request->getInt( 'year' );
+               $month = $request->getInt( 'month' );
+               $tagFilter = $request->getVal( 'tagfilter' );
                $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
 
                /**
@@ -174,7 +176,7 @@ class HistoryAction extends FormlessAction {
                                false,
                                array( 'id' => 'mw-history-search' )
                        ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBKey() ) . "\n" .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
                        Html::hidden( 'action', 'history' ) . "\n" .
                        Xml::dateMenu( ( $year == null ? date( "Y" ) : $year ), $month ) . '&#160;' .
                        ( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
@@ -183,7 +185,7 @@ class HistoryAction extends FormlessAction {
                        '</fieldset></form>'
                );
 
-               wfRunHooks( 'PageHistoryBeforeList', array( &$this->page ) );
+               wfRunHooks( 'PageHistoryBeforeList', array( &$this->page, $this->getContext() ) );
 
                // Create and output the list.
                $pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
@@ -241,7 +243,7 @@ class HistoryAction extends FormlessAction {
        /**
         * Output a subscription feed listing recent edits to this page.
         *
-        * @param $type String: feed type
+        * @param string $type feed type
         */
        function feed( $type ) {
                global $wgFeedClasses, $wgFeedLimit;
@@ -331,6 +333,7 @@ class HistoryAction extends FormlessAction {
 
 /**
  * @ingroup Pager
+ * @ingroup Actions
  */
 class HistoryPager extends ReverseChronologicalPager {
        public $lastRow = false, $counter, $historyPage, $buttons, $conds;
@@ -440,7 +443,7 @@ class HistoryPager extends ReverseChronologicalPager {
                $this->getOutput()->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
                $s = Html::openElement( 'form', array( 'action' => $wgScript,
                        'id' => 'mw-history-compare' ) ) . "\n";
-               $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) . "\n";
+               $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n";
                $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
 
                // Button container stored in $this->buttons for re-use in getEndBody()
@@ -508,8 +511,8 @@ class HistoryPager extends ReverseChronologicalPager {
        /**
         * Creates a submit button
         *
-        * @param $message String: text of the submit button, will be escaped
-        * @param $attributes Array: attributes
+        * @param string $message text of the submit button, will be escaped
+        * @param array $attributes attributes
         * @return String: HTML output for the submit button
         */
        function submitButton( $message, $attributes = array() ) {
@@ -580,7 +583,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        // Otherwise, show the link...
                        } else {
                                $query = array( 'type' => 'revision',
-                                       'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $rev->getId() );
+                                       'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId() );
                                $del .= Linker::revDeleteLink( $query,
                                        $rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
                        }
@@ -654,6 +657,8 @@ class HistoryPager extends ReverseChronologicalPager {
                                $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
                        }
                }
+               // Allow extension to add their own links here
+               wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
 
                if ( $tools ) {
                        $s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
index 39b3e32..1e312d7 100644 (file)
  * @ingroup Actions
  */
 
+/**
+ * Displays information about a page.
+ *
+ * @ingroup Actions
+ */
 class InfoAction extends FormlessAction {
        /**
         * Returns the name of the action this object responds to.
@@ -132,9 +137,9 @@ class InfoAction extends FormlessAction {
        /**
         * Adds a row to a table that will be added to the content.
         *
-        * @param $table string The table that will be added to the content
-        * @param $name string The name of the row
-        * @param $value string The value of the row
+        * @param string $table The table that will be added to the content
+        * @param string $name The name of the row
+        * @param string $value The value of the row
         * @return string The table with the row added
         */
        protected function addRow( $table, $name, $value ) {
@@ -147,8 +152,8 @@ class InfoAction extends FormlessAction {
        /**
         * Adds a table to the content that will be added to the output.
         *
-        * @param $content string The content that will be added to the output
-        * @param $table string The table
+        * @param string $content The content that will be added to the output
+        * @param string $table The table
         * @return string The content with the table added
         */
        protected function addTable( $content, $table ) {
index ae9223f..ff6cf13 100644 (file)
  * @ingroup Actions
  */
 
+/**
+ * Mark a revision as patrolled on a page
+ *
+ * @ingroup Actions
+ */
 class MarkpatrolledAction extends FormlessAction {
 
        public function getName() {
index 1b55a3c..ec6648e 100644 (file)
  * @author Timo Tijhof
  */
 
+/**
+ * Handle page protection
+ *
+ * This is a wrapper that will call Article::protect().
+ *
+ * @ingroup Actions
+ */
 class ProtectAction extends FormlessAction {
 
        public function getName() {
@@ -41,6 +48,13 @@ class ProtectAction extends FormlessAction {
 
 }
 
+/**
+ * Handle page unprotection
+ *
+ * This is a wrapper that will call Article::unprotect().
+ *
+ * @ingroup Actions
+ */
 class UnprotectAction extends ProtectAction {
 
        public function getName() {
index 4c5171c..00bb961 100644 (file)
@@ -1,8 +1,6 @@
 <?php
 /**
- * Formats credits for articles
- *
- * Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
+ * User-requested page cache purging.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * @file
  * @ingroup Actions
- * @author <evan@wikitravel.org>
  */
 
+/**
+ * User-requested page cache purging.
+ *
+ * For users with 'purge', this will directly trigger the cache purging and
+ * for users without that right, it will show a confirmation form.
+ *
+ * @ingroup Actions
+ */
 class PurgeAction extends FormAction {
 
        private $redirectParams;
index da6ba1e..d1d457c 100644 (file)
@@ -29,6 +29,8 @@
 /**
  * A simple method to retrieve the plain source of an article,
  * using "action=raw" in the GET request string.
+ *
+ * @ingroup Actions
  */
 class RawAction extends FormlessAction {
        private $mGen;
index 23cae6a..3d244fb 100644 (file)
  * @author Timo Tijhof
  */
 
+/**
+ * Handle action=render
+ *
+ * This is a wrapper that will call Article::render().
+ *
+ * @ingroup Actions
+ */
 class RenderAction extends FormlessAction {
 
        public function getName() {
index 14da2fc..2949fa9 100644 (file)
  * @author Alexandre Emsenhuber
  */
 
+/**
+ * An action that just pass the request to Special:RevisionDelete
+ *
+ * @ingroup Actions
+ */
 class RevisiondeleteAction extends FormlessAction {
 
        public function getName() {
index af5a674..e227197 100644 (file)
  * @author Timo Tijhof
  */
 
+/**
+ * An action that views article content
+ *
+ * This is a wrapper that will call Article::render().
+ *
+ * @ingroup Actions
+ */
 class ViewAction extends FormlessAction {
 
        public function getName() {
index e263645..ae5f76c 100644 (file)
  * @ingroup Actions
  */
 
+/**
+ * Page addition to a user's watchlist
+ *
+ * @ingroup Actions
+ */
 class WatchAction extends FormAction {
 
        public function getName() {
@@ -148,6 +153,11 @@ class WatchAction extends FormAction {
        }
 }
 
+/**
+ * Page removal from a user's watchlist
+ *
+ * @ingroup Actions
+ */
 class UnwatchAction extends WatchAction {
 
        public function getName() {
index aff7a2e..9351a8d 100644 (file)
@@ -80,8 +80,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Constructor
         * @param $mainModule ApiMain object
-        * @param $moduleName string Name of this module
-        * @param $modulePrefix string Prefix to use for parameter names
+        * @param string $moduleName Name of this module
+        * @param string $modulePrefix Prefix to use for parameter names
         */
        public function __construct( $mainModule, $moduleName, $modulePrefix = '' ) {
                $this->mMainModule = $mainModule;
@@ -135,7 +135,6 @@ abstract class ApiBase extends ContextSource {
                return $this->mModuleName;
        }
 
-
        /**
         * Get the module manager, or null if this module has no sub-modules
         * @since 1.21
@@ -190,7 +189,7 @@ abstract class ApiBase extends ContextSource {
         * @return ApiResult
         */
        public function getResult() {
-               // Main module has getResult() method overriden
+               // Main module has getResult() method overridden
                // Safety - avoid infinite loop:
                if ( $this->isMain() ) {
                        ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
@@ -225,7 +224,7 @@ abstract class ApiBase extends ContextSource {
         * section to notice any changes in API. Multiple calls to this
         * function will result in the warning messages being separated by
         * newlines
-        * @param $warning string Warning message
+        * @param string $warning Warning message
         */
        public function setWarning( $warning ) {
                $result = $this->getResult();
@@ -341,8 +340,8 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * @param $prefix string Text to split output items
-        * @param $title string What is being output
+        * @param string $prefix Text to split output items
+        * @param string $title What is being output
         * @param $input string|array
         * @return string
         */
@@ -429,7 +428,7 @@ abstract class ApiBase extends ContextSource {
                                                        if ( $t === '' ) {
                                                                $nothingPrompt = 'Can be empty, or ';
                                                        } else {
-                                                               $choices[] =  $t;
+                                                               $choices[] = $t;
                                                        }
                                                }
                                                $desc .= $paramPrefix . $nothingPrompt . $prompt;
@@ -468,6 +467,9 @@ abstract class ApiBase extends ContextSource {
                                                                        $desc .= $paramPrefix . $intRangeStr;
                                                                }
                                                                break;
+                                                       case 'upload':
+                                                               $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
+                                                               break;
                                                }
                                        }
 
@@ -547,7 +549,7 @@ abstract class ApiBase extends ContextSource {
         * Get final list of parameters, after hooks have had a chance to
         * tweak it as needed.
         *
-        * @param $flags int Zero or more flags like GET_VALUES_FOR_HELP
+        * @param int $flags Zero or more flags like GET_VALUES_FOR_HELP
         * @return array|Bool False on no parameters
         * @since 1.21 $flags param added
         */
@@ -580,7 +582,7 @@ abstract class ApiBase extends ContextSource {
         * The array can also contain a boolean under the key PROP_LIST,
         * indicating whether the result is a list.
         *
-        * Don't call this functon directly: use getFinalResultProperties() to
+        * Don't call this function directly: use getFinalResultProperties() to
         * allow hooks to modify descriptions as needed.
         *
         * @return array|bool False on no properties
@@ -629,7 +631,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * This method mangles parameter name based on the prefix supplied to the constructor.
         * Override this method to change parameter name during runtime
-        * @param $paramName string Parameter name
+        * @param string $paramName Parameter name
         * @return string Prefixed parameter name
         */
        public function encodeParamName( $paramName ) {
@@ -664,8 +666,8 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Get a value for the given parameter
-        * @param $paramName string Parameter name
-        * @param $parseLimit bool see extractRequestParams()
+        * @param string $paramName Parameter name
+        * @param bool $parseLimit see extractRequestParams()
         * @return mixed Parameter value
         */
        protected function getParameter( $paramName, $parseLimit = true ) {
@@ -676,7 +678,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if none or more than one of a certain set of parameters is set and not false.
-        * @param $params array of parameter names
+        * @param array $params of parameter names
         */
        public function requireOnlyOneParameter( $params ) {
                $required = func_get_args();
@@ -744,7 +746,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * @param $params array
-        * @param $load bool|string Whether load the object's state from the database:
+        * @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
         *        - 'fromdbmaster': load from the master database
@@ -756,7 +758,7 @@ abstract class ApiBase extends ContextSource {
                $pageObj = null;
                if ( isset( $params['title'] ) ) {
                        $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj ) {
+                       if ( !$titleObj || $titleObj->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                        }
                        if ( !$titleObj->canExist() ) {
@@ -793,7 +795,7 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
+        * Callback function used in requireOnlyOneParameter to check whether required parameters are set
         *
         * @param  $x object Parameter to check is not null/false
         * @return bool
@@ -814,9 +816,9 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Return true if we're to watch the page, false if not, null if no change.
-        * @param $watchlist String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+        * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
         * @param $titleObj Title the page under consideration
-        * @param $userOption String The user option to consider when $watchlist=preferences.
+        * @param string $userOption The user option to consider when $watchlist=preferences.
         *      If not set will magically default to either watchdefault or watchcreations
         * @return bool
         */
@@ -836,13 +838,13 @@ abstract class ApiBase extends ContextSource {
                                if ( $userWatching ) {
                                        return true;
                                }
-                               # If no user option was passed, use watchdefault or watchcreation
+                               # If no user option was passed, use watchdefault or watchcreations
                                if ( is_null( $userOption ) ) {
                                        $userOption = $titleObj->exists()
                                                        ? 'watchdefault' : 'watchcreations';
                                }
                                # Watch the article based on the user preference
-                               return (bool)$this->getUser()->getOption( $userOption );
+                               return $this->getUser()->getBoolOption( $userOption );
 
                        case 'nochange':
                                return $userWatching;
@@ -854,9 +856,9 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Set a watch (or unwatch) based the based on a watchlist parameter.
-        * @param $watch String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+        * @param string $watch Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
         * @param $titleObj Title the article's title to change
-        * @param $userOption String The user option to consider when $watch=preferences
+        * @param string $userOption The user option to consider when $watch=preferences
         */
        protected function setWatch( $watch, $titleObj, $userOption = null ) {
                $value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
@@ -875,8 +877,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Using the settings determine the value for the given parameter
         *
-        * @param $paramName String: parameter name
-        * @param $paramSettings array|mixed 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?
         * @return mixed Parameter value
@@ -917,6 +919,29 @@ abstract class ApiBase extends ContextSource {
                        }
 
                        $value = $this->getMain()->getCheck( $encParamName );
+               } elseif ( $type == 'upload' ) {
+                       if ( isset( $default ) ) {
+                               // Having a default value is not allowed
+                               ApiBase::dieDebug( __METHOD__, "File upload param $encParamName's default is set to '$default'. File upload parameters may not have a default." );
+                       }
+                       if ( $multi ) {
+                               ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
+                       }
+                       $value = $this->getMain()->getUpload( $encParamName );
+                       if ( !$value->exists() ) {
+                               // This will get the value without trying to normalize it
+                               // (because trying to normalize a large binary file
+                               // accidentally uploaded as a field fails spectacularly)
+                               $value = $this->getMain()->getRequest()->unsetVal( $encParamName );
+                               if ( $value !== null ) {
+                                       $this->dieUsage(
+                                               "File upload param $encParamName is not a file upload; " .
+                                               "be sure to use multipart/form-data for your POST and include " .
+                                               "a filename in the Content-Disposition header.",
+                                               "badupload_{$encParamName}"
+                                       );
+                               }
+                       }
                } else {
                        $value = $this->getMain()->getVal( $encParamName, $default );
 
@@ -940,7 +965,6 @@ abstract class ApiBase extends ContextSource {
                                                if ( $required && $value === '' ) {
                                                        $this->dieUsageMsg( array( 'missingparam', $paramName ) );
                                                }
-
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
                                                $min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
@@ -997,29 +1021,23 @@ abstract class ApiBase extends ContextSource {
                                                }
                                                break;
                                        case 'user':
-                                               if ( !is_array( $value ) ) {
-                                                       $value = array( $value );
-                                               }
-
-                                               foreach ( $value as $key => $val ) {
-                                                       $title = Title::makeTitleSafe( NS_USER, $val );
-                                                       if ( is_null( $title ) ) {
-                                                               $this->dieUsage( "Invalid value for user parameter $encParamName", "baduser_{$encParamName}" );
+                                               if ( is_array( $value ) ) {
+                                                       foreach ( $value as $key => $val ) {
+                                                               $value[$key] = $this->validateUser( $val, $encParamName );
                                                        }
-                                                       $value[$key] = $title->getText();
-                                               }
-
-                                               if ( !$multi ) {
-                                                       $value = $value[0];
+                                               } else {
+                                                       $value = $this->validateUser( $value, $encParamName );
                                                }
                                                break;
+                                       case 'upload': // nothing to do
+                                               break;
                                        default:
                                                ApiBase::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" );
                                }
                        }
 
                        // Throw out duplicates if requested
-                       if ( is_array( $value ) && !$dupes ) {
+                       if ( !$dupes && is_array( $value ) ) {
                                $value = array_unique( $value );
                        }
 
@@ -1038,10 +1056,10 @@ abstract class ApiBase extends ContextSource {
         * Return an array of values that were given in a 'a|b|c' notation,
         * after it optionally validates them against the list allowed values.
         *
-        * @param $valueName string The name of the parameter (for error
+        * @param string $valueName The name of the parameter (for error
         *  reporting)
         * @param $value mixed The value being parsed
-        * @param $allowMultiple bool Can $value contain more than one value
+        * @param bool $allowMultiple Can $value contain more than one value
         *  separated by '|'?
         * @param $allowedValues mixed An array of values to check against. If
         *  null, all values are accepted.
@@ -1093,11 +1111,11 @@ abstract class ApiBase extends ContextSource {
        /**
         * Validate the value against the minimum and user/bot maximum limits.
         * Prints usage info on failure.
-        * @param $paramName string Parameter name
-        * @param $value int Parameter value
-        * @param $min int|null Minimum value
-        * @param $max int|null Maximum value for users
-        * @param $botMax int Maximum value for sysops/bots
+        * @param string $paramName Parameter name
+        * @param int $value Parameter value
+        * @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
         */
        function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
@@ -1131,18 +1149,33 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * @param $value string
-        * @param $paramName string
-        * @return string
+        * Validate and normalize of parameters of type 'timestamp'
+        * @param string $value Parameter value
+        * @param string $encParamName Parameter name
+        * @return string Validated and normalized parameter
         */
-       function validateTimestamp( $value, $paramName ) {
+       function validateTimestamp( $value, $encParamName ) {
                $unixTimestamp = wfTimestamp( TS_UNIX, $value );
                if ( $unixTimestamp === false ) {
-                       $this->dieUsage( "Invalid value '$value' for timestamp parameter $paramName", "badtimestamp_{$paramName}" );
+                       $this->dieUsage( "Invalid value '$value' for timestamp parameter $encParamName", "badtimestamp_{$encParamName}" );
                }
                return wfTimestamp( TS_MW, $unixTimestamp );
        }
 
+       /**
+        * Validate and normalize of parameters of type 'user'
+        * @param string $value Parameter value
+        * @param string $encParamName Parameter value
+        * @return string Validated and normalized parameter
+        */
+       private function validateUser( $value, $encParamName ) {
+               $title = Title::makeTitleSafe( NS_USER, $value );
+               if ( $title === null ) {
+                       $this->dieUsage( "Invalid value '$value' for user parameter $encParamName", "baduser_{$encParamName}" );
+               }
+               return $title->getText();
+       }
+
        /**
         * Adds a warning to the output, else dies
         *
@@ -1159,8 +1192,8 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Truncate an array to a certain length.
-        * @param $arr array Array to truncate
-        * @param $limit int Maximum length
+        * @param array $arr Array to truncate
+        * @param int $limit Maximum length
         * @return bool True if the array was truncated, false otherwise
         */
        public static function truncateArray( &$arr, $limit ) {
@@ -1176,12 +1209,12 @@ abstract class ApiBase extends ContextSource {
         * Throw a UsageException, which will (if uncaught) call the main module's
         * error handler and die with an error message.
         *
-        * @param $description string One-line human-readable description of the
+        * @param string $description One-line human-readable description of the
         *   error condition, e.g., "The API requires a valid action parameter"
-        * @param $errorCode string Brief, arbitrary, stable string to allow easy
+        * @param string $errorCode Brief, arbitrary, stable string to allow easy
         *   automated identification of the error, e.g., 'unknown_action'
-        * @param $httpRespCode int HTTP response code
-        * @param $extradata array Data to add to the "<error>" element; array in ApiResult format
+        * @param int $httpRespCode HTTP response code
+        * @param array $extradata Data to add to the "<error>" element; array in ApiResult format
         * @throws UsageException
         */
        public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
@@ -1213,7 +1246,7 @@ abstract class ApiBase extends ContextSource {
                'nocreatetext' => array( 'code' => 'cantcreate-anon', 'info' => "Anonymous users can't create new pages" ),
                'movenologintext' => array( 'code' => 'cantmove-anon', 'info' => "Anonymous users can't move pages" ),
                'movenotallowed' => array( 'code' => 'cantmove', 'info' => "You don't have permission to move pages" ),
-               'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your e-mail address before you can edit" ),
+               'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your email address before you can edit" ),
                'blockedtext' => array( 'code' => 'blocked', 'info' => "You have been blocked from editing" ),
                'autoblockedtext' => array( 'code' => 'autoblocked', 'info' => "Your IP address has been blocked automatically, because it was used by a blocked user" ),
 
@@ -1241,15 +1274,15 @@ abstract class ApiBase extends ContextSource {
                'badipaddress' => array( 'code' => 'invalidip', 'info' => "Invalid IP address specified" ),
                'ipb_expiry_invalid' => array( 'code' => 'invalidexpiry', 'info' => "Invalid expiry time" ),
                'ipb_already_blocked' => array( 'code' => 'alreadyblocked', 'info' => "The user you tried to block was already blocked" ),
-               'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP invidually, but you can unblock the range as a whole." ),
+               'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP individually, but you can unblock the range as a whole." ),
                'ipb_cant_unblock' => array( 'code' => 'cantunblock', 'info' => "The block you specified was not found. It may have been unblocked already" ),
-               'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed e-mail address, or you are not allowed to send e-mail to other users, so you cannot send e-mail" ),
+               'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email" ),
                'ipbblocked' => array( 'code' => 'ipbblocked', 'info' => 'You cannot block or unblock users while you are yourself blocked' ),
                'ipbnounblockself' => array( 'code' => 'ipbnounblockself', 'info' => 'You are not allowed to unblock yourself' ),
                'usermaildisabled' => array( 'code' => 'usermaildisabled', 'info' => "User email has been disabled" ),
-               'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending e-mail" ),
+               'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending email" ),
                'notarget' => array( 'code' => 'notarget', 'info' => "You have not specified a valid target for this action" ),
-               'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid e-mail address, or has chosen not to receive e-mail from other users" ),
+               'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid email address, or has chosen not to receive email from other users" ),
                'rcpatroldisabled' => array( 'code' => 'patroldisabled', 'info' => "Patrolling is disabled on this wiki" ),
                'markedaspatrollederror-noautopatrol' => array( 'code' => 'noautopatrol', 'info' => "You don't have permission to patrol your own changes" ),
                'delete-toobig' => array( 'code' => 'bigdelete', 'info' => "You can't delete this page because it has more than \$1 revisions" ),
@@ -1278,7 +1311,7 @@ abstract class ApiBase extends ContextSource {
                'missingtitle-createonly' => array( 'code' => 'missingtitle-createonly', 'info' => "Missing titles can only be protected with 'create'" ),
                'cantblock' => array( 'code' => 'cantblock', 'info' => "You don't have permission to block users" ),
                'canthide' => array( 'code' => 'canthide', 'info' => "You don't have permission to hide user names from the block log" ),
-               'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending e-mail through the wiki" ),
+               'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending email through the wiki" ),
                'unblock-notarget' => array( 'code' => 'notarget', 'info' => "Either the id or the user parameter must be set" ),
                'unblock-idanduser' => array( 'code' => 'idanduser', 'info' => "The id and user parameters can't be used together" ),
                'cantunblock' => array( 'code' => 'permissiondenied', 'info' => "You don't have permission to unblock users" ),
@@ -1391,9 +1424,22 @@ 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
+        * @since 1.21
+        */
+       protected function dieContinueUsageIf( $condition ) {
+               if ( $condition ) {
+                       $this->dieUsage(
+                               'Invalid continue param. You should pass the original value returned by the previous query',
+                               'badcontinue' );
+               }
+       }
+
        /**
         * Return the error message related to a certain array
-        * @param $error array Element of a getUserPermissionsErrors()-style array
+        * @param array $error Element of a getUserPermissionsErrors()-style array
         * @return array('code' => code, 'info' => info)
         */
        public function parseMsg( $error ) {
@@ -1420,8 +1466,8 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Internal code errors should be reported with this method
-        * @param $method string Method or function name
-        * @param $message string Error message
+        * @param string $method Method or function name
+        * @param string $message Error message
         */
        protected static function dieDebug( $method, $message ) {
                wfDebugDieBacktrace( "Internal error in $method: $message" );
@@ -1522,10 +1568,17 @@ abstract class ApiBase extends ContextSource {
                $params = $this->getFinalParams();
                if ( $params ) {
                        foreach ( $params as $paramName => $paramSettings ) {
-                               if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) ) {
+                               if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) && $paramSettings[ApiBase::PARAM_REQUIRED] ) {
                                        $ret[] = array( 'missingparam', $paramName );
                                }
                        }
+                       if ( array_key_exists( 'continue', $params ) ) {
+                               $ret[] = array(
+                                       array(
+                                               'code' => 'badcontinue',
+                                               'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+                                       ) );
+                       }
                }
 
                if ( $this->mustBePosted() ) {
@@ -1551,7 +1604,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Parses a list of errors into a standardised format
-        * @param $errors array List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
+        * @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
         * @return array Parsed list of errors with items in the form array( 'code' => ..., 'info' => ... )
         */
        public function parseErrors( $errors ) {
@@ -1688,8 +1741,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Debugging function that prints a value and an optional backtrace
         * @param $value mixed Value to print
-        * @param $name string Description of the printed value
-        * @param $backtrace bool If true, print a backtrace
+        * @param string $name Description of the printed value
+        * @param bool $backtrace If true, print a backtrace
         */
        public static function debugPrint( $value, $name = 'unknown', $backtrace = false ) {
                print "\n\n<pre><b>Debugging value '$name':</b>\n\n";
index 2e4155a..90432b9 100644 (file)
@@ -25,9 +25,9 @@
  */
 
 /**
-* API module that facilitates the blocking of users. Requires API write mode
-* to be enabled.
-*
+ * API module that facilitates the blocking of users. Requires API write mode
+ * to be enabled.
+ *
  * @ingroup API
  */
 class ApiBlock extends ApiBase {
@@ -183,7 +183,7 @@ class ApiBlock extends ApiBase {
                        'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)',
                        'nocreate' => 'Prevent account creation',
                        'autoblock' => 'Automatically block the last used IP address, and any subsequent IP addresses they try to login from',
-                       'noemail' => 'Prevent user from sending e-mail through the wiki. (Requires the "blockemail" right.)',
+                       'noemail' => 'Prevent user from sending email through the wiki. (Requires the "blockemail" right.)',
                        'hidename' => 'Hide the username from the block log. (Requires the "hideuser" right.)',
                        'allowusertalk' => 'Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit)',
                        'reblock' => 'If the user is already blocked, overwrite the existing block',
index 6b894c1..79ffcb0 100644 (file)
@@ -85,7 +85,7 @@ class ApiComparePages extends ApiBase {
                        return $revision;
                } elseif( $titleText ) {
                        $title = Title::newFromText( $titleText );
-                       if( !$title ) {
+                       if( !$title || $title->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
                        }
                        return $title->getLatestRevID();
index b6c6210..55c60cc 100644 (file)
  */
 class ApiCreateAccount extends ApiBase {
        public function execute() {
+
+               // $loginForm->addNewaccountInternal will throw exceptions
+               // if wiki is read only (already handled by api), user is blocked or does not have rights.
+               // Use userCan in order to hit GlobalBlock checks (according to Special:userlogin)
+               $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
+               if ( !$loginTitle->userCan( 'createaccount', $this->getUser() ) ) {
+                       $this->dieUsage( 'You do not have the right to create a new account', 'permdenied-createaccount' );
+               }
+               if ( $this->getUser()->isBlockedFromCreateAccount() ) {
+                       $this->dieUsage( 'You cannot create a new account because you are blocked', 'blocked' );
+               }
+
                $params = $this->extractRequestParams();
 
                $result = array();
@@ -108,8 +120,10 @@ class ApiCreateAccount extends ApiBase {
 
                $apiResult = $this->getResult();
 
-               if( $status->hasMessage( 'sessionfailure' ) ) {
-                       // Token was incorrect, so add it to result, but don't throw an exception.
+               if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+                       // Token was incorrect, so add it to result, but don't throw an exception
+                       // since not having the correct token is part of the normal
+                       // flow of events.
                        $result['token'] = LoginForm::getCreateaccountToken();
                        $result['result'] = 'needtoken';
                } elseif( !$status->isOK() ) {
@@ -193,9 +207,9 @@ class ApiCreateAccount extends ApiBase {
                        'password' => "Password (ignored if {$p}mailpassword is set)",
                        'domain' => 'Domain for external authentication (optional)',
                        'token' => 'Account creation token obtained in first request',
-                       'email' => 'E-mail address of user (optional)',
+                       'email' => 'Email address of user (optional)',
                        'realname' => 'Real name of user (optional)',
-                       'mailpassword' => 'If set to any value, a random password will be e-mailed to the user',
+                       'mailpassword' => 'If set to any value, a random password will be emailed to the user',
                        'reason' => 'Optional reason for creating the account to be put in the logs',
                        'language' => 'Language code to set as default for the user (optional, defaults to content language)'
                );
@@ -228,17 +242,19 @@ class ApiCreateAccount extends ApiBase {
        }
 
        public function getPossibleErrors() {
+               // Note the following errors aren't possible and don't need to be listed:
+               // sessionfailure, nocookiesfornew, badretype
                $localErrors = array(
-                       'wrongpassword',
-                       'sessionfailure',
+                       'wrongpassword', // Actually caused by wrong domain field. Riddle me that...
                        'sorbs_create_account_reason',
                        'noname',
                        'userexists',
-                       'password-name-match',
-                       'password-login-forbidden',
+                       'password-name-match', // from User::getPasswordValidity
+                       'password-login-forbidden', // from User::getPasswordValidity
                        'noemailtitle',
                        'invalidemailaddress',
-                       'externaldberror'
+                       'externaldberror',
+                       'acct_creation_throttle_hit',
                );
 
                $errors = parent::getPossibleErrors();
@@ -247,6 +263,19 @@ class ApiCreateAccount extends ApiBase {
                        $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
                }
 
+               $errors[] = array(
+                       'code' => 'permdenied-createaccount',
+                       'info' => 'You do not have the right to create a new account'
+               );
+               $errors[] = array(
+                       'code' => 'blocked',
+                       'info' => 'You cannot create a new account because you are blocked'
+               );
+               $errors[] = array(
+                       'code' => 'aborted',
+                       'info' => 'Account creation aborted by hook (info may vary)'
+               );
+
                // 'passwordtooshort' has parameters. :(
                global $wgMinimalPasswordLength;
                $errors[] = array(
index 422524d..d1f0806 100644 (file)
@@ -99,8 +99,8 @@ class ApiDelete extends ApiBase {
         *
         * @param $page Page|WikiPage object to work on
         * @param $user User doing the action
-        * @param $token String delete token (same as edit token)
-        * @param $reason String|null reason for the deletion. Autogenerated if NULL
+        * @param string $token delete token (same as edit token)
+        * @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 b642c6d..4916145 100644 (file)
@@ -46,10 +46,6 @@ class ApiEditPage extends ApiBase {
 
                $pageObj = $this->getTitleOrPageId( $params );
                $titleObj = $pageObj->getTitle();
-               if ( $titleObj->isExternal() ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-               }
-
                $apiResult = $this->getResult();
 
                if ( $params['redirect'] ) {
@@ -62,6 +58,8 @@ class ApiEditPage extends ApiBase {
                                // array_shift( $titles );
 
                                $redirValues = array();
+
+                               /** @var $newTitle Title */
                                foreach ( $titles as $id => $newTitle ) {
 
                                        if ( !isset( $titles[$id - 1] ) ) {
@@ -261,7 +259,7 @@ class ApiEditPage extends ApiBase {
                if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
                        $requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
                } else {
-                       $requestArray['wpStarttime'] = wfTimestampNow();        // Fake wpStartime
+                       $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
                }
 
                if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) )       {
@@ -308,6 +306,7 @@ class ApiEditPage extends ApiBase {
                $articleContext->setWikiPage( $pageObj );
                $articleContext->setUser( $this->getUser() );
 
+               /** @var $articleObject Article */
                $articleObject = Article::newFromWikiPage( $pageObj, $articleContext );
 
                $ep = new EditPage( $articleObject );
@@ -397,6 +396,7 @@ class ApiEditPage extends ApiBase {
 
                        case EditPage::AS_SUCCESS_NEW_ARTICLE:
                                $r['new'] = '';
+                               // fall-through
 
                        case EditPage::AS_SUCCESS_UPDATE:
                                $r['result'] = 'Success';
@@ -496,7 +496,6 @@ class ApiEditPage extends ApiBase {
                        'section' => null,
                        'sectiontitle' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => false,
                        ),
                        'text' => null,
                        'token' => array(
@@ -636,10 +635,8 @@ class ApiEditPage extends ApiBase {
 
        public function getExamples() {
                return array(
-
                        'api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\'
                                => 'Edit a page (anonymous user)',
-
                        'api.php?action=edit&title=Test&summary=NOTOC&minor=&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\'
                                => 'Prepend __NOTOC__ to a page (anonymous user)',
                        'api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\'
index 5a5c572..cd0d0cb 100644 (file)
@@ -154,6 +154,6 @@ class ApiEmailUser extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:E-mail';
+               return 'https://www.mediawiki.org/wiki/API:Email';
        }
 }
index 826171b..f5898fb 100644 (file)
@@ -42,7 +42,7 @@ class ApiExpandTemplates extends ApiBase {
 
                // Create title for parser
                $title_obj = Title::newFromText( $params['title'] );
-               if ( !$title_obj ) {
+               if ( !$title_obj || $title_obj->isExternal() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
index a3b4682..6c793b3 100644 (file)
@@ -61,9 +61,6 @@ class ApiFeedWatchlist extends ApiBase {
                        if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
                                $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                        }
-                       if ( !is_null( $params['wlexcludeuser'] ) ) {
-                               $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
-                       }
 
                        // limit to the number of hours going from now back
                        $endTime = wfTimestamp( TS_MW, time() - intval( $params['hours'] * 60 * 60 ) );
@@ -80,12 +77,15 @@ class ApiFeedWatchlist extends ApiBase {
                                'wllimit' => ( 50 > $wgFeedLimit ) ? $wgFeedLimit : 50
                        );
 
-                       if ( !is_null( $params['wlowner'] ) ) {
+                       if ( $params['wlowner'] !== null ) {
                                $fauxReqArr['wlowner'] = $params['wlowner'];
                        }
-                       if ( !is_null( $params['wltoken'] ) ) {
+                       if ( $params['wltoken'] !== null ) {
                                $fauxReqArr['wltoken'] = $params['wltoken'];
                        }
+                       if ( $params['wlexcludeuser'] !== null ) {
+                               $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
+                       }
 
                        // Support linking to diffs instead of article
                        if ( $params['linktodiffs'] ) {
index a24953a..d8aa163 100644 (file)
@@ -38,7 +38,7 @@ abstract class ApiFormatBase extends ApiBase {
         * Constructor
         * If $format ends with 'fm', pretty-print the output in HTML.
         * @param $main ApiMain
-        * @param $format string Format name
+        * @param string $format Format name
         */
        public function __construct( $main, $format ) {
                parent::__construct( $main, $format );
@@ -83,7 +83,7 @@ abstract class ApiFormatBase extends ApiBase {
         * special-case fix that should be removed once the help has been
         * reworked to use a fully HTML interface.
         *
-        * @param $b bool Whether or not ampersands should be escaped.
+        * @param bool $b Whether or not ampersands should be escaped.
         */
        public function setUnescapeAmps ( $b ) {
                $this->mUnescapeAmps = $b;
@@ -127,7 +127,7 @@ abstract class ApiFormatBase extends ApiBase {
         * A human-targeted notice about available formats is printed for the HTML-based output,
         * except for help screens (caused by either an error in the API parameters,
         * the calling of action=help, or requesting the root script api.php).
-        * @param $isHelpScreen bool Whether a help screen is going to be shown
+        * @param bool $isHelpScreen Whether a help screen is going to be shown
         */
        function initPrinter( $isHelpScreen ) {
                if ( $this->mDisabled ) {
@@ -326,7 +326,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
         * Call this method to initialize output data. See execute()
         * @param $result ApiResult
         * @param $feed object an instance of one of the $wgFeedClasses classes
-        * @param $feedItems array of FeedItem objects
+        * @param array $feedItems of FeedItem objects
         */
        public static function setResult( $result, $feed, $feedItems ) {
                // Store output in the Result data.
index 19c5e5f..abb6348 100644 (file)
@@ -85,7 +85,7 @@ class ApiFormatJson extends ApiFormatBase {
 
        public function getDescription() {
                if ( $this->mIsRaw ) {
-                       return 'Output data with the debuging elements in JSON format' . parent::getDescription();
+                       return 'Output data with the debugging elements in JSON format' . parent::getDescription();
                } else {
                        return 'Output data in JSON format' . parent::getDescription();
                }
diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php
new file mode 100644 (file)
index 0000000..f9c8058
--- /dev/null
@@ -0,0 +1,216 @@
+<?php
+/**
+ *
+ * Created on January 3rd, 2013
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class ApiImageRotate extends ApiBase {
+
+       private $mPageSet = null;
+
+       public function __construct( $main, $action ) {
+               parent::__construct( $main, $action );
+       }
+
+       /**
+        * 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
+        */
+       private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+               foreach ( $values as $val ) {
+                       if( $val instanceof Title ) {
+                               $v = array();
+                               ApiQueryBase::addTitleInfo( $v, $val );
+                       } elseif( $name !== null ) {
+                               $v = array( $name => $val );
+                       } else {
+                               $v = $val;
+                       }
+                       if( $flag !== null ) {
+                               $v[$flag] = '';
+                       }
+                       $result[] = $v;
+               }
+       }
+
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+               $rotation = $params[ 'rotation' ];
+               $user = $this->getUser();
+
+               if( is_null( $rotation ) || $rotation % 90 ) {
+                       $this->dieUsage( "Rotation: {$rotation}", 'rotation must be multiple of 90 degrees' );
+               }
+
+               $pageSet = $this->getPageSet();
+               $pageSet->execute();
+
+               $result = array();
+               $result = array();
+
+               self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
+               self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
+               self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
+               self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
+               self::addValues( $result, $pageSet->getMissingTitles(), 'missing' );
+               self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+
+               foreach ( $pageSet->getTitles() as $title ) {
+                       $file = wfFindFile( $title );
+
+                       $r = array();
+                       $r[ 'title' ] = $title->getFullText();
+                       if ( !$file ) {
+                               $r['missing'] = '';
+                               $r['result'] = 'Failure';
+                               $result[] = $r;
+                               continue;
+                       }
+                       $handler = $file->getHandler();
+                       if ( !$handler || !$handler->canRotate() ) {
+                               $r['invalid'] = '';
+                               $r['result'] = 'Failure';
+                               $result[] = $r;
+                               continue;
+                       }
+
+                       // Check whether we're allowed to rotate this file
+                       $this->checkPermissions( $this->getUser(), $file->getTitle() );
+
+                       $srcPath = $file->getLocalRefPath();
+                       $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
+                       $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+                       $dstPath = $tmpFile->getPath();
+                       $err = $handler->rotate( $file, array(
+                               "srcPath" => $srcPath,
+                               "dstPath" => $dstPath,
+                               "rotation"=> $rotation
+                       ) );
+                       if ( !$err ) {
+                               $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+                               $status = $file->upload( $dstPath,
+                                       $comment, $comment, 0, false, false, $this->getUser() );
+                               if ( $status->isGood() ) {
+                                       $r['result'] = 'Success';
+                               } else {
+                                       $r['result'] = 'Failure';
+                                       $r['errormessage'] = $this->getResult()->convertStatusToArray( $status );
+                               }
+                       } else {
+                               $r['result'] = 'Failure';
+                               $r['errormessage'] = $err->toText();
+                       }
+                       $result[] = $r;
+               }
+               $apiResult = $this->getResult();
+               $apiResult->setIndexedTagName( $result, 'page' );
+               $apiResult->addValue( null, $this->getModuleName(), $result );
+       }
+
+       /**
+        * Get a cached instance of an ApiPageSet object
+        * @return ApiPageSet
+        */
+       private function getPageSet() {
+               if ( $this->mPageSet === null ) {
+                       $this->mPageSet = new ApiPageSet( $this, 0, NS_FILE );
+               }
+               return $this->mPageSet;
+       }
+
+       /**
+        * Checks that the user has permissions to perform rotations.
+        * Dies with usage message on inadequate permissions.
+        * @param $user User The user to check.
+        */
+       protected function checkPermissions( $user, $title ) {
+               $permissionErrors = array_merge(
+                       $title->getUserPermissionsErrors( 'edit' , $user ),
+                       $title->getUserPermissionsErrors( 'upload' , $user )
+               );
+
+               if ( $permissionErrors ) {
+                       $this->dieUsageMsg( $permissionErrors[0] );
+               }
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams( $flags = 0 ) {
+               $pageSet = $this->getPageSet();
+               $result = array(
+                       'rotation' => array(
+                               ApiBase::PARAM_DFLT => 0,
+                       ),
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+               );
+               if ( $flags ) {
+                       $result += $this->getPageSet()->getFinalParams( $flags );
+               }
+               return $result;
+       }
+
+       public function getParamDescription() {
+               $pageSet = $this->getPageSet();
+               return $pageSet->getParamDescription() + array(
+                       'rotation' => 'Degrees to rotate image, values can be 0, 90, 180 or 270',
+                       'token' => 'Edit token. You can get one of these through prop=info',
+               );
+       }
+
+       public function getDescription() {
+               return 'Rotate one or more images';
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function getPossibleErrors() {
+               $pageSet = $this->getPageSet();
+               return array_merge(
+                       parent::getPossibleErrors(),
+                       $pageSet->getPossibleErrors()
+               );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=+\\',
+               );
+       }
+}
index 408805e..1f0a5fa 100644 (file)
@@ -105,7 +105,9 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'summary' => null,
-                       'xml' => null,
+                       'xml' => array(
+                               ApiBase::PARAM_TYPE => 'upload',
+                       ),
                        'interwikisource' => array(
                                ApiBase::PARAM_TYPE => $wgImportSources
                        ),
index 3df952f..b936d3b 100644 (file)
@@ -38,7 +38,7 @@ class ApiLogin extends ApiBase {
 
        /**
         * Executes the log-in attempt using the parameters passed. If
-        * the log-in succeeeds, it attaches a cookie to the session
+        * the log-in succeeds, it attaches a cookie to the session
         * and outputs the user id, username, and session token. If a
         * log-in fails, as the result of a bad password, a nonexistent
         * user, or any other reason, the host is cached with an expiry
@@ -147,7 +147,7 @@ class ApiLogin extends ApiBase {
 
                        case LoginForm::ABORTED:
                                $result['result'] = 'Aborted';
-                               $result['reason'] =  $loginForm->mAbortLoginErrorMsg;
+                               $result['reason'] = $loginForm->mAbortLoginErrorMsg;
                                break;
 
                        default:
index c3ae8b1..80bca2f 100644 (file)
@@ -83,6 +83,7 @@ class ApiMain extends ApiBase {
                'import' => 'ApiImport',
                'userrights' => 'ApiUserrights',
                'options' => 'ApiOptions',
+               'imagerotate' =>'ApiImageRotate',
        );
 
        /**
@@ -144,7 +145,7 @@ 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 FauxRequest, errors are thrown and no printing occurs
-        * @param $enableWrite bool 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 ) {
@@ -244,7 +245,7 @@ class ApiMain extends ApiBase {
        /**
         * Set the type of caching headers which will be sent.
         *
-        * @param $mode String One of:
+        * @param string $mode One of:
         *    - 'public':     Cache this object in public caches, if the maxage or smaxage
         *         parameter is set, or if setCacheMaxAge() was called. If a maximum age is
         *         not provided by any of these means, the object will be private.
@@ -273,7 +274,7 @@ class ApiMain extends ApiBase {
                        return;
                }
 
-               if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
+               if ( !User::groupHasPermission( '*', 'read' ) ) {
                        // Private wiki, only private headers
                        if ( $mode !== 'private' ) {
                                wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
@@ -364,6 +365,12 @@ class ApiMain extends ApiBase {
                        return;
                }
 
+               // Exit here if the request method was OPTIONS
+               // (assume there will be a followup GET or POST)
+               if ( $this->getRequest()->getMethod() === 'OPTIONS' ) {
+                       return;
+               }
+
                // In case an error occurs during data output,
                // clear the output buffer and print just the error information
                ob_start();
@@ -473,9 +480,9 @@ class ApiMain extends ApiBase {
 
        /**
         * Attempt to match an Origin header against a set of rules and a set of exceptions
-        * @param $value string Origin header
-        * @param $rules array Set of wildcard rules
-        * @param $exceptions array Set of wildcard rules
+        * @param string $value Origin header
+        * @param array $rules Set of wildcard rules
+        * @param array $exceptions Set of wildcard rules
         * @return bool True if $value matches a rule in $rules and doesn't match any rules in $exceptions, false otherwise
         */
        protected static function matchOrigin( $value, $rules, $exceptions ) {
@@ -498,7 +505,7 @@ class ApiMain extends ApiBase {
         * '*' => '.*?'
         * '?' => '.'
         *
-        * @param $wildcard string String with wildcards
+        * @param string $wildcard String with wildcards
         * @return string Regular expression
         */
        protected static function wildcardToRegex( $wildcard ) {
@@ -730,7 +737,7 @@ class ApiMain extends ApiBase {
        /**
         * Check the max lag if necessary
         * @param $module ApiBase object: Api module being used
-        * @param $params Array an array containing the request parameters.
+        * @param array $params an array containing the request parameters.
         * @return boolean True on success, false should exit immediately
         */
        protected function checkMaxLag( $module, $params ) {
@@ -762,7 +769,7 @@ class ApiMain extends ApiBase {
         */
        protected function checkExecutePermissions( $module ) {
                $user = $this->getUser();
-               if ( $module->isReadMode() && !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) &&
+               if ( $module->isReadMode() && !User::groupHasPermission( '*', 'read' ) &&
                        !$user->isAllowed( 'read' ) )
                {
                        $this->dieUsageMsg( 'readrequired' );
@@ -789,7 +796,7 @@ class ApiMain extends ApiBase {
        /**
         * Check POST for external response and setup result printer
         * @param $module ApiBase An Api module
-        * @param $params Array an array with the request parameters
+        * @param array $params an array with the request parameters
         */
        protected function setupExternalResponse( $module, $params ) {
                if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
@@ -834,10 +841,9 @@ class ApiMain extends ApiBase {
                wfRunHooks( 'APIAfterExecute', array( &$module ) );
                $module->profileOut();
 
-               if ( !$this->mInternalMode ) {
-                       // Report unused params
-                       $this->reportUnusedParams();
+               $this->reportUnusedParams();
 
+               if ( !$this->mInternalMode ) {
                        //append Debug information
                        MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
 
@@ -913,6 +919,18 @@ class ApiMain extends ApiBase {
                return $this->getRequest()->getCheck( $name );
        }
 
+       /**
+        * Get a request upload, and register the fact that it was used, for logging.
+        *
+        * @since 1.21
+        * @param string $name Parameter name
+        * @return WebRequestUpload
+        */
+       public function getUpload( $name ) {
+               $this->mParamsUsed[$name] = true;
+               return $this->getRequest()->getUpload( $name );
+       }
+
        /**
         * Report unused parameters, so the client gets a hint in case it gave us parameters we don't know,
         * for example in case of spelling mistakes or a missing 'g' prefix for generators.
@@ -921,13 +939,17 @@ class ApiMain extends ApiBase {
                $paramsUsed = $this->getParamsUsed();
                $allParams = $this->getRequest()->getValueNames();
 
-               // Printer has not yet executed; don't warn that its parameters are unused
-               $printerParams = array_map(
-                       array( $this->mPrinter, 'encodeParamName' ),
-                       array_keys( $this->mPrinter->getFinalParams() ?: array() )
-               );
+               if ( !$this->mInternalMode ) {
+                       // Printer has not yet executed; don't warn that its parameters are unused
+                       $printerParams = array_map(
+                               array( $this->mPrinter, 'encodeParamName' ),
+                               array_keys( $this->mPrinter->getFinalParams() ?: array() )
+                       );
+                       $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
+               } else {
+                       $unusedParams = array_diff( $allParams, $paramsUsed );
+               }
 
-               $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
                if( count( $unusedParams ) ) {
                        $s = count( $unusedParams ) > 1 ? 's' : '';
                        $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
@@ -1097,11 +1119,11 @@ class ApiMain extends ApiBase {
        protected function getCredits() {
                return array(
                        'API developers:',
-                       '    Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-present)',
+                       '    Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
                        '    Victor Vasiliev - vasilvv at gee mail dot com',
                        '    Bryan Tong Minh - bryan . tongminh @ gmail . com',
                        '    Sam Reed - sam @ reedyboy . net',
-                       '    Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012)',
+                       '    Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
                        '',
                        'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
                        'or file a bug report at https://bugzilla.wikimedia.org/'
@@ -1189,7 +1211,7 @@ class ApiMain extends ApiBase {
 
        /**
         * @param $module ApiBase
-        * @param $paramName String What type of request is this? e.g. action, query, list, prop, meta, format
+        * @param string $paramName What type of request is this? e.g. action, query, list, prop, meta, format
         * @return string
         */
        public static function makeHelpMsgHeader( $module, $paramName ) {
@@ -1239,7 +1261,7 @@ class ApiMain extends ApiBase {
         * behavior of inherent ones.
         *
         * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
-        * @param $name string The identifier for this module.
+        * @param string $name The identifier for this module.
         * @param $class ApiBase The class where this module is implemented.
         */
        protected function addModule( $name, $class ) {
@@ -1251,11 +1273,11 @@ class ApiMain extends ApiBase {
         * classes who wish to add to or modify current formatters.
         *
         * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
-        * @param $name string The identifier for this format.
+        * @param string $name The identifier for this format.
         * @param $class ApiFormatBase The class implementing this format.
         */
        protected function addFormat( $name, $class ) {
-               $this->getModuleManager->addModule( $name, 'format', $class );
+               $this->getModuleManager()->addModule( $name, 'format', $class );
        }
 
        /**
index db1d36d..100392b 100644 (file)
@@ -62,9 +62,9 @@ class ApiModuleManager extends ContextSource {
         * classes who wish to add their own modules to their lexicon or override the
         * behavior of inherent ones.
         *
-        * @param $group string Name of the module group
-        * @param $name string The identifier for this module.
-        * @param $class string The class where this module is implemented.
+        * @param string $group Name of the module group
+        * @param string $name The identifier for this module.
+        * @param string $class The class where this module is implemented.
         */
        public function addModule( $name, $group, $class ) {
                $this->mGroups[$group] = null;
@@ -73,9 +73,9 @@ class ApiModuleManager extends ContextSource {
 
        /**
         * Get module instance by name, or instantiate it if it does not exist
-        * @param $moduleName string module name
-        * @param $group string optionally validate that the module is in a specific group
-        * @param $ignoreCache bool if true, force-creates a new instance and does not cache it
+        * @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 ) {
index 3f54fee..3e846e3 100644 (file)
@@ -38,7 +38,7 @@ class ApiMove extends ApiBase {
 
                if ( isset( $params['from'] ) ) {
                        $fromTitle = Title::newFromText( $params['from'] );
-                       if ( !$fromTitle ) {
+                       if ( !$fromTitle || $fromTitle->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['from'] ) );
                        }
                } elseif ( isset( $params['fromid'] ) ) {
@@ -54,7 +54,7 @@ class ApiMove extends ApiBase {
                $fromTalk = $fromTitle->getTalkPage();
 
                $toTitle = Title::newFromText( $params['to'] );
-               if ( !$toTitle ) {
+               if ( !$toTitle || $toTitle->isExternal() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['to'] ) );
                }
                $toTalk = $toTitle->getTalkPage();
@@ -291,7 +291,7 @@ class ApiMove extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=move&from=Exampel&to=Example&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
+                       'api.php?action=move&from=Badtitle&to=Goodtitle&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
                );
        }
 
index faebcdc..8c996a2 100644 (file)
@@ -25,9 +25,9 @@
  */
 
 /**
-* API module that facilitates the changing of user's preferences.
-* Requires API write mode to be enabled.
-*
+ * API module that facilitates the changing of user's preferences.
+ * Requires API write mode to be enabled.
+ *
  * @ingroup API
  */
 class ApiOptions extends ApiBase {
@@ -80,7 +80,8 @@ class ApiOptions extends ApiBase {
                                        $validation = $field->validate( $value, $user->getOptions() );
                                        break;
                                case 'registered-multiselect':
-                                       // A key for a multiselect option.
+                               case 'registered-checkmatrix':
+                                       // A key for a multiselect or checkmatrix option.
                                        $validation = true;
                                        $value = $value !== null ? (bool) $value : null;
                                        break;
index 954e5a1..bab59b7 100644 (file)
@@ -46,8 +46,11 @@ class ApiPageSet extends ApiBase {
         */
        const DISABLE_GENERATORS = 1;
 
-       private $mDbSource, $mParams;
-       private $mResolveRedirects, $mConvertTitles, $mAllowGenerator;
+       private $mDbSource;
+       private $mParams;
+       private $mResolveRedirects;
+       private $mConvertTitles;
+       private $mAllowGenerator;
 
        private $mAllPages = array(); // [ns][dbkey] => page_id or negative when missing
        private $mTitles = array();
@@ -66,18 +69,21 @@ class ApiPageSet extends ApiBase {
        private $mFakePageId = -1;
        private $mCacheMode = 'public';
        private $mRequestedPageFields = array();
+       private $mDefaultNamespace = NS_MAIN;
 
        /**
         * Constructor
         * @param $dbSource ApiBase Module implementing getDB().
         *        Allows PageSet to reuse existing db connection from the shared state like ApiQuery.
-        * @param $flags int Zero or more flags like DISABLE_GENERATORS
+        * @param int $flags Zero or more flags like DISABLE_GENERATORS
+        * @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 ) {
+       public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) {
                parent::__construct( $dbSource->getMain(), $dbSource->getModuleName() );
                $this->mDbSource = $dbSource;
                $this->mAllowGenerator = ( $flags & ApiPageSet::DISABLE_GENERATORS ) == 0;
+               $this->mDefaultNamespace = $defaultNamespace;
 
                $this->profileIn();
                $this->mParams = $this->extractRequestParams();
@@ -86,10 +92,26 @@ class ApiPageSet extends ApiBase {
                $this->profileOut();
        }
 
+       /**
+        * In case execute() is not called, call this method to mark all relevant parameters as used
+        * This prevents unused parameters from being reported as warnings
+        */
+       public function executeDryRun() {
+               $this->executeInternal( true );
+       }
+
        /**
         * Populate the PageSet from the request parameters.
         */
        public function execute() {
+               $this->executeInternal( false );
+       }
+
+       /**
+        * Populate the PageSet from the request parameters.
+        * @param bool $isDryRun If true, instantiates generator, but only to mark relevant parameters as used
+        */
+       private function executeInternal( $isDryRun ) {
                $this->profileIn();
 
                $generatorName = $this->mAllowGenerator ? $this->mParams['generator'] : null;
@@ -114,15 +136,27 @@ class ApiPageSet extends ApiBase {
                        $tmpPageSet = new ApiPageSet( $dbSource, ApiPageSet::DISABLE_GENERATORS );
                        $generator->setGeneratorMode( $tmpPageSet );
                        $this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() );
-                       $generator->requestExtraData( $tmpPageSet );
-                       $tmpPageSet->execute();
+
+                       if ( !$isDryRun ) {
+                               $generator->requestExtraData( $tmpPageSet );
+                       }
+                       $tmpPageSet->executeInternal( $isDryRun );
 
                        // populate this pageset with the generator output
                        $this->profileOut();
                        $generator->profileIn();
-                       $generator->executeGenerator( $this );
-                       wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
-                       $this->resolvePendingRedirects();
+
+                       if ( !$isDryRun ) {
+                               $generator->executeGenerator( $this );
+                               wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
+                               $this->resolvePendingRedirects();
+                       } else {
+                               // Prevent warnings from being reported on these parameters
+                               $main = $this->getMain();
+                               foreach ( $generator->extractRequestParams() as $paramName => $param ) {
+                                       $main->getVal( $generator->encodeParamName( $paramName ) );
+                               }
+                       }
                        $generator->profileOut();
                        $this->profileIn();
 
@@ -148,25 +182,28 @@ class ApiPageSet extends ApiBase {
                                }
                                $dataSource = 'revids';
                        }
-                       // Populate page information with the original user input
-                       switch( $dataSource ) {
-                               case 'titles':
-                                       $this->initFromTitles( $this->mParams['titles'] );
-                                       break;
-                               case 'pageids':
-                                       $this->initFromPageIds( $this->mParams['pageids'] );
-                                       break;
-                               case 'revids':
-                                       if ( $this->mResolveRedirects ) {
-                                               $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
-                                                       'Any redirects the revids= point to have not been resolved.' );
-                                       }
-                                       $this->mResolveRedirects = false;
-                                       $this->initFromRevIDs( $this->mParams['revids'] );
-                                       break;
-                               default:
-                                       // Do nothing - some queries do not need any of the data sources.
-                                       break;
+
+                       if ( !$isDryRun ) {
+                               // Populate page information with the original user input
+                               switch( $dataSource ) {
+                                       case 'titles':
+                                               $this->initFromTitles( $this->mParams['titles'] );
+                                               break;
+                                       case 'pageids':
+                                               $this->initFromPageIds( $this->mParams['pageids'] );
+                                               break;
+                                       case 'revids':
+                                               if ( $this->mResolveRedirects ) {
+                                                       $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
+                                                               'Any redirects the revids= point to have not been resolved.' );
+                                               }
+                                               $this->mResolveRedirects = false;
+                                               $this->initFromRevIDs( $this->mParams['revids'] );
+                                               break;
+                                       default:
+                                               // Do nothing - some queries do not need any of the data sources.
+                                               break;
+                               }
                        }
                }
                $this->profileOut();
@@ -183,7 +220,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Request an additional field from the page table.
         * Must be called before execute()
-        * @param $fieldName string Field name
+        * @param string $fieldName Field name
         */
        public function requestField( $fieldName ) {
                $this->mRequestedPageFields[$fieldName] = null;
@@ -192,7 +229,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Get the value of a custom field previously requested through
         * requestField()
-        * @param $fieldName string Field name
+        * @param string $fieldName Field name
         * @return mixed Field value
         */
        public function getCustomField( $fieldName ) {
@@ -476,7 +513,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of Titles
-        * @param $titles array of Title objects
+        * @param array $titles of Title objects
         */
        public function populateFromTitles( $titles ) {
                $this->profileIn();
@@ -486,7 +523,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of page IDs
-        * @param $pageIDs array of page IDs
+        * @param array $pageIDs of page IDs
         */
        public function populateFromPageIDs( $pageIDs ) {
                $this->profileIn();
@@ -507,7 +544,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of revision IDs
-        * @param $revIDs array of revision IDs
+        * @param array $revIDs of revision IDs
         */
        public function populateFromRevisionIDs( $revIDs ) {
                $this->profileIn();
@@ -560,7 +597,7 @@ class ApiPageSet extends ApiBase {
         * #5 Substitute the original LinkBatch object with the new list
         * #6 Repeat from step #1
         *
-        * @param $titles array of Title objects or strings
+        * @param array $titles of Title objects or strings
         */
        private function initFromTitles( $titles ) {
                // Get validated and normalized title objects
@@ -587,7 +624,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Does the same as initFromTitles(), but is based on page IDs instead
-        * @param $pageids array of page IDs
+        * @param array $pageids of page IDs
         */
        private function initFromPageIds( $pageids ) {
                if ( !$pageids ) {
@@ -613,7 +650,7 @@ class ApiPageSet extends ApiBase {
                        $this->profileDBOut();
                }
 
-               $this->initFromQueryResult( $res, $remaining, false );  // process PageIDs
+               $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
 
                // Resolve any found redirects
                $this->resolvePendingRedirects();
@@ -623,9 +660,9 @@ 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 $remaining array of either pageID or ns/title elements (optional).
+        * @param array $remaining of either pageID or ns/title elements (optional).
         *        If given, any missing items will go to $mMissingPageIDs and $mMissingTitles
-        * @param $processTitles bool Must be provided together with $remaining.
+        * @param bool $processTitles Must be provided together with $remaining.
         *        If true, treat $remaining as an array of [ns][title]
         *        If false, treat it as an array of [pageIDs]
         */
@@ -694,7 +731,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Does the same as initFromTitles(), but is based on revision IDs
         * instead
-        * @param $revids array of revision IDs
+        * @param array $revids of revision IDs
         */
        private function initFromRevIDs( $revids ) {
                if ( !$revids ) {
@@ -841,39 +878,40 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Given an array of title strings, convert them into Title objects.
-        * Alternativelly, an array of Title objects may be given.
+        * Alternatively, an array of Title objects may be given.
         * This method validates access rights for the title,
         * and appends normalization values to the output.
         *
-        * @param $titles array of Title objects or strings
+        * @param array $titles of Title objects or strings
         * @return LinkBatch
         */
        private function processTitlesArray( $titles ) {
-               $genderCache = GenderCache::singleton();
-               $genderCache->doTitlesArray( $titles, __METHOD__ );
-
+               $usernames = array();
                $linkBatch = new LinkBatch();
 
                foreach ( $titles as $title ) {
-                       $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
+                       if ( is_string( $title ) ) {
+                               $titleObj = Title::newFromText( $title, $this->mDefaultNamespace );
+                       } else {
+                               $titleObj = $title;
+                       }
                        if ( !$titleObj ) {
                                // Handle invalid titles gracefully
-                               $this->mAllpages[0][$title] = $this->mFakePageId;
+                               $this->mAllPages[0][$title] = $this->mFakePageId;
                                $this->mInvalidTitles[$this->mFakePageId] = $title;
                                $this->mFakePageId--;
                                continue; // There's nothing else we can do
                        }
                        $unconvertedTitle = $titleObj->getPrefixedText();
                        $titleWasConverted = false;
-                       $iw = $titleObj->getInterwiki();
-                       if ( strval( $iw ) !== '' ) {
+                       if ( $titleObj->isExternal() ) {
                                // This title is an interwiki link.
-                               $this->mInterwikiTitles[$titleObj->getPrefixedText()] = $iw;
+                               $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
                        } else {
                                // Variants checking
                                global $wgContLang;
                                if ( $this->mConvertTitles &&
-                                               count( $wgContLang->getVariants() ) > 1  &&
+                                               count( $wgContLang->getVariants() ) > 1 &&
                                                !$titleObj->exists() ) {
                                        // Language::findVariantLink will modify titleText and titleObj into
                                        // the canonical variant if possible
@@ -907,7 +945,15 @@ class ApiPageSet extends ApiBase {
                        } elseif ( is_string( $title ) && $title !== $titleObj->getPrefixedText() ) {
                                $this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
                        }
+
+                       // Need gender information
+                       if ( MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) {
+                               $usernames[] = $titleObj->getText();
+                       }
                }
+               // Get gender information
+               $genderCache = GenderCache::singleton();
+               $genderCache->doQuery( $usernames, __METHOD__ );
 
                return $linkBatch;
        }
index 6978a75..27f8cef 100644 (file)
@@ -69,7 +69,7 @@ class ApiParamInfo extends ApiBase {
         * @param array $params user parameters array
         * @param string $type parameter name
         * @param array $res store results in this array
-        * @param array $resultObj results object to set indexed tag.
+        * @param ApiResult $resultObj results object to set indexed tag.
         */
        private function addModulesInfo( $params, $type, &$res, $resultObj ) {
                if ( !is_array( $params[$type] ) ) {
@@ -291,7 +291,7 @@ class ApiParamInfo extends ApiBase {
                                $retval['props'][] = $propResult;
                        }
 
-                       // default is true for query modules, false for other modules, overriden by ApiBase::PROP_LIST
+                       // default is true for query modules, false for other modules, overridden by ApiBase::PROP_LIST
                        if ( $listResult === true || ( $listResult !== false && $obj instanceof ApiQueryBase ) ) {
                                $retval['listresult'] = '';
                        }
index b81e5c7..09b7a88 100644 (file)
@@ -68,7 +68,7 @@ class ApiParse extends ApiBase {
                // TODO: Does this still need $wgTitle?
                global $wgParser, $wgTitle;
 
-               // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
+               // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
                $oldLang = null;
                if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
                        $oldLang = $this->getContext()->getLanguage(); // Backup language
@@ -161,7 +161,7 @@ class ApiParse extends ApiBase {
                        }
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
-                       if ( !$titleObj ) {
+                       if ( !$titleObj || $titleObj->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                        }
                        if ( !$titleObj->canExist() ) {
index 95fdbce..503c692 100644 (file)
@@ -174,7 +174,7 @@ class ApiProtect extends ApiBase {
                        'token' => 'A protect token previously retrieved through prop=info',
                        'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)',
                        'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
-                                       'Use \'infinite\', \'indefinite\' or \'never\', for a neverexpiring protection.' ),
+                                       'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.' ),
                        'reason' => 'Reason for (un)protecting',
                        'cascade' => array( 'Enable cascading protection (i.e. protect pages included in this page)',
                                        'Ignored if not all protection levels are \'sysop\' or \'protect\'' ),
index bd92077..134f4a0 100644 (file)
@@ -35,10 +35,10 @@ class ApiPurge extends ApiBase {
 
        /**
         * Add all items from $values into the result
-        * @param $result array output
-        * @param $values array values to add
-        * @param $flag string the name of the boolean flag to mark this element
-        * @param $name string 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 ) {
index 118355c..f69ad23 100644 (file)
@@ -109,10 +109,11 @@ class ApiQuery extends ApiBase {
         */
        private $mPageSet;
 
-       private $params;
-       private $iwUrl;
+       private $mParams;
        private $mNamedDB = array();
        private $mModuleMgr;
+       private $mGeneratorContinue;
+       private $mUseLegacyContinue;
 
        /**
         * @param $main ApiMain
@@ -149,9 +150,9 @@ class ApiQuery extends ApiBase {
         * If no such connection has been requested before, it will be created.
         * Subsequent calls with the same $name will return the same connection
         * as the first, regardless of the values of $db and $groups
-        * @param $name string Name to assign to the database connection
-        * @param $db int One of the DB_* constants
-        * @param $groups array Query groups
+        * @param string $name Name to assign to the database connection
+        * @param int $db One of the DB_* constants
+        * @param array $groups Query groups
         * @return DatabaseBase
         */
        public function getNamedDB( $name, $db, $groups ) {
@@ -200,7 +201,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 $moduleName string Name of the module to find type for
+        * @param string $moduleName Name of the module to find type for
         * @return mixed string or null
         */
        function getModuleType( $moduleName ) {
@@ -233,37 +234,37 @@ class ApiQuery extends ApiBase {
         * #5 Execute all requested modules
         */
        public function execute() {
-               $this->params = $this->extractRequestParams();
-               $this->iwUrl = $this->params['iwurl'];
+               $this->mParams = $this->extractRequestParams();
 
-               // Instantiate requested modules
-               $modules = array();
-               $this->instantiateModules( $modules, 'prop' );
-               $this->instantiateModules( $modules, 'list' );
-               $this->instantiateModules( $modules, 'meta' );
-
-               // Query modules may optimize data requests through the $this->getPageSet()
-               // object by adding extra fields from the page table.
-               // This function will gather all the extra request fields from the modules.
-               foreach ( $modules as $module ) {
-                       if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
-                               $this->dieUsageMsgOrDebug( array( 'mustbeposted', $module->getModuleName() ) );
-                       }
+               // $pagesetParams is a array of parameter names used by the pageset generator
+               //   or null if pageset has already finished and is no longer needed
+               // $completeModules is a set of complete modules with the name as key
+               $this->initContinue( $pagesetParams, $completeModules );
 
-                       $module->requestExtraData( $this->mPageSet );
+               // Instantiate requested modules
+               $allModules = array();
+               $this->instantiateModules( $allModules, 'prop' );
+               $propModules = $allModules; // Keep a copy
+               $this->instantiateModules( $allModules, 'list' );
+               $this->instantiateModules( $allModules, 'meta' );
+
+               // Filter modules based on continue parameter
+               $modules = $this->initModules( $allModules, $completeModules, $pagesetParams !== null );
+
+               // Execute pageset if in legacy mode or if pageset is not done
+               if ( $completeModules === null || $pagesetParams !== null ) {
+                       // Populate page/revision information
+                       $this->mPageSet->execute();
+                       // Record page information (title, namespace, if exists, etc)
+                       $this->outputGeneralPageInfo();
+               } else {
+                       $this->mPageSet->executeDryRun();
                }
 
-               // Populate page/revision information
-               $this->mPageSet->execute();
                $cacheMode = $this->mPageSet->getCacheMode();
 
-               // Record page information (title, namespace, if exists, etc)
-               $this->outputGeneralPageInfo();
-
-               // Execute all requested modules.
-               /**
-                * @var $module ApiQueryBase
-                */
+               // Execute all unfinished modules
+               /** @var $module ApiQueryBase */
                foreach ( $modules as $module ) {
                        $params = $module->extractRequestParams();
                        $cacheMode = $this->mergeCacheMode(
@@ -276,6 +277,136 @@ class ApiQuery extends ApiBase {
 
                // Set the cache mode
                $this->getMain()->setCacheMode( $cacheMode );
+
+               if ( $completeModules === null ) {
+                       return; // Legacy continue, we are done
+               }
+
+               // Reformat query-continue result section
+               $result = $this->getResult();
+               $qc = $result->getData();
+               if ( isset( $qc['query-continue'] ) ) {
+                       $qc = $qc['query-continue'];
+                       $result->unsetValue( null, 'query-continue' );
+               } elseif ( $this->mGeneratorContinue !== null ) {
+                       $qc = array();
+               } else {
+                       // no more "continue"s, we are done!
+                       return;
+               }
+
+               // we are done with all the modules that do not have result in query-continue
+               $completeModules = array_merge( $completeModules, array_diff_key( $modules, $qc ) );
+               if ( $pagesetParams !== null ) {
+                       // The pageset is still in use, check if all props have finished
+                       $incompleteProps = array_intersect_key( $propModules, $qc );
+                       if ( count( $incompleteProps ) > 0 ) {
+                               // Properties are not done, continue with the same pageset state - copy current parameters
+                               $main = $this->getMain();
+                               $contValues = array();
+                               foreach ( $pagesetParams as $param ) {
+                                       // The param name is already prefix-encoded
+                                       $contValues[$param] = $main->getVal( $param );
+                               }
+                       } elseif ( $this->mGeneratorContinue !== null ) {
+                               // Move to the next set of pages produced by pageset, properties need to be restarted
+                               $contValues = $this->mGeneratorContinue;
+                               $pagesetParams = array_keys( $contValues );
+                               $completeModules = array_diff_key( $completeModules, $propModules );
+                       } else {
+                               // Done with the pageset, finish up with the the lists and meta modules
+                               $pagesetParams = null;
+                       }
+               }
+
+               $continue = '||' . implode( '|', array_keys( $completeModules ) );
+               if ( $pagesetParams !== null ) {
+                       // list of all pageset parameters to use in the next request
+                       $continue = implode( '|', $pagesetParams ) . $continue;
+               } else {
+                       // we are done with the pageset
+                       $contValues = array();
+                       $continue = '-' . $continue;
+               }
+               $contValues['continue'] = $continue;
+               foreach ( $qc as $qcModule ) {
+                       foreach ( $qcModule as $qcKey => $qcValue ) {
+                               $contValues[$qcKey] = $qcValue;
+                       }
+               }
+               $this->getResult()->addValue( null, 'continue', $contValues );
+       }
+
+       /**
+        * 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
+        */
+       private function initContinue( &$pagesetParams, &$completeModules ) {
+               $pagesetParams = array();
+               $continue = $this->mParams['continue'];
+               if ( $continue !== null ) {
+                       $this->mUseLegacyContinue = false;
+                       if ( $continue !== '' ) {
+                               // Format: ' pagesetParam1 | pagesetParam2 || module1 | module2 | module3 | ...
+                               // If pageset is done, use '-'
+                               $continue = explode( '||', $continue );
+                               $this->dieContinueUsageIf( count( $continue ) !== 2 );
+                               if ( $continue[0] === '-' ) {
+                                       $pagesetParams = null; // No need to execute pageset
+                               } elseif ( $continue[0] !== '' ) {
+                                       // list of pageset params that might need to be repeated
+                                       $pagesetParams = explode( '|', $continue[0] );
+                               }
+                               $continue = $continue[1];
+                       }
+                       if ( $continue !== '' ) {
+                               $completeModules = array_flip( explode( '|', $continue ) );
+                       } else {
+                               $completeModules = array();
+                       }
+               } else {
+                       $this->mUseLegacyContinue = true;
+                       $completeModules = null;
+               }
+       }
+
+       /**
+        * 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 bool $usePageset True if pageset will be executed
+        * @return array of modules to be processed during this execution
+        */
+       private function initModules( $allModules, $completeModules, $usePageset ) {
+               $modules = $allModules;
+               $tmp = $completeModules;
+               $wasPosted = $this->getRequest()->wasPosted();
+               $main = $this->getMain();
+
+               /** @var $module ApiQueryBase */
+               foreach ( $allModules as $moduleName => $module ) {
+                       if ( !$wasPosted && $module->mustBePosted() ) {
+                               $this->dieUsageMsgOrDebug( array( 'mustbeposted', $moduleName ) );
+                       }
+                       if ( $completeModules !== null && array_key_exists( $moduleName, $completeModules ) ) {
+                               // If this module is done, mark all its params as used
+                               $module->extractRequestParams();
+                               // Make sure this module is not used during execution
+                               unset( $modules[$moduleName] );
+                               unset( $tmp[$moduleName] );
+                       } elseif ( $completeModules === null || $usePageset ) {
+                               // Query modules may optimize data requests through the $this->getPageSet()
+                               // object by adding extra fields from the page table.
+                               // This function will gather all the extra request fields from the modules.
+                               $module->requestExtraData( $this->mPageSet );
+                       } else {
+                               // Error - this prop module must have finished before generator is done
+                               $this->dieContinueUsageIf( $this->mModuleMgr->getModuleGroup( $moduleName ) === 'prop' );
+                       }
+               }
+               $this->dieContinueUsageIf( $completeModules !== null && count( $tmp ) !== 0 );
+               return $modules;
        }
 
        /**
@@ -302,13 +433,20 @@ class ApiQuery extends ApiBase {
 
        /**
         * Create instances of all modules requested by the client
-        * @param $modules Array to append instantiated modules to
-        * @param $param string Parameter name to read modules from
+        * @param array $modules to append instantiated modules to
+        * @param string $param Parameter name to read modules from
         */
        private function instantiateModules( &$modules, $param ) {
-               if ( isset( $this->params[$param] ) ) {
-                       foreach ( $this->params[$param] as $moduleName ) {
-                               $modules[] = $this->mModuleMgr->getModule( $moduleName );
+               if ( isset( $this->mParams[$param] ) ) {
+                       foreach ( $this->mParams[$param] as $moduleName ) {
+                               $instance = $this->mModuleMgr->getModule( $moduleName, $param );
+                               if ( $instance === null ) {
+                                       ApiBase::dieDebug( __METHOD__, 'Error instantiating module' );
+                               }
+                               // Ignore duplicates. TODO 2.0: die()?
+                               if ( !array_key_exists( $moduleName, $modules ) ) {
+                                       $modules[$moduleName] = $instance;
+                               }
                        }
                }
        }
@@ -334,7 +472,7 @@ class ApiQuery extends ApiBase {
                if ( $values ) {
                        $result->addValue( 'query', 'converted', $values );
                }
-               $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->iwUrl );
+               $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->mParams['iwurl'] );
                if ( $values ) {
                        $result->addValue( 'query', 'interwiki', $values );
                }
@@ -369,6 +507,7 @@ class ApiQuery extends ApiBase {
                        );
                }
                // Report special pages
+               /** @var $title Title */
                foreach ( $pageSet->getSpecialTitles() as $fakeId => $title ) {
                        $vals = array();
                        ApiQueryBase::addTitleInfo( $vals, $title );
@@ -392,7 +531,7 @@ class ApiQuery extends ApiBase {
                }
 
                if ( count( $pages ) ) {
-                       if ( $this->params['indexpageids'] ) {
+                       if ( $this->mParams['indexpageids'] ) {
                                $pageIDs = array_keys( $pages );
                                // json treats all map keys as strings - converting to match
                                $pageIDs = array_map( 'strval', $pageIDs );
@@ -403,11 +542,32 @@ class ApiQuery extends ApiBase {
                        $result->setIndexedTagName( $pages, 'page' );
                        $result->addValue( 'query', 'pages', $pages );
                }
-               if ( $this->params['export'] ) {
+               if ( $this->mParams['export'] ) {
                        $this->doExport( $pageSet, $result );
                }
        }
 
+       /**
+        * 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 string $paramName
+        * @param mixed $paramValue
+        * @return bool true if processed, false if this is a legacy continue
+        */
+       public function setGeneratorContinue( $module, $paramName, $paramValue ) {
+               if ( $this->mUseLegacyContinue ) {
+                       return false;
+               }
+               $paramName = $module->encodeParamName( $paramName );
+               if ( $this->mGeneratorContinue === null ) {
+                       $this->mGeneratorContinue = array();
+               }
+               $this->mGeneratorContinue[$paramName] = $paramValue;
+               return true;
+       }
+
        /**
         * @param $pageSet ApiPageSet Pages to be exported
         * @param $result ApiResult Result to output to
@@ -417,6 +577,7 @@ class ApiQuery extends ApiBase {
                $titles = $pageSet->getGoodTitles();
                if ( count( $titles ) ) {
                        $user = $this->getUser();
+                       /** @var $title Title */
                        foreach ( $titles as $title ) {
                                if ( $title->userCan( 'read', $user ) ) {
                                        $exportTitles[] = $title;
@@ -440,7 +601,7 @@ class ApiQuery extends ApiBase {
                // It's not continuable, so it would cause more
                // problems than it'd solve
                $result->disableSizeCheck();
-               if ( $this->params['exportnowrap'] ) {
+               if ( $this->mParams['exportnowrap'] ) {
                        $result->reset();
                        // Raw formatter will handle this
                        $result->addValue( null, 'text', $exportxml );
@@ -471,6 +632,7 @@ class ApiQuery extends ApiBase {
                        'export' => false,
                        'exportnowrap' => false,
                        'iwurl' => false,
+                       'continue' => null,
                );
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
@@ -502,7 +664,7 @@ class ApiQuery extends ApiBase {
 
        /**
         * For all modules of a given group, generate help messages and join them together
-        * @param $group string Module group
+        * @param string $group Module group
         * @return string
         */
        private function makeHelpMsgHelper( $group ) {
@@ -543,6 +705,10 @@ class ApiQuery extends ApiBase {
                        'export' => 'Export the current revisions of all given or generated pages',
                        'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
                        'iwurl' => 'Whether to get the full URL if the title is an interwiki link',
+                       'continue' => array(
+                               'When present, formats query-continue as key-value pairs that should simply be merged into the original request.',
+                               'This parameter must be set to an empty string in the initial query.',
+                               'This parameter is recommended for all new development, and will be made default in the next API version.' ),
                );
        }
 
@@ -563,8 +729,8 @@ class ApiQuery extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment',
-                       'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions',
+                       'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment&continue=',
+                       'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=',
                );
        }
 
index adf2037..e24b162 100644 (file)
@@ -42,7 +42,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
        /**
         * Override parent method to make sure the repo's DB is used
-        * which may not necesarilly be the same as the local DB.
+        * which may not necessarily be the same as the local DB.
         *
         * TODO: allow querying non-local repos.
         * @return DatabaseBase
index 6b6b1a3..c9811b0 100644 (file)
@@ -39,8 +39,9 @@ class ApiQueryAllMessages extends ApiQueryBase {
                $params = $this->extractRequestParams();
 
                if ( is_null( $params['lang'] ) ) {
-                       global $wgLang;
-                       $langObj = $wgLang;
+                       $langObj = $this->getLanguage();
+               } elseif ( !Language::isValidCode( $params['lang'] ) ) {
+                       $this->dieUsage( 'Invalid language code for parameter lang', 'invalidlang' );
                } else {
                        $langObj = Language::factory( $params['lang'] );
                }
@@ -48,7 +49,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                if ( $params['enableparser'] ) {
                        if ( !is_null( $params['title'] ) ) {
                                $title = Title::newFromText( $params['title'] );
-                               if ( !$title ) {
+                               if ( !$title || $title->isExternal() ) {
                                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                                }
                        } else {
@@ -256,6 +257,12 @@ class ApiQueryAllMessages extends ApiQueryBase {
                );
        }
 
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'invalidlang', 'info' => 'Invalid language code for parameter lang' ),
+               ) );
+       }
+
        public function getResultProperties() {
                return array(
                        '' => array(
index 0c6692a..d718b96 100644 (file)
@@ -117,7 +117,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
                        $this->addTables( 'page_restrictions' );
                        $this->addWhere( 'page_id=pr_page' );
-                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+                       $this->addWhere( "pr_expiry > {$db->addQuotes( $db->timestamp() )} OR pr_expiry IS NULL" );
 
                        if ( count( $params['prtype'] ) ) {
                                $this->addWhereFld( 'pr_type', $params['prtype'] );
@@ -135,8 +135,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
                                        $this->addWhereFld( 'pr_cascade', 0 );
                                }
-
-                               $this->addOption( 'DISTINCT' );
                        }
                        $forceNameTitleIndex = false;
 
@@ -146,6 +144,8 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
                        }
 
+                       $this->addOption( 'DISTINCT' );
+
                } elseif ( isset( $params['prlevel'] ) ) {
                        $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
                }
@@ -347,7 +347,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                'Show info about 4 pages starting at the letter "T"',
                        ),
                        'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
-                               'Show content of first 2 non-redirect pages begining at "Re"',
+                               'Show content of first 2 non-redirect pages beginning at "Re"',
                        )
                );
        }
index 37f2b0f..7283aa0 100644 (file)
@@ -37,7 +37,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
        /**
         * This function converts the user name to a canonical form
         * which is stored in the database.
-        * @param String $name
+        * @param string $name
         * @return String
         */
        private function getCanonicalUserName( $name ) {
@@ -161,7 +161,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
 
                        $this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
-                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
+                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
                        $this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
 
                        $this->addOption( 'GROUP BY', $userFieldToSort );
@@ -279,7 +279,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        if ( $fld_rights ) {
                                if ( !isset( $lastUserData['rights'] ) ) {
                                        if ( $lastUserObj ) {
-                                               $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                                               $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
                                        } else {
                                                // This should not normally happen
                                                $lastUserData['rights'] = array();
index 0df2899..3ef6b84 100644 (file)
@@ -188,6 +188,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $titleWhere = array();
                $allRedirNs = array();
                $allRedirDBkey = array();
+               /** @var $t Title */
                foreach ( $this->redirTitles as $t ) {
                        $redirNs = $t->getNamespace();
                        $redirDBkey = $t->getDBkey();
@@ -201,6 +202,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
                if ( !is_null( $this->redirID ) ) {
                        $op = $this->params['dir'] == 'descending' ? '<' : '>';
+                       /** @var $first Title */
                        $first = $this->redirTitles[0];
                        $title = $db->addQuotes( $first->getDBkey() );
                        $ns = $first->getNamespace();
@@ -246,7 +248,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $this->params = $this->extractRequestParams( false );
                $this->redirect = isset( $this->params['redirect'] ) && $this->params['redirect'];
                $userMax = ( $this->redirect ? ApiBase::LIMIT_BIG1 / 2 : ApiBase::LIMIT_BIG1 );
-               $botMax  = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
+               $botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
 
                $result = $this->getResult();
 
index 20751e1..7819ead 100644 (file)
@@ -112,7 +112,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Add a set of fields to select to the internal array
-        * @param $value array|string Field name or array of field names
+        * @param array|string $value Field name or array of field names
         */
        protected function addFields( $value ) {
                if ( is_array( $value ) ) {
@@ -124,8 +124,8 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Same as addFields(), but add the fields only if a condition is met
-        * @param $value array|string See addFields()
-        * @param $condition bool If false, do nothing
+        * @param array|string $value See addFields()
+        * @param bool $condition If false, do nothing
         * @return bool $condition
         */
        protected function addFieldsIf( $value, $condition ) {
@@ -162,7 +162,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 $condition bool If false, do nothing
+        * @param bool $condition If false, do nothing
         * @return bool $condition
         */
        protected function addWhereIf( $value, $condition ) {
@@ -175,8 +175,8 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Equivalent to addWhere(array($field => $value))
-        * @param $field string Field name
-        * @param $value string Value; ignored if null or empty array;
+        * @param string $field Field name
+        * @param string $value Value; ignored if null or empty array;
         */
        protected function addWhereFld( $field, $value ) {
                // Use count() to its full documented capabilities to simultaneously
@@ -189,14 +189,14 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Add a WHERE clause corresponding to a range, and an ORDER BY
         * clause to sort in the right direction
-        * @param $field string Field name
-        * @param $dir string If 'newer', sort in ascending order, otherwise
+        * @param string $field Field name
+        * @param string $dir If 'newer', sort in ascending order, otherwise
         *  sort in descending order
-        * @param $start string Value to start the list at. If $dir == 'newer'
+        * @param string $start Value to start the list at. If $dir == 'newer'
         *  this is the lower boundary, otherwise it's the upper boundary
-        * @param $end string Value to end the list at. If $dir == 'newer' this
+        * @param string $end Value to end the list at. If $dir == 'newer' this
         *  is the upper boundary, otherwise it's the lower boundary
-        * @param $sort bool If false, don't add an ORDER BY clause
+        * @param bool $sort If false, don't add an ORDER BY clause
         */
        protected function addWhereRange( $field, $dir, $start, $end, $sort = true ) {
                $isDirNewer = ( $dir === 'newer' );
@@ -240,8 +240,8 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Add an option such as LIMIT or USE INDEX. If an option was set
         * before, the old value will be overwritten
-        * @param $name string Option name
-        * @param $value string Option value
+        * @param string $name Option name
+        * @param string $value Option value
         */
        protected function addOption( $name, $value = null ) {
                if ( is_null( $value ) ) {
@@ -253,9 +253,9 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Execute a SELECT query based on the values in the internal arrays
-        * @param $method string Function the query should be attributed to.
+        * @param string $method Function the query should be attributed to.
         *  You should usually use __METHOD__ here
-        * @param $extraQuery array Query data to add but not store in the object
+        * @param array $extraQuery Query data to add but not store in the object
         *  Format is array( 'tables' => ..., 'fields' => ..., 'where' => ..., 'options' => ..., 'join_conds' => ... )
         * @return ResultWrapper
         */
@@ -298,9 +298,9 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Add information (title and namespace) about a Title object to a
         * result array
-        * @param $arr array Result array à la ApiResult
+        * @param array $arr Result array à la ApiResult
         * @param $title Title
-        * @param $prefix string Module prefix
+        * @param string $prefix Module prefix
         */
        public static function addTitleInfo( &$arr, $title, $prefix = '' ) {
                $arr[$prefix . 'ns'] = intval( $title->getNamespace() );
@@ -325,8 +325,8 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Add a sub-element under the page element with the given page ID
-        * @param $pageId int Page ID
-        * @param $data array Data array à la ApiResult
+        * @param int $pageId Page ID
+        * @param array $data Data array à la ApiResult
         * @return bool Whether the element fit in the result
         */
        protected function addPageSubItems( $pageId, $data ) {
@@ -339,9 +339,9 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Same as addPageSubItems(), but one element of $data at a time
-        * @param $pageId int Page ID
-        * @param $item array Data array à la ApiResult
-        * @param $elemname string XML element name. If null, getModuleName()
+        * @param int $pageId Page ID
+        * @param array $item Data array à la ApiResult
+        * @param string $elemname XML element name. If null, getModuleName()
         *  is used
         * @return bool Whether the element fit in the result
         */
@@ -362,8 +362,8 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Set a query-continue value
-        * @param $paramName string Parameter name
-        * @param $paramValue string Parameter value
+        * @param string $paramName Parameter name
+        * @param string $paramValue Parameter value
         */
        protected function setContinueEnumParameter( $paramName, $paramValue ) {
                $paramName = $this->encodeParamName( $paramName );
@@ -374,19 +374,6 @@ abstract class ApiQueryBase extends ApiBase {
                $result->enableSizeCheck();
        }
 
-       /**
-        * 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
-        * @since 1.21
-        */
-       protected function dieContinueUsageIf( $condition ) {
-               if ( $condition ) {
-                       $this->dieUsage(
-                               'Invalid continue param. You should pass the original value returned by the previous query',
-                               'badcontinue' );
-               }
-       }
-
        /**
         * Get the Query database connection (read-only)
         * @return DatabaseBase
@@ -401,9 +388,9 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Selects the query database connection with the given name.
         * See ApiQuery::getNamedDB() for more information
-        * @param $name string Name to assign to the database connection
-        * @param $db int One of the DB_* constants
-        * @param $groups array Query groups
+        * @param string $name Name to assign to the database connection
+        * @param int $db One of the DB_* constants
+        * @param array $groups Query groups
         * @return DatabaseBase
         */
        public function selectNamedDB( $name, $db, $groups ) {
@@ -420,7 +407,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Convert a title to a DB key
-        * @param $title string Page title with spaces
+        * @param string $title Page title with spaces
         * @return string Page title with underscores
         */
        public function titleToKey( $title ) {
@@ -432,12 +419,12 @@ abstract class ApiQueryBase extends ApiBase {
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                }
-               return $t->getPrefixedDbKey();
+               return $t->getPrefixedDBkey();
        }
 
        /**
         * The inverse of titleToKey()
-        * @param $key string Page title with underscores
+        * @param string $key Page title with underscores
         * @return string Page title with spaces
         */
        public function keyToTitle( $key ) {
@@ -455,7 +442,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * An alternative to titleToKey() that doesn't trim trailing spaces
-        * @param $titlePart string Title part with spaces
+        * @param string $titlePart Title part with spaces
         * @return string Title part with underscores
         */
        public function titlePartToKey( $titlePart ) {
@@ -464,7 +451,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * An alternative to keyToTitle() that doesn't trim trailing spaces
-        * @param $keyPart string Key part with spaces
+        * @param string $keyPart Key part with spaces
         * @return string Key part with underscores
         */
        public function keyPartToTitle( $keyPart ) {
@@ -566,15 +553,6 @@ abstract class ApiQueryBase extends ApiBase {
                        array( 'invalidtitle', 'title' ),
                        array( 'invalidtitle', 'key' ),
                ) );
-               $params = $this->getFinalParams();
-               if ( array_key_exists( 'continue', $params ) ) {
-                       $errors = array_merge( $errors, array(
-                               array(
-                                       'code' => 'badcontinue',
-                                       'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
-                               ),
-                       ) );
-               }
                return $errors;
        }
 }
@@ -614,7 +592,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
 
        /**
         * Overrides base class to prepend 'g' to every generator parameter
-        * @param $paramName string Parameter name
+        * @param string $paramName Parameter name
         * @return string Prefixed parameter name
         */
        public function encodeParamName( $paramName ) {
@@ -625,6 +603,21 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
                }
        }
 
+       /**
+        * Overrides base in case of generator & smart continue to
+        * notify ApiQueryMain instead of adding them to the result right away.
+        * @param string $paramName Parameter name
+        * @param string $paramValue Parameter value
+        */
+       protected function setContinueEnumParameter( $paramName, $paramValue ) {
+               // If this is a generator and query->setGeneratorContinue() returns false, treat as before
+               if ( $this->mGeneratorPageSet === null
+                       || !$this->getQuery()->setGeneratorContinue( $this, $paramName, $paramValue )
+               ) {
+                       parent::setContinueEnumParameter( $paramName, $paramValue );
+               }
+       }
+
        /**
         * Execute this module as a generator
         * @param $resultPageSet ApiPageSet: All output should be appended to
index 2b48eb0..69a6441 100644 (file)
@@ -53,7 +53,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
-                       return; // nothing to do
+                       return; // nothing to do
                }
 
                $params = $this->extractRequestParams();
index fbe555c..a889272 100644 (file)
@@ -48,6 +48,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                                        $this->getPageSet()->getMissingTitles();
                $cattitles = array();
                foreach ( $categories as $c ) {
+                       /** @var $t Title */
                        $t = $titles[$c];
                        $cattitles[$c] = $t->getDBkey();
                }
index fd9d4c5..9dbd859 100644 (file)
@@ -78,7 +78,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                $this->addFieldsIf( 'cl_timestamp', $fld_timestamp || $params['sort'] == 'timestamp' );
 
-               $this->addTables( array( 'page', 'categorylinks' ) );   // must be in this order for 'USE INDEX'
+               $this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
 
                $this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
                $queryTypes = $params['type'];
index 31812cf..31ca1ef 100644 (file)
@@ -74,7 +74,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( $mode == 'revs' || $mode == 'user' ) {
                        // Ignore namespace and unique due to inability to know whether they were purposely set
-                       foreach( array( 'from', 'to', 'prefix', /*'namespace',*/ 'continue', /*'unique'*/ ) as $p ) {
+                       foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
                                if ( !is_null( $params[$p] ) ) {
                                        $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
                                }
@@ -116,7 +116,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
                // Check limits
                $userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
-               $botMax  = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
+               $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
 
                $limit = $params['limit'];
 
@@ -361,7 +361,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        'namespace' => 'Only list pages in this namespace (3)',
                        'user' => 'Only list revisions by this user',
                        'excludeuser' => 'Don\'t list revisions by this user',
-                       'continue' => 'When more results are available, use this to continue (3)',
+                       'continue' => 'When more results are available, use this to continue (1, 3)',
                        'unique' => 'List only one revision for each page (3)',
                );
        }
@@ -399,7 +399,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ),
                        array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ),
                        array( 'code' => 'badparams', 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" ),
-                       array( 'code' => 'badparams', 'info' => "The 'continue' parameter cannot be used in modes 1 or 2" ),
                        array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ),
                        array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ),
                ) );
index 3b04426..18dcba8 100644 (file)
@@ -92,6 +92,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 
                $sha1s = array();
                foreach ( $files as $file ) {
+                       /** @var $file File */
                        $sha1s[$file->getName()] = $file->getSha1();
                }
 
@@ -113,6 +114,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        if( $params['dir'] == 'descending' ) {
                                $dupFiles = array_reverse( $dupFiles );
                        }
+                       /** @var $dupFile File */
                        foreach ( $dupFiles as $dupFile ) {
                                $dupName = $dupFile->getName();
                                if( $image == $dupName && $dupFile->isLocal() ) {
index 98380d6..eb9cdf9 100644 (file)
@@ -55,7 +55,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                $query = $params['query'];
                $protocol = self::getProtocolPrefix( $params['protocol'] );
 
-               $this->addTables( array( 'page', 'externallinks' ) );   // must be in this order for 'USE INDEX'
+               $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
                $this->addOption( 'USE INDEX', 'el_index' );
                $this->addWhere( 'page_id=el_from' );
 
index c4a39d6..761b49e 100644 (file)
@@ -148,7 +148,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns all external urls (not interwikies) from the given page(s)';
+               return 'Returns all external urls (not interwikis) from the given page(s)';
        }
 
        public function getPossibleErrors() {
index 8718371..021074a 100644 (file)
@@ -207,7 +207,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                $file['suppressed'] = '';
                        }
 
-
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', $row->fa_name );
index 34f78e7..95c2745 100644 (file)
@@ -90,6 +90,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        continue;
                                }
 
+                               /** @var $img File */
                                $img = $images[$title];
 
                                if ( self::getTransformCount() >= self::TRANSFORM_LIMIT ) {
@@ -158,6 +159,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                // Get one more to facilitate query-continue functionality
                                $count = ( $gotOne ? 1 : 0 );
                                $oldies = $img->getHistory( $params['limit'] - $count + 1, $start, $params['end'] );
+                               /** @var $oldie File */
                                foreach ( $oldies as $oldie ) {
                                        if ( ++$count > $params['limit'] ) {
                                                // We've reached the extra one which shows that there are additional pages to be had. Stop here...
@@ -191,7 +193,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
        /**
         * From parameters, construct a 'scale' array
-        * @param $params Array: Parameters passed to api.
+        * @param array $params Parameters passed to api.
         * @return Array or Null: key-val array of 'width' and 'height', or null
         */
        public function getScale( $params ) {
@@ -222,8 +224,8 @@ 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).
+        * @param array $thumbParams thumbnail parameters from getScale
+        * @param string $otherParams of otherParams (iiurlparam).
         * @return Array of parameters for transform.
         */
        protected function mergeThumbParams ( $image, $thumbParams, $otherParams ) {
@@ -270,10 +272,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * Get result information for an image revision
         *
         * @param $file File object
-        * @param $prop Array of properties to get (in the keys)
+        * @param array $prop of properties to get (in the keys)
         * @param $result ApiResult object
-        * @param $thumbParams Array containing 'width' and 'height' items, or null
-        * @param $version string Version of image metadata (for things like jpeg which have different versions).
+        * @param array $thumbParams containing 'width' and 'height' items, or null
+        * @param string $version Version of image metadata (for things like jpeg which have different versions).
         * @return Array: result array
         */
        static function getInfo( $file, $prop, $result, $thumbParams = null, $version = 'latest' ) {
@@ -367,7 +369,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        }
 
                                        if ( isset( $prop['thumbmime'] ) && $file->getHandler() ) {
-                                               list( $ext, $mime ) = $file->getHandler()->getThumbType(
+                                               list( , $mime ) = $file->getHandler()->getThumbType(
                                                        $mto->getExtension(), $file->getMimeType(), $thumbParams );
                                                $vals['thumbmime'] = $mime;
                                        }
@@ -452,6 +454,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
        /**
         * @param $img File
+        * @param null|string $start
         * @return string
         */
        protected function getContinueStr( $img, $start = null ) {
@@ -516,6 +519,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        /**
         * Returns array key value pairs of properties and their descriptions
         *
+        * @param string $modulePrefix
         * @return array
         */
        private static function getProperties( $modulePrefix = '' ) {
@@ -710,7 +714,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
                        array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
                        array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
-                       array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesnt't " .
+                       array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
                                "match the one in {$p}urlwidth" ),
                ) );
        }
index aa7359b..f2bf0a7 100644 (file)
@@ -49,7 +49,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
-                       return; // nothing to do
+                       return; // nothing to do
                }
 
                $params = $this->extractRequestParams();
index 7797205..37cd915 100644 (file)
@@ -33,7 +33,8 @@ class ApiQueryInfo extends ApiQueryBase {
 
        private $fld_protection = false, $fld_talkid = false,
                $fld_subjectid = false, $fld_url = false,
-               $fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
+               $fld_readable = false, $fld_watched = false, $fld_watchers = false,
+               $fld_notificationtimestamp = false,
                $fld_preload = false, $fld_displaytitle = false;
 
        private $params, $titles, $missing, $everything, $pageCounter;
@@ -41,7 +42,8 @@ class ApiQueryInfo extends ApiQueryBase {
        private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
                $pageLatest, $pageLength;
 
-       private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+       private $protections, $watched, $watchers, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+       private $showZeroWatchers = false;
 
        private $tokenFunctions;
 
@@ -248,6 +250,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $prop = array_flip( $this->params['prop'] );
                        $this->fld_protection = isset( $prop['protection'] );
                        $this->fld_watched = isset( $prop['watched'] );
+                       $this->fld_watchers = isset( $prop['watchers'] );
                        $this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
                        $this->fld_talkid = isset( $prop['talkid'] );
                        $this->fld_subjectid = isset( $prop['subjectid'] );
@@ -305,6 +308,10 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->getWatchedInfo();
                }
 
+               if ( $this->fld_watchers ) {
+                       $this->getWatcherInfo();
+               }
+
                // Run the talkid/subjectid query if requested
                if ( $this->fld_talkid || $this->fld_subjectid ) {
                        $this->getTSIDs();
@@ -314,6 +321,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->getDisplayTitle();
                }
 
+               /** @var $title Title */
                foreach ( $this->everything as $pageid => $title ) {
                        $pageInfo = $this->extractPageInfo( $pageid, $title );
                        $fit = $result->addValue( array(
@@ -331,7 +339,7 @@ class ApiQueryInfo extends ApiQueryBase {
 
        /**
         * Get a result array with information about a title
-        * @param $pageid int Page ID (negative for missing titles)
+        * @param int $pageid Page ID (negative for missing titles)
         * @param $title Title object
         * @return array
         */
@@ -384,6 +392,14 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['watched'] = '';
                }
 
+               if ( $this->fld_watchers ) {
+                       if ( isset( $this->watchers[$ns][$dbkey] ) ) {
+                               $pageInfo['watchers'] = $this->watchers[$ns][$dbkey];
+                       } elseif ( $this->showZeroWatchers ) {
+                               $pageInfo['watchers'] = 0;
+                       }
+               }
+
                if ( $this->fld_notificationtimestamp ) {
                        $pageInfo['notificationtimestamp'] = '';
                        if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
@@ -447,6 +463,7 @@ class ApiQueryInfo extends ApiQueryBase {
 
                        $res = $this->select( __METHOD__ );
                        foreach ( $res as $row ) {
+                               /** @var $title Title */
                                $title = $this->titles[$row->pr_page];
                                $a = array(
                                        'type' => $row->pr_type,
@@ -582,6 +599,7 @@ class ApiQueryInfo extends ApiQueryBase {
        private function getTSIDs() {
                $getTitles = $this->talkids = $this->subjectids = array();
 
+               /** @var $t Title */
                foreach ( $this->everything as $t ) {
                        if ( MWNamespace::isTalk( $t->getNamespace() ) ) {
                                if ( $this->fld_subjectid ) {
@@ -675,6 +693,46 @@ class ApiQueryInfo extends ApiQueryBase {
                }
        }
 
+       /**
+        * Get the count of watchers and put it in $this->watchers
+        */
+       private function getWatcherInfo() {
+               global $wgUnwatchedPageThreshold;
+
+               if ( count( $this->everything ) == 0 ) {
+                       return;
+               }
+
+               $user = $this->getUser();
+               $canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
+               if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+                       return;
+               }
+
+               $this->watchers = array();
+               $this->showZeroWatchers = $canUnwatchedpages;
+               $db = $this->getDB();
+
+               $lb = new LinkBatch( $this->everything );
+
+               $this->resetQueryParams();
+               $this->addTables( array( 'watchlist' ) );
+               $this->addFields( array( 'wl_title', 'wl_namespace', 'count' => 'COUNT(*)' ) );
+               $this->addWhere( array(
+                       $lb->constructSet( 'wl', $db )
+               ) );
+               $this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
+               if ( !$canUnwatchedpages ) {
+                       $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+               }
+
+               $res = $this->select( __METHOD__ );
+
+               foreach ( $res as $row ) {
+                       $this->watchers[$row->wl_namespace][$row->wl_title] = (int)$row->count;
+               }
+       }
+
        public function getCacheMode( $params ) {
                $publicProps = array(
                        'protection',
@@ -706,6 +764,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                        'protection',
                                        'talkid',
                                        'watched', # private
+                                       'watchers', # private
                                        'notificationtimestamp', # private
                                        'subjectid',
                                        'url',
@@ -731,6 +790,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                ' protection            - List the protection level of each page',
                                ' talkid                - The page ID of the talk page for each non-talk page',
                                ' watched               - List the watched status of each page',
+                               ' watchers              - The number of watchers, if allowed',
                                ' notificationtimestamp - The watchlist notification timestamp of each page',
                                ' subjectid             - The page ID of the parent page for each talk page',
                                ' url                   - Gives a full URL to the page, and also an edit URL',
@@ -764,6 +824,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        'watched' => array(
                                'watched' => 'boolean'
                        ),
+                       'watchers' => array(
+                               'watchers' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
                        'notificationtimestamp' => array(
                                'notificationtimestamp' => array(
                                        ApiBase::PROP_TYPE => 'timestamp',
index 0aaa588..ac65d2d 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 /**
- * A query module to list all langlinks (links to correspanding foreign language pages).
+ * A query module to list all langlinks (links to corresponding foreign language pages).
  *
  * @ingroup API
  */
index 69d81ae..937f4f1 100644 (file)
@@ -79,7 +79,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
-                       return; // nothing to do
+                       return; // nothing to do
                }
 
                $params = $this->extractRequestParams();
index f89c826..73dcea4 100644 (file)
@@ -451,7 +451,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                ' timestamp      - Adds the timestamp for the event',
                                ' comment        - Adds the comment of the event',
                                ' parsedcomment  - Adds the parsed comment of the event',
-                               ' details        - Lists addtional details about the event',
+                               ' details        - Lists additional details about the event',
                                ' tags           - Lists tags for the event',
                        ),
                        'type' => 'Filter log entries to only this type',
index 1c9deb7..b03bdfb 100644 (file)
@@ -75,6 +75,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
                $result = $this->getResult();
 
+               /** @var $qp QueryPage */
                $qp = new $this->qpMap[$params['page']]();
                if ( !$qp->userCanExecute( $this->getUser() ) ) {
                        $this->dieUsageMsg( 'specialpage-cantexecute' );
@@ -141,6 +142,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        public function getCacheMode( $params ) {
+               /** @var $qp QueryPage */
                $qp = new $this->qpMap[$params['page']]();
                if ( $qp->getRestriction() != '' ) {
                        return 'private';
index 99854c1..ae3bb89 100644 (file)
@@ -33,6 +33,8 @@
 
 class ApiQueryRandom extends ApiQueryGeneratorBase {
 
+       private $pageIDs;
+
        public function __construct( $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rn' );
        }
index 6acca67..72e80b8 100644 (file)
@@ -105,7 +105,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
        /**
         * Sets internal state to include the desired properties in the output.
-        * @param $prop Array associative array of properties, only keys are used here
+        * @param array $prop associative array of properties, only keys are used here
         */
        public function initProperties( $prop ) {
                $this->fld_comment = isset( $prop['comment'] );
@@ -149,6 +149,26 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                $this->addTables( 'recentchanges' );
                $index = array( 'recentchanges' => 'rc_timestamp' ); // May change
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       if ( count( $cont ) != 2 ) {
+                               $this->dieUsage( 'Invalid continue param. You should pass the ' .
+                                                               'original value returned by the previous query', '_badcontinue' );
+                       }
+
+                       $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
+                       $id = intval( $cont[1] );
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+
+                       $this->addWhere(
+                               "rc_timestamp $op $timestamp OR " .
+                               "(rc_timestamp = $timestamp AND " .
+                               "rc_id <= $id)"
+                       );
+               }
+
+
                $this->addWhereFld( 'rc_namespace', $params['namespace'] );
                $this->addWhereFld( 'rc_deleted', 0 );
 
@@ -229,8 +249,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
                        }
 
+                       $this->addFields( 'rc_id' );
                        /* Add fields to our query if they are specified as a needed parameter. */
-                       $this->addFieldsIf( array( 'rc_id', 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
+                       $this->addFieldsIf( array( 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
                        $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
                        $this->addFieldsIf( 'rc_user', $this->fld_user );
                        $this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
@@ -281,7 +302,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                foreach ( $res as $row ) {
                        if ( ++ $count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+                               $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
                                break;
                        }
 
@@ -295,7 +316,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+                                       $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
                                        break;
                                }
                        } else {
@@ -314,7 +335,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        /**
         * Extracts from a single sql row the data needed to describe one recent change.
         *
-        * @param $row The row from which to extract the data.
+        * @param mixed $row The row from which to extract the data.
         * @return array An array mapping strings (descriptors) to their respective string values.
         * @access public
         */
@@ -584,6 +605,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                )
                        ),
                        'toponly' => false,
+                       'continue' => null,
                );
        }
 
@@ -621,6 +643,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        'limit' => 'How many total changes to return',
                        'tag' => 'Only list changes tagged with this tag',
                        'toponly' => 'Only list changes which are the latest revision',
+                       'continue' => 'When more results are available, use this to continue',
                );
        }
 
index 9b54ee5..192fe87 100644 (file)
@@ -95,7 +95,6 @@ class ApiQueryRevisions extends ApiQueryBase {
                                !is_null( $params['endid'] ) || $params['dir'] === 'newer' ||
                                !is_null( $params['start'] ) || !is_null( $params['end'] ) );
 
-
                $pageSet = $this->getPageSet();
                $pageCount = $pageSet->getGoodTitleCount();
                $revCount = $pageSet->getRevisionCount();
@@ -168,7 +167,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                $index = array();
 
                $userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
-               $botMax  = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
+               $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
                $limit = $params['limit'];
                if ( $limit == 'max' ) {
                        $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
@@ -197,6 +196,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( isset( $prop['content'] ) || !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 */
                        foreach ( $pageSet->getGoodTitles() as $title ) {
                                if ( !$title->userCan( 'read', $user ) ) {
                                        $this->dieUsage(
index ac13589..810e1d6 100644 (file)
@@ -139,11 +139,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                if ( $wgContLang->linkPrefixExtension() ) {
                        $data['linkprefix'] = wfMessage( 'linkprefix' )->inContentLanguage()->text();
+               } else {
+                       $data['linkprefix'] = '';
                }
 
                $linktrail = $wgContLang->linkTrail();
                if ( $linktrail ) {
                        $data['linktrail'] = $linktrail;
+               } else {
+                       $data['linktrail'] = '';
                }
 
                $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
@@ -372,7 +376,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                );
                        }
                } else {
-                       list( $host, $lag, $index ) = $lb->getMaxLag();
+                       list( , $lag, $index ) = $lb->getMaxLag();
                        $data[] = array(
                                'host' => $wgShowHostnames
                                                ? $lb->getServerName( $index )
index 2410f05..597c412 100644 (file)
@@ -442,7 +442,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        'end' => 'The end timestamp to return to',
                        'continue' => 'When more results are available, use this to continue',
                        'user' => 'The users to retrieve contributions for',
-                       'userprefix' => "Retrieve contibutions for all users whose names begin with this value. Overrides {$p}user",
+                       'userprefix' => "Retrieve contributions for all users whose names begin with this value. Overrides {$p}user",
                        'dir' => $this->getDirectionDescription( $p ),
                        'namespace' => 'Only list contributions in these namespaces',
                        'prop' => array(
index 963c8f8..1a491ec 100644 (file)
@@ -77,18 +77,18 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                if ( isset( $this->prop['groups'] ) ) {
                        $vals['groups'] = $user->getEffectiveGroups();
-                       $result->setIndexedTagName( $vals['groups'], 'g' );     // even if empty
+                       $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
                }
 
                if ( isset( $this->prop['implicitgroups'] ) ) {
                        $vals['implicitgroups'] = $user->getAutomaticGroups();
-                       $result->setIndexedTagName( $vals['implicitgroups'], 'g' );     // even if empty
+                       $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
                }
 
                if ( isset( $this->prop['rights'] ) ) {
                        // User::getRights() may return duplicate values, strip them
                        $vals['rights'] = array_values( array_unique( $user->getRights() ) );
-                       $result->setIndexedTagName( $vals['rights'], 'r' );     // even if empty
+                       $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
                }
 
                if ( isset( $this->prop['changeablegroups'] ) ) {
index 50ea587..72ab786 100644 (file)
@@ -254,12 +254,12 @@ 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
-       * @return array
-       */
+        * Gets all the groups that a user is automatically a member of (implicit groups)
+        *
+        * @deprecated since 1.20; call User::getAutomaticGroups() directly.
+        * @param $user User
+        * @return array
+        */
        public static function getAutoGroups( $user ) {
                wfDeprecated( __METHOD__, '1.20' );
 
@@ -310,7 +310,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                '  rights         - Lists all the rights the user(s) has',
                                '  editcount      - Adds the user\'s edit count',
                                '  registration   - Adds the user\'s registration timestamp',
-                               '  emailable      - Tags if the user can and wants to receive e-mail through [[Special:Emailuser]]',
+                               '  emailable      - Tags if the user can and wants to receive email through [[Special:Emailuser]]',
                                '  gender         - Tags the gender of the user. Returns "male", "female", or "unknown"',
                        ),
                        'users' => 'A list of users to obtain the same information for',
index dd50624..90b12c1 100644 (file)
@@ -240,14 +240,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                if ( $this->fld_user || $this->fld_userid ) {
 
-                       if ( $this->fld_user ) {
-                               $vals['user'] = $row->rc_user_text;
-                       }
-
                        if ( $this->fld_userid ) {
+                               $vals['userid'] = $row->rc_user;
+                               // for backwards compatibility
                                $vals['user'] = $row->rc_user;
                        }
 
+                       if ( $this->fld_user ) {
+                               $vals['user'] = $row->rc_user_text;
+                       }
+
                        if ( !$row->rc_user ) {
                                $vals['anon'] = '';
                        }
@@ -511,7 +513,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'api.php?action=query&list=watchlist&wlallrev=&wlprop=ids|title|timestamp|user|comment',
                        'api.php?action=query&generator=watchlist&prop=info',
                        'api.php?action=query&generator=watchlist&gwlallrev=&prop=revisions&rvprop=timestamp|user',
-                       'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=d8d562e9725ea1512894cdab28e5ceebc7f20237'
+                       'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=123ABC'
                );
        }
 
index 7ecfa8e..39c114b 100644 (file)
@@ -36,8 +36,8 @@
  * There are two special key values that change how XML output is generated:
  *   '_element' This key sets the tag name for the rest of the elements in the current array.
  *              It is only inserted if the formatter returned true for getNeedsRawData()
- *   '*'        This key has special meaning only to the XML formatter, and is outputed as is
- *                             for all others. In XML it becomes the content of the current element.
+ *   '*'        This key has special meaning only to the XML formatter, and is outputted as is
+ *              for all others. In XML it becomes the content of the current element.
  *
  * @ingroup API
  */
@@ -147,10 +147,10 @@ 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 $arr array to add $value to
-        * @param $name string Index of $arr to add $value at
+        * @param array $arr to add $value to
+        * @param string $name Index of $arr to add $value at
         * @param $value mixed
-        * @param $flags int Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+        * @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 signature.
         *
@@ -183,9 +183,9 @@ class ApiResult extends ApiBase {
        /**
         * Adds a content element to an array.
         * Use this function instead of hardcoding the '*' element.
-        * @param $arr array to add the content element to
+        * @param array $arr to add the content element to
         * @param $value Mixed
-        * @param $subElemName string when present, content element is created
+        * @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.
         */
@@ -208,7 +208,7 @@ class ApiResult extends ApiBase {
         * give all indexed values the given tag name. This function MUST be
         * called on every array that has numerical indexes.
         * @param $arr array
-        * @param $tag string Tag name
+        * @param string $tag Tag name
         */
        public function setIndexedTagName( &$arr, $tag ) {
                // In raw mode, add the '_element', otherwise just ignore
@@ -225,7 +225,7 @@ class ApiResult extends ApiBase {
        /**
         * Calls setIndexedTagName() on each sub-array of $arr
         * @param $arr array
-        * @param $tag string Tag name
+        * @param string $tag Tag name
         */
        public function setIndexedTagName_recursive( &$arr, $tag ) {
                if ( !is_array( $arr ) ) {
@@ -244,7 +244,7 @@ class ApiResult extends ApiBase {
         * Calls setIndexedTagName() on an array already in the result.
         * Don't specify a path to a value that's not in the result, or
         * you'll get nasty errors.
-        * @param $path array Path to the array, like addValue()'s $path
+        * @param array $path Path to the array, like addValue()'s $path
         * @param $tag string
         */
        public function setIndexedTagName_internal( $path, $tag ) {
@@ -271,7 +271,7 @@ class ApiResult extends ApiBase {
         * @param $path array|string|null
         * @param $name string
         * @param $value mixed
-        * @param $flags int Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+        * @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 signature.
         * @return bool True if $value fits in the result, false if not
@@ -295,7 +295,7 @@ class ApiResult extends ApiBase {
 
                $addOnTop = $flags & ApiResult::ADD_ON_TOP;
                if ( $path !== null ) {
-                       foreach ( (array) $path as $p ) {
+                       foreach ( (array)$path as $p ) {
                                if ( !isset( $data[$p] ) ) {
                                        if ( $addOnTop ) {
                                                $data = array( $p => array() ) + $data;
@@ -340,12 +340,12 @@ 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
+        * @param $path array|null
         * @param $name string
         */
        public function unsetValue( $path, $name ) {
                $data = &$this->mData;
-               if ( !is_null( $path ) ) {
+               if ( $path !== null ) {
                        foreach ( (array)$path as $p ) {
                                if ( !isset( $data[$p] ) ) {
                                        return;
index 6e55a5e..b9873f4 100644 (file)
@@ -181,7 +181,7 @@ class ApiRollback extends ApiBase {
 
                $this->mTitleObj = Title::newFromText( $params['title'] );
 
-               if ( !$this->mTitleObj ) {
+               if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
                if ( !$this->mTitleObj->exists() ) {
index 3f5ebfe..b40476a 100644 (file)
@@ -133,6 +133,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        }
 
                        // Now, put the valid titles into the result
+                       /** @var $title Title */
                        foreach ( $pageSet->getTitles() as $title ) {
                                $ns = $title->getNamespace();
                                $dbkey = $title->getDBkey();
@@ -259,7 +260,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
        public function getDescription() {
                return array( 'Update the notification timestamp for watched pages.',
                        'This affects the highlighting of changed pages in the watchlist and history,',
-                       'and the sending of email when the "E-mail me when a page on my watchlist is',
+                       'and the sending of email when the "Email me when a page on my watchlist is',
                        'changed" preference is enabled.'
                );
        }
@@ -283,9 +284,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=setnotificationtimestamp&entirewatchlist=&token=ABC123' => 'Reset the notification status for the entire watchlist',
-                       'api.php?action=setnotificationtimestamp&titles=Main_page&token=ABC123' => 'Reset the notification status for "Main page"',
-                       'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=ABC123' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
+                       'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC' => 'Reset the notification status for the entire watchlist',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&token=123ABC' => 'Reset the notification status for "Main page"',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=123ABC' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
                );
        }
 
index 518bfce..7080f54 100644 (file)
  * @file
  */
 
-
 /**
  * @ingroup API
  */
 class ApiTokens extends ApiBase {
 
        public function execute() {
-               wfProfileIn( __METHOD__ );
                $params = $this->extractRequestParams();
                $res = array();
 
                $types = $this->getTokenTypes();
                foreach ( $params['type'] as $type ) {
-                       $type = strtolower( $type );
-
                        $val = call_user_func( $types[$type], null, null );
 
                        if ( $val === false ) {
@@ -49,7 +45,6 @@ class ApiTokens extends ApiBase {
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
-               wfProfileOut( __METHOD__ );
        }
 
        private function getTokenTypes() {
@@ -58,11 +53,11 @@ class ApiTokens extends ApiBase {
                        return $types;
                }
                wfProfileIn( __METHOD__ );
-               $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+               $types = array( 'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' ) );
                $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
                        'email', 'import', 'watch', 'options' );
                foreach ( $names as $name ) {
-                       $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
+                       $types[$name] = array( 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' );
                }
                wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
                ksort( $types );
@@ -81,54 +76,13 @@ class ApiTokens extends ApiBase {
        }
 
        public function getResultProperties() {
-               return array(
-                       '' => array(
-                               'patroltoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'edittoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'deletetoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'protecttoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'movetoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'blocktoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'unblocktoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'emailtoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'importtoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'watchtoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               ),
-                               'optionstoken' => array(
-                                       ApiBase::PROP_TYPE => 'string',
-                                       ApiBase::PROP_NULLABLE => true
-                               )
-                       )
+               $props = array(
+                       '' => array(),
                );
+
+               self::addTokenProperties( $props, $this->getTokenTypes() );
+
+               return $props;
        }
 
        public function getParamDescription() {
index bc7f6e7..55e7331 100644 (file)
@@ -75,7 +75,7 @@ class ApiUnblock extends ApiBase {
 
                $res['id'] = $block->getId();
                $target = $block->getType() == Block::TYPE_AUTO ? '' : $block->getTarget();
-               $res['user'] = $target;
+               $res['user'] = $target instanceof User ? $target->getName() : $target;
                $res['userid'] = $target instanceof User ? $target->getId() : 0;
                $res['reason'] = $params['reason'];
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
index f53f065..4bbe568 100644 (file)
@@ -41,7 +41,7 @@ class ApiUndelete extends ApiBase {
                }
 
                $titleObj = Title::newFromText( $params['title'] );
-               if ( !$titleObj ) {
+               if ( !$titleObj || $titleObj->isExternal() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
index a0da765..deeb1c1 100644 (file)
@@ -37,6 +37,8 @@ class ApiUpload extends ApiBase {
        protected $mParams;
 
        public function execute() {
+               global $wgEnableAsyncUploads;
+
                // Check whether upload is enabled
                if ( !UploadBase::isEnabled() ) {
                        $this->dieUsageMsg( 'uploaddisabled' );
@@ -47,9 +49,8 @@ class ApiUpload extends ApiBase {
                // Parameter handling
                $this->mParams = $this->extractRequestParams();
                $request = $this->getMain()->getRequest();
-               // Check if async mode is actually supported
-               $this->mParams['async'] = ( $this->mParams['async'] && !wfIsWindows() );
-               $this->mParams['async'] = false; // XXX: disabled per bug 44080
+               // Check if async mode is actually supported (jobs done in cli mode)
+               $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -70,6 +71,7 @@ class ApiUpload extends ApiBase {
                $this->checkPermissions( $user );
 
                // Fetch the file (usually a no-op)
+               /** @var $status Status */
                $status = $this->mUpload->fetchFile();
                if ( !$status->isGood() ) {
                        $errors = $status->getErrorsArray();
@@ -115,13 +117,13 @@ class ApiUpload extends ApiBase {
        }
 
        /**
-        * Get an uplaod result based on upload context
+        * Get an upload result based on upload context
         * @return array
         */
        private function getContextResult() {
                $warnings = $this->getApiWarnings();
                if ( $warnings && !$this->mParams['ignorewarnings'] ) {
-                       // Get warnings formated in result array format
+                       // Get warnings formatted in result array format
                        return $this->getWarningsResult( $warnings );
                } elseif ( $this->mParams['chunk'] ) {
                        // Add chunk, and get result
@@ -136,8 +138,8 @@ class ApiUpload extends ApiBase {
        }
 
        /**
-        * Get Stash Result, throws an expetion if the file could not be stashed.
-        * @param $warnings array Array of Api upload warnings
+        * Get Stash Result, throws an exception if the file could not be stashed.
+        * @param array $warnings Array of Api upload warnings
         * @return array
         */
        private function getStashResult( $warnings ) {
@@ -159,7 +161,7 @@ class ApiUpload extends ApiBase {
 
        /**
         * Get Warnings Result
-        * @param $warnings array Array of Api upload warnings
+        * @param array $warnings Array of Api upload warnings
         * @return array
         */
        private function getWarningsResult( $warnings ) {
@@ -179,12 +181,10 @@ class ApiUpload extends ApiBase {
 
        /**
         * Get the result of a chunk upload.
-        * @param $warnings array Array of Api upload warnings
+        * @param array $warnings Array of Api upload warnings
         * @return array
         */
        private function getChunkResult( $warnings ) {
-               global $IP;
-
                $result = array();
 
                $result['result'] = 'Continue';
@@ -195,69 +195,61 @@ class ApiUpload extends ApiBase {
                $chunkPath = $request->getFileTempname( 'chunk' );
                $chunkSize = $request->getUpload( 'chunk' )->getSize();
                if ( $this->mParams['offset'] == 0 ) {
-                       $result['filekey'] = $this->performStash();
+                       $filekey = $this->performStash();
                } else {
+                       $filekey = $this->mParams['filekey'];
+                       /** @var $status Status */
                        $status = $this->mUpload->addChunk(
                                $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
                                $this->dieUsage( $status->getWikiText(), 'stashfailed' );
                                return array();
                        }
+               }
 
-                       // Check we added the last chunk:
-                       if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
-                               if ( $this->mParams['async'] && !wfIsWindows() ) {
-                                       $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
-                                       if ( $progress && $progress['result'] === 'Poll' ) {
-                                               $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
-                                       }
-                                       UploadBase::setSessionStatus(
-                                               $this->mParams['filekey'],
-                                               array( 'result' => 'Poll',
-                                                       'stage' => 'queued', 'status' => Status::newGood() )
-                                       );
-                                       $retVal = 1;
-                                       $cmd = wfShellWikiCmd(
-                                               "$IP/includes/upload/AssembleUploadChunks.php",
-                                               array(
-                                                       '--wiki', wfWikiID(),
-                                                       '--filename', $this->mParams['filename'],
-                                                       '--filekey', $this->mParams['filekey'],
-                                                       '--userid', $this->getUser()->getId(),
-                                                       '--sessionid', session_id(),
-                                                       '--quiet'
-                                               )
-                                       ) . " < " . wfGetNull() . " > " . wfGetNull() . " 2>&1 &";
-                                       // Start a process in the background. Enforce the time limits via PHP
-                                       // since ulimit4.sh seems to often not work for this particular usage.
-                                       wfShellExec( $cmd, $retVal, array(), array( 'time' => 0, 'memory' => 0 ) );
-                                       if ( $retVal == 0 ) {
-                                               $result['result'] = 'Poll';
-                                       } else {
-                                               UploadBase::setSessionStatus( $this->mParams['filekey'], false );
-                                               $this->dieUsage(
-                                                       "Failed to start AssembleUploadChunks.php", 'stashfailed' );
-                                       }
+               // Check we added the last chunk:
+               if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+                       if ( $this->mParams['async'] ) {
+                               $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                               if ( $progress && $progress['result'] === 'Poll' ) {
+                                       $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
+                               }
+                               UploadBase::setSessionStatus(
+                                       $this->mParams['filekey'],
+                                       array( 'result' => 'Poll',
+                                               'stage' => 'queued', 'status' => Status::newGood() )
+                               );
+                               $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
+                                       Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+                                       array(
+                                               'filename'  => $this->mParams['filename'],
+                                               'filekey'   => $this->mParams['filekey'],
+                                               'session'   => $this->getContext()->exportSession()
+                                       )
+                               ) );
+                               if ( $ok ) {
+                                       $result['result'] = 'Poll';
                                } else {
-                                       $status = $this->mUpload->concatenateChunks();
-                                       if ( !$status->isGood() ) {
-                                               $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                                               return array();
-                                       }
-
-                                       // We have a new filekey for the fully concatenated file.
-                                       $result['filekey'] = $this->mUpload->getLocalFile()->getFileKey();
-
-                                       // Remove chunk from stash. (Checks against user ownership of chunks.)
-                                       $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
-
-                                       $result['result'] = 'Success';
+                                       UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+                                       $this->dieUsage(
+                                               "Failed to start AssembleUploadChunks.php", 'stashfailed' );
                                }
                        } else {
-                               // Continue passing through the filekey for adding further chunks.
-                               $result['filekey'] = $this->mParams['filekey'];
+                               $status = $this->mUpload->concatenateChunks();
+                               if ( !$status->isGood() ) {
+                                       $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+                                       return array();
+                               }
+
+                               // The fully concatenated file has a new filekey. So remove
+                               // the old filekey and fetch the new one.
+                               $this->mUpload->stash->removeFile( $filekey );
+                               $filekey = $this->mUpload->getLocalFile()->getFileKey();
+
+                               $result['result'] = 'Success';
                        }
                }
+               $result['filekey'] = $filekey;
                $result['offset'] = $this->mParams['offset'] + $chunkSize;
                return $result;
        }
@@ -288,9 +280,9 @@ class ApiUpload extends ApiBase {
         * Throw an error that the user can recover from by providing a better
         * value for $parameter
         *
-        * @param $error array Error array suitable for passing to dieUsageMsg()
-        * @param $parameter string Parameter that needs revising
-        * @param $data array Optional extra data to pass to the user
+        * @param array $error Error array suitable for passing to dieUsageMsg()
+        * @param string $parameter Parameter that needs revising
+        * @param array $data Optional extra data to pass to the user
         * @throws UsageException
         */
        private function dieRecoverableError( $error, $parameter, $data = array() ) {
@@ -524,7 +516,6 @@ class ApiUpload extends ApiBase {
                }
        }
 
-
        /**
         * Check warnings.
         * Returns a suitable array for inclusion into API results if there were warnings
@@ -562,22 +553,20 @@ class ApiUpload extends ApiBase {
                return $warnings;
        }
 
-
        /**
         * Perform the actual upload. Returns a suitable result array on success;
         * dies on failure.
         *
-        * @param $warnings array Array of Api upload warnings
+        * @param array $warnings Array of Api upload warnings
         * @return array
         */
        protected function performUpload( $warnings ) {
-               global $IP;
-
                // Use comment as initial page text by default
                if ( is_null( $this->mParams['text'] ) ) {
                        $this->mParams['text'] = $this->mParams['comment'];
                }
 
+               /** @var $file File */
                $file = $this->mUpload->getLocalFile();
                $watch = $this->getWatchlistValue( $this->mParams['watchlist'], $file->getTitle() );
 
@@ -596,25 +585,18 @@ class ApiUpload extends ApiBase {
                                $this->mParams['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
                        );
-                       $retVal = 1;
-                       $cmd = wfShellWikiCmd(
-                               "$IP/includes/upload/PublishStashedFile.php",
+                       $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
+                               Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
                                array(
-                                       '--wiki', wfWikiID(),
-                                       '--filename', $this->mParams['filename'],
-                                       '--filekey', $this->mParams['filekey'],
-                                       '--userid', $this->getUser()->getId(),
-                                       '--comment', $this->mParams['comment'],
-                                       '--text', $this->mParams['text'],
-                                       '--watch', $watch,
-                                       '--sessionid', session_id(),
-                                       '--quiet'
+                                       'filename'  => $this->mParams['filename'],
+                                       'filekey'   => $this->mParams['filekey'],
+                                       'comment'   => $this->mParams['comment'],
+                                       'text'      => $this->mParams['text'],
+                                       'watch'     => $watch,
+                                       'session'   => $this->getContext()->exportSession()
                                )
-                       ) . " < " . wfGetNull() . " > " . wfGetNull() . " 2>&1 &";
-                       // Start a process in the background. Enforce the time limits via PHP
-                       // since ulimit4.sh seems to often not work for this particular usage.
-                       wfShellExec( $cmd, $retVal, array(), array( 'time' => 0, 'memory' => 0 ) );
-                       if ( $retVal == 0 ) {
+                       ) );
+                       if ( $ok ) {
                                $result['result'] = 'Poll';
                        } else {
                                UploadBase::setSessionStatus( $this->mParams['filekey'], false );
@@ -622,6 +604,7 @@ class ApiUpload extends ApiBase {
                                        "Failed to start PublishStashedFile.php", 'publishfailed' );
                        }
                } else {
+                       /** @var $status Status */
                        $status = $this->mUpload->performUpload( $this->mParams['comment'],
                                $this->mParams['text'], $watch, $this->getUser() );
 
@@ -696,7 +679,9 @@ class ApiUpload extends ApiBase {
                                ),
                        ),
                        'ignorewarnings' => false,
-                       'file' => null,
+                       'file' => array(
+                               ApiBase::PARAM_TYPE => 'upload',
+                       ),
                        'url' => null,
                        'filekey' => null,
                        'sessionkey' => array(
@@ -707,7 +692,9 @@ class ApiUpload extends ApiBase {
 
                        'filesize' => null,
                        'offset' => null,
-                       'chunk' => null,
+                       'chunk' => array(
+                               ApiBase::PARAM_TYPE => 'upload',
+                       ),
 
                        'async' => false,
                        'asyncdownload' => false,
index 2454e33..3e51299 100644 (file)
@@ -40,13 +40,13 @@ class ApiWatch extends ApiBase {
                $params = $this->extractRequestParams();
                $title = Title::newFromText( $params['title'] );
 
-               if ( !$title || $title->getNamespace() < 0 ) {
+               if ( !$title || $title->isExternal() || !$title->canExist() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
                $res = array( 'title' => $title->getPrefixedText() );
 
-               // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
+               // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
                // Copy from ApiParse
                $oldLang = null;
                if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
index a4aa79e..a59cc9a 100644 (file)
@@ -222,11 +222,11 @@ class BacklinkCache {
         */
        protected function getPrefix( $table ) {
                static $prefixes = array(
-                       'pagelinks'     => 'pl',
-                       'imagelinks'    => 'il',
+                       'pagelinks' => 'pl',
+                       'imagelinks' => 'il',
                        'categorylinks' => 'cl',
                        'templatelinks' => 'tl',
-                       'redirect'      => 'rd',
+                       'redirect' => 'rd',
                );
 
                if ( isset( $prefixes[$table] ) ) {
@@ -259,14 +259,14 @@ class BacklinkCache {
                        case 'templatelinks':
                                $conds = array(
                                        "{$prefix}_namespace" => $this->title->getNamespace(),
-                                       "{$prefix}_title"     => $this->title->getDBkey(),
+                                       "{$prefix}_title" => $this->title->getDBkey(),
                                        "page_id={$prefix}_from"
                                );
                                break;
                        case 'redirect':
                                $conds = array(
                                        "{$prefix}_namespace" => $this->title->getNamespace(),
-                                       "{$prefix}_title"     => $this->title->getDBkey(),
+                                       "{$prefix}_title" => $this->title->getDBkey(),
                                        $this->getDb()->makeList( array(
                                                "{$prefix}_interwiki" => '',
                                                "{$prefix}_interwiki IS NULL",
@@ -356,7 +356,7 @@ 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 $table String: the links table name
+        * @param string $table the links table name
         * @param $batchSize Integer
         * @return Array
         */
@@ -394,7 +394,6 @@ class BacklinkCache {
                        return $cacheEntry['batches'];
                }
 
-
                // 4) ... finally fetch from the slow database :(
                $this->getLinks( $table );
                $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
index c67b655..0f047e8 100644 (file)
@@ -98,11 +98,11 @@ class DependencyWrapper {
         * calculated value will be stored to the cache in a wrapper.
         *
         * @param $cache BagOStuff a cache object such as $wgMemc
-        * @param $key String: the cache key
+        * @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 $callbackParams Array: the function parameters for the callback
-        * @param $deps Array: the dependencies to store on a cache miss. Note: these
+        * @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.
         *
@@ -153,7 +153,7 @@ class FileDependency extends CacheDependency {
        /**
         * Create a file dependency
         *
-        * @param $filename String: the name of the file, preferably fully qualified
+        * @param string $filename the name of the file, preferably fully qualified
         * @param $timestamp Mixed: the unix last modified timestamp, or false if the
         *        file does not exist. If omitted, the timestamp will be loaded from
         *        the file.
index ccdd98a..30a7217 100644 (file)
@@ -107,7 +107,7 @@ abstract class FileCacheBase {
 
        /**
         * Check if up to date cache file exists
-        * @param $timestamp string MW_TS timestamp
+        * @param string $timestamp MW_TS timestamp
         *
         * @return bool
         */
index 2a169bb..63e4226 100644 (file)
@@ -59,8 +59,8 @@ class GenderCache {
 
        /**
         * Returns the gender for given username.
-        * @param $username String or User: username
-        * @param $caller String: the calling method
+        * @param string $username or User: username
+        * @param string $caller the calling method
         * @return String
         */
        public function getGenderOf( $username, $caller = '' ) {
@@ -116,7 +116,7 @@ class GenderCache {
         *
         * @since 1.20
         * @param $titles List: array of Title objects or strings
-        * @param $caller String: the calling method
+        * @param string $caller the calling method
         */
        public function doTitlesArray( $titles, $caller = '' ) {
                $users = array();
@@ -137,7 +137,7 @@ class GenderCache {
        /**
         * Preloads genders for given list of users.
         * @param $users List|String: usernames
-        * @param $caller String: the calling method
+        * @param string $caller the calling method
         */
        public function doQuery( $users, $caller = '' ) {
                $default = $this->getDefault();
index 372f983..72a2e8e 100644 (file)
@@ -223,7 +223,7 @@ class LinkBatch {
        /**
         * Construct a WHERE clause which will match all the given titles.
         *
-        * @param $prefix String: the appropriate table's field name prefix ('page', 'pl', etc)
+        * @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.
         */
index 623f545..0e41e26 100644 (file)
@@ -74,11 +74,11 @@ 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 $field String: ('length','redirect','revision','model')
+        * @param string $field ('length','redirect','revision','model')
         * @return mixed
         */
        public function getGoodLinkFieldObj( $title, $field ) {
-               $dbkey = $title->getPrefixedDbKey();
+               $dbkey = $title->getPrefixedDBkey();
                if ( array_key_exists( $dbkey, $this->mGoodLinkFields ) ) {
                        return $this->mGoodLinkFields[$dbkey][$field];
                } else {
@@ -105,7 +105,7 @@ class LinkCache {
         * @param $model Integer: latest revision's content model ID
         */
        public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false, $model = false ) {
-               $dbkey = $title->getPrefixedDbKey();
+               $dbkey = $title->getPrefixedDBkey();
                $this->mGoodLinks[$dbkey] = intval( $id );
                $this->mGoodLinkFields[$dbkey] = array(
                        'length' => intval( $len ),
@@ -122,7 +122,7 @@ class LinkCache {
         *  page_latest and page_content_model
         */
        public function addGoodLinkObjFromRow( $title, $row ) {
-               $dbkey = $title->getPrefixedDbKey();
+               $dbkey = $title->getPrefixedDBkey();
                $this->mGoodLinks[$dbkey] = intval( $row->page_id );
                $this->mGoodLinkFields[$dbkey] = array(
                        'length' => intval( $row->page_len ),
@@ -136,7 +136,7 @@ class LinkCache {
         * @param $title Title
         */
        public function addBadLinkObj( $title ) {
-               $dbkey = $title->getPrefixedDbKey();
+               $dbkey = $title->getPrefixedDBkey();
                if ( !$this->isBadLink( $dbkey ) ) {
                        $this->mBadLinks[$dbkey] = 1;
                }
@@ -150,7 +150,7 @@ class LinkCache {
         * @param $title Title
         */
        public function clearLink( $title ) {
-               $dbkey = $title->getPrefixedDbKey();
+               $dbkey = $title->getPrefixedDBkey();
                unset( $this->mBadLinks[$dbkey] );
                unset( $this->mGoodLinks[$dbkey] );
                unset( $this->mGoodLinkFields[$dbkey] );
@@ -162,7 +162,7 @@ class LinkCache {
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
-        * @param $title String: title to add
+        * @param string $title title to add
         * @return Integer
         */
        public function addLink( $title ) {
index dc3151e..009b950 100644 (file)
@@ -538,7 +538,6 @@ 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.
@@ -915,8 +914,8 @@ class LocalisationCache {
 interface LCStore {
        /**
         * Get a value.
-        * @param $code string Language code
-        * @param $key string Cache key
+        * @param string $code Language code
+        * @param string $key Cache key
         */
        function get( $code, $key );
 
index 89e5325..7425978 100644 (file)
@@ -122,7 +122,7 @@ class MessageCache {
         * Actual format of the file depends on the $wgLocalMessageCacheSerialized
         * setting.
         *
-        * @param $hash String: the hash of contents, to check validity.
+        * @param string $hash the hash of contents, to check validity.
         * @param $code Mixed: Optional language code, see documenation of load().
         * @return bool on failure.
         */
@@ -327,31 +327,39 @@ class MessageCache {
                        $where[] = 'cache is empty';
                        $where[] = 'loading from database';
 
-                       $this->lock( $cacheKey );
+                       if ( $this->lock( $cacheKey ) ) {
+                               $that = $this;
+                               $osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
+                                       $that->unlock( $cacheKey );
+                               } );
+                       }
                        # Limit the concurrency of loadFromDB to a single process
                        # This prevents the site from going down when the cache expires
                        $statusKey = wfMemcKey( 'messages', $code, 'status' );
                        $success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
                        if ( $success ) { // acquired lock
+                               $cache = $this->mMemc;
+                               $isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
+                                       $cache->delete( $statusKey );
+                               } );
                                $cache = $this->loadFromDB( $code );
                                $success = $this->setCache( $cache, $code );
                                if ( $success ) { // messages loaded
                                        $success = $this->saveToCaches( $cache, true, $code );
-                                       if ( $success ) {
-                                               $this->mMemc->delete( $statusKey );
-                                       } else {
+                                       $isc = null; // unlock
+                                       if ( !$success ) {
                                                $this->mMemc->set( $statusKey, 'error', 60 * 5 );
                                                wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
                                                $exception = new MWException( "Could not save cache for '$code'." );
                                        }
                                } else {
-                                       $this->mMemc->delete( $statusKey );
+                                       $isc = null; // unlock
                                        $exception = new MWException( "Could not load cache from DB for '$code'." );
                                }
                        } else {
                                $exception = new MWException( "Could not acquire '$statusKey' lock." );
                        }
-                       $this->unlock( $cacheKey );
+                       $osc = null; // unlock
                }
 
                if ( !$success ) {
@@ -380,7 +388,7 @@ class MessageCache {
         * $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
         * on-demand from the database later.
         *
-        * @param $code String: language code.
+        * @param string $code language code.
         * @return Array: loaded messages for storing in caches.
         */
        function loadFromDB( $code ) {
@@ -460,7 +468,7 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param $title String: name of the page changed.
+        * @param string $title name of the page changed.
         * @param $text Mixed: new contents of the page.
         */
        public function replace( $title, $text ) {
@@ -523,9 +531,9 @@ class MessageCache {
        /**
         * Shortcut to update caches.
         *
-        * @param $cache Array: cached messages with a version.
-        * @param $memc Bool: Wether to update or not memcache.
-        * @param $code String: Language code.
+        * @param array $cache cached messages with a version.
+        * @param bool $memc Wether to update or not memcache.
+        * @param string $code Language code.
         * @return bool on somekind of error.
         */
        protected function saveToCaches( $cache, $memc = true, $code = false ) {
@@ -578,50 +586,70 @@ class MessageCache {
        }
 
        /**
-        * Get a message from either the content language or the user language.
+        * Get a message from either the content language or the user language. The fallback
+        * language order is the users language fallback union the content language fallback.
+        * This list is then applied to find keys in the following order
+        * 1) MediaWiki:$key/$langcode (for every language except the content language where
+        *    we look at MediaWiki:$key)
+        * 2) Built-in messages via the l10n cache which is also in fallback order
         *
-        * @param $key String: the message cache key
-        * @param $useDB Boolean: get the message from the DB, false to use only
-        *               the localisation
-        * @param bool|string $langcode Code of the language to get the message for, if
-        *                  it is a valid code create a language for that language,
-        *                  if it is a string but not a valid code then make a basic
-        *                  language object, if it is a false boolean then use the
-        *                  current users language (as a fallback for the old
-        *                  parameter functionality), or if it is a true boolean
-        *                  then use the wikis content language (also as a
-        *                  fallback).
+        * @param string $key the message cache key
+        * @param $useDB Boolean: If true will look for the message in the DB, false only
+        *        get the message from the DB, false 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 $isFullKey Boolean: specifies whether $key is a two part key
         *                   "msg/lang".
         *
         * @throws MWException
-        * @return string|bool
+        * @return string|bool False if the message doesn't exist, otherwise the message
         */
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
                global $wgLanguageCode, $wgContLang;
 
+               wfProfileIn( __METHOD__ );
+
                if ( is_int( $key ) ) {
                        // "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
                        $key = strval( $key );
                }
 
                if ( !is_string( $key ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Non-string key given' );
                }
 
                if ( strval( $key ) === '' ) {
                        # Shortcut: the empty key is always missing
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
-               $lang = wfGetLangObj( $langcode );
-               if ( !$lang ) {
-                       throw new MWException( "Bad lang code $langcode given" );
-               }
 
-               $langcode = $lang->getCode();
+               # Obtain the initial language object
+               if ( $isFullKey ) {
+                       $keyParts = explode( '/', $key );
+                       if ( count( $keyParts ) < 2 ) {
+                               throw new MWException( "Message key '$key' does not appear to be a full key." );
+                       }
 
-               $message = false;
+                       $langcode = array_pop( $keyParts );
+                       $key = implode( '/', $keyParts );
+               }
+
+               # Obtain a language object for the requested language from the passed language code
+               # Note that the language code could in fact be a language object already but we assume
+               # it's a string further below.
+               $requestedLangObj = wfGetLangObj( $langcode );
+               if ( !$requestedLangObj ) {
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( "Bad lang code $langcode given" );
+               }
+               $langcode = $requestedLangObj->getCode();
 
                # Normalise title-case input (with some inlining)
                $lckey = str_replace( ' ', '_', $key );
@@ -633,24 +661,37 @@ class MessageCache {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
+               # Loop through each language in the fallback list until we find something useful
+               $message = false;
+
                # Try the MediaWiki namespace
-               if( !$this->mDisable && $useDB ) {
-                       $title = $uckey;
-                       if( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
-                               $title .= '/' . $langcode;
+               if ( !$this->mDisable && $useDB ) {
+                       $fallbackChain = Language::getFallbacksIncludingSiteLanguage( $langcode );
+                       array_unshift( $fallbackChain, $langcode );
+
+                       foreach ( $fallbackChain as $langcode ) {
+                               if ( $langcode === $wgLanguageCode ) {
+                                       # Messages created in the content language will not have the /lang extension
+                                       $message = $this->getMsgFromNamespace( $uckey, $langcode );
+                               } else {
+                                       $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+                               }
+
+                               if ( $message !== false ) {
+                                       break;
+                               }
                        }
-                       $message = $this->getMsgFromNamespace( $title, $langcode );
                }
 
                # Try the array in the language object
                if ( $message === false ) {
-                       $message = $lang->getMessage( $lckey );
-                       if ( is_null( $message ) ) {
+                       $message = $requestedLangObj->getMessage( $lckey );
+                       if ( is_null ( $message ) ) {
                                $message = false;
                        }
                }
 
-               # Try the array of another language
+               # If we still have no message, maybe the key was in fact a full key so try that
                if( $message === false ) {
                        $parts = explode( '/', $lckey );
                        # We may get calls for things that are http-urls from sidebar
@@ -664,15 +705,9 @@ class MessageCache {
                        }
                }
 
-               # Is this a custom message? Try the default language in the db...
-               if( ( $message === false || $message === '-' ) &&
-                       !$this->mDisable && $useDB &&
-                       !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
-                       $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
-               }
-
                # Final fallback
                if( $message === false ) {
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -686,6 +721,7 @@ class MessageCache {
                                '&#160;' => "\xc2\xa0",
                        ) );
 
+               wfProfileOut( __METHOD__ );
                return $message;
        }
 
@@ -693,8 +729,8 @@ class MessageCache {
         * Get a message from the MediaWiki namespace, with caching. The key must
         * first be converted to two-part lang/msg form if necessary.
         *
-        * @param $title String: Message cache key with initial uppercase letter.
-        * @param $code String: code denoting the language to try.
+        * @param string $title Message cache key with initial uppercase letter.
+        * @param string $code code denoting the language to try.
         *
         * @return string|bool False on failure
         */
index 784e30e..39bf4c9 100644 (file)
@@ -61,7 +61,7 @@ class SquidUpdate {
                        array( 'page_namespace', 'page_title' ),
                        array(
                                'pl_namespace' => $title->getNamespace(),
-                               'pl_title'     => $title->getDBkey(),
+                               'pl_title' => $title->getDBkey(),
                                'pl_from=page_id' ),
                        __METHOD__ );
                $blurlArr = $title->getSquidURLs();
@@ -254,8 +254,8 @@ class SquidUpdate {
 
        /**
         * Find the HTCP routing rule to use for a given URL.
-        * @param $url string URL to match
-        * @param $rules array Array of rules, see $wgHTCPMulticastRouting for format and behavior
+        * @param string $url URL to match
+        * @param array $rules Array of rules, see $wgHTCPMulticastRouting for format and behavior
         * @return mixed Element of $rules that matched, or false if nothing matched
         */
        static function getRuleForURL( $url, $rules ) {
index 6ec2366..bfbacfa 100644 (file)
@@ -45,7 +45,7 @@ class UserCache {
         * Get a property of a user based on their user ID
         *
         * @param $userId integer User ID
-        * @param $prop string User property
+        * @param string $prop User property
         * @return mixed The property or false if the user does not exist
         */
        public function getProp( $userId, $prop ) {
@@ -60,9 +60,9 @@ class UserCache {
 
        /**
         * Preloads user names for given list of users.
-        * @param $userIds Array List of user IDs
-        * @param $options Array Option flags; include 'userpage' and 'usertalk'
-        * @param $caller String: the calling method
+        * @param array $userIds List of user IDs
+        * @param array $options Option flags; include 'userpage' and 'usertalk'
+        * @param string $caller the calling method
         */
        public function doQuery( array $userIds, $options = array(), $caller = '' ) {
                wfProfileIn( __METHOD__ );
@@ -124,8 +124,8 @@ class UserCache {
         * Check if a cache type is in $options and was not loaded for this user
         *
         * @param $uid integer user ID
-        * @param $type string Cache type
-        * @param $options Array Requested cache types
+        * @param string $type Cache type
+        * @param array $options Requested cache types
         * @return bool
         */
        protected function queryNeeded( $uid, $type, array $options ) {
index bb8b77f..5c7c4f2 100644 (file)
@@ -40,7 +40,6 @@ class RedisConnectionPool {
        protected $connectTimeout; // string; connection timeout
        protected $persistent; // bool; whether connections persist
        protected $password; // string; plaintext auth password
-       protected $poolSize; // integer; maximum number of idle connections
        protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
 
        protected $idlePoolSize = 0; // integer; current idle pool size
@@ -61,10 +60,9 @@ class RedisConnectionPool {
         *                      Optional, default is 1 second.
         *   - persistent     : Set this to true to allow connections to persist across
         *                      multiple web requests. False by default.
-        *   - poolSize       : Maximim number of idle connections. Default is 5.
         *   - password       : The authentication password, will be sent to Redis in clear text.
         *                      Optional, if it is unspecified, no AUTH command will be sent.
-        *   - serializer     : Set to "php" or "igbinary". Default is "php".
+        *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
         * @param array $options
         */
        protected function __construct( array $options ) {
@@ -72,53 +70,58 @@ class RedisConnectionPool {
                        throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
                                'https://github.com/nicolasff/phpredis' );
                }
-               $this->connectTimeout = isset( $options['connectTimeout'] )
-                       ? $options['connectTimeout']
-                       : 1;
-               $this->persistent = isset( $options['persistent'] )
-                       ? $options['persistent']
-                       : false;
-               $this->password = isset( $options['password'] )
-                       ? $options['password']
-                       : '';
-               $this->poolSize = isset( $options['poolSize'] )
-                       ? $options['poolSize']
-                       : 5;
+               $this->connectTimeout = $options['connectTimeout'];
+               $this->persistent = $options['persistent'];
+               $this->password = $options['password'];
                if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
                        $this->serializer = Redis::SERIALIZER_PHP;
                } elseif ( $options['serializer'] === 'igbinary' ) {
                        $this->serializer = Redis::SERIALIZER_IGBINARY;
+               } elseif ( $options['serializer'] === 'none' ) {
+                       $this->serializer = Redis::SERIALIZER_NONE;
                } else {
                        throw new MWException( "Invalid serializer specified." );
                }
        }
 
+       /**
+        * @param $options Array
+        * @return Array
+        */
+       protected static function applyDefaultConfig( array $options ) {
+               if ( !isset( $options['connectTimeout'] ) ) {
+                       $options['connectTimeout'] = 1;
+               }
+               if ( !isset( $options['persistent'] ) ) {
+                       $options['persistent'] = false;
+               }
+               if ( !isset( $options['password'] ) ) {
+                       $options['password'] = null;
+               }
+               return $options;
+       }
+
        /**
         * @param $options Array
         * @return RedisConnectionPool
         */
        public static function singleton( array $options ) {
+               $options = self::applyDefaultConfig( $options );
                // Map the options to a unique hash...
-               $poolOptions = $options;
-               unset( $poolOptions['poolSize'] ); // avoid pool fragmentation
-               ksort( $poolOptions ); // normalize to avoid pool fragmentation
-               $id = sha1( serialize( $poolOptions ) );
+               ksort( $options ); // normalize to avoid pool fragmentation
+               $id = sha1( serialize( $options ) );
                // Initialize the object at the hash as needed...
                if ( !isset( self::$instances[$id] ) ) {
                        self::$instances[$id] = new self( $options );
                        wfDebug( "Creating a new " . __CLASS__ . " instance with id $id." );
                }
-               // Simply grow the pool size if the existing one is too small
-               $psize = isset( $options['poolSize'] ) ? $options['poolSize'] : 1; // size requested
-               self::$instances[$id]->poolSize = max( $psize, self::$instances[$id]->poolSize );
-
                return self::$instances[$id];
        }
 
        /**
         * Get a connection to a redis server. Based on code in RedisBagOStuff.php.
         *
-        * @param $server string A hostname/port combination or the absolute path of a UNIX socket.
+        * @param string $server A hostname/port combination or the absolute path of a UNIX socket.
         *                       If a hostname is specified but no port, port 6379 will be used.
         * @return RedisConnRef|bool Returns false on failure
         * @throws MWException
@@ -231,16 +234,16 @@ class RedisConnectionPool {
         * @return void
         */
        protected function closeExcessIdleConections() {
-               if ( $this->idlePoolSize <= $this->poolSize ) {
-                       return; // nothing to do
+               if ( $this->idlePoolSize <= count( $this->connections ) ) {
+                       return; // nothing to do (no more connections than servers)
                }
 
                foreach ( $this->connections as $server => &$serverConnections ) {
                        foreach ( $serverConnections as $key => &$connection ) {
                                if ( $connection['free'] ) {
                                        unset( $serverConnections[$key] );
-                                       if ( --$this->idlePoolSize <= $this->poolSize ) {
-                                               return; // done
+                                       if ( --$this->idlePoolSize <= count( $this->connections ) ) {
+                                               return; // done (no more connections than servers)
                                        }
                                }
                        }
@@ -254,15 +257,14 @@ class RedisConnectionPool {
         * object and let it be reopened during the next request.
         *
         * @param $server string
-        * @param $conn RedisConnRef
+        * @param $cref RedisConnRef
         * @param $e RedisException
         * @return void
         */
-       public function handleException( $server, RedisConnRef $conn, RedisException $e ) {
-               wfDebugLog( 'redis',
-                       "Redis exception on server $server: " . $e->getMessage() . "\n" );
+       public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
+               wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
                foreach ( $this->connections[$server] as $key => $connection ) {
-                       if ( $connection['conn'] === $conn ) {
+                       if ( $cref->isConnIdentical( $connection['conn'] ) ) {
                                $this->idlePoolSize -= $connection['free'] ? 1 : 0;
                                unset( $this->connections[$server][$key] );
                                break;
@@ -280,12 +282,11 @@ class RedisConnectionPool {
 class RedisConnRef {
        /** @var RedisConnectionPool */
        protected $pool;
-
-       protected $server; // string
-
        /** @var Redis */
        protected $conn;
 
+       protected $server; // string
+
        /**
         * @param $pool RedisConnectionPool
         * @param $server string
@@ -301,6 +302,10 @@ class RedisConnRef {
                return call_user_func_array( array( $this->conn, $name ), $arguments );
        }
 
+       public function isConnIdentical( Redis $conn ) {
+               return $this->conn === $conn;
+       }
+
        function __destruct() {
                $this->pool->freeConnection( $this->server, $this->conn );
        }
index e14fb56..137efb8 100644 (file)
@@ -203,7 +203,6 @@ abstract class AbstractContent implements Content {
                return $this->getNativeData() === $that->getNativeData();
        }
 
-
        /**
         * Returns a list of DataUpdate objects for recording information about this
         * Content in some secondary data store.
@@ -243,7 +242,6 @@ abstract class AbstractContent implements Content {
                return $parserOutput->getSecondaryDataUpdates( $title, $recursive );
        }
 
-
        /**
         * @see Content::getRedirectChain
         *
@@ -424,8 +422,8 @@ abstract class AbstractContent implements Content {
         * This base implementation calls the hook ConvertContent to enable custom conversions.
         * Subclasses may override this to implement conversion for "their" content model.
         *
-        * @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
+        * @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 A content object with the content model $toModel, or false if
index 31345af..9b59a27 100644 (file)
@@ -65,7 +65,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $maxLength int Maximum length of the summary text
+        * @param int $maxLength Maximum length of the summary text
         * @return string The summary text
         */
        public function getTextForSummary( $maxLength = 250 );
@@ -148,7 +148,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $format string The format to check
+        * @param string $format The format to check
         * @return bool Whether the format is supported
         */
        public function isSupportedFormat( $format );
@@ -240,7 +240,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $hasLinks Bool: If it is known whether this content contains
+        * @param bool $hasLinks If it is known whether this content contains
         *    links, provide this information here, to avoid redundant parsing to
         *    find out.
         * @return boolean
@@ -335,7 +335,7 @@ interface Content {
         * target is hit in order to provide (hopefully) the Title of the final
         * destination instead of another redirect.
         *
-        * There is usually no need to override the default behaviour, subclasses that
+        * There is usually no need to override the default behavior, subclasses that
         * want to implement redirects should override getRedirectTarget().
         *
         * @since 1.21
@@ -371,7 +371,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $sectionId string The section's ID, given as a numeric string.
+        * @param string $sectionId The section's ID, given as a numeric string.
         *    The ID "0" retrieves the section before the first heading, "1" the
         *    text between the first heading (included) and the second heading
         *    (excluded), etc.
@@ -388,7 +388,7 @@ interface Content {
         *
         * @param $section null/false or a section number (0, 1, 2, T1, T2...), or "new"
         * @param $with Content: new content of the section
-        * @param $sectionTitle String: new section's subject, only if $section is 'new'
+        * @param string $sectionTitle new section's subject, only if $section is 'new'
         * @return string Complete article text, or null if error
         */
        public function replaceSection( $section, Content $with, $sectionTitle = '' );
@@ -491,8 +491,8 @@ interface Content {
         * Converts this content object into another content object with the given content model,
         * if that is possible.
         *
-        * @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
+        * @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 A content object with the content model $toModel, or false if
index 5e0447f..9c20195 100644 (file)
@@ -83,7 +83,7 @@ abstract class ContentHandler {
         *   form of the content.
         * - If $wgContentHandlerTextFallback is 'ignore' and $content is not a
         *   TextContent object, this method returns null.
-        * - otherwise, the behaviour is undefined.
+        * - otherwise, the behavior is undefined.
         *
         * @since 1.21
         *
@@ -129,7 +129,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $text string the textual representation, will be
+        * @param string $text the textual representation, will be
         *    unserialized to create the Content object
         * @param $title null|Title the title of the page this text belongs to.
         *    Required if $modelId is not provided.
@@ -141,7 +141,7 @@ abstract class ContentHandler {
         * @throws MWException
         * @return Content a Content object representing $text
         *
-        * @throw MWException if $model or $format is not supported or if $text can
+        * @throws MWException if $model or $format is not supported or if $text can
         *    not be unserialized using $format.
         */
        public static function makeContent( $text, Title $title = null,
@@ -300,7 +300,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $modelId String The ID of the content model for which to get a
+        * @param string $modelId The ID of the content model for which to get a
         *    handler. Use CONTENT_MODEL_XXX constants.
         * @return ContentHandler The ContentHandler singleton for handling the
         *    model given by $modelId
@@ -347,7 +347,7 @@ abstract class ContentHandler {
         * Model names are localized using system messages. Message keys
         * have the form content-model-$name, where $name is getContentModelName( $id ).
         *
-        * @param $name String The content model ID, as given by a CONTENT_MODEL_XXX
+        * @param string $name The content model ID, as given by a CONTENT_MODEL_XXX
         *    constant or returned by Revision::getContentModel().
         *
         * @return string The content format's localized name.
@@ -391,8 +391,8 @@ abstract class ContentHandler {
         * and a list of supported formats. Values for the parameters are typically
         * provided as literals by subclass's constructors.
         *
-        * @param $modelId String (use CONTENT_MODEL_XXX constants).
-        * @param $formats array List for supported serialization formats
+        * @param string $modelId (use CONTENT_MODEL_XXX constants).
+        * @param array $formats List for supported serialization formats
         *    (typically as MIME types)
         */
        public function __construct( $modelId, $formats ) {
@@ -420,7 +420,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $blob string serialized form of the content
+        * @param string $blob serialized form of the content
         * @param $format null|String the format used for serialization
         * @return Content the Content object created by deserializing $blob
         */
@@ -474,7 +474,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param String $model_id The model to check
+        * @param string $model_id The model to check
         *
         * @throws MWException
         */
@@ -523,7 +523,7 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @param $format string the serialization format to check
+        * @param string $format the serialization format to check
         * @return bool
         */
        public function isSupportedFormat( $format ) {
@@ -540,7 +540,7 @@ abstract class ContentHandler {
         * Convenient for checking whether a format provided as a parameter is
         * actually supported.
         *
-        * @param $format string the serialization format to check
+        * @param string $format the serialization format to check
         *
         * @throws MWException
         */
@@ -575,7 +575,7 @@ abstract class ContentHandler {
         * @param $context IContextSource context to use, anything else will be
         *    ignored
         * @param $old Integer Old ID we want to show and diff with.
-        * @param $new int|string String either 'prev' or 'next'.
+        * @param int|string $new String either 'prev' or 'next'.
         * @param $rcid Integer ??? FIXME (default 0)
         * @param $refreshCache boolean If set, refreshes the diff cache
         * @param $unhide boolean If set, allow viewing deleted revs
@@ -712,7 +712,7 @@ abstract class ContentHandler {
         *
         * @param $oldContent Content|null: the previous text of the page.
         * @param $newContent Content|null: The submitted text of the page.
-        * @param $flags int Bit mask: a bit mask of flags submitted for the edit.
+        * @param int $flags Bit mask: a bit mask of flags submitted for the edit.
         *
         * @return string An appropriate auto-summary, or an empty string.
         */
@@ -997,10 +997,10 @@ abstract class ContentHandler {
         * Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
         * self::$enableDeprecationWarnings is set to true.
         *
-        * @param String      $func The name of the deprecated function
+        * @param string      $func The name of the deprecated function
         * @param string      $version The version since the method is deprecated. Usually 1.21
         *                    for ContentHandler related stuff.
-        * @param String|bool $component: Component to which the function belongs.
+        * @param string|bool $component: Component to which the function belongs.
         *                                If false, it is assumed the function is in MediaWiki core.
         *
         * @see ContentHandler::$enableDeprecationWarnings
@@ -1019,9 +1019,9 @@ abstract class ContentHandler {
         * hook function, a new Content object is constructed from the new
         * text.
         *
-        * @param $event String: event name
-        * @param $args Array: parameters passed to hook functions
-        * @param $warn bool: whether to log a warning.
+        * @param string $event event name
+        * @param array $args parameters passed to hook functions
+        * @param bool $warn whether to log a warning.
         *                    Default to self::$enableDeprecationWarnings.
         *                    May be set to false for testing.
         *
@@ -1050,8 +1050,6 @@ abstract class ContentHandler {
                        wfSuppressWarnings();
 
                        foreach ( $handlers as $handler ) {
-                               $info = '';
-
                                if ( is_array( $handler ) ) {
                                        if ( is_object( $handler[0] ) ) {
                                                $info = get_class( $handler[0] );
index 3d4eb24..75f1aa0 100644 (file)
@@ -54,7 +54,6 @@ class CssContent extends TextContent {
                return new CssContent( $pst );
        }
 
-
        protected function getHtml( ) {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
index 7508079..5221168 100644 (file)
@@ -55,7 +55,6 @@ class JavaScriptContent extends TextContent {
                return new JavaScriptContent( $pst );
        }
 
-
        protected function getHtml( ) {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
index 0f7a531..91ba6ef 100644 (file)
@@ -81,7 +81,7 @@ class TextContent extends AbstractContent {
         * Returns true if this content is not a redirect, and $wgArticleCountMethod
         * is "any".
         *
-        * @param $hasLinks Bool: if it is known whether this content contains links,
+        * @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 True if the content is countable
@@ -173,28 +173,29 @@ class TextContent extends AbstractContent {
 
                # @todo: could implement this in DifferenceEngine and just delegate here?
 
-               if ( !$lang ) $lang = $wgContLang;
+               if ( !$lang ) {
+                       $lang = $wgContLang;
+               }
 
                $otext = $this->getNativeData();
                $ntext = $this->getNativeData();
 
                # Note: Use native PHP diff, external engines don't give us abstract output
-               $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) );
-               $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
+               $ota = explode( "\n", $lang->segmentForDiff( $otext ) );
+               $nta = explode( "\n", $lang->segmentForDiff( $ntext ) );
 
                $diff = new Diff( $ota, $nta );
                return $diff;
        }
 
-
        /**
         * Returns a generic ParserOutput object, wrapping the HTML returned by
         * getHtml().
         *
         * @param $title Title Context title for parsing
-        * @param $revId int|null Revision ID (for {{REVISIONID}})
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
         * @param $options ParserOptions|null Parser options
-        * @param $generateHtml bool Whether or not to generate HTML
+        * @param bool $generateHtml Whether or not to generate HTML
         *
         * @return ParserOutput representing the HTML form of the text
         */
@@ -258,8 +259,8 @@ class TextContent extends AbstractContent {
         * This implementation provides lossless conversion between content models based
         * on TextContent.
         *
-        * @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
+        * @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 A content object with the content model $toModel, or false if
index 89aac20..7d3cd37 100644 (file)
@@ -219,7 +219,7 @@ class WikitextContent extends TextContent {
         * Returns true if this content is not a redirect, and this content's text
         * is countable according to the criteria defined by $wgArticleCountMethod.
         *
-        * @param $hasLinks Bool  if it is known whether this content contains
+        * @param bool $hasLinks  if it is known whether this content contains
         *    links, provide this information here, to avoid redundant parsing to
         *    find out (default: null).
         * @param $title Title: (default: null)
@@ -278,9 +278,9 @@ class WikitextContent extends TextContent {
         * @since    1.21
         *
         * @param $title Title
-        * @param $revId int Revision to pass to the parser (default: null)
+        * @param int $revId Revision to pass to the parser (default: null)
         * @param $options ParserOptions (default: null)
-        * @param $generateHtml bool (default: false)
+        * @param bool $generateHtml (default: false)
         *
         * @internal param \IContextSource|null $context
         * @return ParserOutput representing the HTML form of the text
index f78ccbb..e1dcc66 100644 (file)
@@ -49,7 +49,6 @@ class WikitextContentHandler extends TextContentHandler {
                return new WikitextContent( '' );
        }
 
-
        /**
         * Returns a WikitextContent object representing a redirect to the given destination page.
         *
index 4a02f0b..33f51cb 100644 (file)
@@ -164,4 +164,15 @@ abstract class ContextSource implements IContextSource {
                $args = func_get_args();
                return call_user_func_array( array( $this->getContext(), 'msg' ), $args );
        }
+
+       /**
+        * Export the resolved user IP, HTTP headers, user ID, and session ID.
+        * The result will be reasonably sized to allow for serialization.
+        *
+        * @return Array
+        * @since 1.21
+        */
+       public function exportSession() {
+               return $this->getContext()->exportSession();
+       }
 }
index 0399081..c7b221b 100644 (file)
@@ -105,4 +105,13 @@ interface IContextSource {
         * @return Message
         */
        public function msg();
+
+       /**
+        * Export the resolved user IP, HTTP headers, user ID, and session ID.
+        * The result will be reasonably sized to allow for serialization.
+        *
+        * @return Array
+        * @since 1.21
+        */
+       public function exportSession();
 }
index 09cb409..6aefc98 100644 (file)
@@ -392,6 +392,96 @@ class RequestContext implements IContextSource {
                return $instance;
        }
 
+       /**
+        * Export the resolved user IP, HTTP headers, user ID, and session ID.
+        * The result will be reasonably sized to allow for serialization.
+        *
+        * @return Array
+        * @since 1.21
+        */
+       public function exportSession() {
+               return array(
+                       'ip'        => $this->getRequest()->getIP(),
+                       'headers'   => $this->getRequest()->getAllHeaders(),
+                       'sessionId' => session_id(),
+                       'userId'    => $this->getUser()->getId()
+               );
+       }
+
+       /**
+        * Import the resolved user IP, HTTP headers, user ID, and session ID.
+        * This sets the current session and sets $wgUser and $wgRequest.
+        * Once the return value falls out of scope, the old context is restored.
+        * This function can only be called within CLI mode scripts.
+        *
+        * This will setup the session from the given ID. This is useful when
+        * background scripts inherit context when acting on behalf of a user.
+        *
+        * $param array $params Result of RequestContext::exportSession()
+        * @return ScopedCallback
+        * @throws MWException
+        * @since 1.21
+        */
+       public static function importScopedSession( array $params ) {
+               if ( PHP_SAPI !== 'cli' ) {
+                       // Don't send random private cookies or turn $wgRequest into FauxRequest
+                       throw new MWException( "Sessions can only be imported in cli mode." );
+               } elseif ( !strlen( $params['sessionId'] ) ) {
+                       throw new MWException( "No session ID was specified." );
+               }
+
+               if ( $params['userId'] ) { // logged-in user
+                       $user = User::newFromId( $params['userId'] );
+                       if ( !$user ) {
+                               throw new MWException( "No user with ID '{$params['userId']}'." );
+                       }
+               } elseif ( !IP::isValid( $params['ip'] ) ) {
+                       throw new MWException( "Could not load user '{$params['ip']}'." );
+               } else { // anon user
+                       $user = User::newFromName( $params['ip'], false );
+               }
+
+               $importSessionFunction = function( User $user, array $params ) {
+                       global $wgRequest, $wgUser;
+
+                       $context = RequestContext::getMain();
+                       // Commit and close any current session
+                       session_write_close(); // persist
+                       session_id( '' ); // detach
+                       $_SESSION = array(); // clear in-memory array
+                       // Remove any user IP or agent information
+                       $context->setRequest( new FauxRequest() );
+                       $wgRequest = $context->getRequest(); // b/c
+                       // Now that all private information is detached from the user, it should
+                       // be safe to load the new user. If errors occur or an exception is thrown
+                       // and caught (leaving the main context in a mixed state), there is no risk
+                       // of the User object being attached to the wrong IP, headers, or session.
+                       $context->setUser( $user );
+                       $wgUser = $context->getUser(); // b/c
+                       if ( strlen( $params['sessionId'] ) ) { // don't make a new random ID
+                               wfSetupSession( $params['sessionId'] ); // sets $_SESSION
+                       }
+                       $request = new FauxRequest( array(), false, $_SESSION );
+                       $request->setIP( $params['ip'] );
+                       foreach ( $params['headers'] as $name => $value ) {
+                               $request->setHeader( $name, $value );
+                       }
+                       // Set the current context to use the new WebRequest
+                       $context->setRequest( $request );
+                       $wgRequest = $context->getRequest(); // b/c
+               };
+
+               // Stash the old session and load in the new one
+               $oUser = self::getMain()->getUser();
+               $oParams = self::getMain()->exportSession();
+               $importSessionFunction( $user, $params );
+
+               // Set callback to save and close the new session and reload the old one
+               return new ScopedCallback( function() use ( $importSessionFunction, $oUser, $oParams ) {
+                       $importSessionFunction( $oUser, $oParams );
+               } );
+       }
+
        /**
         * Create a new extraneous context. The context is filled with information
         * external to the current session.
index 20cf5b4..6c009de 100644 (file)
@@ -36,7 +36,7 @@ abstract class DBAccessBase implements IDBAccessObject {
        protected $wiki = false;
 
        /**
-        * @param String|bool $wiki The target wiki's name. This must be an ID
+        * @param string|bool $wiki The target wiki's name. This must be an ID
         * that LBFactory can understand.
         */
        public function __construct( $wiki = false ) {
index f847b98..4eb6ff3 100644 (file)
@@ -46,7 +46,7 @@
  */
 interface IDBAccessObject {
        // Constants for object loading bitfield flags (higher => higher QoS)
-       const READ_LATEST  = 1; // read from the master
+       const READ_LATEST = 1; // read from the master
        const READ_LOCKING = 3; // READ_LATEST and "FOR UPDATE"
 
        // Convenience constant for callers to explicitly request slave data
index 56717b6..4e44374 100644 (file)
@@ -60,9 +60,9 @@ class CloneDatabase {
         * Constructor
         *
         * @param $db DatabaseBase A database subclass
-        * @param $tablesToClone Array An array of tables to clone, unprefixed
-        * @param $newTablePrefix String Prefix to assign to the tables
-        * @param $oldTablePrefix String Prefix on current tables, if not $wgDBprefix
+        * @param array $tablesToClone An array of tables to clone, unprefixed
+        * @param string $newTablePrefix Prefix to assign to the tables
+        * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
         * @param $dropCurrentTables bool
         */
        public function __construct( DatabaseBase $db, array $tablesToClone,
@@ -77,7 +77,7 @@ class CloneDatabase {
 
        /**
         * Set whether to use temporary tables or not
-        * @param $u Bool Use temporary tables when cloning the structure
+        * @param bool $u Use temporary tables when cloning the structure
         */
        public function useTemporaryTables( $u = true ) {
                $this->useTemporaryTables = $u;
@@ -112,7 +112,7 @@ class CloneDatabase {
 
        /**
         * Change the prefix back to the original.
-        * @param $dropTables bool Optionally drop the tables we created
+        * @param bool $dropTables Optionally drop the tables we created
         */
        public function destroy( $dropTables = false ) {
                if( $dropTables ) {
index 05a0ca0..65a74ab 100644 (file)
@@ -49,10 +49,10 @@ interface DatabaseType {
        /**
         * Open a connection to the database. Usually aborts on failure
         *
-        * @param $server String: database server host
-        * @param $user String: database user name
-        * @param $password String: database user password
-        * @param $dbName String: 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
         */
@@ -151,8 +151,8 @@ interface DatabaseType {
         * mysql_fetch_field() wrapper
         * Returns false if the field doesn't exist
         *
-        * @param $table string: table name
-        * @param $field string: field name
+        * @param string $table table name
+        * @param string $field field name
         *
         * @return Field
         */
@@ -160,9 +160,9 @@ interface DatabaseType {
 
        /**
         * Get information about an index into an object
-        * @param $table string: Table name
-        * @param $index string: Index name
-        * @param $fname string: Calling function name
+        * @param string $table Table name
+        * @param string $index Index name
+        * @param string $fname Calling function name
         * @return Mixed: Database-specific index description class or false if the index does not exist
         */
        function indexInfo( $table, $index, $fname = 'Database::indexInfo' );
@@ -178,7 +178,7 @@ interface DatabaseType {
        /**
         * Wrapper for addslashes()
         *
-        * @param $s string: to be slashed.
+        * @param string $s to be slashed.
         * @return string: slashed string.
         */
        function strencode( $s );
@@ -282,7 +282,6 @@ abstract class DatabaseBase implements DatabaseType {
         */
        protected $fileHandle = null;
 
-
 # ------------------------------------------------------------------------------
 # Accessors
 # ------------------------------------------------------------------------------
@@ -370,7 +369,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Historically, transactions were allowed to be "nested". This is no
         * longer supported, so this function really only returns a boolean.
         *
-        * @param $level int An integer (0 or 1), or omitted to leave it unchanged.
+        * @param int $level An integer (0 or 1), or omitted to leave it unchanged.
         * @return int The previous value
         */
        public function trxLevel( $level = null ) {
@@ -379,7 +378,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Get/set the number of errors logged. Only useful when errors are ignored
-        * @param $count int The count to set, or omitted to leave it unchanged.
+        * @param int $count The count to set, or omitted to leave it unchanged.
         * @return int The error count
         */
        public function errorCount( $count = null ) {
@@ -388,7 +387,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Get/set the table prefix.
-        * @param $prefix string The table prefix to set, or omitted to leave it unchanged.
+        * @param string $prefix The table prefix to set, or omitted to leave it unchanged.
         * @return string The previous table prefix.
         */
        public function tablePrefix( $prefix = null ) {
@@ -408,7 +407,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Get properties passed down from the server info array of the load
         * balancer.
         *
-        * @param $name string The entry of the info array to get, or null to get the
+        * @param string $name The entry of the info array to get, or null to get the
         *   whole array
         *
         * @return LoadBalancer|null
@@ -491,7 +490,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns true if this database uses timestamps rather than integers
         *
         * @return bool
-       */
+        */
        public function realTimestamps() {
                return false;
        }
@@ -655,12 +654,12 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Constructor.
-        * @param $server String: database server host
-        * @param $user String: database user name
-        * @param $password String: database user password
-        * @param $dbName String: 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
         * @param $flags
-        * @param $tablePrefix String: database table prefixes. By default use the prefix gave in LocalSettings.php
+        * @param string $tablePrefix database table prefixes. By default use the prefix gave in LocalSettings.php
         */
        function __construct( $server = false, $user = false, $password = false, $dbName = false,
                $flags = 0, $tablePrefix = 'get from global'
@@ -721,14 +720,14 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @since 1.18
         *
-        * @param $dbType String A possible DB type
-        * @param $p Array An array of options to pass to the constructor.
+        * @param string $dbType A possible DB type
+        * @param array $p An array of options to pass to the constructor.
         *    Valid options are: host, user, password, dbname, flags, tablePrefix
         * @return DatabaseBase subclass or null
         */
        final public static function factory( $dbType, $p = array() ) {
                $canonicalDBTypes = array(
-                       'mysql', 'postgres', 'sqlite', 'oracle', 'mssql', 'ibm_db2'
+                       'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
                );
                $dbType = strtolower( $dbType );
                $class = 'Database' . ucfirst( $dbType );
@@ -816,7 +815,7 @@ abstract class DatabaseBase implements DatabaseType {
        abstract protected function closeConnection();
 
        /**
-        * @param $error String: fallback error message, used if none is given by DB
+        * @param string $error fallback error message, used if none is given by DB
         * @throws DBConnectionError
         */
        function reportConnectionError( $error = 'Unknown error' ) {
@@ -1050,7 +1049,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Execute a prepared query with the various arguments
-        * @param $prepared String: the prepared sql
+        * @param string $prepared the prepared sql
         * @param $args Mixed: Either an array here, or put scalars as varargs
         *
         * @return ResultWrapper
@@ -1070,8 +1069,8 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * For faking prepared SQL statements on DBs that don't support it directly.
         *
-        * @param $preparedQuery String: a 'preparable' SQL statement
-        * @param $args Array of arguments to fill it with
+        * @param string $preparedQuery a 'preparable' SQL statement
+        * @param array $args of arguments to fill it with
         * @return string executable SQL
         */
        public function fillPrepared( $preparedQuery, $args ) {
@@ -1128,12 +1127,12 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * If no result rows are returned from the query, false is returned.
         *
-        * @param $table string|array Table name. See DatabaseBase::select() for details.
-        * @param $var string The field name to select. This must be a valid SQL
+        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string $var The field name to select. This must be a valid SQL
         *   fragment: do not use unvalidated user input.
-        * @param $cond string|array The condition array. See DatabaseBase::select() for details.
-        * @param $fname string The function name of the caller.
-        * @param $options string|array The query options. See DatabaseBase::select() for details.
+        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string $fname The function name of the caller.
+        * @param string|array $options The query options. See DatabaseBase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
@@ -1165,7 +1164,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query.
         *
-        * @param $options Array: associative array of options to be turned into
+        * @param array $options associative array of options to be turned into
         *              an SQL query, valid keys are listed in the function.
         * @return Array
         * @see DatabaseBase::select()
@@ -1249,7 +1248,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Returns an optional GROUP BY with an optional HAVING
         *
-        * @param $options Array: associative array of options
+        * @param array $options associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1274,7 +1273,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Returns an optional ORDER BY
         *
-        * @param $options Array: associative array of options
+        * @param array $options associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1293,11 +1292,11 @@ abstract class DatabaseBase implements DatabaseType {
         * Execute a SELECT query constructed using the various parameters provided.
         * See below for full details of the parameters.
         *
-        * @param $table String|Array Table name
-        * @param $vars String|Array Field names
-        * @param $conds String|Array Conditions
-        * @param $fname String Caller function name
-        * @param $options Array Query options
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param string|array $conds Conditions
+        * @param string $fname Caller function name
+        * @param array $options Query options
         * @param $join_conds Array Join conditions
         *
         * @param $table string|array
@@ -1441,11 +1440,11 @@ abstract class DatabaseBase implements DatabaseType {
         * doing UNION queries, where the SQL text of each query is needed. In general,
         * however, callers outside of Database classes should just use select().
         *
-        * @param $table string|array Table name
-        * @param $vars string|array Field names
-        * @param $conds string|array Conditions
-        * @param $fname string Caller function name
-        * @param $options string|array Query options
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param string|array $conds Conditions
+        * @param string $fname Caller function name
+        * @param string|array $options Query options
         * @param $join_conds string|array Join conditions
         *
         * @return string SQL query string.
@@ -1509,11 +1508,11 @@ abstract class DatabaseBase implements DatabaseType {
         * that a single row object is returned. If the query returns no rows,
         * false is returned.
         *
-        * @param $table string|array Table name
-        * @param $vars string|array Field names
-        * @param $conds array Conditions
-        * @param $fname string Caller function name
-        * @param $options string|array Query options
+        * @param string|array $table Table name
+        * @param string|array $vars Field names
+        * @param array $conds Conditions
+        * @param string $fname Caller function name
+        * @param string|array $options Query options
         * @param $join_conds array|string Join conditions
         *
         * @return object|bool
@@ -1551,11 +1550,11 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * Takes the same arguments as DatabaseBase::select().
         *
-        * @param $table String: table name
-        * @param Array|string $vars : unused
-        * @param Array|string $conds : filters on the table
-        * @param $fname String: function name for profiling
-        * @param $options Array: options for select
+        * @param string $table table name
+        * @param array|string $vars : unused
+        * @param array|string $conds : filters on the table
+        * @param string $fname function name for profiling
+        * @param array $options options for select
         * @return Integer: row count
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -1576,7 +1575,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Removes most variables from an SQL query and replaces them with X or N for numbers.
         * It's only slightly flawed. Don't use for anything important.
         *
-        * @param $sql String A SQL Query
+        * @param string $sql A SQL Query
         *
         * @return string
         */
@@ -1603,9 +1602,9 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Determines whether a field exists in a table
         *
-        * @param $table String: table name
-        * @param $field String: filed to check on that table
-        * @param $fname String: calling function name (optional)
+        * @param string $table table name
+        * @param string $field filed to check on that table
+        * @param string $fname calling function name (optional)
         * @return Boolean: whether $table has filed $field
         */
        public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
@@ -1726,7 +1725,7 @@ abstract class DatabaseBase implements DatabaseType {
         *                 DatabaseBase::tableName().
         * @param $a       Array of rows to insert
         * @param $fname   String Calling function name (use __METHOD__) for logs/profiling
-        * @param $options Array of options
+        * @param array $options of options
         *
         * @return bool
         */
@@ -1785,7 +1784,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Make UPDATE options for the DatabaseBase::update function
         *
-        * @param $options Array: The options passed to DatabaseBase::update
+        * @param array $options The options passed to DatabaseBase::update
         * @return string
         */
        protected function makeUpdateOptions( $options ) {
@@ -1812,7 +1811,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $table  String name of the table to UPDATE. This will be passed through
         *                DatabaseBase::tableName().
         *
-        * @param $values Array:  An array of values to SET. For each array element,
+        * @param array $values  An array of values to SET. For each array element,
         *                the key gives the field name, and the value gives the data
         *                to set that field to. The data will be quoted by
         *                DatabaseBase::addQuotes().
@@ -1824,7 +1823,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname  String: The function name of the caller (from __METHOD__),
         *                for logging and profiling.
         *
-        * @param $options Array: An array of UPDATE options, can be:
+        * @param array $options An array of UPDATE options, can be:
         *                   - IGNORE: Ignore unique key conflicts
         *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
         * @return Boolean
@@ -1843,7 +1842,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Makes an encoded list of strings from an array
-        * @param $a Array containing the data
+        * @param array $a containing the data
         * @param int $mode Constant
         *      - LIST_COMMA:          comma separated, no field names
         *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
@@ -1914,10 +1913,10 @@ abstract class DatabaseBase implements DatabaseType {
         * Build a partial where clause from a 2-d array such as used for LinkBatch.
         * The keys on each level may be either integers or strings.
         *
-        * @param $data Array: organized as 2-d
+        * @param array $data organized as 2-d
         *              array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
-        * @param $baseKey String: field name to match the base-level keys to (eg 'pl_namespace')
-        * @param $subKey String: field name to match the sub-level keys to (eg 'pl_title')
+        * @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.
         */
        public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
@@ -1979,7 +1978,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Build a concatenation list to feed into a SQL query
-        * @param $stringList Array: list of raw SQL expressions; caller is responsible for any quoting
+        * @param array $stringList list of raw SQL expressions; caller is responsible for any quoting
         * @return String
         */
        public function buildConcat( $stringList ) {
@@ -2027,8 +2026,8 @@ abstract class DatabaseBase implements DatabaseType {
         * themselves. Pass the canonical name to such functions. This is only needed
         * when calling query() directly.
         *
-        * @param $name String: database table name
-        * @param $format String One of:
+        * @param string $name database table name
+        * @param string $format One of:
         *   quoted - Automatically pass the table name through addIdentifierQuotes()
         *            so that it can be used in a query.
         *   raw - Do not add identifier quotes to the table name
@@ -2070,7 +2069,7 @@ abstract class DatabaseBase implements DatabaseType {
                                && in_array( $table, $wgSharedTables ) # A shared table is selected
                        ) {
                                $database = $wgSharedDB;
-                               $prefix   = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
+                               $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
                        } else {
                                $database = null;
                                $prefix = $this->mTablePrefix; # Default prefix
@@ -2142,8 +2141,8 @@ abstract class DatabaseBase implements DatabaseType {
         * Get an aliased table name
         * e.g. tableName AS newTableName
         *
-        * @param $name string Table name, see tableName()
-        * @param $alias string|bool Alias (optional)
+        * @param string $name Table name, see tableName()
+        * @param string|bool $alias Alias (optional)
         * @return string SQL name for aliased table. Will not alias a table to its own name
         */
        public function tableNameWithAlias( $name, $alias = false ) {
@@ -2175,8 +2174,8 @@ abstract class DatabaseBase implements DatabaseType {
         * Get an aliased field name
         * e.g. fieldName AS newFieldName
         *
-        * @param $name string Field name
-        * @param $alias string|bool Alias (optional)
+        * @param string $name Field name
+        * @param string|bool $alias Alias (optional)
         * @return string SQL name for aliased field. Will not alias a field to its own name
         */
        public function fieldNameWithAlias( $name, $alias = false ) {
@@ -2208,7 +2207,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Get the aliased table name clause for a FROM clause
         * which might have a JOIN and/or USE INDEX clause
         *
-        * @param $tables array ( [alias] => table )
+        * @param array $tables ( [alias] => table )
         * @param $use_index array Same as for select()
         * @param $join_conds array Same as for select()
         * @return string
@@ -2439,12 +2438,12 @@ abstract class DatabaseBase implements DatabaseType {
         * to collide. However if you do this, you run the risk of encountering
         * errors which wouldn't have occurred in MySQL.
         *
-        * @param $table String: The table to replace the row(s) in.
-        * @param $rows array Can be either a single row to insert, or multiple rows,
+        * @param string $table The table to replace the row(s) in.
+        * @param array $rows Can be either a single row to insert, or multiple rows,
         *    in the same format as for DatabaseBase::insert()
-        * @param $uniqueIndexes array is an array of indexes. Each element may be either
+        * @param array $uniqueIndexes is an array of indexes. Each element may be either
         *    a field name or an array of field names
-        * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
        public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
                $quotedTable = $this->tableName( $table );
@@ -2497,9 +2496,9 @@ abstract class DatabaseBase implements DatabaseType {
         * REPLACE query wrapper for MySQL and SQLite, which have a native REPLACE
         * statement.
         *
-        * @param $table string Table name
-        * @param $rows array Rows to insert
-        * @param $fname string Caller function name
+        * @param string $table Table name
+        * @param array $rows Rows to insert
+        * @param string $fname Caller function name
         *
         * @return ResultWrapper
         */
@@ -2607,10 +2606,10 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * DELETE query wrapper.
         *
-        * @param $table Array Table name
-        * @param $conds String|Array of conditions. See $conds in DatabaseBase::select() for
+        * @param array $table Table name
+        * @param string|array $conds of conditions. See $conds in DatabaseBase::select() for
         *               the format. Use $conds == "*" to delete all rows
-        * @param $fname String name of the calling function
+        * @param string $fname name of the calling function
         *
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
@@ -2634,24 +2633,24 @@ abstract class DatabaseBase implements DatabaseType {
         * INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
         * into another table.
         *
-        * @param $destTable string The table name to insert into
-        * @param $srcTable string|array May be either a table name, or an array of table names
+        * @param string $destTable The table name to insert into
+        * @param string|array $srcTable May be either a table name, or an array of table names
         *    to include in a join.
         *
-        * @param $varMap array must be an associative array of the form
+        * @param array $varMap must be an associative array of the form
         *    array( 'dest1' => 'source1', ...). Source items may be literals
         *    rather than field names, but strings should be quoted with
         *    DatabaseBase::addQuotes()
         *
-        * @param $conds array Condition array. See $conds in DatabaseBase::select() for
+        * @param array $conds Condition array. See $conds in DatabaseBase::select() for
         *    the details of the format of condition arrays. May be "*" to copy the
         *    whole table.
         *
-        * @param $fname string The function name of the caller, from __METHOD__
+        * @param string $fname The function name of the caller, from __METHOD__
         *
-        * @param $insertOptions array Options for the INSERT part of the query, see
+        * @param array $insertOptions Options for the INSERT part of the query, see
         *    DatabaseBase::insert() for details.
-        * @param $selectOptions array Options for the SELECT part of the query, see
+        * @param array $selectOptions Options for the SELECT part of the query, see
         *    DatabaseBase::select() for details.
         *
         * @return ResultWrapper
@@ -2707,7 +2706,7 @@ abstract class DatabaseBase implements DatabaseType {
         * The version provided by default works in MySQL and SQLite.  It will very
         * likely need to be overridden for most other DBMSes.
         *
-        * @param $sql String SQL query we will append the limit too
+        * @param string $sql SQL query we will append the limit too
         * @param $limit Integer the SQL limit
         * @param $offset Integer|bool the SQL offset (default false)
         *
@@ -2736,7 +2735,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Construct a UNION query
         * This is used for providing overload point for other DB abstractions
         * not compatible with the MySQL syntax.
-        * @param $sqls Array: SQL statements to combine
+        * @param array $sqls SQL statements to combine
         * @param $all Boolean: use UNION ALL
         * @return String: SQL fragment
         */
@@ -2749,9 +2748,9 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns an SQL expression for a simple conditional.  This doesn't need
         * to be overridden unless CASE isn't supported in your DBMS.
         *
-        * @param $cond string|array SQL expression which will result in a boolean value
-        * @param $trueVal String: SQL expression to return if true
-        * @param $falseVal String: SQL expression to return if false
+        * @param string|array $cond SQL expression which will result in a boolean value
+        * @param string $trueVal SQL expression to return if true
+        * @param string $falseVal SQL expression to return if false
         * @return String: SQL fragment
         */
        public function conditional( $cond, $trueVal, $falseVal ) {
@@ -2765,9 +2764,9 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns a comand for str_replace function in SQL query.
         * Uses REPLACE() in MySQL
         *
-        * @param $orig String: column to modify
-        * @param $old String: column to seek
-        * @param $new String: column to replace with
+        * @param string $orig column to modify
+        * @param string $old column to seek
+        * @param string $new column to replace with
         *
         * @return string
         */
@@ -3058,7 +3057,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Nesting of transactions is not supported.
         *
         * @param $fname string
-        * @param $flush String Flush flag, set to 'flush' to disable warnings about explicitly committing implicit
+        * @param string $flush Flush flag, set to 'flush' to disable warnings about explicitly committing implicit
         *        transactions, or calling commit when no transaction is in progress.
         *        This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
         *        that it is safe to ignore these warnings in your context.
@@ -3132,10 +3131,10 @@ abstract class DatabaseBase implements DatabaseType {
         * The table names passed to this function shall not be quoted (this
         * function calls addIdentifierQuotes when needed).
         *
-        * @param $oldName String: name of table whose structure should be copied
-        * @param $newName String: name of table to be created
+        * @param string $oldName name of table whose structure should be copied
+        * @param string $newName name of table to be created
         * @param $temporary Boolean: whether the new table should be temporary
-        * @param $fname String: calling function name
+        * @param string $fname calling function name
         * @throws MWException
         * @return Boolean: true if operation was successful
         */
@@ -3149,8 +3148,8 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * List all tables on the database
         *
-        * @param $prefix string Only show tables with this prefix, e.g. mw_
-        * @param $fname String: calling function name
+        * @param string $prefix Only show tables with this prefix, e.g. mw_
+        * @param string $fname calling function name
         * @throws MWException
         */
        function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
@@ -3294,7 +3293,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns true on success, error string or exception on failure (depending
         * on object's error ignore settings).
         *
-        * @param $filename String: File name to open
+        * @param string $filename File name to open
         * @param bool|callable $lineCallback Optional function called before reading each line
         * @param bool|callable $resultCallback Optional function called for each MySQL result
         * @param bool|string $fname Calling function name or false if name should be
@@ -3337,7 +3336,7 @@ abstract class DatabaseBase implements DatabaseType {
         * from updaters.inc. Keep in mind this always returns a patch, as
         * it fails back to MySQL if no DB-specific patch can be found
         *
-        * @param $patch String The name of the patch, like patch-something.sql
+        * @param string $patch The name of the patch, like patch-something.sql
         * @return String Full path to patch file
         */
        public function patchPath( $patch ) {
@@ -3356,7 +3355,7 @@ abstract class DatabaseBase implements DatabaseType {
         * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
         * all. If it's set to false, $GLOBALS will be used.
         *
-        * @param $vars bool|array mapping variable name to value.
+        * @param bool|array $vars mapping variable name to value.
         */
        public function setSchemaVars( $vars ) {
                $this->mSchemaVars = $vars;
@@ -3371,7 +3370,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fp Resource: File handle
         * @param $lineCallback Callback: Optional function called before reading each query
         * @param $resultCallback Callback: Optional function called for each MySQL result
-        * @param $fname String: Calling function name
+        * @param string $fname Calling function name
         * @param $inputCallback Callback: Optional function called for each complete query sent
         * @return bool|string
         */
@@ -3428,8 +3427,8 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Called by sourceStream() to check if we've reached a statement end
         *
-        * @param $sql String SQL assembled so far
-        * @param $newLine String New line about to be added to $sql
+        * @param string $sql SQL assembled so far
+        * @param string $newLine New line about to be added to $sql
         * @return Bool Whether $newLine contains end of the statement
         */
        public function streamStatementEnd( &$sql, &$newLine ) {
@@ -3457,7 +3456,7 @@ abstract class DatabaseBase implements DatabaseType {
         * - / *$var* / is just encoded, besides traditional table prefix and
         *   table options its use should be avoided.
         *
-        * @param $ins String: SQL statement to replace variables in
+        * @param string $ins SQL statement to replace variables in
         * @return String The new SQL statement with variables replaced
         */
        protected function replaceSchemaVars( $ins ) {
@@ -3545,8 +3544,8 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
-        * @param $lockName String: name of lock to poll
-        * @param $method String: name of method calling us
+        * @param string $lockName name of lock to poll
+        * @param string $method name of method calling us
         * @return Boolean
         * @since 1.20
         */
@@ -3560,8 +3559,8 @@ abstract class DatabaseBase implements DatabaseType {
         * Abstracted from Filestore::lock() so child classes can implement for
         * their own needs.
         *
-        * @param $lockName String: name of lock to aquire
-        * @param $method String: name of method calling us
+        * @param string $lockName name of lock to aquire
+        * @param string $method name of method calling us
         * @param $timeout Integer: timeout
         * @return Boolean
         */
@@ -3572,8 +3571,8 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Release a lock.
         *
-        * @param $lockName String: Name of lock to release
-        * @param $method String: Name of method calling us
+        * @param string $lockName Name of lock to release
+        * @param string $method Name of method calling us
         *
         * @return int Returns 1 if the lock was released, 0 if the lock was not established
         * by this thread (in which case the lock is not released), and NULL if the named
@@ -3586,10 +3585,10 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Lock specific tables
         *
-        * @param $read Array of tables to lock for read access
-        * @param $write Array of tables to lock for write access
-        * @param $method String name of caller
-        * @param $lowPriority bool Whether to indicate writes to be LOW PRIORITY
+        * @param array $read of tables to lock for read access
+        * @param array $write of tables to lock for write access
+        * @param string $method name of caller
+        * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
         *
         * @return bool
         */
@@ -3600,7 +3599,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Unlock specific tables
         *
-        * @param $method String the caller
+        * @param string $method the caller
         *
         * @return bool
         */
@@ -3650,7 +3649,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Encode an expiry time into the DBMS dependent format
         *
-        * @param $expiry String: timestamp for expiry, or the 'infinity' string
+        * @param string $expiry timestamp for expiry, or the 'infinity' string
         * @return String
         */
        public function encodeExpiry( $expiry ) {
@@ -3662,7 +3661,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Decode an expiry time into a DBMS independent format
         *
-        * @param $expiry String: DB timestamp field value for expiry
+        * @param string $expiry DB timestamp field value for expiry
         * @param $format integer: TS_* constant, defaults to TS_MW
         * @return String
         */
index 18b2733..331b8ae 100644 (file)
@@ -35,7 +35,7 @@ class DBError extends MWException {
        /**
         * Construct a database error
         * @param $db DatabaseBase object which threw the error
-        * @param $error String A simple error message to be used for debugging
+        * @param string $error A simple error message to be used for debugging
         */
        function __construct( DatabaseBase &$db, $error ) {
                $this->db = $db;
@@ -153,7 +153,7 @@ class DBConnectionError extends DBError {
 
                $sorry = htmlspecialchars( $this->msg( 'dberr-problems', 'Sorry! This site is experiencing technical difficulties.' ) );
                $again = htmlspecialchars( $this->msg( 'dberr-again', 'Try waiting a few minutes and reloading.' ) );
-               $info  = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
+               $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
 
                # No database access
                MessageCache::singleton()->disable();
diff --git a/includes/db/DatabaseIbm_db2.php b/includes/db/DatabaseIbm_db2.php
deleted file mode 100644 (file)
index 30bc665..0000000
+++ /dev/null
@@ -1,1727 +0,0 @@
-<?php
-/**
- * This is the IBM DB2 database abstraction layer.
- * See maintenance/ibm_db2/README for development notes
- * and other specific information.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- * @author leo.petr+mediawiki@gmail.com
- */
-
-/**
- * This represents a column in a DB2 database
- * @ingroup Database
- */
-class IBM_DB2Field implements Field {
-       private $name = '';
-       private $tablename = '';
-       private $type = '';
-       private $nullable = false;
-       private $max_length = 0;
-
-       /**
-        * Builder method for the class
-        * @param $db DatabaseIbm_db2: Database interface
-        * @param $table String: table name
-        * @param $field String: column name
-        * @return IBM_DB2Field
-        */
-       static function fromText( $db, $table, $field ) {
-               global $wgDBmwschema;
-
-               $q = <<<SQL
-SELECT
-lcase( coltype ) AS typname,
-nulls AS attnotnull, length AS attlen
-FROM sysibm.syscolumns
-WHERE tbcreator=%s AND tbname=%s AND name=%s;
-SQL;
-               $res = $db->query(
-                       sprintf( $q,
-                               $db->addQuotes( $wgDBmwschema ),
-                               $db->addQuotes( $table ),
-                               $db->addQuotes( $field )
-                       )
-               );
-               $row = $db->fetchObject( $res );
-               if ( !$row ) {
-                       return null;
-               }
-               $n = new IBM_DB2Field;
-               $n->type = $row->typname;
-               $n->nullable = ( $row->attnotnull == 'N' );
-               $n->name = $field;
-               $n->tablename = $table;
-               $n->max_length = $row->attlen;
-               return $n;
-       }
-       /**
-        * Get column name
-        * @return string column name
-        */
-       function name() { return $this->name; }
-       /**
-        * Get table name
-        * @return string table name
-        */
-       function tableName() { return $this->tablename; }
-       /**
-        * Get column type
-        * @return string column type
-        */
-       function type() { return $this->type; }
-       /**
-        * Can column be null?
-        * @return bool true or false
-        */
-       function isNullable() { return $this->nullable; }
-       /**
-        * How much can you fit in the column per row?
-        * @return int length
-        */
-       function maxLength() { return $this->max_length; }
-}
-
-/**
- * Wrapper around binary large objects
- * @ingroup Database
- */
-class IBM_DB2Blob {
-       private $mData;
-
-       public function __construct( $data ) {
-               $this->mData = $data;
-       }
-
-       public function getData() {
-               return $this->mData;
-       }
-
-       public function __toString() {
-               return $this->mData;
-       }
-}
-
-/**
- * Wrapper to address lack of certain operations in the DB2 driver
- *  ( seek, num_rows )
- * @ingroup Database
- * @since 1.19
- */
-class IBM_DB2Result{
-       private $db;
-       private $result;
-       private $num_rows;
-       private $current_pos;
-       private $columns = array();
-       private $sql;
-
-       private $resultSet = array();
-       private $loadedLines = 0;
-
-       /**
-        * Construct and initialize a wrapper for DB2 query results
-        * @param $db DatabaseBase
-        * @param $result Object
-        * @param $num_rows Integer
-        * @param $sql String
-        * @param $columns Array
-        */
-       public function __construct( $db, $result, $num_rows, $sql, $columns ) {
-               $this->db = $db;
-
-               if( $result instanceof ResultWrapper ) {
-                       $this->result = $result->result;
-               } else {
-                       $this->result = $result;
-               }
-
-               $this->num_rows = $num_rows;
-               $this->current_pos = 0;
-               if ( $this->num_rows > 0 ) {
-                       // Make a lower-case list of the column names
-                       // By default, DB2 column names are capitalized
-                       //  while MySQL column names are lowercase
-
-                       // Is there a reasonable maximum value for $i?
-                       // Setting to 2048 to prevent an infinite loop
-                       for( $i = 0; $i < 2048; $i++ ) {
-                               $name = db2_field_name( $this->result, $i );
-                               if ( $name != false ) {
-                                       continue;
-                               }
-                               else {
-                                       return false;
-                               }
-
-                               $this->columns[$i] = strtolower( $name );
-                       }
-               }
-
-               $this->sql = $sql;
-       }
-
-       /**
-        * Unwrap the DB2 query results
-        * @return mixed Object on success, false on failure
-        */
-       public function getResult() {
-               if ( $this->result ) {
-                       return $this->result;
-               }
-               else return false;
-       }
-
-       /**
-        * Get the number of rows in the result set
-        * @return integer
-        */
-       public function getNum_rows() {
-               return $this->num_rows;
-       }
-
-       /**
-        * Return a row from the result set in object format
-        * @return mixed Object on success, false on failure.
-        */
-       public function fetchObject() {
-               if ( $this->result
-                               && $this->num_rows > 0
-                               && $this->current_pos >= 0
-                               && $this->current_pos < $this->num_rows )
-               {
-                       $row = $this->fetchRow();
-                       $ret = new stdClass();
-
-                       foreach ( $row as $k => $v ) {
-                               $lc = $this->columns[$k];
-                               $ret->$lc = $v;
-                       }
-                       return $ret;
-               }
-               return false;
-       }
-
-       /**
-        * Return a row form the result set in array format
-        * @return mixed Array on success, false on failure
-        * @throws DBUnexpectedError
-        */
-       public function fetchRow() {
-               if ( $this->result
-                               && $this->num_rows > 0
-                               && $this->current_pos >= 0
-                               && $this->current_pos < $this->num_rows )
-               {
-                       if ( $this->loadedLines <= $this->current_pos ) {
-                               $row = db2_fetch_array( $this->result );
-                               $this->resultSet[$this->loadedLines++] = $row;
-                               if ( $this->db->lastErrno() ) {
-                                       throw new DBUnexpectedError( $this->db, 'Error in fetchRow(): '
-                                               . htmlspecialchars( $this->db->lastError() ) );
-                               }
-                       }
-
-                       if ( $this->loadedLines > $this->current_pos ) {
-                               return $this->resultSet[$this->current_pos++];
-                       }
-
-               }
-               return false;
-       }
-
-       /**
-        * Free a DB2 result object
-        * @throws DBUnexpectedError
-        */
-       public function freeResult() {
-               unset( $this->resultSet );
-               if ( !@db2_free_result( $this->result ) ) {
-                       throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
-               }
-       }
-}
-
-/**
- * Primary database interface
- * @ingroup Database
- */
-class DatabaseIbm_db2 extends DatabaseBase {
-       /*
-        * Inherited members
-       protected $mLastQuery = '';
-       protected $mPHPError = false;
-
-       protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
-       protected $mOpened = false;
-
-       protected $mTablePrefix;
-       protected $mFlags;
-       protected $mTrxLevel = 0;
-       protected $mErrorCount = 0;
-       protected $mLBInfo = array();
-       protected $mFakeSlaveLag = null, $mFakeMaster = false;
-        *
-        */
-
-       /** Database server port */
-       protected $mPort = null;
-       /** Schema for tables, stored procedures, triggers */
-       protected $mSchema = null;
-       /** Whether the schema has been applied in this session */
-       protected $mSchemaSet = false;
-       /** Result of last query */
-       protected $mLastResult = null;
-       /** Number of rows affected by last INSERT/UPDATE/DELETE */
-       protected $mAffectedRows = null;
-       /** Number of rows returned by last SELECT */
-       protected $mNumRows = null;
-       /** Current row number on the cursor of the last SELECT */
-       protected $currentRow = 0;
-
-       /** Connection config options - see constructor */
-       public $mConnOptions = array();
-       /** Statement config options -- see constructor */
-       public $mStmtOptions = array();
-
-       /** Default schema */
-       const USE_GLOBAL = 'get from global';
-
-       /** Option that applies to nothing */
-       const NONE_OPTION = 0x00;
-       /** Option that applies to connection objects */
-       const CONN_OPTION = 0x01;
-       /** Option that applies to statement objects */
-       const STMT_OPTION = 0x02;
-
-       /** Regular operation mode -- minimal debug messages */
-       const REGULAR_MODE = 'regular';
-       /** Installation mode -- lots of debug messages */
-       const INSTALL_MODE = 'install';
-
-       /** Controls the level of debug message output */
-       protected $mMode = self::REGULAR_MODE;
-
-       /** Last sequence value used for a primary key */
-       protected $mInsertId = null;
-
-       ######################################
-       # Getters and Setters
-       ######################################
-
-       /**
-        * Returns true if this database supports (and uses) cascading deletes
-        * @return bool
-        */
-       function cascadingDeletes() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database supports (and uses) triggers (e.g. on the
-        *  page table)
-        * @return bool
-        */
-       function cleanupTriggers() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database is strict about what can be put into an
-        *  IP field.
-        * Specifically, it uses a NULL value instead of an empty string.
-        * @return bool
-        */
-       function strictIPs() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database uses timestamps rather than integers
-        * @return bool
-        */
-       function realTimestamps() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database does an implicit sort when doing GROUP BY
-        * @return bool
-        */
-       function implicitGroupby() {
-               return false;
-       }
-
-       /**
-        * Returns true if this database does an implicit order by when the column
-        *  has an index
-        * For example: SELECT page_title FROM page LIMIT 1
-        * @return bool
-        */
-       function implicitOrderby() {
-               return false;
-       }
-
-       /**
-        * Returns true if this database can do a native search on IP columns
-        * e.g. this works as expected: .. WHERE rc_ip = '127.42.12.102/32';
-        * @return bool
-        */
-       function searchableIPs() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database can use functional indexes
-        * @return bool
-        */
-       function functionalIndexes() {
-               return true;
-       }
-
-       /**
-        * Returns a unique string representing the wiki on the server
-        * @return string
-        */
-       public function getWikiID() {
-               if( $this->mSchema ) {
-                       return "{$this->mDBname}-{$this->mSchema}";
-               } else {
-                       return $this->mDBname;
-               }
-       }
-
-       /**
-        * Returns the database software identifieir
-        * @return string
-        */
-       public function getType() {
-               return 'ibm_db2';
-       }
-
-       /**
-        * Returns the database connection object
-        * @return Object
-        */
-       public function getDb() {
-               return $this->mConn;
-       }
-
-       /**
-        *
-        * @param $server String: hostname of database server
-        * @param $user String: username
-        * @param $password String: password
-        * @param $dbName String: database name on the server
-        * @param $flags Integer: database behaviour flags (optional, unused)
-        * @param $schema String
-        */
-       public function __construct( $server = false, $user = false,
-                                                       $password = false,
-                                                       $dbName = false, $flags = 0,
-                                                       $schema = self::USE_GLOBAL )
-       {
-               global $wgDBmwschema;
-
-               if ( $schema == self::USE_GLOBAL ) {
-                       $this->mSchema = $wgDBmwschema;
-               } else {
-                       $this->mSchema = $schema;
-               }
-
-               // configure the connection and statement objects
-               $this->setDB2Option( 'db2_attr_case', 'DB2_CASE_LOWER',
-                       self::CONN_OPTION | self::STMT_OPTION );
-               $this->setDB2Option( 'deferred_prepare', 'DB2_DEFERRED_PREPARE_ON',
-                       self::STMT_OPTION );
-               $this->setDB2Option( 'rowcount', 'DB2_ROWCOUNT_PREFETCH_ON',
-                       self::STMT_OPTION );
-               parent::__construct( $server, $user, $password, $dbName, DBO_TRX | $flags );
-       }
-
-       /**
-        * Enables options only if the ibm_db2 extension version supports them
-        * @param $name String: name of the option in the options array
-        * @param $const String: name of the constant holding the right option value
-        * @param $type Integer: whether this is a Connection or Statement otion
-        */
-       private function setDB2Option( $name, $const, $type ) {
-               if ( defined( $const ) ) {
-                       if ( $type & self::CONN_OPTION ) {
-                               $this->mConnOptions[$name] = constant( $const );
-                       }
-                       if ( $type & self::STMT_OPTION ) {
-                               $this->mStmtOptions[$name] = constant( $const );
-                       }
-               } else {
-                       $this->installPrint(
-                               "$const is not defined. ibm_db2 version is likely too low." );
-               }
-       }
-
-       /**
-        * Outputs debug information in the appropriate place
-        * @param $string String: the relevant debug message
-        */
-       private function installPrint( $string ) {
-               wfDebug( "$string\n" );
-               if ( $this->mMode == self::INSTALL_MODE ) {
-                       print "<li><pre>$string</pre></li>";
-                       flush();
-               }
-       }
-
-       /**
-        * Opens a database connection and returns it
-        * Closes any existing connection
-        *
-        * @param $server String: hostname
-        * @param $user String
-        * @param $password String
-        * @param $dbName String: database name
-        * @throws DBConnectionError
-        * @return DatabaseBase a fresh connection
-        */
-       public function open( $server, $user, $password, $dbName ) {
-               wfProfileIn( __METHOD__ );
-
-               # Load IBM DB2 driver if missing
-               wfDl( 'ibm_db2' );
-
-               # Test for IBM DB2 support, to avoid suppressed fatal error
-               if ( !function_exists( 'db2_connect' ) ) {
-                       throw new DBConnectionError( $this, "DB2 functions missing, have you enabled the ibm_db2 extension for PHP?" );
-               }
-
-               global $wgDBport;
-
-               // Close existing connection
-               $this->close();
-               // Cache conn info
-               $this->mServer = $server;
-               $this->mPort = $port = $wgDBport;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
-
-               $this->openUncataloged( $dbName, $user, $password, $server, $port );
-
-               if ( !$this->mConn ) {
-                       $this->installPrint( "DB connection error\n" );
-                       $this->installPrint(
-                               "Server: $server, Database: $dbName, User: $user, Password: "
-                               . substr( $password, 0, 3 ) . "...\n" );
-                       $this->installPrint( $this->lastError() . "\n" );
-                       wfProfileOut( __METHOD__ );
-                       wfDebug( "DB connection error\n" );
-                       wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
-                       wfDebug( $this->lastError() . "\n" );
-                       throw new DBConnectionError( $this, $this->lastError() );
-               }
-
-               // Some MediaWiki code is still transaction-less (?).
-               // The strategy is to keep AutoCommit on for that code
-               //  but switch it off whenever a transaction is begun.
-               db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
-               $this->mOpened = true;
-               $this->applySchema();
-
-               wfProfileOut( __METHOD__ );
-               return $this->mConn;
-       }
-
-       /**
-        * Opens a cataloged database connection, sets mConn
-        */
-       protected function openCataloged( $dbName, $user, $password ) {
-               wfSuppressWarnings();
-               $this->mConn = db2_pconnect( $dbName, $user, $password );
-               wfRestoreWarnings();
-       }
-
-       /**
-        * Opens an uncataloged database connection, sets mConn
-        */
-       protected function openUncataloged( $dbName, $user, $password, $server, $port )
-       {
-               $dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$dbName;CHARSET=UTF-8;HOSTNAME=$server;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
-               wfSuppressWarnings();
-               $this->mConn = db2_pconnect( $dsn, "", "", array() );
-               wfRestoreWarnings();
-       }
-
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
-       protected function closeConnection() {
-               return db2_close( $this->mConn );
-       }
-
-       /**
-        * Retrieves the most current database error
-        * Forces a database rollback
-        * @return bool|string
-        */
-       public function lastError() {
-               $connerr = db2_conn_errormsg();
-               if ( $connerr ) {
-                       //$this->rollback( __METHOD__ );
-                       return $connerr;
-               }
-               $stmterr = db2_stmt_errormsg();
-               if ( $stmterr ) {
-                       //$this->rollback( __METHOD__ );
-                       return $stmterr;
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the last error number
-        * Return 0 if no error
-        * @return integer
-        */
-       public function lastErrno() {
-               $connerr = db2_conn_error();
-               if ( $connerr ) {
-                       return $connerr;
-               }
-               $stmterr = db2_stmt_error();
-               if ( $stmterr ) {
-                       return $stmterr;
-               }
-               return 0;
-       }
-
-       /**
-        * Is a database connection open?
-        * @return
-        */
-       public function isOpen() { return $this->mOpened; }
-
-       /**
-        * The DBMS-dependent part of query()
-        * @param  $sql String: SQL query.
-        * @throws DBUnexpectedError
-        * @return object Result object for fetch functions or false on failure
-        */
-       protected function doQuery( $sql ) {
-               $this->applySchema();
-
-               // Needed to handle any UTF-8 encoding issues in the raw sql
-               // Note that we fully support prepared statements for DB2
-               // prepare() and execute() should be used instead of doQuery() whenever possible
-               $sql = utf8_decode( $sql );
-
-               $ret = db2_exec( $this->mConn, $sql, $this->mStmtOptions );
-               if( $ret == false ) {
-                       $error = db2_stmt_errormsg();
-
-                       $this->installPrint( "<pre>$sql</pre>" );
-                       $this->installPrint( $error );
-                       throw new DBUnexpectedError( $this, 'SQL error: '
-                               . htmlspecialchars( $error ) );
-               }
-               $this->mLastResult = $ret;
-               $this->mAffectedRows = null; // Not calculated until asked for
-               return $ret;
-       }
-
-       /**
-        * @return string Version information from the database
-        */
-       public function getServerVersion() {
-               $info = db2_server_info( $this->mConn );
-               return $info->DBMS_VER;
-       }
-
-       /**
-        * Queries whether a given table exists
-        * @return boolean
-        */
-       public function tableExists( $table, $fname = __METHOD__ ) {
-               $schema = $this->mSchema;
-
-               $sql = "SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST WHERE ST.NAME = '" .
-                       strtoupper( $table ) .
-                       "' AND ST.CREATOR = '" .
-                       strtoupper( $schema ) . "'";
-               $res = $this->query( $sql );
-               if ( !$res ) {
-                       return false;
-               }
-
-               // If the table exists, there should be one of it
-               $row = $this->fetchRow( $res );
-               $count = $row[0];
-               if ( $count == '1' || $count == 1 ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
-        * @return object|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       public function fetchObject( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $row = db2_fetch_object( $res );
-               wfRestoreWarnings();
-               if( $this->lastErrno() ) {
-                       throw new DBUnexpectedError( $this, 'Error in fetchObject(): '
-                               . htmlspecialchars( $this->lastError() ) );
-               }
-               return $row;
-       }
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       public function fetchRow( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               if ( db2_num_rows( $res ) > 0) {
-                       wfSuppressWarnings();
-                       $row = db2_fetch_array( $res );
-                       wfRestoreWarnings();
-                       if ( $this->lastErrno() ) {
-                               throw new DBUnexpectedError( $this, 'Error in fetchRow(): '
-                                       . htmlspecialchars( $this->lastError() ) );
-                       }
-                       return $row;
-               }
-               return false;
-       }
-
-       /**
-        * Escapes strings
-        * Doesn't escape numbers
-        *
-        * @param $s String: string to escape
-        * @return string escaped string
-        */
-       public function addQuotes( $s ) {
-               //$this->installPrint( "DB2::addQuotes( $s )\n" );
-               if ( is_null( $s ) ) {
-                       return 'NULL';
-               } elseif ( $s instanceof Blob ) {
-                       return "'" . $s->fetch( $s ) . "'";
-               } elseif ( $s instanceof IBM_DB2Blob ) {
-                       return "'" . $this->decodeBlob( $s ) . "'";
-               }
-               $s = $this->strencode( $s );
-               if ( is_numeric( $s ) ) {
-                       return $s;
-               } else {
-                       return "'$s'";
-               }
-       }
-
-       /**
-        * Verifies that a DB2 column/field type is numeric
-        *
-        * @param $type String: DB2 column type
-        * @return Boolean: true if numeric
-        */
-       public function is_numeric_type( $type ) {
-               switch ( strtoupper( $type ) ) {
-                       case 'SMALLINT':
-                       case 'INTEGER':
-                       case 'INT':
-                       case 'BIGINT':
-                       case 'DECIMAL':
-                       case 'REAL':
-                       case 'DOUBLE':
-                       case 'DECFLOAT':
-                               return true;
-               }
-               return false;
-       }
-
-       /**
-        * Alias for addQuotes()
-        * @param $s String: string to escape
-        * @return string escaped string
-        */
-       public function strencode( $s ) {
-               // Bloody useless function
-               //  Prepends backslashes to \x00, \n, \r, \, ', " and \x1a.
-               //  But also necessary
-               $s = db2_escape_string( $s );
-               // Wide characters are evil -- some of them look like '
-               $s = utf8_encode( $s );
-               // Fix its stupidity
-               $from = array( "\\\\", "\\'", '\\n', '\\t', '\\"', '\\r' );
-               $to = array( "\\", "''", "\n", "\t", '"', "\r" );
-               $s = str_replace( $from, $to, $s ); // DB2 expects '', not \' escaping
-               return $s;
-       }
-
-       /**
-        * Switch into the database schema
-        */
-       protected function applySchema() {
-               if ( !( $this->mSchemaSet ) ) {
-                       $this->mSchemaSet = true;
-                       $this->begin( __METHOD__ );
-                       $this->doQuery( "SET SCHEMA = $this->mSchema" );
-                       $this->commit( __METHOD__ );
-               }
-       }
-
-       /**
-        * Start a transaction (mandatory)
-        */
-       protected function doBegin( $fname = 'DatabaseIbm_db2::begin' ) {
-               // BEGIN is implicit for DB2
-               // However, it requires that AutoCommit be off.
-
-               // Some MediaWiki code is still transaction-less (?).
-               // The strategy is to keep AutoCommit on for that code
-               //  but switch it off whenever a transaction is begun.
-               db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_OFF );
-
-               $this->mTrxLevel = 1;
-       }
-
-       /**
-        * End a transaction
-        * Must have a preceding begin()
-        */
-       protected function doCommit( $fname = 'DatabaseIbm_db2::commit' ) {
-               db2_commit( $this->mConn );
-
-               // Some MediaWiki code is still transaction-less (?).
-               // The strategy is to keep AutoCommit on for that code
-               //  but switch it off whenever a transaction is begun.
-               db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Cancel a transaction
-        */
-       protected function doRollback( $fname = 'DatabaseIbm_db2::rollback' ) {
-               db2_rollback( $this->mConn );
-               // turn auto-commit back on
-               // not sure if this is appropriate
-               db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Makes an encoded list of strings from an array
-        * $mode:
-        *   LIST_COMMA         - comma separated, no field names
-        *   LIST_AND           - ANDed WHERE clause (without the WHERE)
-        *   LIST_OR            - ORed WHERE clause (without the WHERE)
-        *   LIST_SET           - comma separated with field names, like a SET clause
-        *   LIST_NAMES         - comma separated field names
-        *   LIST_SET_PREPARED  - like LIST_SET, except with ? tokens as values
-        * @param array $a
-        * @param int $mode
-        * @throws DBUnexpectedError
-        * @return string
-        */
-       function makeList( $a, $mode = LIST_COMMA ) {
-               if ( !is_array( $a ) ) {
-                       throw new DBUnexpectedError( $this,
-                               'DatabaseIbm_db2::makeList called with incorrect parameters' );
-               }
-
-               // if this is for a prepared UPDATE statement
-               // (this should be promoted to the parent class
-               //  once other databases use prepared statements)
-               if ( $mode == LIST_SET_PREPARED ) {
-                       $first = true;
-                       $list = '';
-                       foreach ( $a as $field => $value ) {
-                               if ( !$first ) {
-                                       $list .= ", $field = ?";
-                               } else {
-                                       $list .= "$field = ?";
-                                       $first = false;
-                               }
-                       }
-                       $list .= '';
-
-                       return $list;
-               }
-
-               // otherwise, call the usual function
-               return parent::makeList( $a, $mode );
-       }
-
-       /**
-        * Construct a LIMIT query with optional offset
-        * This is used for query pages
-        *
-        * @param $sql string SQL query we will append the limit too
-        * @param $limit integer the SQL limit
-        * @param bool|int $offset SQL offset (default false)
-        * @throws DBUnexpectedError
-        * @return string
-        */
-       public function limitResult( $sql, $limit, $offset=false ) {
-               if( !is_numeric( $limit ) ) {
-                       throw new DBUnexpectedError( $this,
-                               "Invalid non-numeric limit passed to limitResult()\n" );
-               }
-               if( $offset ) {
-                       if ( stripos( $sql, 'where' ) === false ) {
-                               return "$sql AND ( ROWNUM BETWEEN $offset AND $offset+$limit )";
-                       } else {
-                               return "$sql WHERE ( ROWNUM BETWEEN $offset AND $offset+$limit )";
-                       }
-               }
-               return "$sql FETCH FIRST $limit ROWS ONLY ";
-       }
-
-       /**
-        * Handle reserved keyword replacement in table names
-        *
-        * @param $name Object
-        * @param $format String Ignored parameter Default 'quoted'Boolean
-        * @return String
-        */
-       public function tableName( $name, $format = 'quoted' ) {
-               // we want maximum compatibility with MySQL schema
-               return $name;
-       }
-
-       /**
-        * Generates a timestamp in an insertable format
-        *
-        * @param $ts string timestamp
-        * @return String: timestamp value
-        */
-       public function timestamp( $ts = 0 ) {
-               // TS_MW cannot be easily distinguished from an integer
-               return wfTimestamp( TS_DB2, $ts );
-       }
-
-       /**
-        * Return the next in a sequence, save the value for retrieval via insertId()
-        * @param $seqName String: name of a defined sequence in the database
-        * @return int next value in that sequence
-        */
-       public function nextSequenceValue( $seqName ) {
-               // Not using sequences in the primary schema to allow for easier migration
-               //  from MySQL
-               // Emulating MySQL behaviour of using NULL to signal that sequences
-               // aren't used
-               /*
-               $safeseq = preg_replace( "/'/", "''", $seqName );
-               $res = $this->query( "VALUES NEXTVAL FOR $safeseq" );
-               $row = $this->fetchRow( $res );
-               $this->mInsertId = $row[0];
-               return $this->mInsertId;
-               */
-               return null;
-       }
-
-       /**
-        * This must be called after nextSequenceVal
-        * @return int Last sequence value used as a primary key
-        */
-       public function insertId() {
-               return $this->mInsertId;
-       }
-
-       /**
-        * Updates the mInsertId property with the value of the last insert
-        *  into a generated column
-        *
-        * @param $table      String: sanitized table name
-        * @param $primaryKey Mixed: string name of the primary key
-        * @param $stmt       Resource: prepared statement resource
-        *  of the SELECT primary_key FROM FINAL TABLE ( INSERT ... ) form
-        */
-       private function calcInsertId( $table, $primaryKey, $stmt ) {
-               if ( $primaryKey ) {
-                       $this->mInsertId = db2_last_insert_id( $this->mConn );
-               }
-       }
-
-       /**
-        * INSERT wrapper, inserts an array into a table
-        *
-        * $args may be a single associative array, or an array of arrays
-        *  with numeric keys, for multi-row insert
-        *
-        * @param $table   String: Name of the table to insert to.
-        * @param $args    Array: Items to insert into the table.
-        * @param $fname   String: Name of the function, for profiling
-        * @param $options String or Array. Valid options: IGNORE
-        *
-        * @return bool Success of insert operation. IGNORE always returns true.
-        */
-       public function insert( $table, $args, $fname = 'DatabaseIbm_db2::insert',
-               $options = array() )
-       {
-               if ( !count( $args ) ) {
-                       return true;
-               }
-               // get database-specific table name (not used)
-               $table = $this->tableName( $table );
-               // format options as an array
-               $options = IBM_DB2Helper::makeArray( $options );
-               // format args as an array of arrays
-               if ( !( isset( $args[0] ) && is_array( $args[0] ) ) ) {
-                       $args = array( $args );
-               }
-
-               // prevent insertion of NULL into primary key columns
-               list( $args, $primaryKeys ) = $this->removeNullPrimaryKeys( $table, $args );
-               // if there's only one primary key
-               // we'll be able to read its value after insertion
-               $primaryKey = false;
-               if ( count( $primaryKeys ) == 1 ) {
-                       $primaryKey = $primaryKeys[0];
-               }
-
-               // get column names
-               $keys = array_keys( $args[0] );
-               $key_count = count( $keys );
-
-               // If IGNORE is set, we use savepoints to emulate mysql's behavior
-               $ignore = in_array( 'IGNORE', $options ) ? 'mw' : '';
-
-               // assume success
-               $res = true;
-               // If we are not in a transaction, we need to be for savepoint trickery
-               if ( !$this->mTrxLevel ) {
-                       $this->begin( __METHOD__ );
-               }
-
-               $sql = "INSERT INTO $table ( " . implode( ',', $keys ) . ' ) VALUES ';
-               if ( $key_count == 1 ) {
-                       $sql .= '( ? )';
-               } else {
-                       $sql .= '( ?' . str_repeat( ',?', $key_count-1 ) . ' )';
-               }
-               $this->installPrint( "Preparing the following SQL:" );
-               $this->installPrint( "$sql" );
-               $this->installPrint( print_r( $args, true ));
-               $stmt = $this->prepare( $sql );
-
-               // start a transaction/enter transaction mode
-               $this->begin( __METHOD__ );
-
-               if ( !$ignore ) {
-                       //$first = true;
-                       foreach ( $args as $row ) {
-                               //$this->installPrint( "Inserting " . print_r( $row, true ));
-                               // insert each row into the database
-                               $res = $res & $this->execute( $stmt, $row );
-                               if ( !$res ) {
-                                       $this->installPrint( 'Last error:' );
-                                       $this->installPrint( $this->lastError() );
-                               }
-                               // get the last inserted value into a generated column
-                               $this->calcInsertId( $table, $primaryKey, $stmt );
-                       }
-               } else {
-                       $olde = error_reporting( 0 );
-                       // For future use, we may want to track the number of actual inserts
-                       // Right now, insert (all writes) simply return true/false
-                       $numrowsinserted = 0;
-
-                       // always return true
-                       $res = true;
-
-                       foreach ( $args as $row ) {
-                               $overhead = "SAVEPOINT $ignore ON ROLLBACK RETAIN CURSORS";
-                               db2_exec( $this->mConn, $overhead, $this->mStmtOptions );
-
-                               $res2 = $this->execute( $stmt, $row );
-
-                               if ( !$res2 ) {
-                                       $this->installPrint( 'Last error:' );
-                                       $this->installPrint( $this->lastError() );
-                               }
-                               // get the last inserted value into a generated column
-                               $this->calcInsertId( $table, $primaryKey, $stmt );
-
-                               $errNum = $this->lastErrno();
-                               if ( $errNum ) {
-                                       db2_exec( $this->mConn, "ROLLBACK TO SAVEPOINT $ignore",
-                                               $this->mStmtOptions );
-                               } else {
-                                       db2_exec( $this->mConn, "RELEASE SAVEPOINT $ignore",
-                                               $this->mStmtOptions );
-                                       $numrowsinserted++;
-                               }
-                       }
-
-                       $olde = error_reporting( $olde );
-                       // Set the affected row count for the whole operation
-                       $this->mAffectedRows = $numrowsinserted;
-               }
-               // commit either way
-               $this->commit( __METHOD__ );
-               $this->freePrepared( $stmt );
-
-               return $res;
-       }
-
-       /**
-        * Given a table name and a hash of columns with values
-        * Removes primary key columns from the hash where the value is NULL
-        *
-        * @param $table String: name of the table
-        * @param $args Array of hashes of column names with values
-        * @return Array: tuple( filtered array of columns, array of primary keys )
-        */
-       private function removeNullPrimaryKeys( $table, $args ) {
-               $schema = $this->mSchema;
-
-               // find out the primary keys
-               $keyres = $this->doQuery( "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = '"
-                       . strtoupper( $table )
-                       . "' AND TBCREATOR = '"
-                       . strtoupper( $schema )
-                       . "' AND KEYSEQ > 0" );
-
-               $keys = array();
-               for (
-                       $row = $this->fetchRow( $keyres );
-                       $row != null;
-                       $row = $this->fetchRow( $keyres )
-               )
-               {
-                       $keys[] = strtolower( $row[0] );
-               }
-               // remove primary keys
-               foreach ( $args as $ai => $row ) {
-                       foreach ( $keys as $key ) {
-                               if ( $row[$key] == null ) {
-                                       unset( $row[$key] );
-                               }
-                       }
-                       $args[$ai] = $row;
-               }
-               // return modified hash
-               return array( $args, $keys );
-       }
-
-       /**
-        * UPDATE wrapper, takes a condition array and a SET array
-        *
-        * @param $table  String: The table to UPDATE
-        * @param $values array An array of values to SET
-        * @param $conds  array An array of conditions ( WHERE ). Use '*' to update all rows.
-        * @param $fname  String: The Class::Function calling this function
-        *                ( for the log )
-        * @param $options array An array of UPDATE options, can be one or
-        *                 more of IGNORE, LOW_PRIORITY
-        * @return Boolean
-        */
-       public function update( $table, $values, $conds, $fname = 'DatabaseIbm_db2::update',
-               $options = array() )
-       {
-               $table = $this->tableName( $table );
-               $opts = $this->makeUpdateOptions( $options );
-               $sql = "UPDATE $opts $table SET "
-                       . $this->makeList( $values, LIST_SET_PREPARED );
-               if ( $conds != '*' ) {
-                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
-               }
-               $stmt = $this->prepare( $sql );
-               $this->installPrint( 'UPDATE: ' . print_r( $values, true ) );
-               // assuming for now that an array with string keys will work
-               // if not, convert to simple array first
-               $result = $this->execute( $stmt, $values );
-               $this->freePrepared( $stmt );
-
-               return $result;
-       }
-
-       /**
-        * DELETE query wrapper
-        *
-        * Use $conds == "*" to delete all rows
-        * @param array $table
-        * @param array|string $conds
-        * @param string $fname
-        * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
-        */
-       public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
-               if ( !$conds ) {
-                       throw new DBUnexpectedError( $this,
-                               'DatabaseIbm_db2::delete() called with no conditions' );
-               }
-               $table = $this->tableName( $table );
-               $sql = "DELETE FROM $table";
-               if ( $conds != '*' ) {
-                       $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
-               }
-               $result = $this->query( $sql, $fname );
-
-               return $result;
-       }
-
-       /**
-        * Returns the number of rows affected by the last query or 0
-        * @return Integer: the number of rows affected by the last query
-        */
-       public function affectedRows() {
-               if ( !is_null( $this->mAffectedRows ) ) {
-                       // Forced result for simulated queries
-                       return $this->mAffectedRows;
-               }
-               if( empty( $this->mLastResult ) ) {
-                       return 0;
-               }
-               return db2_num_rows( $this->mLastResult );
-       }
-
-       /**
-        * Returns the number of rows in the result set
-        * Has to be called right after the corresponding select query
-        * @param $res Object result set
-        * @return Integer: number of rows
-        */
-       public function numRows( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               if ( $this->mNumRows ) {
-                       return $this->mNumRows;
-               } else {
-                       return 0;
-               }
-       }
-
-       /**
-        * Moves the row pointer of the result set
-        * @param $res Object: result set
-        * @param $row Integer: row number
-        * @return bool success or failure
-        */
-       public function dataSeek( $res, $row ) {
-               if ( $res instanceof ResultWrapper ) {
-                       return $res = $res->result;
-               }
-               if ( $res instanceof IBM_DB2Result ) {
-                       return $res->dataSeek( $row );
-               }
-               wfDebug( "dataSeek operation in DB2 database\n" );
-               return false;
-       }
-
-       ###
-       # Fix notices in Block.php
-       ###
-
-       /**
-        * Frees memory associated with a statement resource
-        * @param $res Object: statement resource to free
-        * @throws DBUnexpectedError
-        * @return Boolean success or failure
-        */
-       public function freeResult( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $ok = db2_free_result( $res );
-               wfRestoreWarnings();
-               if ( !$ok ) {
-                       throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
-               }
-       }
-
-       /**
-        * Returns the number of columns in a resource
-        * @param $res Object: statement resource
-        * @return Number of fields/columns in resource
-        */
-       public function numFields( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               if ( $res instanceof IBM_DB2Result ) {
-                       $res = $res->getResult();
-               }
-               return db2_num_fields( $res );
-       }
-
-       /**
-        * Returns the nth column name
-        * @param $res Object: statement resource
-        * @param $n Integer: Index of field or column
-        * @return String name of nth column
-        */
-       public function fieldName( $res, $n ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               if ( $res instanceof IBM_DB2Result ) {
-                       $res = $res->getResult();
-               }
-               return db2_field_name( $res, $n );
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param $table   Array or string, table name(s) (prefix auto-added)
-        * @param $vars    Array or string, field name(s) to be retrieved
-        * @param $conds   Array or string, condition(s) for WHERE
-        * @param $fname   String: calling function name (use __METHOD__)
-        *                 for logs/profiling
-        * @param $options array Associative array of options
-        *                 (e.g. array( 'GROUP BY' => 'page_title' )),
-        *                 see Database::makeSelectOptions code for list of
-        *                 supported stuff
-        * @param $join_conds array Associative array of table join conditions (optional)
-        *                    (e.g. array( 'page' => array('LEFT JOIN',
-        *                    'page_latest=rev_id') )
-        * @return Mixed: database result resource for fetch functions or false
-        *                 on failure
-        */
-       public function select( $table, $vars, $conds = '', $fname = 'DatabaseIbm_db2::select', $options = array(), $join_conds = array() )
-       {
-               $res = parent::select( $table, $vars, $conds, $fname, $options,
-                       $join_conds );
-               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
-               // We must adjust for offset
-               if ( isset( $options['LIMIT'] ) && isset ( $options['OFFSET'] ) ) {
-                       $limit = $options['LIMIT'];
-                       $offset = $options['OFFSET'];
-               }
-
-               // DB2 does not have a proper num_rows() function yet, so we must emulate
-               // DB2 9.5.4 and the corresponding ibm_db2 driver will introduce
-               //  a working one
-               // TODO: Yay!
-
-               // we want the count
-               $vars2 = array( 'count( * ) as num_rows' );
-               // respecting just the limit option
-               $options2 = array();
-               if ( isset( $options['LIMIT'] ) ) {
-                       $options2['LIMIT'] = $options['LIMIT'];
-               }
-               // but don't try to emulate for GROUP BY
-               if ( isset( $options['GROUP BY'] ) ) {
-                       return $res;
-               }
-
-               $res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
-                       $join_conds );
-
-               $obj = $this->fetchObject( $res2 );
-               $this->mNumRows = $obj->num_rows;
-
-               return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
-       }
-
-       /**
-        * Handles ordering, grouping, and having options ('GROUP BY' => colname)
-        * Has limited support for per-column options (colnum => 'DISTINCT')
-        *
-        * @private
-        *
-        * @param $options array Associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
-        * @return Array
-        */
-       function makeSelectOptions( $options ) {
-               $preLimitTail = $postLimitTail = '';
-               $startOpts = '';
-
-               $noKeyOptions = array();
-               foreach ( $options as $key => $option ) {
-                       if ( is_numeric( $key ) ) {
-                               $noKeyOptions[$option] = true;
-                       }
-               }
-
-               $preLimitTail .= $this->makeGroupByWithHaving( $options );
-
-               $preLimitTail .= $this->makeOrderBy( $options );
-
-               if ( isset( $noKeyOptions['DISTINCT'] )
-                       || isset( $noKeyOptions['DISTINCTROW'] ) )
-               {
-                       $startOpts .= 'DISTINCT';
-               }
-
-               return array( $startOpts, '', $preLimitTail, $postLimitTail );
-       }
-
-       /**
-        * Returns link to IBM DB2 free download
-        * @return String: wikitext of a link to the server software's web site
-        */
-       public static function getSoftwareLink() {
-               return '[http://www.ibm.com/db2/express/ IBM DB2]';
-       }
-
-       /**
-        * Get search engine class. All subclasses of this
-        * need to implement this if they wish to use searching.
-        *
-        * @return String
-        */
-       public function getSearchEngine() {
-               return 'SearchIBM_DB2';
-       }
-
-       /**
-        * Did the last database access fail because of deadlock?
-        * @return Boolean
-        */
-       public function wasDeadlock() {
-               // get SQLSTATE
-               $err = $this->lastErrno();
-               switch( $err ) {
-                       // This is literal port of the MySQL logic and may be wrong for DB2
-                       case '40001':   // sql0911n, Deadlock or timeout, rollback
-                       case '57011':   // sql0904n, Resource unavailable, no rollback
-                       case '57033':   // sql0913n, Deadlock or timeout, no rollback
-                       $this->installPrint( "In a deadlock because of SQLSTATE $err" );
-                       return true;
-               }
-               return false;
-       }
-
-       /**
-        * Ping the server and try to reconnect if it there is no connection
-        * The connection may be closed and reopened while this happens
-        * @return Boolean: whether the connection exists
-        */
-       public function ping() {
-               // db2_ping() doesn't exist
-               // Emulate
-               $this->close();
-               $this->openUncataloged( $this->mDBName, $this->mUser,
-                       $this->mPassword, $this->mServer, $this->mPort );
-
-               return false;
-       }
-       ######################################
-       # Unimplemented and not applicable
-       ######################################
-
-       /**
-        * Only useful with fake prepare like in base Database class
-        * @return      string
-        */
-       public function fillPreparedArg( $matches ) {
-               $this->installPrint( 'Not useful for DB2: fillPreparedArg()' );
-               return '';
-       }
-
-       ######################################
-       # Reflection
-       ######################################
-
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        * @param $table String: table name
-        * @param $index String: index name
-        * @param $fname String: function name for logging and profiling
-        * @return Object query row in object form
-        */
-       public function indexInfo( $table, $index,
-               $fname = 'DatabaseIbm_db2::indexExists' )
-       {
-               $table = $this->tableName( $table );
-               $sql = <<<SQL
-SELECT name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
-               $res = $this->query( $sql, $fname );
-               if ( !$res ) {
-                       return null;
-               }
-               $row = $this->fetchObject( $res );
-               if ( $row != null ) {
-                       return $row;
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Returns an information object on a table column
-        * @param $table String: table name
-        * @param $field String: column name
-        * @return IBM_DB2Field
-        */
-       public function fieldInfo( $table, $field ) {
-               return IBM_DB2Field::fromText( $this, $table, $field );
-       }
-
-       /**
-        * db2_field_type() wrapper
-        * @param $res Object: result of executed statement
-        * @param $index Mixed: number or name of the column
-        * @return String column type
-        */
-       public function fieldType( $res, $index ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               if ( $res instanceof IBM_DB2Result ) {
-                       $res = $res->getResult();
-               }
-               return db2_field_type( $res, $index );
-       }
-
-       /**
-        * Verifies that an index was created as unique
-        * @param $table String: table name
-        * @param $index String: index name
-        * @param $fname string function name for profiling
-        * @return Bool
-        */
-       public function indexUnique ( $table, $index,
-               $fname = 'DatabaseIbm_db2::indexUnique' )
-       {
-               $table = $this->tableName( $table );
-               $sql = <<<SQL
-SELECT si.name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-AND si.uniquerule IN ( 'U', 'P' )
-SQL;
-               $res = $this->query( $sql, $fname );
-               if ( !$res ) {
-                       return null;
-               }
-               if ( $this->fetchObject( $res ) ) {
-                       return true;
-               }
-               return false;
-
-       }
-
-       /**
-        * Returns the size of a text field, or -1 for "unlimited"
-        * @param $table String: table name
-        * @param $field String: column name
-        * @return Integer: length or -1 for unlimited
-        */
-       public function textFieldSize( $table, $field ) {
-               $table = $this->tableName( $table );
-               $sql = <<<SQL
-SELECT length as size
-FROM sysibm.syscolumns sc
-WHERE sc.name='$field' AND sc.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
-               $res = $this->query( $sql );
-               $row = $this->fetchObject( $res );
-               $size = $row->size;
-               return $size;
-       }
-
-       /**
-        * Description is left as an exercise for the reader
-        * @param $b Mixed: data to be encoded
-        * @return IBM_DB2Blob
-        */
-       public function encodeBlob( $b ) {
-               return new IBM_DB2Blob( $b );
-       }
-
-       /**
-        * Description is left as an exercise for the reader
-        * @param $b IBM_DB2Blob: data to be decoded
-        * @return mixed
-        */
-       public function decodeBlob( $b ) {
-               return "$b";
-       }
-
-       /**
-        * Convert into a list of string being concatenated
-        * @param $stringList Array: strings that need to be joined together
-        *                    by the SQL engine
-        * @return String: joined by the concatenation operator
-        */
-       public function buildConcat( $stringList ) {
-               // || is equivalent to CONCAT
-               // Sample query: VALUES 'foo' CONCAT 'bar' CONCAT 'baz'
-               return implode( ' || ', $stringList );
-       }
-
-       /**
-        * Generates the SQL required to convert a DB2 timestamp into a Unix epoch
-        * @param $column String: name of timestamp column
-        * @return String: SQL code
-        */
-       public function extractUnixEpoch( $column ) {
-               // TODO
-               // see SpecialAncientpages
-       }
-
-       ######################################
-       # Prepared statements
-       ######################################
-
-       /**
-        * Intended to be compatible with the PEAR::DB wrapper functions.
-        * http://pear.php.net/manual/en/package.database.db.intro-execute.php
-        *
-        * ? = scalar value, quoted as necessary
-        * ! = raw SQL bit (a function for instance)
-        * & = filename; reads the file and inserts as a blob
-        *     (we don't use this though...)
-        * @param $sql String: SQL statement with appropriate markers
-        * @param $func String: Name of the function, for profiling
-        * @return resource a prepared DB2 SQL statement
-        */
-       public function prepare( $sql, $func = 'DB2::prepare' ) {
-               $stmt = db2_prepare( $this->mConn, $sql, $this->mStmtOptions );
-               return $stmt;
-       }
-
-       /**
-        * Frees resources associated with a prepared statement
-        * @return Boolean success or failure
-        */
-       public function freePrepared( $prepared ) {
-               return db2_free_stmt( $prepared );
-       }
-
-       /**
-        * Execute a prepared query with the various arguments
-        * @param $prepared String: the prepared sql
-        * @param $args Mixed: either an array here, or put scalars as varargs
-        * @return Resource: results object
-        */
-       public function execute( $prepared, $args = null ) {
-               if( !is_array( $args ) ) {
-                       # Pull the var args
-                       $args = func_get_args();
-                       array_shift( $args );
-               }
-               $res = db2_execute( $prepared, $args );
-               if ( !$res ) {
-                       $this->installPrint( db2_stmt_errormsg() );
-               }
-               return $res;
-       }
-
-       /**
-        * For faking prepared SQL statements on DBs that don't support
-        * it directly.
-        * @param $preparedQuery String: a 'preparable' SQL statement
-        * @param $args Array of arguments to fill it with
-        * @return String: executable statement
-        */
-       public function fillPrepared( $preparedQuery, $args ) {
-               reset( $args );
-               $this->preparedArgs =& $args;
-
-               foreach ( $args as $i => $arg ) {
-                       db2_bind_param( $preparedQuery, $i+1, $args[$i] );
-               }
-
-               return $preparedQuery;
-       }
-
-       /**
-        * Switches module between regular and install modes
-        * @return string
-        */
-       public function setMode( $mode ) {
-               $old = $this->mMode;
-               $this->mMode = $mode;
-               return $old;
-       }
-
-       /**
-        * Bitwise negation of a column or value in SQL
-        * Same as (~field) in C
-        * @param $field String
-        * @return String
-        */
-       function bitNot( $field ) {
-               // expecting bit-fields smaller than 4bytes
-               return "BITNOT( $field )";
-       }
-
-       /**
-        * Bitwise AND of two columns or values in SQL
-        * Same as (fieldLeft & fieldRight) in C
-        * @param $fieldLeft String
-        * @param $fieldRight String
-        * @return String
-        */
-       function bitAnd( $fieldLeft, $fieldRight ) {
-               return "BITAND( $fieldLeft, $fieldRight )";
-       }
-
-       /**
-        * Bitwise OR of two columns or values in SQL
-        * Same as (fieldLeft | fieldRight) in C
-        * @param $fieldLeft String
-        * @param $fieldRight String
-        * @return String
-        */
-       function bitOr( $fieldLeft, $fieldRight ) {
-               return "BITOR( $fieldLeft, $fieldRight )";
-       }
-}
-
-class IBM_DB2Helper {
-       public static function makeArray( $maybeArray ) {
-               if ( !is_array( $maybeArray ) ) {
-                       return array( $maybeArray );
-               }
-
-               return $maybeArray;
-       }
-}
index 1c920cb..6c45ffa 100644 (file)
@@ -61,10 +61,10 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Usually aborts on failure
-        * @param String $server
-        * @param String $user
-        * @param String $password
-        * @param String $dbName
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
         * @throws DBConnectionError
         * @return bool|DatabaseBase|null
         */
@@ -284,7 +284,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param $vars    Mixed: array or string, field name(s) to be retrieved
         * @param $conds   Mixed: array or string, condition(s) for WHERE
         * @param $fname   String: calling function name (use __METHOD__) for logs/profiling
-        * @param $options Array: associative array of options (e.g. array('GROUP BY' => 'page_title')),
+        * @param array $options associative array of options (e.g. array('GROUP BY' => 'page_title')),
         *                 see Database::makeSelectOptions code for list of supported stuff
         * @param $join_conds Array: Associative array of table join conditions (optional)
         *                                                 (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
@@ -309,7 +309,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param $vars    Mixed:  Array or string, field name(s) to be retrieved
         * @param $conds   Mixed:  Array or string, condition(s) for WHERE
         * @param $fname   String: Calling function name (use __METHOD__) for logs/profiling
-        * @param $options Array:  Associative array of options (e.g. array('GROUP BY' => 'page_title')),
+        * @param array $options  Associative array of options (e.g. array('GROUP BY' => 'page_title')),
         *                 see Database::makeSelectOptions code for list of supported stuff
         * @param $join_conds Array: Associative array of table join conditions (optional)
         *                    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
@@ -385,8 +385,8 @@ class DatabaseMssql extends DatabaseBase {
         *
         * Usually aborts on failure
         * If errors are explicitly ignored, returns success
-        * @param String $table
-        * @param Array $arrToInsert
+        * @param string $table
+        * @param array $arrToInsert
         * @param string $fname
         * @param array $options
         * @throws DBQueryError
@@ -813,8 +813,6 @@ class DatabaseMssql extends DatabaseBase {
                                                TO $newUser
                                                ;
                                        " );
-
-
        }
 
        function encodeBlob( $b ) {
@@ -893,7 +891,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * @private
         *
-        * @param $options Array: an associative array of options to be turned into
+        * @param array $options an associative array of options to be turned into
         *                 an SQL query, valid keys are listed in the function.
         * @return Array
         */
index fab0e96..27aae18 100644 (file)
@@ -208,7 +208,7 @@ class DatabaseMysql extends DatabaseBase {
                // Unfortunately, mysql_fetch_object does not reset the last errno.
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
                if( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
                }
@@ -232,7 +232,7 @@ class DatabaseMysql extends DatabaseBase {
                // Unfortunately, mysql_fetch_array does not reset the last errno.
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
                if( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
                }
@@ -251,9 +251,11 @@ class DatabaseMysql extends DatabaseBase {
                wfSuppressWarnings();
                $n = mysql_num_rows( $res );
                wfRestoreWarnings();
-               if( $this->lastErrno() ) {
-                       throw new DBUnexpectedError( $this, 'Error in numRows(): ' . htmlspecialchars( $this->lastError() ) );
-               }
+               // Unfortunately, mysql_num_rows does not reset the last errno.
+               // We are not checking for any errors here, since
+               // these are no errors mysql_num_rows can cause.
+               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               // See https://bugzilla.wikimedia.org/42430
                return $n;
        }
 
@@ -695,8 +697,8 @@ class DatabaseMysql extends DatabaseBase {
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
-        * @param $lockName String: name of lock to poll
-        * @param $method String: name of method calling us
+        * @param string $lockName name of lock to poll
+        * @param string $method name of method calling us
         * @return Boolean
         * @since 1.20
         */
@@ -893,8 +895,8 @@ class DatabaseMysql extends DatabaseBase {
        /**
         * List all tables on the database
         *
-        * @param $prefix string Only show tables with this prefix, e.g. mw_
-        * @param $fname String: calling function name
+        * @param string $prefix Only show tables with this prefix, e.g. mw_
+        * @param string $fname calling function name
         * @return array
         */
        function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
index 626d841..75b3550 100644 (file)
@@ -1151,7 +1151,7 @@ class DatabaseOracle extends DatabaseBase {
         *
         * @private
         *
-        * @param $options Array: an associative array of options to be turned into
+        * @param array $options an associative array of options to be turned into
         *              an SQL query, valid keys are listed in the function.
         * @return array
         */
index 2cbcc4b..f32d775 100644 (file)
@@ -482,7 +482,6 @@ class DatabasePostgres extends DatabaseBase {
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
-
        function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
                return $this->query( $sql, $fname, true );
        }
@@ -703,7 +702,6 @@ __INDEXATTR__;
                return $a;
        }
 
-
        function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
                        " AND indexdef LIKE 'CREATE UNIQUE%(" .
@@ -728,7 +726,7 @@ __INDEXATTR__;
         * @param $table   String: Name of the table to insert to.
         * @param $args    Array: Items to insert into the table.
         * @param $fname   String: Name of the function, for profiling
-        * @param $options String or Array. Valid options: IGNORE
+        * @param string $options or Array. Valid options: IGNORE
         *
         * @return bool Success of insert operation. IGNORE always returns true.
         */
@@ -1062,7 +1060,6 @@ __INDEXATTR__;
                return '[http://www.postgresql.org/ PostgreSQL]';
        }
 
-
        /**
         * Return current schema (executes SELECT current_schema())
         * Needs transaction
@@ -1081,8 +1078,8 @@ __INDEXATTR__;
         * This is list does not contain magic keywords like "$user"
         * Needs transaction
         *
-        * @seealso getSearchPath()
-        * @seealso setSearchPath()
+        * @see getSearchPath()
+        * @see setSearchPath()
         * @since 1.19
         * @return array list of actual schemas for the current sesson
         */
@@ -1350,7 +1347,7 @@ SQL;
         *
         * @private
         *
-        * @param $ins String: SQL string, read from a stream (usually tables.sql)
+        * @param string $ins SQL string, read from a stream (usually tables.sql)
         *
         * @return string SQL string
         */
@@ -1374,7 +1371,7 @@ SQL;
         *
         * @private
         *
-        * @param $options Array: an associative array of options to be turned into
+        * @param array $options an associative array of options to be turned into
         *              an SQL query, valid keys are listed in the function.
         * @return array
         */
@@ -1444,8 +1441,8 @@ SQL;
         * Check to see if a named lock is available. This is non-blocking.
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
         *
-        * @param $lockName String: name of lock to poll
-        * @param $method String: name of method calling us
+        * @param string $lockName name of lock to poll
+        * @param string $method name of method calling us
         * @return Boolean
         * @since 1.20
         */
@@ -1466,7 +1463,7 @@ SQL;
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
-               for ( $attempts=1; $attempts <= $timeout; ++$attempts ) {
+               for ( $attempts = 1; $attempts <= $timeout; ++$attempts ) {
                        $result = $this->query(
                                "SELECT pg_try_advisory_lock($key) AS lockstatus", $method );
                        $row = $this->fetchObject( $result );
index 74bd9b7..0789e1b 100644 (file)
@@ -144,8 +144,8 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * Generates a database file name. Explicitly public for installer.
-        * @param $dir String: Directory where database resides
-        * @param $dbName String: Database name
+        * @param string $dir Directory where database resides
+        * @param string $dbName Database name
         * @return String
         */
        public static function generateFileName( $dir, $dbName ) {
@@ -194,9 +194,9 @@ class DatabaseSqlite extends DatabaseBase {
         * Attaches external database to our connection, see http://sqlite.org/lang_attach.html
         * for details.
         *
-        * @param $name String: database name to be used in queries like SELECT foo FROM dbname.table
-        * @param $file String: database file name. If omitted, will be generated using $name and $wgSQLiteDataDir
-        * @param $fname String: calling function name
+        * @param string $name database name to be used in queries like SELECT foo FROM dbname.table
+        * @param string $file database file name. If omitted, will be generated using $name and $wgSQLiteDataDir
+        * @param string $fname calling function name
         *
         * @return ResultWrapper
         */
@@ -471,7 +471,7 @@ class DatabaseSqlite extends DatabaseBase {
         */
        function makeSelectOptions( $options ) {
                foreach ( $options as $k => $v ) {
-                       if ( is_numeric( $k ) && $v == 'FOR UPDATE' ) {
+                       if ( is_numeric( $k ) && ($v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE') ) {
                                $options[$k] = '';
                        }
                }
@@ -597,7 +597,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @return bool
         */
        function wasErrorReissuable() {
-               return $this->lastErrno() ==  17; // SQLITE_SCHEMA;
+               return $this->lastErrno() == 17; // SQLITE_SCHEMA;
        }
 
        /**
@@ -831,12 +831,11 @@ class DatabaseSqlite extends DatabaseBase {
                return $this->query( $sql, $fname );
        }
 
-
        /**
         * List all tables on the database
         *
-        * @param $prefix string Only show tables with this prefix, e.g. mw_
-        * @param $fname String: calling function name
+        * @param string $prefix Only show tables with this prefix, e.g. mw_
+        * @param string $fname calling function name
         *
         * @return array
         */
index 5e11076..9a1c8bd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * This file contains database-related utiliy classes.
+ * This file contains database-related utility classes.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -219,9 +219,9 @@ class ResultWrapper implements Iterator {
  * doesn't go anywhere near an actual database.
  */
 class FakeResultWrapper extends ResultWrapper {
-       var $result     = array();
-       var $db         = null; // And it's going to stay that way :D
-       var $pos        = 0;
+       var $result = array();
+       var $db = null; // And it's going to stay that way :D
+       var $pos = 0;
        var $currentRow = null;
 
        function __construct( $array ) {
@@ -285,7 +285,7 @@ class LikeMatch {
        /**
         * Store a string into a LikeMatch marker object.
         *
-        * @param String $s
+        * @param string $s
         */
        public function __construct( $s ) {
                $this->str = $s;
index 6a7a5bb..6bc0cdd 100644 (file)
@@ -33,7 +33,6 @@
 
 interface IORMRow {
 
-
        /**
         * Constructor.
         *
index e46dbc0..3686565 100644 (file)
@@ -107,7 +107,7 @@ interface IORMTable {
         * @param string|null $functionName
         *
         * @return ORMResult The result set
-        * @throw DBQueryError if the query failed (even if the database was in ignoreErrors mode)
+        * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
         */
        public function select( $fields = null, array $conditions = array(),
                                                        array $options = array(), $functionName = null );
@@ -139,7 +139,7 @@ interface IORMTable {
         * @param null|string $functionName
         *
         * @return ResultWrapper
-        * @throw DBQueryError if the query failed (even if the database was in ignoreErrors mode)
+        * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
         */
        public function rawSelect( $fields = null, array $conditions = array(),
                                                           array $options = array(), $functionName = null );
@@ -311,7 +311,6 @@ interface IORMTable {
         */
        public function setReadDb( $db );
 
-
        /**
         * Get the ID of the any foreign wiki to use as a target for database operations
         *
@@ -324,7 +323,7 @@ interface IORMTable {
        /**
         * Set the ID of the any foreign wiki to use as a target for database operations
         *
-        * @param String|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
+        * @param string|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
         *
         * @since 1.20
         */
index cc7f133..d469e86 100644 (file)
@@ -86,7 +86,7 @@ abstract class LBFactory {
         * Create a new load balancer object. The resulting object will be untracked,
         * not chronology-protected, and the caller is responsible for cleaning it up.
         *
-        * @param $wiki String: wiki ID, or false for the current wiki
+        * @param string $wiki wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function newMainLB( $wiki = false );
@@ -94,7 +94,7 @@ abstract class LBFactory {
        /**
         * Get a cached (tracked) load balancer object.
         *
-        * @param $wiki String: wiki ID, or false for the current wiki
+        * @param string $wiki wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function getMainLB( $wiki = false );
@@ -104,8 +104,8 @@ abstract class LBFactory {
         * untracked, not chronology-protected, and the caller is responsible for
         * cleaning it up.
         *
-        * @param $cluster String: external storage cluster, or false for core
-        * @param $wiki String: wiki ID, or false for the current wiki
+        * @param string $cluster external storage cluster, or false for core
+        * @param string $wiki wiki ID, or false for the current wiki
         *
         * @return LoadBalancer
         */
@@ -114,8 +114,8 @@ abstract class LBFactory {
        /**
         * Get a cached (tracked) load balancer for external storage
         *
-        * @param $cluster String: external storage cluster, or false for core
-        * @param $wiki String: wiki ID, or false for the current wiki
+        * @param string $cluster external storage cluster, or false for core
+        * @param string $wiki wiki ID, or false for the current wiki
         *
         * @return LoadBalancer
         */
index 88b7500..2e4963d 100644 (file)
@@ -21,7 +21,6 @@
  * @ingroup Database
  */
 
-
 /**
  * A multi-wiki, multi-master factory for Wikimedia and similar installations.
  * Ignores the old configuration globals
@@ -154,7 +153,7 @@ class LBFactory_Multi extends LBFactory {
        }
 
        /**
-        * @param String $cluster
+        * @param string $cluster
         * @param bool $wiki
         * @throws MWException
         * @return LoadBalancer
index 4b165b2..7dca06d 100644 (file)
@@ -28,7 +28,7 @@ class LBFactory_Single extends LBFactory {
        protected $lb;
 
        /**
-        * @param $conf array An associative array with one member:
+        * @param array $conf An associative array with one member:
         *  - connection: The DatabaseBase connection object
         */
        function __construct( $conf ) {
index 13fa466..aeebb13 100644 (file)
@@ -37,7 +37,7 @@ class LoadBalancer {
        private $mLoadMonitorClass, $mLoadMonitor;
 
        /**
-        * @param $params Array with keys:
+        * @param array $params with keys:
         *    servers           Required. Array of server info structures.
         *    masterWaitTimeout Replication lag wait timeout
         *    loadMonitor       Name of a class used to fetch server lag and load.
@@ -117,34 +117,14 @@ class LoadBalancer {
         * Given an array of non-normalised probabilities, this function will select
         * an element and return the appropriate key
         *
+        * @deprecated 1.21, use ArrayUtils::pickRandom()
+        *
         * @param $weights array
         *
-        * @return int
+        * @return bool|int|string
         */
        function pickRandom( $weights ) {
-               if ( !is_array( $weights ) || count( $weights ) == 0 ) {
-                       return false;
-               }
-
-               $sum = array_sum( $weights );
-               if ( $sum == 0 ) {
-                       # No loads on any of them
-                       # In previous versions, this triggered an unweighted random selection,
-                       # but this feature has been removed as of April 2006 to allow for strict
-                       # separation of query groups.
-                       return false;
-               }
-               $max = mt_getrandmax();
-               $rand = mt_rand( 0, $max ) / $max * $sum;
-
-               $sum = 0;
-               foreach ( $weights as $i => $w ) {
-                       $sum += $w;
-                       if ( $sum >= $rand ) {
-                               break;
-                       }
-               }
-               return $i;
+               return ArrayUtils::pickRandom( $weights );
        }
 
        /**
@@ -343,7 +323,7 @@ class LoadBalancer {
                                        $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
                                }
                        }
-                       if ( $this->mReadIndex <=0 && $this->mLoads[$i]>0 && $i !== false ) {
+                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $i !== false ) {
                                $this->mReadIndex = $i;
                        }
                }
@@ -453,7 +433,7 @@ class LoadBalancer {
         * This is the main entry point for this class.
         *
         * @param $i Integer: server index
-        * @param $groups Array: query groups
+        * @param array $groups query groups
         * @param bool|string $wiki Wiki ID
         *
         * @throws MWException
@@ -570,7 +550,7 @@ class LoadBalancer {
         * error will be available via $this->mErrorConnection.
         *
         * @param $i Integer server index
-        * @param $wiki String wiki ID to open
+        * @param string $wiki wiki ID to open
         * @return DatabaseBase
         *
         * @access private
@@ -616,7 +596,7 @@ class LoadBalancer {
         * error will be available via $this->mErrorConnection.
         *
         * @param $i Integer: server index
-        * @param $wiki String: wiki ID to open
+        * @param string $wiki wiki ID to open
         * @return DatabaseBase
         */
        function openForeignConnection( $i, $wiki ) {
@@ -704,11 +684,8 @@ class LoadBalancer {
                                'See DefaultSettings.php entry for $wgDBservers.' );
                }
 
-               $host = $server['host'];
-               $dbname = $server['dbname'];
-
                if ( $dbNameOverride !== false ) {
-                       $server['dbname'] = $dbname = $dbNameOverride;
+                       $server['dbname'] = $dbNameOverride;
                }
 
                # Create object
@@ -1001,7 +978,7 @@ class LoadBalancer {
         * May attempt to open connections to slaves on the default DB. If there is
         * no lag, the maximum lag will be reported as -1.
         *
-        * @param $wiki string Wiki ID, or false for the default database
+        * @param string $wiki Wiki ID, or false for the default database
         *
         * @return array ( host, max lag, index of max lagged host )
         */
index cb3376f..ad7b3b2 100644 (file)
@@ -37,7 +37,7 @@ interface LoadMonitor {
        /**
         * Perform pre-connection load ratio adjustment.
         * @param $loads array
-        * @param $group String: the selected query group
+        * @param string $group the selected query group
         * @param $wiki String
         */
        function scaleLoads( &$loads, $group = false, $wiki = false );
index 6acc124..6c1f27f 100644 (file)
@@ -139,7 +139,7 @@ class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @param $name string: Field name
+        * @param string $name Field name
         * @param $default mixed: Default value to return when none is found
         * (default: null)
         *
@@ -261,6 +261,11 @@ class ORMRow implements IORMRow {
                        if ( array_key_exists( $name, $this->fields ) ) {
                                $value = $this->fields[$name];
 
+                               // Skip null id fields so that the DBMS can set the default.
+                               if ( $name === 'id' && is_null ( $value ) ) {
+                                       continue;
+                               }
+
                                switch ( $type ) {
                                        case 'array':
                                                $value = (array)$value;
@@ -509,11 +514,7 @@ class ORMRow implements IORMRow {
                                        $value = (float)$value;
                                        break;
                                case 'bool':
-                                       if ( is_string( $value ) ) {
-                                               $value = $value !== '0';
-                                       } elseif ( is_int( $value ) ) {
-                                               $value = $value !== 0;
-                                       }
+                                       $value = (bool)$value;
                                        break;
                                case 'array':
                                        if ( is_string( $value ) ) {
index 06f88c1..bcbe94a 100644 (file)
@@ -201,7 +201,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @return ORMResult
         */
        public function select( $fields = null, array $conditions = array(),
-                                                       array $options = array(), $functionName  = null ) {
+                                                       array $options = array(), $functionName = null ) {
                $res = $this->rawSelect( $fields, $conditions, $options, $functionName );
                return new ORMResult( $this, $res );
        }
@@ -221,7 +221,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode).
         */
        public function selectObjects( $fields = null, array $conditions = array(),
-                                                                  array $options = array(), $functionName  = null ) {
+                                                                  array $options = array(), $functionName = null ) {
                $result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
 
                $objects = array();
@@ -247,7 +247,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
         */
        public function rawSelect( $fields = null, array $conditions = array(),
-                                                          array $options = array(), $functionName  = null ) {
+                                                          array $options = array(), $functionName = null ) {
                if ( is_null( $fields ) ) {
                        $fields = array_keys( $this->getFields() );
                }
@@ -313,7 +313,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @return array of array
         */
        public function selectFields( $fields = null, array $conditions = array(),
-                                                                 array $options = array(), $collapse = true, $functionName  = null ) {
+                                                                 array $options = array(), $collapse = true, $functionName = null ) {
                $objects = array();
 
                $result = $this->rawSelect( $fields, $conditions, $options, $functionName );
@@ -592,7 +592,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * Set the ID of the any foreign wiki to use as a target for database operations
         *
-        * @param String|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
+        * @param string|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
         *
         * @since 1.20
         */
index 8c60eca..8c39e1a 100644 (file)
@@ -135,7 +135,7 @@ class MWDebug {
         * @since 1.19
         * @param $msg string
         * @param $callerOffset int
-        * @param $level int A PHP error level. See sendWarning()
+        * @param int $level A PHP error level. See sendWarning()
         * @return mixed
         */
        public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
@@ -162,9 +162,9 @@ class MWDebug {
         * - MediaWiki's debug log, if $wgDevelopmentWarnings is set to false.
         *
         * @since 1.19
-        * @param $function string: Function that is deprecated.
-        * @param $version string|bool: Version in which the function was deprecated.
-        * @param $component string|bool: Component to which the function belongs.
+        * @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
         *    caller. 2 = function that called the function that called
@@ -270,8 +270,8 @@ class MWDebug {
         * Send a warning either to the debug log or by triggering an user PHP
         * error depending on $wgDevelopmentWarnings.
         *
-        * @param $msg string Message to send
-        * @param $caller array caller description get from getCallerDescription()
+        * @param string $msg Message to send
+        * @param array $caller caller description get from getCallerDescription()
         * @param $level error level to use if $wgDevelopmentWarnings is true
         */
        private static function sendWarning( $msg, $caller, $level ) {
index 6ef5fcb..94ffc06 100644 (file)
@@ -780,7 +780,6 @@ class Diff {
                        trigger_error( "Reversed closing doesn't match", E_USER_ERROR );
                }
 
-
                $prevtype = 'none';
                foreach ( $this->edits as $edit ) {
                        if ( $prevtype == $edit->type ) {
index c8f1d7f..0f3c77f 100644 (file)
@@ -80,7 +80,7 @@ class DifferenceEngine extends ContextSource {
         * Constructor
         * @param $context IContextSource context to use, anything else will be ignored
         * @param $old Integer old ID we want to show and diff with.
-        * @param $new String either 'prev' or 'next'.
+        * @param string $new either 'prev' or 'next'.
         * @param $rcid Integer ??? FIXME (default 0)
         * @param $refreshCache boolean If set, refreshes the diff cache
         * @param $unhide boolean If set, allow viewing deleted revs
@@ -267,6 +267,8 @@ class DifferenceEngine extends ContextSource {
                $deleted = $suppressed = false;
                $allowed = $this->mNewRev->userCan( Revision::DELETED_TEXT, $user );
 
+               $revisionTools = array();
+
                # mOldRev is false if the difference engine is called with a "vague" query for
                # a diff between a version V and its previous version V' AND the version V
                # is the first version of that article. In that case, V' does not exist.
@@ -301,8 +303,7 @@ class DifferenceEngine extends ContextSource {
                                        }
                                }
                                if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
-                                       $undoLink = ' ' . $this->msg( 'parentheses' )->rawParams(
-                                               Html::element( 'a', array(
+                                       $undoLink = Html::element( 'a', array(
                                                        'href' => $this->mNewPage->getLocalUrl( array(
                                                                'action' => 'edit',
                                                                'undoafter' => $this->mOldid,
@@ -310,7 +311,8 @@ class DifferenceEngine extends ContextSource {
                                                        'title' => Linker::titleAttrib( 'undo' )
                                                ),
                                                $this->msg( 'editundo' )->text()
-                                       ) )->escaped();
+                                       );
+                                       $revisionTools[] = $undoLink;
                                }
                        }
 
@@ -376,7 +378,15 @@ class DifferenceEngine extends ContextSource {
 
                # Handle RevisionDelete links...
                $rdel = $this->revisionDeleteLink( $this->mNewRev );
-               $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . $undoLink;
+
+               # Allow extensions to define their own revision tools
+               wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools ) );
+               $formattedRevisionTools = array();
+               // Put each one in parentheses (poor man's button)
+               foreach ( $revisionTools as $tool ) {
+                       $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
+               }
+               $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . ' ' . implode( ' ', $formattedRevisionTools );
 
                $newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
                        '<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
@@ -618,7 +628,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @param string|bool $otitle Header for old text or false
         * @param string|bool $ntitle Header for new text or false
-        * @param $notice String: HTML between diff header and body
+        * @param string $notice HTML between diff header and body
         * @return mixed
         */
        function getDiff( $otitle, $ntitle, $notice = '' ) {
@@ -759,8 +769,8 @@ class DifferenceEngine extends ContextSource {
        /**
         * Generate a diff, no caching
         *
-        * @param $otext String: old text, must be already segmented
-        * @param $ntext String: new text, must be already segmented
+        * @param string $otext old text, must be already segmented
+        * @param string $ntext new text, must be already segmented
         * @return bool|string
         * @deprecated since 1.21, use generateContentDiffBody() instead!
         */
@@ -775,8 +785,8 @@ class DifferenceEngine extends ContextSource {
         *
         * @todo move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point.
         *
-        * @param $otext String: old text, must be already segmented
-        * @param $ntext String: new text, must be already segmented
+        * @param string $otext old text, must be already segmented
+        * @param string $ntext new text, must be already segmented
         * @return bool|string
         */
        function generateTextDiffBody( $otext, $ntext ) {
@@ -887,7 +897,6 @@ class DifferenceEngine extends ContextSource {
                return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
        }
 
-
        /**
         * If there are revisions between the ones being compared, return a note saying so.
         * @return string
@@ -938,7 +947,7 @@ class DifferenceEngine extends ContextSource {
         * Get a header for a specified revision.
         *
         * @param $rev Revision
-        * @param $complete String: 'complete' to get the header wrapped depending
+        * @param string $complete 'complete' to get the header wrapped depending
         *        the visibility of the revision and a link to edit the page.
         * @return String HTML fragment
         */
index 4ce9f19..ea6f6e5 100644 (file)
@@ -29,7 +29,7 @@
  * (http://citeseer.ist.psu.edu/myers86ond.html) with range compression (see Wu et al.'s
  * "An O(NP) Sequence Comparison Algorithm").
  *
- * This implementation supports an upper bound on the excution time.
+ * This implementation supports an upper bound on the execution time.
  *
  * Complexity: O((M + N)D) worst case time, O(M + N + D^2) expected time, O(M + N) space
  *
@@ -490,7 +490,6 @@ class WikiDiff3 {
 
                $temp = array( 0, 0, 0 );
 
-
                $max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
                                $backward_end_diag - $backward_start_diag ) / 2 ), $temp );
                $num_progress = 0; // the 1st entry is current, it is initialized
index 5dd49d7..4ca193d 100644 (file)
  * Constructor class for key/value blob data kept in external repositories.
  *
  * Objects in external stores are defined by a special URL. The URL is of
- * the form "<store protocal>://<location>/<object name>". The protocal is used
+ * the form "<store protocol>://<location>/<object name>". The protocol is used
  * to determine what ExternalStoreMedium class is used. The location identifies
  * particular storage instances or database clusters for store class to use.
  *
  * When an object is inserted into a store, the calling code uses a partial URL of
- * the form "<store protocal>://<location>" and receives the full object URL on success.
+ * the form "<store protocol>://<location>" and receives the full object URL on success.
  * This is useful since object names can be sequential IDs, UUIDs, or hashes.
  * Callers are not responsible for unique name generation.
  *
@@ -47,8 +47,8 @@ class ExternalStore {
        /**
         * Get an external store object of the given type, with the given parameters
         *
-        * @param $proto string Type of external storage, should be a value in $wgExternalStores
-        * @param $params array Associative array of ExternalStoreMedium parameters
+        * @param string $proto Type of external storage, should be a value in $wgExternalStores
+        * @param array $params Associative array of ExternalStoreMedium parameters
         * @return ExternalStoreMedium|bool The store class or false on error
         */
        public static function getStoreObject( $proto, array $params = array() ) {
@@ -66,8 +66,8 @@ class ExternalStore {
        /**
         * Fetch data from given URL
         *
-        * @param $url string The URL of the text to get
-        * @param $params array Associative array of ExternalStoreMedium parameters
+        * @param string $url The URL of the text to get
+        * @param array $params Associative array of ExternalStoreMedium parameters
         * @return string|bool The text stored or false on error
         * @throws MWException
         */
@@ -95,9 +95,9 @@ class ExternalStore {
         * The protocol part is used to identify the class, the rest is passed to the
         * class itself as a parameter.
         *
-        * @param $url String A partial external store URL ("<store type>://<location>")
+        * @param string $url A partial external store URL ("<store type>://<location>")
         * @param $data string
-        * @param $params array Associative array of ExternalStoreMedium parameters
+        * @param array $params Associative array of ExternalStoreMedium parameters
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
         */
@@ -126,7 +126,7 @@ class ExternalStore {
         * itself. It also fails-over to the next possible clusters.
         *
         * @param $data string
-        * @param $params array Associative array of ExternalStoreMedium parameters
+        * @param array $params Associative array of ExternalStoreMedium parameters
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
         */
index 3857771..196e7f2 100644 (file)
@@ -75,7 +75,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a LoadBalancer for the specified cluster
         *
-        * @param $cluster String: cluster name
+        * @param string $cluster cluster name
         * @return LoadBalancer object
         */
        function &getLoadBalancer( $cluster ) {
@@ -87,7 +87,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a slave database connection for the specified cluster
         *
-        * @param $cluster String: cluster name
+        * @param string $cluster cluster name
         * @return DatabaseBase object
         */
        function &getSlave( $cluster ) {
@@ -109,7 +109,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a master database connection for the specified cluster
         *
-        * @param $cluster String: cluster name
+        * @param string $cluster cluster name
         * @return DatabaseBase object
         */
        function &getMaster( $cluster ) {
index 34e43e2..41af7d8 100644 (file)
@@ -33,7 +33,7 @@ abstract class ExternalStoreMedium {
        protected $params = array();
 
        /**
-        * @param $params array Options
+        * @param array $params Options
         */
        public function __construct( array $params = array() ) {
                $this->params = $params;
@@ -42,7 +42,7 @@ abstract class ExternalStoreMedium {
        /**
         * Fetch data from given external store URL
         *
-        * @param $url string An external store URL
+        * @param string $url An external store URL
         * @return string|bool The text stored or false on error
         * @throws MWException
         */
@@ -51,8 +51,8 @@ abstract class ExternalStoreMedium {
        /**
         * Insert a data item into a given location
         *
-        * @param $location string: the location name
-        * @param $data string: the data item
+        * @param string $location the location name
+        * @param string $data the data item
         * @return string|bool The URL of the stored data item, or false on error
         * @throws MWException
         */
index acbc4a9..7d0dbd5 100644 (file)
  */
 class FSFile {
        protected $path; // path to file
+       private $sha1Base36 = null; // File Sha1Base36
 
        /**
         * Sets up the file object
         *
-        * @param $path string Path to temporary file on local disk
+        * @param string $path Path to temporary file on local disk
         * @throws MWException
         */
        public function __construct( $path ) {
@@ -193,20 +194,27 @@ class FSFile {
         * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
         * fairly neatly.
         *
+        * @param $recache bool
         * @return bool|string False on failure
         */
-       public function getSha1Base36() {
+       public function getSha1Base36( $recache = false ) {
                wfProfileIn( __METHOD__ );
 
+               if ( $this->sha1Base36 !== null && !$recache ) {
+                       wfProfileOut( __METHOD__ );
+                       return $this->sha1Base36;
+               }
+
                wfSuppressWarnings();
-               $hash = sha1_file( $this->path );
+               $this->sha1Base36 = sha1_file( $this->path );
                wfRestoreWarnings();
-               if ( $hash !== false ) {
-                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+
+               if ( $this->sha1Base36 !== false ) {
+                       $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
                }
 
                wfProfileOut( __METHOD__ );
-               return $hash;
+               return $this->sha1Base36;
        }
 
        /**
@@ -223,7 +231,7 @@ class FSFile {
        /**
         * Get an associative array containing information about a file in the local filesystem.
         *
-        * @param $path String: absolute local filesystem path
+        * @param string $path absolute local filesystem path
         * @param $ext Mixed: the file extension, or true to extract it from the filename.
         *             Set it to false to ignore the extension.
         *
@@ -242,11 +250,18 @@ class FSFile {
         * fairly neatly.
         *
         * @param $path string
+        * @param $recache bool
         *
         * @return bool|string False on failure
         */
-       public static function getSha1Base36FromPath( $path ) {
-               $fsFile = new self( $path );
-               return $fsFile->getSha1Base36();
+       public static function getSha1Base36FromPath( $path, $recache = false ) {
+               static $sha1Base36 = array();
+
+               if ( !isset( $sha1Base36[$path] ) || $recache ) {
+                       $fsFile = new self( $path );
+                       $sha1Base36[$path] = $fsFile->getSha1Base36();
+               }
+
+               return $sha1Base36[$path];
        }
 }
index a1d46c1..c976998 100644 (file)
@@ -70,7 +70,7 @@ class FSFileBackend extends FileBackendStore {
                if ( isset( $config['containerPaths'] ) ) {
                        $this->containerPaths = (array)$config['containerPaths'];
                        foreach ( $this->containerPaths as &$path ) {
-                               $path = rtrim( $path, '/' );  // remove trailing slash
+                               $path = rtrim( $path, '/' ); // remove trailing slash
                        }
                }
 
@@ -102,7 +102,7 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Sanity check a relative file system path for validity
         *
-        * @param $path string Normalized relative path
+        * @param string $path Normalized relative path
         * @return bool
         */
        protected function isLegalRelPath( $path ) {
@@ -137,7 +137,7 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Get the absolute file system path for a storage path
         *
-        * @param $storagePath string Storage path
+        * @param string $storagePath Storage path
         * @return string|null
         */
        protected function resolveToFSPath( $storagePath ) {
@@ -145,7 +145,7 @@ class FSFileBackend extends FileBackendStore {
                if ( $relPath === null ) {
                        return null; // invalid
                }
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $storagePath );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $storagePath );
                $fsPath = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                if ( $relPath != '' ) {
                        $fsPath .= "/{$relPath}";
@@ -460,7 +460,7 @@ class FSFileBackend extends FileBackendStore {
         */
        protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                $existed = is_dir( $dir ); // already there?
@@ -487,7 +487,7 @@ class FSFileBackend extends FileBackendStore {
         */
        protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                // Seed new directories with a blank index.html, to prevent crawling...
@@ -518,7 +518,7 @@ class FSFileBackend extends FileBackendStore {
         */
        protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                // Unseed new directories with a blank index.html, to allow crawling...
@@ -549,7 +549,7 @@ class FSFileBackend extends FileBackendStore {
         */
        protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                $this->trapWarnings();
@@ -598,7 +598,7 @@ class FSFileBackend extends FileBackendStore {
         * @return bool|null
         */
        protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
 
@@ -614,7 +614,7 @@ class FSFileBackend extends FileBackendStore {
         * @return Array|null
         */
        public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                $exists = is_dir( $dir );
@@ -633,7 +633,7 @@ class FSFileBackend extends FileBackendStore {
         * @return Array|FSFileBackendFileList|null
         */
        public function getFileListInternal( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
                $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
                $exists = is_dir( $dir );
@@ -747,7 +747,7 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Chmod a file, suppressing the warnings
         *
-        * @param $path string Absolute file system path
+        * @param string $path Absolute file system path
         * @return bool Success
         */
        protected function chmod( $path ) {
@@ -779,7 +779,7 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Clean up directory separators for the given OS
         *
-        * @param $path string FS path
+        * @param string $path FS path
         * @return string
         */
        protected function cleanPathSlashes( $path ) {
@@ -857,7 +857,7 @@ abstract class FSFileBackendList implements Iterator {
        protected $params = array();
 
        /**
-        * @param $dir string file system directory
+        * @param string $dir file system directory
         * @param $params array
         */
        public function __construct( $dir, array $params ) {
@@ -878,7 +878,7 @@ abstract class FSFileBackendList implements Iterator {
        /**
         * Return an appropriate iterator object to wrap
         *
-        * @param $dir string file system directory
+        * @param string $dir file system directory
         * @return Iterator
         */
        protected function initIterator( $dir ) {
index 3ebfdb1..f40b8c1 100644 (file)
@@ -310,8 +310,8 @@ abstract class FileBackend {
         *   - a) unexpected operation errors occurred (network partitions, disk full...)
         *   - b) significant operation errors occurred and 'force' was not set
         *
-        * @param $ops Array List of operations to execute in order
-        * @param $opts Array Batch operation options
+        * @param array $ops List of operations to execute in order
+        * @param array $opts Batch operation options
         * @return Status
         */
        final public function doOperations( array $ops, array $opts = array() ) {
@@ -337,8 +337,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperations()
         *
-        * @param $op Array Operation
-        * @param $opts Array Operation options
+        * @param array $op Operation
+        * @param array $opts Operation options
         * @return Status
         */
        final public function doOperation( array $op, array $opts = array() ) {
@@ -351,8 +351,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         */
        final public function create( array $params, array $opts = array() ) {
@@ -365,8 +365,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         */
        final public function store( array $params, array $opts = array() ) {
@@ -379,8 +379,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         */
        final public function copy( array $params, array $opts = array() ) {
@@ -393,8 +393,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         */
        final public function move( array $params, array $opts = array() ) {
@@ -407,8 +407,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         */
        final public function delete( array $params, array $opts = array() ) {
@@ -421,8 +421,8 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperation()
         *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
+        * @param array $params Operation parameters
+        * @param array $opts Operation options
         * @return Status
         * @since 1.21
         */
@@ -540,8 +540,8 @@ abstract class FileBackend {
         * will reflect each operation attempted for the given files. The status will be
         * considered "OK" as long as no fatal errors occurred.
         *
-        * @param $ops Array Set of operations to execute
-        * @param $opts Array Batch operation options
+        * @param array $ops Set of operations to execute
+        * @param array $opts Batch operation options
         * @return Status
         * @since 1.20
         */
@@ -568,7 +568,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperations()
         *
-        * @param $op Array Operation
+        * @param array $op Operation
         * @return Status
         * @since 1.20
         */
@@ -582,7 +582,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.20
         */
@@ -596,7 +596,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.20
         */
@@ -610,7 +610,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.20
         */
@@ -624,7 +624,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.20
         */
@@ -638,7 +638,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.20
         */
@@ -652,7 +652,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doQuickOperation()
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * @return Status
         * @since 1.21
         */
@@ -666,7 +666,7 @@ abstract class FileBackend {
         * otherwise safe from modification from other processes. Normally,
         * the file will be a new temp file, which should be adequate.
         *
-        * @param $params Array Operation parameters
+        * @param array $params Operation parameters
         * $params include:
         *   - srcs        : ordered source storage paths (e.g. chunk1, chunk2, ...)
         *   - dst         : file system path to 0-byte temp file
@@ -684,7 +684,7 @@ abstract class FileBackend {
         * except they are only applied *if* the directory/container had to be created.
         * These flags should always be set for directories that have private files.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - dir            : storage directory
         *   - noAccess       : try to deny file access (since 1.20)
@@ -712,7 +712,7 @@ abstract class FileBackend {
         * access to the storage user representing end-users in web requests.
         * This is not guaranteed to actually do anything.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - dir            : storage directory
         *   - noAccess       : try to deny file access
@@ -740,7 +740,7 @@ abstract class FileBackend {
         * access to the storage user representing end-users in web requests.
         * This essentially can undo the result of secure() calls.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - dir            : storage directory
         *   - access         : try to allow file access
@@ -767,7 +767,7 @@ abstract class FileBackend {
         * Backends using key/value stores may do nothing unless the directory
         * is that of an empty container, in which case it will be deleted.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - dir            : storage directory
         *   - recursive      : recursively delete empty subdirectories first (since 1.20)
@@ -806,7 +806,7 @@ abstract class FileBackend {
         * Check if a file exists at a storage path in the backend.
         * This returns false if only a directory exists at the path.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -817,7 +817,7 @@ abstract class FileBackend {
        /**
         * Get the last-modified timestamp of the file at a storage path.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -829,7 +829,7 @@ abstract class FileBackend {
         * Get the contents of a file at a storage path in the backend.
         * This should be avoided for potentially large files.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -849,7 +849,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::getFileContents()
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - srcs        : list of source storage paths
         *   - latest      : use the latest available data
@@ -862,7 +862,7 @@ abstract class FileBackend {
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -878,7 +878,7 @@ abstract class FileBackend {
         *   - size   : the file size (bytes)
         * Additional values may be included for internal use only.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -889,7 +889,7 @@ abstract class FileBackend {
        /**
         * Get a SHA-1 hash of the file at a storage path in the backend.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -901,7 +901,7 @@ abstract class FileBackend {
         * Get the properties of the file at a storage path in the backend.
         * This gives the result of FSFile::getProps() on a local copy of the file.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -916,7 +916,7 @@ abstract class FileBackend {
         * will be sent if streaming began, while none will be sent otherwise.
         * Implementations should flush the output buffer before sending data.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src     : source storage path
         *   - headers : list of additional HTTP headers to send on success
@@ -938,7 +938,7 @@ abstract class FileBackend {
         * In that later case, there are copies of the file that must stay in sync.
         * Additionally, further calls to this function may return the same file.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -958,7 +958,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::getLocalReference()
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - srcs        : list of source storage paths
         *   - latest      : use the latest available data
@@ -973,7 +973,7 @@ abstract class FileBackend {
         * The temporary copy will have the same file extension as the source.
         * Temporary files may be purged when the file object falls out of scope.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
@@ -993,7 +993,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::getLocalCopy()
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - srcs        : list of source storage paths
         *   - latest      : use the latest available data
@@ -1013,9 +1013,10 @@ abstract class FileBackend {
         * Otherwise, one would need to use getLocalReference(), which involves loading
         * the entire file on to local disk.
         *
-        * @param $params Array
+        * @param array $params
         * $params include:
         *   - src : source storage path
+        *   - ttl : lifetime (seconds) if pre-authenticated; default is 1 day
         * @return string|null
         * @since 1.21
         */
@@ -1109,7 +1110,7 @@ abstract class FileBackend {
         * Preload persistent file stat and property cache into in-process cache.
         * This should be used when stat calls will be made on a known list of a many files.
         *
-        * @param $paths Array Storage paths
+        * @param array $paths Storage paths
         * @return void
         */
        public function preloadCache( array $paths ) {}
@@ -1118,7 +1119,7 @@ abstract class FileBackend {
         * Invalidate any in-process file stat and property cache.
         * If $paths is given, then only the cache for those files will be cleared.
         *
-        * @param $paths Array Storage paths (optional)
+        * @param array $paths Storage paths (optional)
         * @return void
         */
        public function clearCache( array $paths = null ) {}
@@ -1129,7 +1130,7 @@ abstract class FileBackend {
         *
         * Callers should consider using getScopedFileLocks() instead.
         *
-        * @param $paths Array Storage paths
+        * @param array $paths Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -1140,7 +1141,7 @@ abstract class FileBackend {
        /**
         * Unlock the files at the given storage paths in the backend.
         *
-        * @param $paths Array Storage paths
+        * @param array $paths Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -1156,7 +1157,7 @@ abstract class FileBackend {
         * Once the return value goes out scope, the locks will be released and
         * the status updated. Unlock fatals will not change the status "OK" value.
         *
-        * @param $paths Array Storage paths
+        * @param array $paths Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @param $status Status Status to update on lock/unlock
         * @return ScopedLock|null Returns null on failure
@@ -1176,7 +1177,7 @@ abstract class FileBackend {
         *
         * @see FileBackend::doOperations()
         *
-        * @param $ops Array List of file operations to FileBackend::doOperations()
+        * @param array $ops List of file operations to FileBackend::doOperations()
         * @param $status Status Status to update on lock/unlock
         * @return Array List of ScopedFileLocks or null values
         * @since 1.20
@@ -1197,7 +1198,7 @@ abstract class FileBackend {
        /**
         * Get the storage path for the given container for this backend
         *
-        * @param $container string Container name
+        * @param string $container Container name
         * @return string Storage path
         * @since 1.21
         */
@@ -1278,7 +1279,7 @@ abstract class FileBackend {
         */
        final public static function parentStoragePath( $storagePath ) {
                $storagePath = dirname( $storagePath );
-               list( $b, $cont, $rel ) = self::splitStoragePath( $storagePath );
+               list( , $rel ) = self::splitStoragePath( $storagePath );
                return ( $rel === null ) ? null : $storagePath;
        }
 
@@ -1307,8 +1308,8 @@ abstract class FileBackend {
        /**
         * Build a Content-Disposition header value per RFC 6266.
         *
-        * @param $type string One of (attachment, inline)
-        * @param $filename string Suggested file name (should not contain slashes)
+        * @param string $type One of (attachment, inline)
+        * @param string $filename Suggested file name (should not contain slashes)
         * @throws MWException
         * @return string
         * @since 1.20
@@ -1336,7 +1337,7 @@ abstract class FileBackend {
         *
         * This uses the same traversal protection as Title::secureAndSplit().
         *
-        * @param $path string Storage path relative to a container
+        * @param string $path Storage path relative to a container
         * @return string|null
         */
        final protected static function normalizeContainerPath( $path ) {
index 0bf5279..d790a99 100644 (file)
@@ -184,7 +184,7 @@ class FileBackendGroup {
         * @return FileBackend|null Backend or null on failure
         */
        public function backendFromPath( $storagePath ) {
-               list( $backend, $c, $p ) = FileBackend::splitStoragePath( $storagePath );
+               list( $backend, , ) = FileBackend::splitStoragePath( $storagePath );
                if ( $backend !== null && isset( $this->backends[$backend] ) ) {
                        return $this->get( $backend );
                }
index a5f5073..939315d 100644 (file)
@@ -204,7 +204,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Check that a set of files are consistent across all internal backends
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @return Status
         */
        public function consistencyCheck( array $paths ) {
@@ -270,7 +270,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Check that a set of file paths are usable across all internal backends
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @return Status
         */
        public function accessibilityCheck( array $paths ) {
@@ -295,7 +295,7 @@ class FileBackendMultiWrite extends FileBackend {
         * Check that a set of files are consistent across all internal backends
         * and re-synchronize those files againt the "multi master" if needed.
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @return Status
         */
        public function resyncFiles( array $paths ) {
@@ -303,8 +303,8 @@ class FileBackendMultiWrite extends FileBackend {
 
                $mBackend = $this->backends[$this->masterIndex];
                foreach ( $paths as $path ) {
-                       $mPath  = $this->substPaths( $path, $mBackend );
-                       $mSha1  = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
+                       $mPath = $this->substPaths( $path, $mBackend );
+                       $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
                        $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
                        // Check if the master backend is available...
                        if ( $mExist === null ) {
@@ -336,14 +336,20 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Get a list of file storage paths to read or write for a list of operations
         *
-        * @param $ops Array Same format as doOperations()
+        * @param array $ops Same format as doOperations()
         * @return Array List of storage paths to files (does not include directories)
         */
        protected function fileStoragePathsForOps( array $ops ) {
                $paths = array();
                foreach ( $ops as $op ) {
                        if ( isset( $op['src'] ) ) {
-                               $paths[] = $op['src'];
+                               // For things like copy/move/delete with "ignoreMissingSource" and there
+                               // is no source file, nothing should happen and there should be no errors.
+                               if ( empty( $op['ignoreMissingSource'] )
+                                       || $this->fileExists( array( 'src' => $op['src'] ) ) )
+                               {
+                                       $paths[] = $op['src'];
+                               }
                        }
                        if ( isset( $op['srcs'] ) ) {
                                $paths = array_merge( $paths, $op['srcs'] );
@@ -359,7 +365,7 @@ class FileBackendMultiWrite extends FileBackend {
         * Substitute the backend name in storage path parameters
         * for a set of operations with that of a given internal backend.
         *
-        * @param $ops Array List of file operation arrays
+        * @param array $ops List of file operation arrays
         * @param $backend FileBackendStore
         * @return Array
         */
@@ -380,7 +386,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Same as substOpBatchPaths() but for a single operation
         *
-        * @param $ops array File operation array
+        * @param array $ops File operation array
         * @param $backend FileBackendStore
         * @return Array
         */
@@ -392,7 +398,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Substitute the backend of storage paths with an internal backend's name
         *
-        * @param $paths Array|string List of paths or single string path
+        * @param array|string $paths List of paths or single string path
         * @param $backend FileBackendStore
         * @return Array|string
         */
@@ -407,7 +413,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Substitute the backend of internal storage paths with the proxy backend's name
         *
-        * @param $paths Array|string List of paths or single string path
+        * @param array|string $paths List of paths or single string path
         * @return Array|string
         */
        protected function unsubstPaths( $paths ) {
@@ -447,11 +453,11 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        /**
-        * @param $path string Storage path
+        * @param string $path Storage path
         * @return bool Path container should have dir changes pushed to all backends
         */
        protected function replicateContainerDirChanges( $path ) {
-               list( $b, $shortCont, $r ) = self::splitStoragePath( $path );
+               list( , $shortCont,  ) = self::splitStoragePath( $path );
                return !in_array( $shortCont, $this->noPushDirConts );
        }
 
index b906af5..3f1d185 100644 (file)
@@ -57,8 +57,8 @@ abstract class FileBackendStore extends FileBackend {
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
-               $this->memCache       = new EmptyBagOStuff(); // disabled by default
-               $this->cheapCache     = new ProcessCacheLRU( 300 );
+               $this->memCache = new EmptyBagOStuff(); // disabled by default
+               $this->cheapCache = new ProcessCacheLRU( 300 );
                $this->expensiveCache = new ProcessCacheLRU( 5 );
        }
 
@@ -100,7 +100,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - dstExists   : Whether a file exists at the destination (optimization).
         *                   Callers can use "false" if no existing file is being changed.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function createInternal( array $params ) {
@@ -143,7 +143,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - dstExists   : Whether a file exists at the destination (optimization).
         *                   Callers can use "false" if no existing file is being changed.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function storeInternal( array $params ) {
@@ -186,7 +186,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - dstExists           : Whether a file exists at the destination (optimization).
         *                           Callers can use "false" if no existing file is being changed.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function copyInternal( array $params ) {
@@ -219,7 +219,7 @@ abstract class FileBackendStore extends FileBackend {
         *                           If the status is OK, then its value field will be
         *                           set to a FileBackendStoreOpHandle object.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function deleteInternal( array $params ) {
@@ -255,7 +255,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - dstExists           : Whether a file exists at the destination (optimization).
         *                           Callers can use "false" if no existing file is being changed.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function moveInternal( array $params ) {
@@ -300,7 +300,7 @@ abstract class FileBackendStore extends FileBackend {
         *                     If the status is OK, then its value field will be
         *                     set to a FileBackendStoreOpHandle object.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function describeInternal( array $params ) {
@@ -326,7 +326,7 @@ abstract class FileBackendStore extends FileBackend {
         * No-op file operation that does nothing.
         * Do not call this function from places outside FileBackend and FileOp.
         *
-        * @param $params Array
+        * @param array $params
         * @return Status
         */
        final public function nullInternal( array $params ) {
@@ -447,7 +447,7 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doPrepareInternal( $fullCont, $dir, $params ) );
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doPrepareInternal( "{$fullCont}{$suffix}", $dir, $params ) );
                        }
@@ -487,7 +487,7 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doSecureInternal( "{$fullCont}{$suffix}", $dir, $params ) );
                        }
@@ -527,7 +527,7 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doPublishInternal( $fullCont, $dir, $params ) );
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doPublishInternal( "{$fullCont}{$suffix}", $dir, $params ) );
                        }
@@ -589,7 +589,7 @@ abstract class FileBackendStore extends FileBackend {
                        $this->deleteContainerCache( $fullCont ); // purge cache
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
                                $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
@@ -767,10 +767,7 @@ abstract class FileBackendStore extends FileBackend {
                $hash = $this->doGetFileSha1Base36( $params );
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
-               if ( $hash ) { // don't cache negatives
-                       $this->cheapCache->set( $path, 'sha1',
-                               array( 'hash' => $hash, 'latest' => $latest ) );
-               }
+               $this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $hash;
@@ -954,7 +951,7 @@ abstract class FileBackendStore extends FileBackend {
                        return $this->doDirectoryExists( $fullCont, $dir, $params );
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        $res = false; // response
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
@@ -972,9 +969,9 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackendStore::directoryExists()
         *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
+        * @param string $container Resolved container name
+        * @param string $dir Resolved path relative to container
+        * @param array $params
         * @return bool|null
         */
        abstract protected function doDirectoryExists( $container, $dir, array $params );
@@ -994,7 +991,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        // File listing spans multiple containers/shards
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        return new FileBackendStoreShardDirIterator( $this,
                                $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
                }
@@ -1005,9 +1002,9 @@ abstract class FileBackendStore extends FileBackend {
         *
         * @see FileBackendStore::getDirectoryList()
         *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
+        * @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
         */
        abstract public function getDirectoryListInternal( $container, $dir, array $params );
@@ -1027,7 +1024,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        // File listing spans multiple containers/shards
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
                        return new FileBackendStoreShardFileIterator( $this,
                                $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
                }
@@ -1038,9 +1035,9 @@ abstract class FileBackendStore extends FileBackend {
         *
         * @see FileBackendStore::getFileList()
         *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
+        * @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
         */
        abstract public function getFileListInternal( $container, $dir, array $params );
@@ -1052,7 +1049,7 @@ abstract class FileBackendStore extends FileBackend {
         * The result must have the same number of items as the input.
         * An exception is thrown if an unsupported operation is requested.
         *
-        * @param $ops Array Same format as doOperations()
+        * @param array $ops Same format as doOperations()
         * @return Array List of FileOp objects
         * @throws MWException
         */
@@ -1091,7 +1088,7 @@ abstract class FileBackendStore extends FileBackend {
         * each corresponding to a list of storage paths to be locked.
         * All returned paths are normalized.
         *
-        * @param $performOps Array List of FileOp objects
+        * @param array $performOps List of FileOp objects
         * @return Array ('sh' => list of paths, 'ex' => list of paths)
         */
        final public function getPathsToLockForOpsInternal( array $performOps ) {
@@ -1243,7 +1240,7 @@ abstract class FileBackendStore extends FileBackend {
         * The resulting Status object fields will correspond
         * to the order in which the handles where given.
         *
-        * @param $handles Array List of FileBackendStoreOpHandle objects
+        * @param array $handles List of FileBackendStoreOpHandle objects
         * @return Array Map of Status objects
         * @throws MWException
         */
@@ -1282,7 +1279,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Strip long HTTP headers from a file operation
         *
-        * @param $op array Same format as doOperation()
+        * @param array $op Same format as doOperation()
         * @return Array
         */
        protected function stripInvalidHeadersFromOp( array $op ) {
@@ -1305,7 +1302,7 @@ abstract class FileBackendStore extends FileBackend {
        final public function preloadCache( array $paths ) {
                $fullConts = array(); // full container names
                foreach ( $paths as $path ) {
-                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       list( $fullCont, , ) = $this->resolveStoragePath( $path );
                        $fullConts[] = $fullCont;
                }
                // Load from the persistent file and container caches
@@ -1338,7 +1335,7 @@ abstract class FileBackendStore extends FileBackend {
         *
         * @see FileBackend::clearCache()
         *
-        * @param $paths Array Storage paths (optional)
+        * @param array $paths Storage paths (optional)
         * @return void
         */
        protected function doClearCache( array $paths = null ) {}
@@ -1427,8 +1424,8 @@ abstract class FileBackendStore extends FileBackend {
         * Get the container name shard suffix for a given path.
         * Any empty suffix means the container is not sharded.
         *
-        * @param $container string Container name
-        * @param $relPath string Storage path relative to the container
+        * @param string $container Container name
+        * @param string $relPath Storage path relative to the container
         * @return string|null Returns null if shard could not be determined
         */
        final protected function getContainerShard( $container, $relPath ) {
@@ -1464,11 +1461,11 @@ abstract class FileBackendStore extends FileBackend {
         * Container dirs like "a", where the container shards on "x/xy",
         * can reside on several shards. Such paths are tricky to handle.
         *
-        * @param $storagePath string Storage path
+        * @param string $storagePath Storage path
         * @return bool
         */
        final public function isSingleShardPathInternal( $storagePath ) {
-               list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+               list( , $shard ) = $this->resolveStoragePath( $storagePath );
                return ( $shard !== null );
        }
 
@@ -1544,8 +1541,8 @@ abstract class FileBackendStore extends FileBackend {
         * getting absolute paths (e.g. FS based backends). Note that the relative path
         * may be the empty string (e.g. the path is simply to the container).
         *
-        * @param $container string Container name
-        * @param $relStoragePath string Storage path relative to the container
+        * @param string $container Container name
+        * @param string $relStoragePath Storage path relative to the container
         * @return string|null Path or null if not valid
         */
        protected function resolveContainerPath( $container, $relStoragePath ) {
@@ -1555,7 +1552,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get the cache key for a container
         *
-        * @param $container string Resolved container name
+        * @param string $container Resolved container name
         * @return string
         */
        private function containerCacheKey( $container ) {
@@ -1565,7 +1562,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Set the cached info for a container
         *
-        * @param $container string Resolved container name
+        * @param string $container Resolved container name
         * @param $val mixed Information to cache
         */
        final protected function setContainerCache( $container, $val ) {
@@ -1576,7 +1573,7 @@ abstract class FileBackendStore extends FileBackend {
         * Delete the cached info for a container.
         * The cache key is salted for a while to prevent race conditions.
         *
-        * @param $container string Resolved container name
+        * @param string $container Resolved container name
         */
        final protected function deleteContainerCache( $container ) {
                if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
@@ -1611,7 +1608,7 @@ abstract class FileBackendStore extends FileBackend {
                }
                // Get all the corresponding cache keys for paths...
                foreach ( $paths as $path ) {
-                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       list( $fullCont, , ) = $this->resolveStoragePath( $path );
                        if ( $fullCont !== null ) { // valid path for this backend
                                $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
                        }
@@ -1636,7 +1633,7 @@ abstract class FileBackendStore extends FileBackend {
         * resolved container names and their corresponding cached info.
         * Only containers that actually exist should appear in the map.
         *
-        * @param $containerInfo Array Map of resolved container names to cached info
+        * @param array $containerInfo Map of resolved container names to cached info
         * @return void
         */
        protected function doPrimeContainerCache( array $containerInfo ) {}
@@ -1644,7 +1641,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get the cache key for a file path
         *
-        * @param $path string Normalized storage path
+        * @param string $path Normalized storage path
         * @return string
         */
        private function fileCacheKey( $path ) {
@@ -1656,7 +1653,7 @@ abstract class FileBackendStore extends FileBackend {
         * Negatives (404s) are not cached. By not caching negatives, we can skip cache
         * salting for the case when a file is created at a path were there was none before.
         *
-        * @param $path string Storage path
+        * @param string $path Storage path
         * @param $val mixed Information to cache
         */
        final protected function setFileCache( $path, $val ) {
@@ -1673,7 +1670,7 @@ abstract class FileBackendStore extends FileBackend {
         * Since negatives (404s) are not cached, this does not need to be called when
         * a file is created at a path were there was none before.
         *
-        * @param $path string Storage path
+        * @param string $path Storage path
         */
        final protected function deleteFileCache( $path ) {
                $path = FileBackend::normalizeStoragePath( $path );
@@ -1690,7 +1687,7 @@ abstract class FileBackendStore extends FileBackend {
         * used in a list of storage paths or FileOp objects.
         * This loads the persistent cache values into the process cache.
         *
-        * @param $items Array List of storage paths or FileOps
+        * @param array $items List of storage paths or FileOps
         * @return void
         */
        final protected function primeFileCache( array $items ) {
@@ -1712,7 +1709,7 @@ abstract class FileBackendStore extends FileBackend {
                $paths = array_filter( $paths, 'strlen' ); // remove nulls
                // Get all the corresponding cache keys for paths...
                foreach ( $paths as $path ) {
-                       list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+                       list( , $rel, ) = $this->resolveStoragePath( $path );
                        if ( $rel !== null ) { // valid path for this backend
                                $pathNames[$this->fileCacheKey( $path )] = $path;
                        }
@@ -1737,7 +1734,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Set the 'concurrency' option from a list of operation options
         *
-        * @param $opts array Map of operation options
+        * @param array $opts Map of operation options
         * @return Array
         */
        final protected function setConcurrencyFlags( array $opts ) {
@@ -1809,10 +1806,10 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
 
        /**
         * @param $backend FileBackendStore
-        * @param $container string Full storage container name
-        * @param $dir string Storage directory relative to container
-        * @param $suffixes Array List of container shard suffixes
-        * @param $params Array
+        * @param string $container Full storage container name
+        * @param string $dir Storage directory relative to container
+        * @param array $suffixes List of container shard suffixes
+        * @param array $params
         */
        public function __construct(
                FileBackendStore $backend, $container, $dir, array $suffixes, array $params
@@ -1938,9 +1935,9 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
        /**
         * Get the list for a given container shard
         *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
+        * @param string $container Resolved container name
+        * @param string $dir Resolved path relative to container
+        * @param array $params
         * @return Traversable|Array|null
         */
        abstract protected function listFromShard( $container, $dir, array $params );
index 28f5b73..bb0ab57 100644 (file)
@@ -163,7 +163,7 @@ abstract class FileOp {
        /**
         * Update a dependency tracking array to account for this operation
         *
-        * @param $deps Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @param array $deps Prior path reads/writes; format of FileOp::newPredicates()
         * @return Array
         */
        final public function applyDependencies( array $deps ) {
@@ -175,7 +175,7 @@ abstract class FileOp {
        /**
         * Check if this operation changes files listed in $paths
         *
-        * @param $paths Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @param array $paths Prior path reads/writes; format of FileOp::newPredicates()
         * @return boolean
         */
        final public function dependsOn( array $deps ) {
@@ -195,8 +195,8 @@ abstract class FileOp {
        /**
         * Get the file journal entries for this file operation
         *
-        * @param $oPredicates Array Pre-op info about files (format of FileOp::newPredicates)
-        * @param $nPredicates Array Post-op info about files (format of FileOp::newPredicates)
+        * @param array $oPredicates Pre-op info about files (format of FileOp::newPredicates)
+        * @param array $nPredicates Post-op info about files (format of FileOp::newPredicates)
         * @return Array
         */
        final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
@@ -392,7 +392,7 @@ abstract class FileOp {
        /**
         * Check if a file will exist in storage when this operation is attempted
         *
-        * @param $source string Storage path
+        * @param string $source Storage path
         * @param $predicates Array
         * @return bool
         */
@@ -408,7 +408,7 @@ abstract class FileOp {
        /**
         * Get the SHA-1 of a file in storage when this operation is attempted
         *
-        * @param $source string Storage path
+        * @param string $source Storage path
         * @param $predicates Array
         * @return string|bool False on failure
         */
index 6e103ec..fc51d78 100644 (file)
@@ -49,8 +49,8 @@ class FileOpBatch {
         *   - a) unexpected operation errors occurred (network partitions, disk full...)
         *   - b) significant operation errors occurred and 'force' was not set
         *
-        * @param $performOps Array List of FileOp operations
-        * @param $opts Array Batch operation options
+        * @param array $performOps List of FileOp operations
+        * @param array $opts Batch operation options
         * @param $journal FileJournal Journal to log operations to
         * @return Status
         */
index 9c271ea..0f3d97a 100644 (file)
@@ -194,14 +194,14 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @param $disposition string Content-Disposition header value
+        * @param string $disposition Content-Disposition header value
         * @return string Truncated Content-Disposition header value to meet Swift limits
         */
        protected function truncDisp( $disposition ) {
                $res = '';
                foreach ( explode( ';', $disposition ) as $part ) {
                        $part = trim( $part );
-                       $new  = ( $res === '' ) ? $part : "{$res};{$part}";
+                       $new = ( $res === '' ) ? $part : "{$res};{$part}";
                        if ( strlen( $new ) <= 255 ) {
                                $res = $new;
                        } else {
@@ -411,7 +411,9 @@ class SwiftFileBackend extends FileBackendStore {
                        $sContObj = $this->getContainer( $srcCont );
                        $dContObj = $this->getContainer( $dstCont );
                } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
+                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       }
                        return $status;
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
@@ -481,7 +483,9 @@ class SwiftFileBackend extends FileBackendStore {
                        $sContObj = $this->getContainer( $srcCont );
                        $dContObj = $this->getContainer( $dstCont );
                } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
+                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       }
                        return $status;
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
@@ -557,7 +561,9 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( CDNNotEnabledException $e ) {
                        // CDN not enabled; nothing to see here
                } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                       }
                } catch ( NoSuchObjectException $e ) {
                        if ( empty( $params['ignoreMissingSource'] ) ) {
                                $status->fatal( 'backend-fail-delete', $params['src'] );
@@ -634,7 +640,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                // (a) Check if container already exists
                try {
-                       $contObj = $this->getContainer( $fullCont );
+                       $this->getContainer( $fullCont );
                        // NoSuchContainerException not thrown: container must exist
                        return $status; // already exists
                } catch ( NoSuchContainerException $e ) {
@@ -816,7 +822,7 @@ class SwiftFileBackend extends FileBackendStore {
         * Fill in any missing object metadata and save it to Swift
         *
         * @param $obj CF_Object
-        * @param $path string Storage path to object
+        * @param string $path Storage path to object
         * @return bool Success
         * @throws Exception cloudfiles exceptions
         */
@@ -869,8 +875,6 @@ class SwiftFileBackend extends FileBackendStore {
                                try {
                                        $sContObj = $this->getContainer( $srcCont );
                                        $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                                       // Get source file extension
-                                       $ext = FileBackend::extensionFromPath( $path );
                                        // Create a new temporary memory file...
                                        $handle = fopen( 'php://temp', 'wb' );
                                        if ( $handle ) {
@@ -958,11 +962,11 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Do not call this function outside of SwiftFileBackendFileList
         *
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string|null Storage path of file to list items after
+        * @param string $fullCont Resolved container name
+        * @param string $dir Resolved storage directory with no trailing slash
+        * @param string|null $after Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @param $params Array Includes flag for 'topOnly'
+        * @param array $params Includes flag for 'topOnly'
         * @return Array List of relative paths of dirs directly under $dir
         */
        public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
@@ -1031,11 +1035,11 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Do not call this function outside of SwiftFileBackendFileList
         *
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string|null Storage path of file to list items after
+        * @param string $fullCont Resolved container name
+        * @param string $dir Resolved storage directory with no trailing slash
+        * @param string|null $after Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @param $params Array Includes flag for 'topOnly'
+        * @param array $params Includes flag for 'topOnly'
         * @return Array List of relative paths of files under $dir
         */
        public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
@@ -1210,12 +1214,13 @@ class SwiftFileBackend extends FileBackendStore {
                                return null; // invalid path
                        }
                        try {
+                               $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
                                $sContObj = $this->getContainer( $srcCont );
                                $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
                                if ( $this->swiftTempUrlKey != '' ) {
-                                       return $obj->get_temp_url( $this->swiftTempUrlKey, 86400, "GET" );
+                                       return $obj->get_temp_url( $this->swiftTempUrlKey, $ttl, "GET" );
                                } else { // give S3 API URL for rgw
-                                       $expires = time() + 86400;
+                                       $expires = time() + $ttl;
                                        // Path for signature starts with the bucket
                                        $spath = '/' . rawurlencode( $srcCont ) . '/' .
                                                str_replace( '%2F', '/', rawurlencode( $srcRel ) );
@@ -1258,7 +1263,7 @@ class SwiftFileBackend extends FileBackendStore {
         * on a FileBackend params array, e.g. that of getLocalCopy().
         * $params is currently only checked for a 'latest' flag.
         *
-        * @param $params Array
+        * @param array $params
         * @return Array
         */
        protected function headersFromParams( array $params ) {
@@ -1321,8 +1326,8 @@ class SwiftFileBackend extends FileBackendStore {
         * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
         *
         * @param $contObj CF_Container Swift container
-        * @param $readGrps Array List of read access routes
-        * @param $writeGrps Array List of write access routes
+        * @param array $readGrps List of read access routes
+        * @param array $writeGrps List of write access routes
         * @return Status
         */
        protected function setContainerAccess(
@@ -1345,7 +1350,7 @@ class SwiftFileBackend extends FileBackendStore {
         * Purge the CDN cache of affected objects if CDN caching is enabled.
         * This is for Rackspace/Akamai CDNs.
         *
-        * @param $objects Array List of CF_Object items
+        * @param array $objects List of CF_Object items
         * @return void
         */
        public function purgeCDNCache( array $objects ) {
@@ -1439,8 +1444,8 @@ class SwiftFileBackend extends FileBackendStore {
         * Get a Swift container object, possibly from process cache.
         * Use $reCache if the file count or byte count is needed.
         *
-        * @param $container string Container name
-        * @param $bypassCache bool Bypass all caches and load from Swift
+        * @param string $container Container name
+        * @param bool $bypassCache Bypass all caches and load from Swift
         * @return CF_Container
         * @throws CloudFilesException
         */
@@ -1467,7 +1472,7 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Create a Swift container
         *
-        * @param $container string Container name
+        * @param string $container Container name
         * @return CF_Container
         * @throws CloudFilesException
         */
@@ -1481,7 +1486,7 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Delete a Swift container
         *
-        * @param $container string Container name
+        * @param string $container Container name
         * @return void
         * @throws CloudFilesException
         */
@@ -1515,7 +1520,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param $e Exception
         * @param $status Status|null
         * @param $func string
-        * @param $params Array
+        * @param array $params
         * @return void
         */
        protected function handleException( Exception $e, $status, $func, array $params ) {
@@ -1582,9 +1587,9 @@ abstract class SwiftFileBackendList implements Iterator {
 
        /**
         * @param $backend SwiftFileBackend
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved directory relative to container
-        * @param $params Array
+        * @param string $fullCont Resolved container name
+        * @param string $dir Resolved directory relative to container
+        * @param array $params
         */
        public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
                $this->backend = $backend;
@@ -1653,11 +1658,11 @@ abstract class SwiftFileBackendList implements Iterator {
        /**
         * Get the given list portion (page)
         *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
+        * @param string $container Resolved container name
+        * @param string $dir Resolved path relative to container
         * @param $after string|null
         * @param $limit integer
-        * @param $params Array
+        * @param array $params
         * @return Traversable|Array|null Returns null on failure
         */
        abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
index 44c6567..73f29a9 100644 (file)
@@ -99,6 +99,22 @@ class DBFileJournal extends FileJournal {
                );
        }
 
+       /**
+        * @see FileJournal::doGetPositionAtTime()
+        * @param $time integer|string timestamp
+        * @return integer|false
+        */
+       protected function doGetPositionAtTime( $time ) {
+               $dbw = $this->getMasterDB();
+
+               $encTimestamp = $dbw->addQuotes( $dbw->timestamp( $time ) );
+               return $dbw->selectField( 'filejournal', 'fj_id',
+                       array( 'fj_backend' => $this->backend, "fj_timestamp <= $encTimestamp" ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'fj_timestamp DESC' )
+               );
+       }
+
        /**
         * @see FileJournal::doGetChangeEntries()
         * @return Array
index d99384d..a1b7a45 100644 (file)
@@ -54,7 +54,7 @@ abstract class FileJournal {
         * Create an appropriate FileJournal object from config
         *
         * @param $config Array
-        * @param $backend string A registered file backend name
+        * @param string $backend A registered file backend name
         * @throws MWException
         * @return FileJournal
         */
@@ -90,8 +90,8 @@ abstract class FileJournal {
         *     newSha1 : The final base 36 SHA-1 of the file
         * Note that 'false' should be used as the SHA-1 for non-existing files.
         *
-        * @param $entries Array List of file operations (each an array of parameters)
-        * @param $batchId string UUID string that identifies the operation batch
+        * @param array $entries List of file operations (each an array of parameters)
+        * @param string $batchId UUID string that identifies the operation batch
         * @return Status
         */
        final public function logChangeBatch( array $entries, $batchId ) {
@@ -104,8 +104,8 @@ abstract class FileJournal {
        /**
         * @see FileJournal::logChangeBatch()
         *
-        * @param $entries Array List of file operations (each an array of parameters)
-        * @param $batchId string UUID string that identifies the operation batch
+        * @param array $entries List of file operations (each an array of parameters)
+        * @param string $batchId UUID string that identifies the operation batch
         * @return Status
         */
        abstract protected function doLogChangeBatch( array $entries, $batchId );
@@ -125,6 +125,23 @@ abstract class FileJournal {
         */
        abstract protected function doGetCurrentPosition();
 
+       /**
+        * Get the position ID of the latest journal entry at some point in time
+        *
+        * @param $time integer|string timestamp
+        * @return integer|false
+        */
+       final public function getPositionAtTime( $time ) {
+               return $this->doGetPositionAtTime( $time );
+       }
+
+       /**
+        * @see FileJournal::getPositionAtTime()
+        * @param $time integer|string timestamp
+        * @return integer|false
+        */
+       abstract protected function doGetPositionAtTime( $time );
+
        /**
         * Get an array of file change log entries.
         * A starting change ID and/or limit can be specified.
@@ -201,6 +218,15 @@ class NullFileJournal extends FileJournal {
                return false;
        }
 
+       /**
+        * @see FileJournal::doGetPositionAtTime()
+        * @param $time integer|string timestamp
+        * @return integer|false
+        */
+       protected function doGetPositionAtTime( $time ) {
+               return false;
+       }
+
        /**
         * @see FileJournal::doGetChangeEntries()
         * @return Array
index 90f4ccd..f02387d 100644 (file)
@@ -71,7 +71,7 @@ abstract class DBLockManager extends QuorumLockManager {
         *                   This tells the DB server how long to wait before assuming
         *                   connection failure and releasing all the locks for a session.
         *
-        * @param Array $config
+        * @param array $config
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
@@ -256,27 +256,38 @@ class MySqlLockManager extends DBLockManager {
                $status = Status::newGood();
 
                $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
-               $keys = array_unique( array_map( array( $this, 'sha1Base36Absolute' ), $paths ) );
+
+               $keys = array(); // list of hash keys for the paths
+               $data = array(); // list of rows to insert
+               $checkEXKeys = array(); // list of hash keys that this has no EX lock on
                # Build up values for INSERT clause
-               $data = array();
-               foreach ( $keys as $key ) {
+               foreach ( $paths as $path ) {
+                       $key = $this->sha1Base36Absolute( $path );
+                       $keys[] = $key;
                        $data[] = array( 'fls_key' => $key, 'fls_session' => $this->session );
+                       if ( !isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+                               $checkEXKeys[] = $key;
+                       }
                }
-               # Block new writers...
+
+               # Block new writers (both EX and SH locks leave entries here)...
                $db->insert( 'filelocks_shared', $data, __METHOD__, array( 'IGNORE' ) );
                # Actually do the locking queries...
                if ( $type == self::LOCK_SH ) { // reader locks
+                       $blocked = false;
                        # Bail if there are any existing writers...
-                       $blocked = $db->selectField( 'filelocks_exclusive', '1',
-                               array( 'fle_key' => $keys ),
-                               __METHOD__
-                       );
-                       # Prospective writers that haven't yet updated filelocks_exclusive
-                       # will recheck filelocks_shared after doing so and bail due to our entry.
+                       if ( count( $checkEXKeys ) ) {
+                               $blocked = $db->selectField( 'filelocks_exclusive', '1',
+                                       array( 'fle_key' => $checkEXKeys ),
+                                       __METHOD__
+                               );
+                       }
+                       # Other prospective writers that haven't yet updated filelocks_exclusive
+                       # will recheck filelocks_shared after doing so and bail due to this entry.
                } else { // writer locks
                        $encSession = $db->addQuotes( $this->session );
                        # Bail if there are any existing writers...
-                       # The may detect readers, but the safe check for them is below.
+                       # This may detect readers, but the safe check for them is below.
                        # Note: if two writers come at the same time, both bail :)
                        $blocked = $db->selectField( 'filelocks_shared', '1',
                                array( 'fls_key' => $keys, "fls_session != $encSession" ),
index f374fdd..eacba70 100644 (file)
@@ -43,7 +43,7 @@ class FSLockManager extends LockManager {
 
        protected $lockDir; // global dir for all servers
 
-       /** @var Array Map of (locked key => lock type => lock file handle) */
+       /** @var Array Map of (locked key => lock file handle) */
        protected $handles = array();
 
        /**
@@ -115,12 +115,16 @@ class FSLockManager extends LockManager {
                } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
                        $this->locksHeld[$path][$type] = 1;
                } else {
-                       wfSuppressWarnings();
-                       $handle = fopen( $this->getLockPath( $path ), 'a+' );
-                       wfRestoreWarnings();
-                       if ( !$handle ) { // lock dir missing?
-                               wfMkdirParents( $this->lockDir );
-                               $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+                       if ( isset( $this->handles[$path] ) ) {
+                               $handle = $this->handles[$path];
+                       } else {
+                               wfSuppressWarnings();
+                               $handle = fopen( $this->getLockPath( $path ), 'a+' );
+                               wfRestoreWarnings();
+                               if ( !$handle ) { // lock dir missing?
+                                       wfMkdirParents( $this->lockDir );
+                                       $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+                               }
                        }
                        if ( $handle ) {
                                // Either a shared or exclusive lock
@@ -128,7 +132,7 @@ class FSLockManager extends LockManager {
                                if ( flock( $handle, $lock | LOCK_NB ) ) {
                                        // Record this lock as active
                                        $this->locksHeld[$path][$type] = 1;
-                                       $this->handles[$path][$type] = $handle;
+                                       $this->handles[$path] = $handle;
                                } else {
                                        fclose( $handle );
                                        $status->fatal( 'lockmanager-fail-acquirelock', $path );
@@ -160,24 +164,13 @@ class FSLockManager extends LockManager {
                        --$this->locksHeld[$path][$type];
                        if ( $this->locksHeld[$path][$type] <= 0 ) {
                                unset( $this->locksHeld[$path][$type] );
-                               // If a LOCK_SH comes in while we have a LOCK_EX, we don't
-                               // actually add a handler, so check for handler existence.
-                               if ( isset( $this->handles[$path][$type] ) ) {
-                                       if ( $type === self::LOCK_EX
-                                               && isset( $this->locksHeld[$path][self::LOCK_SH] )
-                                               && !isset( $this->handles[$path][self::LOCK_SH] ) )
-                                       {
-                                               // EX lock came first: move this handle to the SH one
-                                               $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
-                                       } else {
-                                               // Mark this handle to be unlocked and closed
-                                               $handlesToClose[] = $this->handles[$path][$type];
-                                       }
-                                       unset( $this->handles[$path][$type] );
-                               }
                        }
                        if ( !count( $this->locksHeld[$path] ) ) {
                                unset( $this->locksHeld[$path] ); // no locks on this path
+                               if ( isset( $this->handles[$path] ) ) {
+                                       $handlesToClose[] = $this->handles[$path];
+                                       unset( $this->handles[$path] );
+                               }
                        }
                        // Unlock handles to release locks and delete
                        // any lock files that end up with no locks on them...
index 96d37ab..97de8dc 100644 (file)
@@ -66,7 +66,7 @@ class LSLockManager extends QuorumLockManager {
         *                    each having an odd-numbered list of server names (peers) as values.
         *   - connTimeout  : Lock server connection attempt timeout. [optional]
         *
-        * @param Array $config
+        * @param array $config
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
index d222bab..6d155df 100644 (file)
@@ -75,7 +75,7 @@ abstract class LockManager {
        /**
         * Lock the resources at the given abstract paths
         *
-        * @param $paths Array List of resource names
+        * @param array $paths List of resource names
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -89,7 +89,7 @@ abstract class LockManager {
        /**
         * Unlock the resources at the given abstract paths
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -127,7 +127,7 @@ abstract class LockManager {
        /**
         * Lock resources with the given keys and lock type
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return string
         */
@@ -136,7 +136,7 @@ abstract class LockManager {
        /**
         * Unlock resources with the given keys and lock type
         *
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return string
         */
index f0d5818..ac0bd49 100644 (file)
@@ -38,14 +38,14 @@ class LockManagerGroup {
        protected $managers = array();
 
        /**
-        * @param $domain string Domain (usually wiki ID)
+        * @param string $domain Domain (usually wiki ID)
         */
        protected function __construct( $domain ) {
                $this->domain = $domain;
        }
 
        /**
-        * @param $domain string Domain (usually wiki ID)
+        * @param string $domain Domain (usually wiki ID)
         * @return LockManagerGroup
         */
        public static function singleton( $domain = false ) {
index 099f11d..8131f81 100644 (file)
@@ -28,8 +28,8 @@
  * This is meant for multi-wiki systems that may share files.
  * All locks are non-blocking, which avoids deadlocks.
  *
- * All lock requests for a resource, identified by a hash string, will map
- * to one bucket. Each bucket maps to one or several peer servers, each running memcached.
+ * All lock requests for a resource, identified by a hash string, will map to one
+ * bucket. Each bucket maps to one or several peer servers, each running memcached.
  * A majority of peers must agree for a lock to be acquired.
  *
  * @ingroup LockManager
@@ -49,7 +49,7 @@ class MemcLockManager extends QuorumLockManager {
        protected $serversUp = array(); // (server name => bool)
 
        protected $lockExpiry; // integer; maximum time locks can be held
-       protected $session = ''; // string; random SHA-1 UUID
+       protected $session = ''; // string; random UUID
 
        /**
         * Construct a new instance from configuration.
@@ -61,7 +61,7 @@ class MemcLockManager extends QuorumLockManager {
         *   - memcConfig   : Configuration array for ObjectCache::newFromParams. [optional]
         *                    If set, this must use one of the memcached classes.
         *
-        * @param Array $config
+        * @param array $config
         * @throws MWException
         */
        public function __construct( array $config ) {
@@ -118,8 +118,8 @@ class MemcLockManager extends QuorumLockManager {
                foreach ( $paths as $path ) {
                        $locksKey = $this->recordKeyForPath( $path );
                        $locksHeld = isset( $lockRecords[$locksKey] )
-                               ? $lockRecords[$locksKey]
-                               : array( self::LOCK_SH => array(), self::LOCK_EX => array() ); // init
+                               ? self::sanitizeLockArray( $lockRecords[$locksKey] )
+                               : self::newLockArray(); // init
                        foreach ( $locksHeld[self::LOCK_EX] as $session => $expiry ) {
                                if ( $expiry < $now ) { // stale?
                                        unset( $locksHeld[self::LOCK_EX][$session] );
@@ -146,9 +146,15 @@ class MemcLockManager extends QuorumLockManager {
 
                // If there were no lock conflicts, update all the lock records...
                if ( $status->isOK() ) {
-                       foreach ( $lockRecords as $locksKey => $locksHeld ) {
-                               $memc->set( $locksKey, $locksHeld );
-                               wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+                       foreach ( $paths as $path ) {
+                               $locksKey = $this->recordKeyForPath( $path );
+                               $locksHeld = $lockRecords[$locksKey];
+                               $ok = $memc->set( $locksKey, $locksHeld, 7*86400 );
+                               if ( !$ok ) {
+                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                               } else {
+                                       wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+                               }
                        }
                }
 
@@ -183,17 +189,22 @@ class MemcLockManager extends QuorumLockManager {
                foreach ( $paths as $path ) {
                        $locksKey = $this->recordKeyForPath( $path ); // lock record
                        if ( !isset( $lockRecords[$locksKey] ) ) {
+                               $status->warning( 'lockmanager-fail-releaselock', $path );
                                continue; // nothing to do
                        }
-                       $locksHeld = $lockRecords[$locksKey];
-                       if ( is_array( $locksHeld ) && isset( $locksHeld[$type] ) ) {
-                               unset( $locksHeld[$type][$this->session] );
-                               $ok = $memc->set( $locksKey, $locksHeld );
+                       $locksHeld = self::sanitizeLockArray( $lockRecords[$locksKey] );
+                       if ( isset( $locksHeld[$type][$this->session] ) ) {
+                               unset( $locksHeld[$type][$this->session] ); // unregister this session
+                               if ( $locksHeld === self::newLockArray() ) {
+                                       $ok = $memc->delete( $locksKey );
+                               } else {
+                                       $ok = $memc->set( $locksKey, $locksHeld );
+                               }
+                               if ( !$ok ) {
+                                       $status->fatal( 'lockmanager-fail-releaselock', $path );
+                               }
                        } else {
-                               $ok = true;
-                       }
-                       if ( !$ok ) {
-                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                               $status->warning( 'lockmanager-fail-releaselock', $path );
                        }
                        wfDebug( __METHOD__ . ": released lock on key $locksKey.\n" );
                }
@@ -223,7 +234,7 @@ class MemcLockManager extends QuorumLockManager {
        /**
         * Get the MemcachedBagOStuff object for a $lockSrv
         *
-        * @param $lockSrv string Server name
+        * @param string $lockSrv Server name
         * @return MemcachedBagOStuff|null
         */
        protected function getCache( $lockSrv ) {
@@ -251,9 +262,29 @@ class MemcLockManager extends QuorumLockManager {
                return implode( ':', array( __CLASS__, 'locks', $this->sha1Base36Absolute( $path ) ) );
        }
 
+       /**
+        * @return Array An empty lock structure for a key
+        */
+       protected static function newLockArray() {
+               return array( self::LOCK_SH => array(), self::LOCK_EX => array() );
+       }
+
+       /**
+        * @param $a array
+        * @return Array An empty lock structure for a key
+        */
+       protected static function sanitizeLockArray( $a ) {
+               if ( is_array( $a ) && isset( $a[self::LOCK_EX] ) && isset( $a[self::LOCK_SH] ) ) {
+                       return $a;
+               } else {
+                       trigger_error( __METHOD__ . ": reset invalid lock array.", E_USER_WARNING );
+                       return self::newLockArray();
+               }
+       }
+
        /**
         * @param $memc MemcachedBagOStuff
-        * @param $keys Array List of keys to acquire
+        * @param array $keys List of keys to acquire
         * @return bool
         */
        protected function acquireMutexes( MemcachedBagOStuff $memc, array $keys ) {
@@ -279,10 +310,10 @@ class MemcLockManager extends QuorumLockManager {
                                        continue; // acquire in order
                                }
                        }
-               } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 6 );
+               } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 3 );
 
                if ( count( $lockedKeys ) != count( $keys ) ) {
-                       $this->releaseMutexes( $lockedKeys ); // failed; release what was locked
+                       $this->releaseMutexes( $memc, $lockedKeys ); // failed; release what was locked
                        return false;
                }
 
@@ -291,7 +322,7 @@ class MemcLockManager extends QuorumLockManager {
 
        /**
         * @param $memc MemcachedBagOStuff
-        * @param $keys Array List of acquired keys
+        * @param array $keys List of acquired keys
         * @return void
         */
        protected function releaseMutexes( MemcachedBagOStuff $memc, array $keys ) {
index 76a3ad6..b331b54 100644 (file)
@@ -46,8 +46,6 @@ abstract class QuorumLockManager extends LockManager {
                foreach ( $paths as $path ) {
                        if ( isset( $this->locksHeld[$path][$type] ) ) {
                                ++$this->locksHeld[$path][$type];
-                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
-                               $this->locksHeld[$path][$type] = 1;
                        } else {
                                $bucket = $this->getBucketFromPath( $path );
                                $pathsToLock[$bucket][] = $path;
@@ -118,7 +116,7 @@ abstract class QuorumLockManager extends LockManager {
         * This is all or nothing; if any key is locked then this totally fails.
         *
         * @param $bucket integer
-        * @param $paths Array List of resource keys to lock
+        * @param array $paths List of resource keys to lock
         * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
         * @return Status
         */
@@ -160,7 +158,7 @@ abstract class QuorumLockManager extends LockManager {
         * Attempt to release locks with the peers for a bucket
         *
         * @param $bucket integer
-        * @param $paths Array List of resource keys to lock
+        * @param array $paths List of resource keys to lock
         * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
         * @return Status
         */
index 5a80bee..edcb1d6 100644 (file)
@@ -43,7 +43,7 @@ class ScopedLock {
 
        /**
         * @param $manager LockManager
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @param $status Status
         */
@@ -62,7 +62,7 @@ class ScopedLock {
         * The status object is updated with any errors or warnings.
         *
         * @param $manager LockManager
-        * @param $paths Array List of storage paths
+        * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @param $status Status
         * @return ScopedLock|null Returns null on failure
@@ -78,6 +78,19 @@ class ScopedLock {
                return null;
        }
 
+       /**
+        * Release a scoped lock and set any errors in the attatched Status object.
+        * This is useful for early release of locks before function scope is destroyed.
+        * This is the same as setting the lock object to null.
+        *
+        * @param ScopedLock $lock
+        * @return void
+        * @since 1.21
+        */
+       public static function release( ScopedLock &$lock = null ) {
+               $lock = null;
+       }
+
        function __destruct() {
                $wasOk = $this->status->isOK();
                $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
index 05e71d4..366dd8a 100644 (file)
@@ -155,7 +155,7 @@ class FileRepo {
        /**
         * Check if a single zone or list of zones is defined for usage
         *
-        * @param $doZones Array Only do a particular zones
+        * @param array $doZones Only do a particular zones
         * @throws MWException
         * @return Status
         */
@@ -199,8 +199,8 @@ class FileRepo {
        /**
         * Get the URL corresponding to one of the four basic zones
         *
-        * @param $zone String One of: public, deleted, temp, thumb
-        * @param $ext String|null Optional file extension
+        * @param string $zone One of: public, deleted, temp, thumb
+        * @param string|null $ext Optional file extension
         * @return String or false
         */
        public function getZoneUrl( $zone, $ext = null ) {
@@ -237,7 +237,7 @@ class FileRepo {
         * 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 $zone String: one of: public, deleted, temp, thumb
+        * @param string $zone one of: public, deleted, temp, thumb
         * @return String or false
         */
        public function getZoneHandlerUrl( $zone ) {
@@ -340,7 +340,7 @@ class FileRepo {
         * version control should return false if the time is specified.
         *
         * @param $title Mixed: Title object or string
-        * @param $options array Associative array of options:
+        * @param array $options Associative array of options:
         *     time:           requested time for a specific file version, or false for the
         *                     current version. An image object will be returned which was
         *                     created at the specified time (which may be archived or current).
@@ -399,7 +399,7 @@ class FileRepo {
        /**
         * Find many files at once.
         *
-        * @param $items array An array of titles, or an array of findFile() options with
+        * @param array $items An array of titles, or an array of findFile() options with
         *    the "title" option giving the title. Example:
         *
         *     $findItem = array( 'title' => $title, 'private' => true );
@@ -431,8 +431,8 @@ class FileRepo {
         * Returns false if the file does not exist. Repositories not supporting
         * version control should return false if the time is specified.
         *
-        * @param $sha1 String base 36 SHA-1 hash
-        * @param $options array Option array, same as findFile().
+        * @param string $sha1 base 36 SHA-1 hash
+        * @param array $options Option array, same as findFile().
         * @return File|bool False on failure
         */
        public function findFileFromKey( $sha1, $options = array() ) {
@@ -476,7 +476,7 @@ class FileRepo {
         * Get an array of arrays or iterators of file objects for files that
         * have the given SHA-1 content hashes.
         *
-        * @param $hashes array An array of hashes
+        * @param array $hashes An array of hashes
         * @return array An Array of arrays or iterators of file objects and the hash as key
         */
        public function findBySha1s( array $hashes ) {
@@ -490,6 +490,18 @@ class FileRepo {
                return $result;
        }
 
+       /**
+        * Return an array of files where the name starts with $prefix.
+        *
+        * STUB
+        * @param string $prefix The prefix to search for
+        * @param int $limit The maximum amount of files to return
+        * @return array
+        */
+       public function findFilesByPrefix( $prefix, $limit ) {
+               return array();
+       }
+
        /**
         * Get the public root URL of the repository
         *
@@ -550,7 +562,7 @@ class FileRepo {
         * Get a relative path including trailing slash, e.g. f/fa/
         * If the repo is not hashed, returns an empty string
         *
-        * @param $name string Name of file
+        * @param string $name Name of file
         * @return string
         */
        public function getHashPath( $name ) {
@@ -561,7 +573,7 @@ class FileRepo {
         * Get a relative path including trailing slash, e.g. f/fa/
         * If the repo is not hashed, returns an empty string
         *
-        * @param $suffix string Basename of file from FileRepo::storeTemp()
+        * @param string $suffix Basename of file from FileRepo::storeTemp()
         * @return string
         */
        public function getTempHashPath( $suffix ) {
@@ -610,7 +622,7 @@ class FileRepo {
         * Make an url to this repo
         *
         * @param $query mixed Query string to append
-        * @param $entry string Entry point; defaults to index
+        * @param string $entry Entry point; defaults to index
         * @return string|bool False on failure
         */
        public function makeUrl( $query = '', $entry = 'index' ) {
@@ -664,8 +676,8 @@ class FileRepo {
         * repository's file class, since it may return invalid results. User code
         * should use File::getDescriptionText().
         *
-        * @param $name String: name of image to fetch
-        * @param $lang String: language to fetch it in, if any.
+        * @param string $name name of image to fetch
+        * @param string $lang language to fetch it in, if any.
         * @return string
         */
        public function getDescriptionRenderUrl( $name, $lang = null ) {
@@ -704,9 +716,9 @@ class FileRepo {
        /**
         * Store a file to a given destination.
         *
-        * @param $srcPath String: source file system path, storage path, or virtual URL
-        * @param $dstZone String: destination zone
-        * @param $dstRel String: destination relative path
+        * @param string $srcPath source file system path, storage path, or virtual URL
+        * @param string $dstZone destination zone
+        * @param string $dstRel destination relative path
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::DELETE_SOURCE     Delete the source file after upload
         *     self::OVERWRITE         Overwrite an existing destination file instead of failing
@@ -729,7 +741,7 @@ class FileRepo {
        /**
         * Store a batch of files
         *
-        * @param $triplets Array: (src, dest zone, dest rel) triplets as per store()
+        * @param array $triplets (src, dest zone, dest rel) triplets as per store()
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::DELETE_SOURCE     Delete the source file after upload
         *     self::OVERWRITE         Overwrite an existing destination file instead of failing
@@ -763,7 +775,7 @@ class FileRepo {
                                throw new MWException( 'Validation error in $dstRel' );
                        }
                        $dstPath = "$root/$dstRel";
-                       $dstDir  = dirname( $dstPath );
+                       $dstDir = dirname( $dstPath );
                        // Create destination directories for this triplet
                        if ( !$this->initDirectory( $dstDir )->isOK() ) {
                                return $this->newFatal( 'directorycreateerror', $dstDir );
@@ -811,7 +823,7 @@ class FileRepo {
         * Each file can be a (zone, rel) pair, virtual url, storage path.
         * It will try to delete each file, but ignores any errors that may occur.
         *
-        * @param $files array List of files to delete
+        * @param array $files List of files to delete
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::SKIP_LOCKING      Skip any file locking when doing the deletions
         * @return FileRepoStatus
@@ -849,9 +861,9 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for copying generated thumbnails into the repo.
         *
-        * @param $src string Source file system path, storage path, or virtual URL
-        * @param $dst string Virtual URL or storage path
-        * @param $disposition string|null Content-Disposition if given and supported
+        * @param string $src Source file system path, storage path, or virtual URL
+        * @param string $dst Virtual URL or storage path
+        * @param string|null $disposition Content-Disposition if given and supported
         * @return FileRepoStatus
         */
        final public function quickImport( $src, $dst, $disposition = null ) {
@@ -863,7 +875,7 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for purging thumbnails.
         *
-        * @param $path string Virtual URL or storage path
+        * @param string $path Virtual URL or storage path
         * @return FileRepoStatus
         */
        final public function quickPurge( $path ) {
@@ -874,7 +886,7 @@ class FileRepo {
         * Deletes a directory if empty.
         * This function can be used to write to otherwise read-only foreign repos.
         *
-        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @param string $dir Virtual URL (or storage path) of directory to clean
         * @return Status
         */
        public function quickCleanDir( $dir ) {
@@ -894,7 +906,7 @@ class FileRepo {
         * All path parameters may be a file system path, storage path, or virtual URL.
         * When "dispositions" are given they are used as Content-Disposition if supported.
         *
-        * @param $triples Array List of (source path, destination path, disposition)
+        * @param array $triples List of (source path, destination path, disposition)
         * @return FileRepoStatus
         */
        public function quickImportBatch( array $triples ) {
@@ -922,7 +934,7 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This does no locking nor journaling and is intended for purging thumbnails.
         *
-        * @param $paths Array List of virtual URLs or storage paths
+        * @param array $paths List of virtual URLs or storage paths
         * @return FileRepoStatus
         */
        public function quickPurgeBatch( array $paths ) {
@@ -945,18 +957,17 @@ class FileRepo {
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
         * file can later be disposed using FileRepo::freeTemp().
         *
-        * @param $originalName String: the base name of the file as specified
+        * @param string $originalName the base name of the file as specified
         *     by the user. The file extension will be maintained.
-        * @param $srcPath String: the current location of the file.
+        * @param string $srcPath the current location of the file.
         * @return FileRepoStatus object with the URL in the value.
         */
        public function storeTemp( $originalName, $srcPath ) {
                $this->assertWritableRepo(); // fail out if read-only
 
-               $date       = gmdate( "YmdHis" );
-               $hashPath   = $this->getHashPath( $originalName );
-               $dstRel     = "{$hashPath}{$date}!{$originalName}";
-               $dstUrlRel  = $hashPath . $date . '!' . rawurlencode( $originalName );
+               $date = gmdate( "YmdHis" );
+               $hashPath = $this->getHashPath( $originalName );
+               $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
                $virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
 
                $result = $this->quickImport( $srcPath, $virtualUrl );
@@ -968,7 +979,7 @@ class FileRepo {
        /**
         * Remove a temporary file or mark it for garbage collection
         *
-        * @param $virtualUrl String: the virtual URL returned by FileRepo::storeTemp()
+        * @param string $virtualUrl the virtual URL returned by FileRepo::storeTemp()
         * @return Boolean: true on success, false on failure
         */
        public function freeTemp( $virtualUrl ) {
@@ -986,8 +997,8 @@ class FileRepo {
        /**
         * Concatenate a list of temporary files into a target file location.
         *
-        * @param $srcPaths Array Ordered list of source virtual URLs/storage paths
-        * @param $dstPath String Target file system path
+        * @param array $srcPaths Ordered list of source virtual URLs/storage paths
+        * @param string $dstPath Target file system path
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::DELETE_SOURCE     Delete the source files
         * @return FileRepoStatus
@@ -1032,13 +1043,13 @@ class FileRepo {
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
-        * @param $srcPath String: the source file system path, storage path, or URL
-        * @param $dstRel String: the destination relative path
-        * @param $archiveRel String: the relative path where the existing file is to
+        * @param string $srcPath the source file system path, storage path, or URL
+        * @param string $dstRel the destination relative path
+        * @param string $archiveRel the relative path where the existing file is to
         *        be archived, if there is one. Relative to the public zone root.
         * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
         *        that the source file should be deleted if possible
-        * @param $options Array Optional additional parameters
+        * @param array $options Optional additional parameters
         * @return FileRepoStatus
         */
        public function publish(
@@ -1063,7 +1074,7 @@ class FileRepo {
        /**
         * Publish a batch of files
         *
-        * @param $ntuples Array: (source, dest, archive) triplets or
+        * @param array $ntuples (source, dest, archive) triplets or
         *        (source, dest, archive, options) 4-tuples as per publish().
         * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
         *        that the source files should be deleted if possible
@@ -1085,7 +1096,7 @@ class FileRepo {
                $operations = array();
                $sourceFSFilesToDelete = array(); // cleanup for disk source files
                // Validate each triplet and get the store operation...
-               foreach ( $ntuples as $i => $ntuple ) {
+               foreach ( $ntuples as $ntuple ) {
                        list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
                        $options = isset( $ntuple[3] ) ? $ntuple[3] : array();
                        // Resolve source to a storage path if virtual
@@ -1164,7 +1175,7 @@ class FileRepo {
                $status->merge( $backend->doOperations( $operations ) );
                // Find out which files were archived...
                foreach ( $ntuples as $i => $ntuple ) {
-                       list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
+                       list( , $archiveRel ) = $ntuple;
                        $archivePath = $this->getZonePath( 'public' ) . "/$archiveRel";
                        if ( $this->fileExists( $archivePath ) ) {
                                $status->value[$i] = 'archived';
@@ -1186,12 +1197,12 @@ class FileRepo {
         * Creates a directory with the appropriate zone permissions.
         * Callers are responsible for doing read-only and "writable repo" checks.
         *
-        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @param string $dir Virtual URL (or storage path) of directory to clean
         * @return Status
         */
        protected function initDirectory( $dir ) {
                $path = $this->resolveToStoragePath( $dir );
-               list( $b, $container, $r ) = FileBackend::splitStoragePath( $path );
+               list( , $container, ) = FileBackend::splitStoragePath( $path );
 
                $params = array( 'dir' => $path );
                if ( $this->isPrivate || $container === $this->zones['deleted']['container'] ) {
@@ -1206,7 +1217,7 @@ class FileRepo {
        /**
         * Deletes a directory if empty.
         *
-        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @param string $dir Virtual URL (or storage path) of directory to clean
         * @return Status
         */
        public function cleanDir( $dir ) {
@@ -1222,7 +1233,7 @@ class FileRepo {
        /**
         * Checks existence of a a file
         *
-        * @param $file string Virtual URL (or storage path) of file to check
+        * @param string $file Virtual URL (or storage path) of file to check
         * @return bool
         */
        public function fileExists( $file ) {
@@ -1233,7 +1244,7 @@ class FileRepo {
        /**
         * Checks existence of an array of files.
         *
-        * @param $files Array: Virtual URLs (or storage paths) of files to check
+        * @param array $files Virtual URLs (or storage paths) of files to check
         * @return array|bool Either array of files and existence flags, or false
         */
        public function fileExistsBatch( array $files ) {
@@ -1271,7 +1282,7 @@ class FileRepo {
         * assumes a naming scheme in the deleted zone based on content hash, as
         * opposed to the public zone which is assumed to be unique.
         *
-        * @param $sourceDestPairs Array of source/destination pairs. Each element
+        * @param array $sourceDestPairs of source/destination pairs. Each element
         *        is a two-element array containing the source file path relative to the
         *        public root in the first element, and the archive file path relative
         *        to the deleted zone root in the second element.
@@ -1448,7 +1459,7 @@ class FileRepo {
         * Attempt to stream a file with the given virtual URL/storage path
         *
         * @param $virtualUrl string
-        * @param $headers Array Additional HTTP headers to send on success
+        * @param array $headers Additional HTTP headers to send on success
         * @return bool Success
         */
        public function streamFile( $virtualUrl, $headers = array() ) {
@@ -1610,7 +1621,7 @@ class FileRepo {
         */
        public function nameForThumb( $name ) {
                if ( strlen( $name ) > $this->abbrvThreshold ) {
-                       $ext  = FileBackend::extensionFromPath( $name );
+                       $ext = FileBackend::extensionFromPath( $name );
                        $name = ( $ext == '' ) ? 'thumbnail' : "thumbnail.$ext";
                }
                return $name;
index 98a21f7..ba574da 100644 (file)
@@ -247,10 +247,10 @@ 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 $name String is a dbkey form of a title
+        * @param string $name is a dbkey form of a title
         * @param $width
         * @param $height
-        * @param String $params Other rendering parameters (page number, etc) from handler's makeParamString.
+        * @param string $params Other rendering parameters (page number, etc) from handler's makeParamString.
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
@@ -320,7 +320,6 @@ class ForeignAPIRepo extends FileRepo {
                        return false;
                }
 
-
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
                $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
                $params = array( 'dst' => $localFilename, 'content' => $thumb );
@@ -337,7 +336,7 @@ class ForeignAPIRepo extends FileRepo {
        /**
         * @see FileRepo::getZoneUrl()
         * @param $zone String
-        * @param $ext String|null Optional file extension
+        * @param string|null $ext Optional file extension
         * @return String
         */
        function getZoneUrl( $zone, $ext = null ) {
index 0fbaeef..be11b23 100644 (file)
@@ -103,8 +103,8 @@ class LocalRepo extends FileRepo {
        /**
         * Check if a deleted (filearchive) file has this sha1 key
         *
-        * @param $key String File storage key (base-36 sha1 key with file extension)
-        * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+        * @param string $key File storage key (base-36 sha1 key with file extension)
+        * @param string|null $lock Use "lock" to lock the row via FOR UPDATE
         * @return bool File with this key is in use
         */
        protected function deletedFileHasKey( $key, $lock = null ) {
@@ -120,8 +120,8 @@ class LocalRepo extends FileRepo {
        /**
         * Check if a hidden (revision delete) file has this sha1 key
         *
-        * @param $key String File storage key (base-36 sha1 key with file extension)
-        * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+        * @param string $key File storage key (base-36 sha1 key with file extension)
+        * @param string|null $lock Use "lock" to lock the row via FOR UPDATE
         * @return bool File with this key is in use
         */
        protected function hiddenFileHasKey( $key, $lock = null ) {
@@ -168,7 +168,7 @@ class LocalRepo extends FileRepo {
                        $expiry = 86400; // has invalidation, 1 day
                }
                $cachedValue = $wgMemc->get( $memcKey );
-               if ( $cachedValue === ' '  || $cachedValue === '' ) {
+               if ( $cachedValue === ' ' || $cachedValue === '' ) {
                        // Does not exist
                        return false;
                } elseif ( strval( $cachedValue ) !== '' ) {
@@ -217,7 +217,7 @@ class LocalRepo extends FileRepo {
                                'page_namespace' => $title->getNamespace(),
                                'page_title' => $title->getDBkey(),
                        ),
-                       __METHOD__  //Function name
+                       __METHOD__ //Function name
                );
                return $id;
        }
@@ -226,7 +226,7 @@ class LocalRepo extends FileRepo {
         * Get an array or iterator of file objects for files that have a given
         * SHA-1 content hash.
         *
-        * @param $hash String a sha1 hash to look for
+        * @param string $hash a sha1 hash to look for
         * @return Array
         */
        function findBySha1( $hash ) {
@@ -254,7 +254,7 @@ class LocalRepo extends FileRepo {
         *
         * Overrides generic implementation in FileRepo for performance reason
         *
-        * @param $hashes array An array of hashes
+        * @param array $hashes An array of hashes
         * @return array An Array of arrays or iterators of file objects and the hash as key
         */
        function findBySha1s( array $hashes ) {
@@ -281,6 +281,34 @@ class LocalRepo extends FileRepo {
                return $result;
        }
 
+       /**\r
+        * Return an array of files where the name starts with $prefix.\r
+        *\r
+        * @param string $prefix The prefix to search for\r
+        * @param int $limit The maximum amount of files to return\r
+        * @return array\r
+        */\r
+       public function findFilesByPrefix( $prefix, $limit ) {
+               $selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
+
+               // Query database\r
+               $dbr = $this->getSlaveDB();
+               $res = $dbr->select(
+                       'image',
+                       LocalFile::selectFields(),
+                       'img_name ' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+                       __METHOD__,
+                       $selectOptions
+                       );
+
+               // Build file objects
+               $files = array();
+               foreach ( $res as $row ) {
+                       $files[] = $this->newFileFromRow( $row );
+               }
+               return $files;\r
+       }
+
        /**
         * Get a connection to the slave DB
         * @return DatabaseBase
index d3aea9f..1423d35 100644 (file)
@@ -18,10 +18,10 @@ repository-specific configuration is needed, or in static members of File or
 FileRepo, where no such configuration is needed.
 
 File objects are generated by a factory function from the repository. The
-repository thus has full control over the behaviour of its subsidiary file
+repository thus has full control over the behavior of its subsidiary file
 class, since it can subclass the file class and override functionality at its
 whim. Thus there is no need for the File subclass to query its parent repository
-for information about repository-class-dependent behaviour -- the file subclass
+for information about repository-class-dependent behavior -- the file subclass
 is generally fully aware of the static preferences of its repository. Limited
 exceptions can be made to this rule to permit sharing of functions, or perhaps
 even entire classes, between repositories.
index 1f5ae91..02dfdad 100644 (file)
@@ -79,8 +79,8 @@ class RepoGroup {
        /**
         * Construct a group of file repositories.
         *
-        * @param $localInfo array Associative array for local repo's info
-        * @param $foreignInfo Array of repository info arrays.
+        * @param array $localInfo Associative array for local repo's info
+        * @param array $foreignInfo 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.
@@ -96,7 +96,7 @@ class RepoGroup {
         * You can also use wfFindFile() to do this.
         *
         * @param $title Title|string Title object or string
-        * @param $options array Associative array of options:
+        * @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
         *                     created at the specified time.
@@ -225,8 +225,8 @@ 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 $hash String base 36 SHA-1 hash
-        * @param $options array Option array, same as findFile()
+        * @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
         */
        function findFileFromKey( $hash, $options = array() ) {
@@ -247,7 +247,7 @@ class RepoGroup {
        /**
         * Find all instances of files with this key
         *
-        * @param $hash String base 36 SHA-1 hash
+        * @param string $hash base 36 SHA-1 hash
         * @return Array of File objects
         */
        function findBySha1( $hash ) {
@@ -266,7 +266,7 @@ class RepoGroup {
        /**
         * Find all instances of files with this keys
         *
-        * @param $hashes Array base 36 SHA-1 hashes
+        * @param array $hashes base 36 SHA-1 hashes
         * @return Array of array of File objects
         */
        function findBySha1s( array $hashes ) {
@@ -335,7 +335,7 @@ class RepoGroup {
         * first parameter.
         *
         * @param $callback Callback: the function to call
-        * @param $params Array: optional additional parameters to pass to the function
+        * @param array $params optional additional parameters to pass to the function
         * @return bool
         */
        function forEachForeignRepo( $callback, $params = array() ) {
index bf2749f..cecd0ae 100644 (file)
@@ -152,7 +152,7 @@ abstract class File {
         * valid Title object with namespace NS_FILE or null
         *
         * @param $title Title|string
-        * @param $exception string|bool Use 'exception' to throw an error on bad titles
+        * @param string|bool $exception Use 'exception' to throw an error on bad titles
         * @throws MWException
         * @return Title|null
         */
@@ -190,7 +190,7 @@ abstract class File {
         * Normalize a file extension to the common form, and ensure it's clean.
         * Extensions with non-alphanumeric characters will be discarded.
         *
-        * @param $ext string (without the .)
+        * @param string $ext (without the .)
         * @return string
         */
        static function normalizeExtension( $ext ) {
@@ -214,7 +214,7 @@ abstract class File {
         * Checks if file extensions are compatible
         *
         * @param $old File Old file
-        * @param $new string New name
+        * @param string $new New name
         *
         * @return bool|null
         */
@@ -369,7 +369,7 @@ abstract class File {
         * returns false.
         *
         * @return string|bool ForeignAPIFile::getPath can return false
-       */
+        */
        public function getPath() {
                if ( !isset( $this->path ) ) {
                        $this->assertRepoDefined();
@@ -432,7 +432,7 @@ abstract class File {
         * Returns ID or name of user who uploaded the file
         * STUB
         *
-        * @param $type string 'text' or 'id'
+        * @param string $type 'text' or 'id'
         *
         * @return string|int
         */
@@ -512,12 +512,12 @@ abstract class File {
        }
 
        /**
-       * get versioned metadata
-       *
-       * @param $metadata Mixed Array or String of (serialized) metadata
-       * @param $version integer version number.
-       * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
-       */
+        * get versioned metadata
+        *
+        * @param $metadata Mixed Array or String of (serialized) metadata
+        * @param $version integer version number.
+        * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
+        */
        public function convertMetadataVersion($metadata, $version) {
                $handler = $this->getHandler();
                if ( !is_array( $metadata ) ) {
@@ -767,7 +767,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 $params Array: handler-specific parameters
+        * @param array $params handler-specific parameters
         * @param $flags integer Bitfield that supports THUMB_* constants
         * @return string
         */
@@ -832,8 +832,8 @@ abstract class File {
        /**
         * Return either a MediaTransformError or placeholder thumbnail (if $wgIgnoreImageErrors)
         *
-        * @param $thumbPath string Thumbnail storage path
-        * @param $thumbUrl string Thumbnail URL
+        * @param string $thumbPath Thumbnail storage path
+        * @param string $thumbUrl Thumbnail URL
         * @param $params Array
         * @param $flags integer
         * @return MediaTransformOutput
@@ -852,7 +852,7 @@ abstract class File {
        /**
         * Transform a media file
         *
-        * @param $params Array: 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 $flags Integer: a bitfield, may contain self::RENDER_NOW to force rendering
         * @return MediaTransformOutput|bool False on failure
@@ -978,7 +978,7 @@ abstract class File {
        }
 
        /**
-        * @param $thumbName string Thumbnail name
+        * @param string $thumbName Thumbnail name
         * @return string Content-Disposition header value
         */
        function getThumbDisposition( $thumbName ) {
@@ -1051,7 +1051,7 @@ abstract class File {
         * Purge shared caches such as thumbnails and DB data caching
         * STUB
         * Overridden by LocalFile
-        * @param $options Array Options, which include:
+        * @param array $options Options, which include:
         *     'forThumbRefresh' : The purging is only to refresh thumbnails
         */
        function purgeCache( $options = array() ) {}
@@ -1091,9 +1091,9 @@ abstract class File {
         *
         * STUB
         * @param $limit integer Limit of rows to return
-        * @param $start string timestamp Only revisions older than $start will be returned
-        * @param $end string timestamp Only revisions newer than $end will be returned
-        * @param $inc bool Include the endpoints of the time range
+        * @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 bool $inc Include the endpoints of the time range
         *
         * @return array
         */
@@ -1150,7 +1150,7 @@ abstract class File {
        /**
         * Get the path of an archived file relative to the public zone root
         *
-        * @param $suffix bool|string 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
         */
@@ -1168,7 +1168,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 $suffix bool|string if not false, the name of a thumbnail file
+        * @param bool|string $suffix if not false, the name of a thumbnail file
         *
         * @return string
         */
@@ -1194,8 +1194,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 $archiveName string the timestamped name of an archived image
-        * @param $suffix bool|string 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
         */
@@ -1212,7 +1212,7 @@ abstract class File {
        /**
         * Get the path of the archived file.
         *
-        * @param $suffix bool|string if not false, the name of an archived file.
+        * @param bool|string $suffix if not false, the name of an archived file.
         *
         * @return string
         */
@@ -1224,8 +1224,8 @@ abstract class File {
        /**
         * Get the path of an archived file's thumbs, or a particular thumb if $suffix is specified
         *
-        * @param $archiveName string the timestamped name of an archived image
-        * @param $suffix bool|string 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
         */
@@ -1238,7 +1238,7 @@ abstract class File {
        /**
         * Get the path of the thumbnail directory, or a particular file if $suffix is specified
         *
-        * @param $suffix bool|string if not false, the name of a thumbnail file
+        * @param bool|string $suffix if not false, the name of a thumbnail file
         *
         * @return string
         */
@@ -1250,7 +1250,7 @@ abstract class File {
        /**
         * Get the path of the transcoded directory, or a particular file if $suffix is specified
         *
-        * @param $suffix bool|string if not false, the name of a media file
+        * @param bool|string $suffix if not false, the name of a media file
         *
         * @return string
         */
@@ -1262,7 +1262,7 @@ abstract class File {
        /**
         * Get the URL of the archive directory, or a particular file if $suffix is specified
         *
-        * @param $suffix bool|string if not false, the name of an archived file
+        * @param bool|string $suffix if not false, the name of an archived file
         *
         * @return string
         */
@@ -1281,8 +1281,8 @@ abstract class File {
        /**
         * Get the URL of the archived file's thumbs, or a particular thumb if $suffix is specified
         *
-        * @param $archiveName string the timestamped name of an archived image
-        * @param $suffix bool|string 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
         */
@@ -1302,8 +1302,8 @@ abstract class File {
        /**
         * Get the URL of the zone directory, or a particular file if $suffix is specified
         *
-        * @param $zone string name of requested zone
-        * @param $suffix bool|string if not false, the name of a file in 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
         */
@@ -1320,7 +1320,7 @@ abstract class File {
        /**
         * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
         *
-        * @param $suffix bool|string 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
         */
@@ -1331,7 +1331,7 @@ abstract class File {
        /**
         * Get the URL of the transcoded directory, or a particular file if $suffix is specified
         *
-        * @param $suffix bool|string if not false, the name of a media file
+        * @param bool|string $suffix if not false, the name of a media file
         *
         * @return string path
         */
@@ -1342,7 +1342,7 @@ abstract class File {
        /**
         * Get the public zone virtual URL for a current version source file
         *
-        * @param $suffix bool|string if not false, the name of a thumbnail file
+        * @param bool|string $suffix if not false, the name of a thumbnail file
         *
         * @return string
         */
@@ -1358,7 +1358,7 @@ abstract class File {
        /**
         * Get the public zone virtual URL for an archived version source file
         *
-        * @param $suffix bool|string if not false, the name of a thumbnail file
+        * @param bool|string $suffix if not false, the name of a thumbnail file
         *
         * @return string
         */
@@ -1376,7 +1376,7 @@ abstract class File {
        /**
         * Get the virtual URL for a thumbnail file or directory
         *
-        * @param $suffix bool|string if not false, the name of a thumbnail file
+        * @param bool|string $suffix if not false, the name of a thumbnail file
         *
         * @return string
         */
@@ -1434,11 +1434,11 @@ abstract class File {
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
-        * @param $srcPath String: local filesystem path to the source image
+        * @param string $srcPath local filesystem path to the source image
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move
         *         rather than copy
-        * @param $options Array Optional additional parameters
+        * @param array $options Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         *
@@ -1567,9 +1567,9 @@ abstract class File {
         *
         * May throw database exceptions on error.
         *
-        * @param $versions array 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 $unsuppress bool remove restrictions on content upon restoration?
+        * @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
@@ -1629,7 +1629,7 @@ abstract class File {
         * Get an image size array like that returned by getImageSize(), or false if it
         * can't be determined.
         *
-        * @param $fileName String: The filename
+        * @param string $fileName The filename
         * @return Array
         */
        function getImageSize( $fileName ) {
@@ -1753,11 +1753,12 @@ abstract class File {
        /**
         * Get an associative array containing information about a file in the local filesystem.
         *
-        * @param $path String: absolute local filesystem path
+        * @param string $path absolute local filesystem path
         * @param $ext Mixed: the file extension, or true to extract it from the filename.
         *             Set it to false to ignore the extension.
         *
         * @return array
+        * @deprecated since 1.19
         */
        static function getPropsFromPath( $path, $ext = true ) {
                wfDebug( __METHOD__ . ": Getting file info for $path\n" );
@@ -1777,6 +1778,7 @@ abstract class File {
         * @param $path string
         *
         * @return bool|string False on failure
+        * @deprecated since 1.19
         */
        static function sha1Base36( $path ) {
                wfDeprecated( __METHOD__, '1.19' );
index 84e0df6..a96c1f3 100644 (file)
@@ -106,7 +106,7 @@ class ForeignAPIFile extends File {
        }
 
        /**
-        * @param Array $params
+        * @param array $params
         * @param int $flags
         * @return bool|MediaTransformOutput
         */
index 610f556..ee5883c 100644 (file)
@@ -115,7 +115,7 @@ class ForeignDBFile extends LocalFile {
         * @return string
         */
        function getDescriptionUrl() {
-               // Restore remote behaviour
+               // Restore remote behavior
                return File::getDescriptionUrl();
        }
 
@@ -123,7 +123,7 @@ class ForeignDBFile extends LocalFile {
         * @return string
         */
        function getDescriptionText() {
-               // Restore remote behaviour
+               // Restore remote behavior
                return File::getDescriptionText();
        }
 }
index 11eab1e..639228b 100644 (file)
@@ -123,7 +123,7 @@ class LocalFile extends File {
         * Create a LocalFile from a SHA-1 key
         * Do not call this except from inside a repo class.
         *
-        * @param $sha1 string base-36 SHA-1
+        * @param string $sha1 base-36 SHA-1
         * @param $repo LocalRepo
         * @param string|bool $timestamp MW_timestamp (optional)
         *
@@ -266,7 +266,7 @@ class LocalFile extends File {
                // If the cache value gets to large it will not fit in memcached and nothing will
                // get cached at all, causing master queries for any file access.
                foreach ( $this->getLazyCacheFields( '' ) as $field ) {
-                       if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100*1024 ) {
+                       if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100 * 1024 ) {
                                unset( $cache[$field] ); // don't let the value get too big
                        }
                }
@@ -644,7 +644,7 @@ class LocalFile extends File {
        /**
         * Returns ID or name of user who uploaded the file
         *
-        * @param $type string 'text' or 'id'
+        * @param string $type 'text' or 'id'
         * @return int|string
         */
        function getUser( $type = 'text' ) {
@@ -730,9 +730,8 @@ class LocalFile extends File {
         *        RTT regression for wikis without 404 handling.
         */
        function migrateThumbFile( $thumbName ) {
-               $thumbDir = $this->getThumbPath();
-
                /* Old code for bug 2532
+               $thumbDir = $this->getThumbPath();
                $thumbPath = "$thumbDir/$thumbName";
                if ( is_dir( $thumbPath ) ) {
                        // Directory where file should be
@@ -764,7 +763,7 @@ class LocalFile extends File {
 
        /**
         * Get all thumbnail names previously generated for this file
-        * @param $archiveName string|bool Name of an archive file, default false
+        * @param string|bool $archiveName Name of an archive file, default false
         * @return array first element is the base dir, then files in that base dir.
         */
        function getThumbnails( $archiveName = false ) {
@@ -828,7 +827,7 @@ class LocalFile extends File {
 
        /**
         * Delete cached transformed files for an archived version only.
-        * @param $archiveName string name of the archived file
+        * @param string $archiveName name of the archived file
         */
        function purgeOldThumbnails( $archiveName ) {
                global $wgUseSquid;
@@ -896,8 +895,8 @@ class LocalFile extends File {
 
        /**
         * Delete a list of thumbnails visible at urls
-        * @param $dir string base dir of the files.
-        * @param $files array of strings: relative filenames (to $dir)
+        * @param string $dir base dir of the files.
+        * @param array $files of strings: relative filenames (to $dir)
         */
        protected function purgeThumbList( $dir, $files ) {
                $fileListDebug = strtr(
@@ -1047,15 +1046,15 @@ class LocalFile extends File {
 
        /**
         * Upload a file and record it in the DB
-        * @param $srcPath String: source storage path, virtual URL, or filesystem path
-        * @param $comment String: upload description
-        * @param $pageText String: text to use for the new description page,
+        * @param string $srcPath source storage path, virtual URL, or filesystem path
+        * @param string $comment upload description
+        * @param string $pageText text to use for the new description page,
         *                  if a new description page is created
         * @param $flags Integer|bool: flags for publish()
-        * @param $props Array|bool: File properties, if known. This can be used to reduce the
+        * @param array|bool $props File properties, if known. This can be used to reduce the
         *               upload time when uploading virtual URLs for which the file info
         *               is already known
-        * @param $timestamp String|bool: timestamp for img_timestamp, or false to use the current time
+        * @param string|bool $timestamp timestamp for img_timestamp, or false to use the current time
         * @param $user User|null: User object or null to use $wgUser
         *
         * @return FileRepoStatus object. On success, the value member contains the
@@ -1373,10 +1372,10 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param $srcPath String: local filesystem path to the source image
+        * @param string $srcPath local filesystem path to the source image
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE      Delete the source file, i.e. move rather than copy
-        * @param $options Array Optional additional parameters
+        * @param array $options Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
@@ -1391,11 +1390,11 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param $srcPath String: local filesystem path to the source image
-        * @param $dstRel String: target relative path
+        * @param string $srcPath local filesystem path to the source image
+        * @param string $dstRel target relative path
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE      Delete the source file, i.e. move rather than copy
-        * @param $options Array Optional additional parameters
+        * @param array $options Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
@@ -1551,7 +1550,7 @@ class LocalFile extends File {
         *
         * May throw database exceptions on error.
         *
-        * @param $versions array 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 $unsuppress Boolean
         * @return FileRepoStatus
@@ -1971,7 +1970,7 @@ class LocalFileDeleteBatch {
                $this->file->lock();
                // Leave private files alone
                $privateFiles = array();
-               list( $oldRels, $deleteCurrent ) = $this->getOldRels();
+               list( $oldRels, ) = $this->getOldRels();
                $dbw = $this->file->repo->getMasterDB();
 
                if ( !empty( $oldRels ) ) {
@@ -2049,7 +2048,7 @@ class LocalFileDeleteBatch {
                $files = $newBatch = array();
 
                foreach ( $batch as $batchItem ) {
-                       list( $src, $dest ) = $batchItem;
+                       list( $src, ) = $batchItem;
                        $files[$src] = $this->file->repo->getVirtualUrl( 'public' ) . '/' . rawurlencode( $src );
                }
 
@@ -2634,7 +2633,7 @@ class LocalFileMoveBatch {
         */
        function getMoveTriplets() {
                $moves = array_merge( array( $this->cur ), $this->olds );
-               $triplets = array();    // The format is: (srcUrl, destZone, destUrl)
+               $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
 
                foreach ( $moves as $move ) {
                        // $move: (oldRelativePath, newRelativePath)
index 4f27c8d..5c50592 100644 (file)
@@ -73,7 +73,7 @@ class OldLocalFile extends LocalFile {
         * Create a OldLocalFile from a SHA-1 key
         * Do not call this except from inside a repo class.
         *
-        * @param $sha1 string base-36 SHA-1
+        * @param string $sha1 base-36 SHA-1
         * @param $repo LocalRepo
         * @param string|bool $timestamp MW_timestamp (optional)
         *
@@ -123,8 +123,8 @@ class OldLocalFile extends LocalFile {
        /**
         * @param $title Title
         * @param $repo FileRepo
-        * @param $time String: timestamp or null to load by archive name
-        * @param $archiveName String: archive name or null to load by timestamp
+        * @param string $time timestamp or null to load by archive name
+        * @param string $archiveName archive name or null to load by timestamp
         * @throws MWException
         */
        function __construct( $title, $repo, $time, $archiveName ) {
@@ -318,8 +318,8 @@ class OldLocalFile extends LocalFile {
        /**
         * Upload a file directly into archive. Generally for Special:Import.
         *
-        * @param $srcPath string File system path of the source file
-        * @param $archiveName string Full archive name of the file, in the form
+        * @param string $srcPath File system path of the source file
+        * @param string $archiveName Full archive name of the file, in the form
         *     $timestamp!$filename, where $filename must match $this->getName()
         *
         * @param $timestamp string
@@ -350,10 +350,10 @@ class OldLocalFile extends LocalFile {
        /**
         * Record a file upload in the oldimage table, without adding log entries.
         *
-        * @param $srcPath string File system path to the source file
-        * @param $archiveName string The archive name of the file
+        * @param string $srcPath File system path to the source file
+        * @param string $archiveName The archive name of the file
         * @param $timestamp string
-        * @param $comment string Upload comment
+        * @param string $comment Upload comment
         * @param $user User User who did this upload
         * @return bool
         */
index 9a7f653..47ba6d6 100644 (file)
@@ -42,7 +42,7 @@ class UnregisteredLocalFile extends File {
        var $handler;
 
        /**
-        * @param $path string Storage path
+        * @param string $path Storage path
         * @param $mime string
         * @return UnregisteredLocalFile
         */
index 75e55f1..997255d 100644 (file)
@@ -129,7 +129,7 @@ class CliInstaller extends Installer {
        /**
         * Write LocalSettings.php to a given path
         *
-        * @param $path String Full path to write LocalSettings.php to
+        * @param string $path Full path to write LocalSettings.php to
         */
        public function writeConfigurationFile( $path ) {
                $ls = InstallerOverrides::getLocalSettingsGenerator( $this );
index 10d23fb..3472b7f 100644 (file)
@@ -527,7 +527,7 @@ abstract class DatabaseInstaller {
 
        /**
         * Get a standard web-user fieldset
-        * @param $noCreateMsg String: Message to display instead of the creation checkbox.
+        * @param string $noCreateMsg Message to display instead of the creation checkbox.
         *   Set this to false to show a creation checkbox.
         *
         * @return String
index 746cd12..4b4bc23 100644 (file)
@@ -92,7 +92,7 @@ abstract class DatabaseUpdater {
         * Constructor
         *
         * @param $db DatabaseBase object to perform updates on
-        * @param $shared bool Whether to perform updates on shared tables
+        * @param bool $shared Whether to perform updates on shared tables
         * @param $maintenance Maintenance Maintenance object which created us
         */
        protected function __construct( DatabaseBase &$db, $shared, Maintenance $maintenance = null ) {
@@ -177,7 +177,7 @@ abstract class DatabaseUpdater {
        /**
         * Output some text. If we're running from web, escape the text first.
         *
-        * @param $str String: Text to output
+        * @param string $str Text to output
         */
        public function output( $str ) {
                if ( $this->maintenance->isQuiet() ) {
@@ -197,7 +197,7 @@ abstract class DatabaseUpdater {
         *
         * @since 1.17
         *
-        * @param $update Array: the update to run. Format is the following:
+        * @param array $update the update to run. Format is the following:
         *                first item is the callback function, it also can be a
         *                simple string with the name of a function in this class,
         *                following elements are parameters to the function.
@@ -214,8 +214,8 @@ abstract class DatabaseUpdater {
         *
         * @since 1.18
         *
-        * @param $tableName String Name of table to create
-        * @param $sqlPath String Full path to the schema file
+        * @param string $tableName Name of table to create
+        * @param string $sqlPath Full path to the schema file
         */
        public function addExtensionTable( $tableName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'addTable', $tableName, $sqlPath, true );
@@ -261,9 +261,9 @@ abstract class DatabaseUpdater {
         *
         * @since 1.21
         *
-        * @param $tableName string The table name
-        * @param $indexName string The index name
-        * @param $sqlPath string The path to the SQL change path
+        * @param string $tableName The table name
+        * @param string $indexName The index name
+        * @param string $sqlPath The path to the SQL change path
         */
        public function dropExtensionIndex( $tableName, $indexName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'dropIndex', $tableName, $indexName, $sqlPath, true );
@@ -285,11 +285,11 @@ abstract class DatabaseUpdater {
         *
         * @since 1.21
         *
-        * @param $tableName string The table name
-        * @param $oldIndexName string The old index name
-        * @param $newIndexName string The new index name
+        * @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 and the new indexes exist. [facultative; by default, false]
-        * @param $sqlPath string The path to the SQL change path
+        * @param string $sqlPath The path to the SQL change path
         */
        public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) {
                $this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true );
@@ -298,9 +298,9 @@ abstract class DatabaseUpdater {
        /**
         * @since 1.21
         *
-        * @param $tableName string The table name
-        * @param $fieldName string The field to be modified
-        * @param $sqlPath string The path to the SQL change path
+        * @param string $tableName The table name
+        * @param string $fieldName The field to be modified
+        * @param string $sqlPath The path to the SQL change path
         */
        public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
                $this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
@@ -324,7 +324,7 @@ abstract class DatabaseUpdater {
         *
         * @since 1.19
         *
-        * @param $class string Name of a Maintenance subclass
+        * @param string $class Name of a Maintenance subclass
         */
        public function addPostDatabaseUpdateMaintenance( $class ) {
                $this->postDatabaseUpdateMaintenance[] = $class;
@@ -361,7 +361,7 @@ abstract class DatabaseUpdater {
                        $func = $funcList[0];
                        $arg = $funcList[1];
                        $origParams = $funcList[2];
-                       $ret = call_user_func_array( $func, $arg );
+                       call_user_func_array( $func, $arg );
                        flush();
                        $this->updatesSkipped[] = $origParams;
                }
@@ -370,7 +370,7 @@ abstract class DatabaseUpdater {
        /**
         * Do all the updates
         *
-        * @param $what Array: what updates to perform
+        * @param array $what what updates to perform
         */
        public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
                global $wgVersion, $wgLocalisationCacheConf;
@@ -412,7 +412,7 @@ abstract class DatabaseUpdater {
        /**
         * Helper function for doUpdates()
         *
-        * @param $updates Array of updates to run
+        * @param array $updates of updates to run
         * @param $passSelf Boolean: whether to pass this object we calling external
         *                  functions
         */
@@ -459,7 +459,7 @@ abstract class DatabaseUpdater {
         * Helper function: check if the given key is present in the updatelog table.
         * Obviously, only use this for updates that occur after the updatelog table was
         * created!
-        * @param $key String Name of the key to check for
+        * @param string $key Name of the key to check for
         *
         * @return bool
         */
@@ -477,8 +477,8 @@ abstract class DatabaseUpdater {
         * Helper function: Add a key to the updatelog table
         * Obviously, only use this for updates that occur after the updatelog table was
         * created!
-        * @param $key String Name of key to insert
-        * @param $val String [optional] value to insert along with the key
+        * @param string $key Name of key to insert
+        * @param string $val [optional] value to insert along with the key
         */
        public function insertUpdateRow( $key, $val = null ) {
                $this->db->clearFlag( DBO_DDLMODE );
@@ -508,7 +508,7 @@ abstract class DatabaseUpdater {
         * Updates will be prevented if the table is a shared table and it is not
         * specified to run updates on shared tables.
         *
-        * @param $name String table name
+        * @param string $name table name
         * @return bool
         */
        protected function doTable( $name ) {
@@ -580,7 +580,7 @@ abstract class DatabaseUpdater {
        /**
         * Append an SQL fragment to the open file handle.
         *
-        * @param $filename String: File name to open
+        * @param string $filename File name to open
         */
        public function copyFile( $filename ) {
                $this->db->sourceFile( $filename, false, false, false,
@@ -594,7 +594,7 @@ abstract class DatabaseUpdater {
         *
         * This is used as a callback for for sourceLine().
         *
-        * @param $line String text to append to the file
+        * @param string $line text to append to the file
         * @return Boolean false to skip actually executing the file
         * @throws MWException
         */
@@ -609,9 +609,9 @@ abstract class DatabaseUpdater {
        /**
         * Applies a SQL patch
         *
-        * @param $path String Path to the patch file
+        * @param string $path Path to the patch file
         * @param $isFullPath Boolean Whether to treat $path as a relative or not
-        * @param $msg String Description of the patch
+        * @param string $msg Description of the patch
         * @return boolean false if patch is skipped.
         */
        protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
@@ -640,8 +640,8 @@ abstract class DatabaseUpdater {
        /**
         * Add a new table to the database
         *
-        * @param $name String Name of the new table
-        * @param $patch String Path to the patch file
+        * @param string $name Name of the new table
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -661,9 +661,9 @@ abstract class DatabaseUpdater {
        /**
         * Add a new field to an existing table
         *
-        * @param $table String Name of the table to modify
-        * @param $field String Name of the new field
-        * @param $patch String Path to the patch file
+        * @param string $table Name of the table to modify
+        * @param string $field Name of the new field
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -685,9 +685,9 @@ abstract class DatabaseUpdater {
        /**
         * Add a new index to an existing table
         *
-        * @param $table String Name of the table to modify
-        * @param $index String Name of the new index
-        * @param $patch String Path to the patch file
+        * @param string $table Name of the table to modify
+        * @param string $index Name of the new index
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -709,9 +709,9 @@ abstract class DatabaseUpdater {
        /**
         * Drop a field from an existing table
         *
-        * @param $table String Name of the table to modify
-        * @param $field String Name of the old field
-        * @param $patch String Path to the patch file
+        * @param string $table Name of the table to modify
+        * @param string $field Name of the old field
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -731,9 +731,9 @@ abstract class DatabaseUpdater {
        /**
         * Drop an index from an existing table
         *
-        * @param $table String: Name of the table to modify
-        * @param $index String: Name of the index
-        * @param $patch String: Path to the patch file
+        * @param string $table Name of the table to modify
+        * @param string $index Name of the index
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -753,11 +753,11 @@ abstract class DatabaseUpdater {
        /**
         * Rename an index from an existing table
         *
-        * @param $table String: Name of the table to modify
-        * @param $oldIndex String: Old name of the index
-        * @param $newIndex String: New name of the index
+        * @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 old and the new indexes exist.
-        * @param $patch String: Path to the patch file
+        * @param string $patch Path to the patch file
         * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
@@ -828,9 +828,9 @@ abstract class DatabaseUpdater {
        /**
         * Modify an existing field
         *
-        * @param $table String: name of the table to which the field belongs
-        * @param $field String: name of the field to modify
-        * @param $patch String: path to the patch file
+        * @param string $table name of the table to which the field belongs
+        * @param string $field name of the field to modify
+        * @param string $patch path to the patch file
         * @param $fullpath Boolean: whether to treat $patch path as a relative or not
         * @return Boolean false if this was skipped because schema changes are skipped
         */
diff --git a/includes/installer/Ibm_db2Installer.php b/includes/installer/Ibm_db2Installer.php
deleted file mode 100644 (file)
index bf19055..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
- * IBM_DB2-specific installer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-/**
- * Class for setting up the MediaWiki database using IBM_DB2.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Installer extends DatabaseInstaller {
-
-
-       protected $globalNames = array(
-               'wgDBserver',
-               'wgDBport',
-               'wgDBname',
-               'wgDBuser',
-               'wgDBpassword',
-               'wgDBmwschema',
-       );
-
-       protected $internalDefaults = array(
-               '_InstallUser' => 'db2admin'
-       );
-
-       /**
-        * Get the DB2 database extension name
-        * @return string
-        */
-       public function getName() {
-               return 'ibm_db2';
-       }
-
-       /**
-        * Determine whether the DB2 database extension is currently available in PHP
-        * @return boolean
-        */
-       public function isCompiled() {
-               return self::checkExtension( 'ibm_db2' );
-       }
-
-       /**
-        * Generate a connection form for a DB2 database
-        * @return string
-        */
-       public function getConnectForm() {
-               return
-                       $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
-                       $this->getTextBox( 'wgDBport', 'config-db-port', array(), $this->parent->getHelpBox( 'config-db-port' ) ) .
-                       Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
-                       $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
-                       $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
-                       Html::closeElement( 'fieldset' ) .
-                       $this->getInstallUserBox();
-       }
-
-       /**
-        * Validate and then execute the connection form for a DB2 database
-        * @return Status
-        */
-       public function submitConnectForm() {
-               // Get variables from the request
-               $newValues = $this->setVarsFromRequest(
-                       array( 'wgDBserver', 'wgDBport', 'wgDBname',
-                               'wgDBmwschema', 'wgDBuser', 'wgDBpassword' ) );
-
-               // Validate them
-               $status = Status::newGood();
-               if ( !strlen( $newValues['wgDBname'] ) ) {
-                       $status->fatal( 'config-missing-db-name' );
-               } elseif ( !preg_match( '/^[a-zA-Z0-9_]+$/', $newValues['wgDBname'] ) ) {
-                       $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
-               }
-               if ( !strlen( $newValues['wgDBmwschema'] ) ) {
-                       $status->fatal( 'config-invalid-schema' );
-               }
-               elseif ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
-                       $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
-               }
-               if ( !strlen( $newValues['wgDBport'] ) ) {
-                       $status->fatal( 'config-invalid-port' );
-               }
-               elseif ( !preg_match( '/^[0-9_]*$/', $newValues['wgDBport'] ) ) {
-                       $status->fatal( 'config-invalid-port', $newValues['wgDBport'] );
-               }
-
-               // Submit user box
-               if ( $status->isOK() ) {
-                       $status->merge( $this->submitInstallUserBox() );
-               }
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               global $wgDBport;
-               $wgDBport = $newValues['wgDBport'];
-
-               // Try to connect
-               $status->merge( $this->getConnection() );
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               $this->parent->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
-               $this->parent->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
-
-               return $status;
-       }
-
-       /**
-        * Open a DB2 database connection
-        * @return Status
-        */
-       public function openConnection() {
-               $status = Status::newGood();
-               try {
-                       $db = new DatabaseIbm_db2(
-                               $this->getVar( 'wgDBserver' ),
-                               $this->getVar( '_InstallUser' ),
-                               $this->getVar( '_InstallPassword' ),
-                               $this->getVar( 'wgDBname' ),
-                               0,
-                               $this->getVar( 'wgDBmwschema' )
-                       );
-                       $status->value = $db;
-               } catch ( DBConnectionError $e ) {
-                       $status->fatal( 'config-connection-error', $e->getMessage() );
-               }
-               return $status;
-       }
-
-       /**
-        * Create a DB2 database for MediaWiki
-        * @return Status
-        */
-       public function setupDatabase() {
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-               /**
-                * @var $conn DatabaseBase
-                */
-               $conn = $status->value;
-               $dbName = $this->getVar( 'wgDBname' );
-               if( !$conn->selectDB( $dbName ) ) {
-                       $conn->query( "CREATE DATABASE "
-                               . $conn->addIdentifierQuotes( $dbName )
-                               . " AUTOMATIC STORAGE YES"
-                               . " USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM"
-                               . " PAGESIZE 32768", __METHOD__ );
-                       $conn->selectDB( $dbName );
-               }
-               $this->setupSchemaVars();
-               return $status;
-       }
-
-       /**
-        * Create tables from scratch.
-        * First check if pagesize >= 32k.
-        *
-        * @return Status
-        */
-       public function createTables() {
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-               $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
-               if( $this->db->tableExists( 'user' ) ) {
-                       $status->warning( 'config-install-tables-exist' );
-                       return $status;
-               }
-
-               /* Check for pagesize */
-               $status = $this->checkPageSize();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-
-               $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
-               $this->db->begin( __METHOD__ );
-
-               $error = $this->db->sourceFile( $this->db->getSchemaPath() );
-               if( $error !== true ) {
-                       $this->db->reportQueryError( $error, 0, '', __METHOD__ );
-                       $this->db->rollback( __METHOD__ );
-                       $status->fatal( 'config-install-tables-failed', $error );
-               } else {
-                       $this->db->commit( __METHOD__ );
-               }
-               // Resume normal operations
-               if( $status->isOk() ) {
-                       $this->enableLB();
-               }
-               return $status;
-       }
-
-       /**
-        * Check if database has a tablspace with pagesize >= 32k.
-        *
-        * @return Status
-        */
-       public function checkPageSize() {
-               $status = $this->getConnection();
-               if ( !$status->isOK() ) {
-                       return $status;
-               }
-               $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
-               try {
-                       $result = $this->db->query( 'SELECT PAGESIZE FROM SYSCAT.TABLESPACES FOR READ ONLY' );
-                       if( $result == false ) {
-                               $status->fatal( 'config-connection-error', '' );
-                       } else {
-                               $row = $this->db->fetchRow( $result );
-                               while ( $row ) {
-                                       if( $row[0] >= 32768 ) {
-                                               return $status;
-                                       }
-                                       $row = $this->db->fetchRow( $result );
-                               }
-                               $status->fatal( 'config-ibm_db2-low-db-pagesize', '' );
-                       }
-               } catch ( DBUnexpectedError $e ) {
-                       $status->fatal( 'config-connection-error', $e->getMessage() );
-               }
-
-               return $status;
-       }
-
-       /**
-        * Generate the code to store the DB2-specific settings defined by the configuration form
-        * @return string
-        */
-       public function getLocalSettings() {
-               $schema = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBmwschema' ) );
-               $port = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBport' ) );
-               return
-"# IBM_DB2 specific settings
-\$wgDBmwschema         = \"{$schema}\";
-\$wgDBport             = \"{$port}\";";
-       }
-
-       public function __construct( $parent ) {
-               parent::__construct( $parent );
-       }
-}
diff --git a/includes/installer/Ibm_db2Updater.php b/includes/installer/Ibm_db2Updater.php
deleted file mode 100644 (file)
index 33bf69c..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * IBM_DB2-specific updater.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-/**
- * Class for handling updates to IBM_DB2 databases.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Updater extends DatabaseUpdater {
-
-       /**
-        * Get the changes in the DB2 database scheme since MediaWiki 1.14
-        * @return array
-        */
-       protected function getCoreUpdateList() {
-               return array(
-                       // 1.14
-                       array( 'addField', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
-                       array( 'addField', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
-
-                       // 1.15
-                       array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-                       array( 'addTable', 'tag_summary',                       'patch-change_tag_summary.sql' ),
-                       array( 'addTable', 'valid_tag',                         'patch-change_valid_tag.sql' ),
-
-                       // 1.16
-                       array( 'addTable', 'user_properties',                   'patch-user_properties.sql' ),
-                       array( 'addTable', 'log_search',                        'patch-log_search.sql' ),
-                       array( 'addField', 'logging',       'log_user_text',    'patch-log_user_text.sql' ),
-                       array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
-                       array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
-                       array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
-                       array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
-
-                       // 1.17
-                       array( 'addTable', 'iwlinks',                            'patch-iwlinks.sql' ),
-                       array( 'addField', 'updatelog',     'ul_value',          'patch-ul_value.sql' ),
-                       array( 'addField', 'interwiki',     'iw_api',            'patch-iw_api_and_wikiid.sql' ),
-                       array( 'addField', 'categorylinks', 'cl_collation',      'patch-categorylinks-better-collation.sql' ),
-                       array( 'addTable', 'msg_resource',                       'patch-msg_resource.sql' ),
-                       array( 'addTable', 'msg_resource_links',                 'patch-msg_resource_links.sql' ),
-                       array( 'addIndex', 'msg_resource_links', 'uq61_msg_resource_links', 'patch-uq_61_msg_resource_links.sql' ),
-                       array( 'addIndex', 'msg_resource',   'uq81_msg_resource', 'patch-uq_81_msg_resource.sql' ),
-                       array( 'addTable', 'module_deps',                        'patch-module_deps.sql' ),
-                       array( 'addIndex', 'module_deps',    'uq96_module_deps',  'patch-uq_96_module_deps.sql' ),
-                       array( 'addField', 'interwiki',      'iw_api',            'patch-iw_api-field.sql' ),
-                       array( 'addField', 'interwiki',      'iw_wikiid',         'patch-iw_wikiid-field.sql' ),
-                       array( 'addField', 'categorylinks',  'cl_sortkey_prefix', 'patch-cl_sortkey_prefix-field.sql' ),
-                       array( 'addField', 'categorylinks',  'cl_collation',      'patch-cl_collation-field.sql' ),
-                       array( 'addField', 'categorylinks',  'cl_type',           'patch-cl_type-field.sql' ),
-
-                       //1.18
-                       array( 'doUserNewTalkTimestampNotNull' ),
-                       array( 'addIndex', 'user',          'user_email',       'patch-user_email_index.sql' ),
-                       array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
-                       array( 'addTable', 'uploadstash',                       'patch-uploadstash.sql' ),
-                       array( 'addTable', 'user_former_groups',                'patch-user_former_groups.sql'),
-                       array( 'doRebuildLocalisationCache' ),
-
-                       // 1.19
-                       array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
-                       array( 'dropField', 'user',         'user_options', 'patch-drop-user_options.sql' ),
-                       array( 'addField', 'revision',      'rev_sha1',         'patch-rev_sha1.sql' ),
-                       array( 'addField', 'archive',       'ar_sha1',          'patch-ar_sha1.sql' ),
-
-                       // 1.21
-                       array( 'addField',      'revision',     'rev_content_format',           'patch-revision-rev_content_format.sql' ),
-                       array( 'addField',      'revision',     'rev_content_model',            'patch-revision-rev_content_model.sql' ),
-                       array( 'addField',      'archive',      'ar_content_format',            'patch-archive-ar_content_format.sql' ),
-                       array( 'addField',      'archive',      'ar_content_model',                 'patch-archive-ar_content_model.sql' ),
-                       array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
-               );
-       }
-}
index e2fb735..a508e24 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Installer-specific wikitext formating.
+ * Installer-specific wikitext formatting.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ecee84c..a8641ca 100644 (file)
@@ -93,9 +93,9 @@ You cannot install MediaWiki.',
 However, 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' => "'''Warning''': The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
+       'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
 If 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'   => "'''Warning''': The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+       'config-unicode-update-warning'   => "'''Warning:''' The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
 You 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.
 The following database types are supported: $1.
@@ -103,8 +103,8 @@ The following database types are supported: $1.
 If you are on shared hosting, ask your hosting provider to install a suitable database driver.
 If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
 If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
-       'config-outdated-sqlite'          => "'''Warning''': you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
-       'config-no-fts3'                  => "'''Warning''': SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+       'config-outdated-sqlite'          => "'''Warning:''' you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+       'config-no-fts3'                  => "'''Warning:''' SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
        'config-register-globals'         => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
 '''Disable it if you can.'''
 MediaWiki will work, but your server is exposed to potential security vulnerabilities.",
@@ -127,19 +127,19 @@ MediaWiki requires functions in this module and will not work in this configurat
 If you're running Mandrake, install the php-xml package.",
        'config-pcre'                     => 'The PCRE support module appears to be missing.
 MediaWiki requires the Perl-compatible regular expression functions to work.',
-       'config-pcre-no-utf8'             => "'''Fatal''': PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
+       'config-pcre-no-utf8'             => "'''Fatal:''' PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
 MediaWiki requires UTF-8 support to function correctly.",
        'config-memory-raised'            => "PHP's <code>memory_limit</code> is $1, raised to $2.",
        'config-memory-bad'               => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
 This is probably too low.
 The installation may fail!",
-       'config-ctype'                    => "'''Fatal''': PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       'config-ctype'                    => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
        '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'                 => "'''Warning:''' Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
 Object caching is not enabled.",
-       'config-mod-security'             => "'''Warning''': 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.
+       'config-mod-security'             => "'''Warning:''' 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.
 Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
        'config-diff3-bad'                => 'GNU diff3 not found.',
        'config-imagemagick'              => 'Found ImageMagick: <code>$1</code>.
@@ -150,7 +150,7 @@ Image thumbnailing will be enabled if you enable uploads.',
 Image thumbnailing will be disabled.',
        'config-no-uri'                   => "'''Error:''' Could not determine the current URI.
 Installation aborted.",
-       'config-no-cli-uri'               => "'''Warning''': No --scriptpath specified, using default: <code>$1</code>.",
+       'config-no-cli-uri'               => "'''Warning:''' No --scriptpath 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'         => "'''Warning:''' Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
@@ -232,7 +232,7 @@ The directory you provide must be writable by the webserver during installation.
 It should '''not''' be accessible via the web, this is why we're not putting it where your PHP files are.
 
 The installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.
-That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
+That includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
 
 Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts'            => 'Default tablespace:',
@@ -241,7 +241,6 @@ Consider putting the database somewhere else altogether, for example in <code>/v
        'config-type-postgres'            => 'PostgreSQL',
        'config-type-sqlite'              => 'SQLite',
        'config-type-oracle'              => 'Oracle',
-       'config-type-ibm_db2'             => 'IBM DB2',
        'config-support-info'             => 'MediaWiki supports the following database systems:
 
 $1
@@ -251,12 +250,10 @@ If you do not see the database system you are trying to use listed below, then f
        'config-support-postgres'         => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
        'config-support-sqlite'           => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
        'config-support-oracle'           => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2'          => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql'             => 'MySQL settings',
        'config-header-postgres'          => 'PostgreSQL settings',
        'config-header-sqlite'            => 'SQLite settings',
        'config-header-oracle'            => 'Oracle settings',
-       'config-header-ibm_db2'           => 'IBM DB2 settings',
        'config-invalid-db-type'          => 'Invalid database type',
        'config-missing-db-name'          => 'You must enter a value for "Database name"',
        'config-missing-db-host'          => 'You must enter a value for "Database host"',
@@ -320,7 +317,7 @@ This is '''not recommended''' unless you are having problems with your wiki.",
 You can now [$1 start using your wiki].",
        'config-regenerate'               => 'Regenerate <code>LocalSettings.php</code> →',
        'config-show-table-status'        => '<code>SHOW TABLE STATUS</code> query failed!',
-       'config-unknown-collation'        => "'''Warning:''' Database is using unrecognised collation.",
+       'config-unknown-collation'        => "'''Warning:''' 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',
@@ -330,7 +327,7 @@ The account you specify here must already exist.',
        'config-mysql-engine'             => 'Storage engine:',
        'config-mysql-innodb'             => 'InnoDB',
        'config-mysql-myisam'             => 'MyISAM',
-       'config-mysql-myisam-dep'         => "'''Warning''': You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+       'config-mysql-myisam-dep'         => "'''Warning:''' You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
 * it barely supports concurrency due to table locking
 * it is more prone to corruption than other engines
 * the MediaWiki codebase does not always handle MyISAM as it should
@@ -349,8 +346,6 @@ This is more efficient than MySQL's UTF-8 mode, and allows you to use the full r
 
 In '''UTF-8 mode''', 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-ibm_db2-low-db-pagesize'  => "Your DB2 database has a default tablespace with an insufficient pagesize. The pagesize has to be '''32K''' or greater.",
-
        '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.',
@@ -378,16 +373,16 @@ Specify a different username.',
        'config-admin-password-blank'     => 'Enter a password for the administrator account.',
        'config-admin-password-same'      => 'The password must not be the same as the username.',
        'config-admin-password-mismatch'  => 'The two passwords you entered do not match.',
-       'config-admin-email'              => 'E-mail address:',
-       'config-admin-email-help'         => 'Enter an e-mail address here to allow you to receive e-mail 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-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 e-mail address.',
+       '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.
 You 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 e-mail address.
-Please provide an e-mail address if you wish to subscribe to the mailing list.',
+       'config-subscribe-noemail'        => 'You tried to subscribe to the release announcements mailing list without providing an email address.
+Please provide an email address if you wish to subscribe to the mailing list.',
        'config-almost-done'              => 'You are almost done!
 You can now skip the remaining configuration and install the wiki right now.',
        'config-optional-continue'        => 'Ask me more questions.',
@@ -428,22 +423,22 @@ If you want to be able to use text from Wikipedia, and you want Wikipedia to be
 Wikipedia previously used the GNU Free Documentation License.
 The GFDL is a valid license, but it is difficult to understand.
 It is also difficult to reuse content licensed under the GFDL.",
-       'config-email-settings'           => 'E-mail settings',
-       'config-enable-email'             => 'Enable outbound e-mail',
-       'config-enable-email-help'        => "If you want e-mail to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.
-If you do not want any e-mail features, you can disable them here.",
-       'config-email-user'               => 'Enable user-to-user e-mail',
-       'config-email-user-help'          => 'Allow all users to send each other e-mail if they have enabled it in their preferences.',
+       '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.
+If 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 e-mail authentication',
-       'config-email-auth-help'          => "If this option is enabled, users have to confirm their e-mail address using a link sent to them whenever they set or change it.
-Only authenticated e-mail addresses can receive e-mails from other users or change notification e-mails.
-Setting this option is '''recommended''' for public wikis because of potential abuse of the e-mail features.",
-       'config-email-sender'             => 'Return e-mail address:',
-       'config-email-sender-help'        => 'Enter the e-mail address to use as the return address on outbound e-mail.
+       '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.
+Only authenticated email addresses can receive emails from other users or change notification emails.
+Setting this option is '''recommended''' 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.
 This is where bounces will be sent.
 Many mail servers require at least the domain name part to be valid.',
        'config-upload-settings'          => 'Images and file uploads',
@@ -519,12 +514,12 @@ MediaWiki currently requires that the tables be owned by the web user. Please sp
        'config-install-user-missing-create' => 'The specified user "$1" does not exist.
 Please click the "create account" checkbox below if you want to create it.',
        'config-install-tables'           => 'Creating tables',
-       'config-install-tables-exist'     => "'''Warning''': MediaWiki tables seem to already exist.
+       'config-install-tables-exist'     => "'''Warning:''' MediaWiki tables seem to already exist.
 Skipping creation.",
-       'config-install-tables-failed'    => "'''Error''': Table creation failed with the following error: $1",
+       'config-install-tables-failed'    => "'''Error:''' 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' => "'''Warning''': The interwiki table seems to already have entries.
+       'config-install-interwiki-exists' => "'''Warning:''' The interwiki table seems to already have entries.
 Skipping default list.",
        'config-install-stats'            => 'Initializing statistics',
        'config-install-keys'             => 'Generating secret keys',
@@ -547,7 +542,7 @@ If the download was not offered, or if you cancelled it, you can restart the dow
 
 $3
 
-'''Note''': 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.
+'''Note:''' 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.
 
 When that has been done, you can '''[$2 enter your wiki]'''.",
        'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
@@ -652,7 +647,6 @@ Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is be
 * $1 - a link to the SQLite home page having the anchor text "SQLite".',
        'config-support-oracle' => 'Parameters:
 * $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
-       'config-support-ibm_db2' => 'Used in the DBConnect step of the installer, explaining what is the ibm_db2 database',
        'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
 
 If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
@@ -674,6 +668,8 @@ If you\'re translating this message to a right-to-left language, consider writin
 * {{msg-mw|config-profile-no-anon}}
 * {{msg-mw|config-profile-fishbowl}}
 * {{msg-mw|config-profile-private}}',
+       'config-email-settings' => '{{Identical|E-mail setting}}',
+       'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
        'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
        'config-logo-help' => '',
        'config-cc-not-chosen' => '{{doc-important|Do not translate the "<code>proceed</code>" part.}}
@@ -1039,12 +1035,13 @@ $messages['ang'] = array(
 
 /** Arabic (العربية)
  * @author Meno25
+ * @author Mido
  * @author OsamaK
  * @author روخو
  */
 $messages['ar'] = array(
        'config-desc' => 'مثبت لميدياويكي',
-       'config-title' => 'ميدياويكي 1$ التثبيت', # Fuzzy
+       'config-title' => 'تثبيت ميدياويكي $1',
        'config-information' => 'معلومات',
        'config-back' => '→ ارجع',
        'config-continue' => 'استمر ←',
@@ -1065,7 +1062,7 @@ $messages['ar'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings قائمة إعدادات الضبط]
 * [//www.mediawiki.org/wiki/Manual:FAQ أسئلة متكررة حول ميدياويكي]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]', # Fuzzy
 );
 
 /** Aramaic (ܐܪܡܝܐ)
@@ -2708,7 +2705,6 @@ Arabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.",
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :
 
 $1
@@ -2718,12 +2714,10 @@ Ma ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti
        'config-support-postgres' => "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
        'config-support-sqlite' => "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
        'config-support-oracle' => '* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])',
-       'config-support-ibm_db2' => '* Un diaz titouroù evit embregerezhioù kenwerzhel eo $1.', # Fuzzy
        'config-header-mysql' => 'Arventennoù MySQL',
        'config-header-postgres' => 'Arventennoù PostgreSQL',
        'config-header-sqlite' => 'Arventennoù SQLite',
        'config-header-oracle' => 'Arventennoù Oracle',
-       'config-header-ibm_db2' => 'Arventennoù IBM DB2',
        'config-invalid-db-type' => 'Direizh eo ar seurt diaz roadennoù',
        'config-missing-db-name' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Anv an diaz titouroù"',
        'config-missing-db-host' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Ostiz an diaz titouroù"',
@@ -2808,7 +2802,7 @@ Gellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
        'config-optional-continue' => "Sevel muioc'h a goulennoù ouzhin.",
        'config-optional-skip' => 'Aet on skuizh, staliañ ar wiki hepken.',
        'config-profile' => 'Profil ar gwirioù implijer :',
-       'config-profile-wiki' => 'Wiki hengounel', # Fuzzy
+       'config-profile-wiki' => 'Wiki digor',
        'config-profile-no-anon' => 'Krouidigezh ur gont ret',
        'config-profile-fishbowl' => 'Embanner aotreet hepken',
        'config-profile-private' => 'Wiki prevez',
@@ -2865,7 +2859,7 @@ Marteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.
        'config-install-alreadydone' => "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.
 Kit d'ar bajenn war-lerc'h, mar plij.",
        'config-install-begin' => 'Pa vo bet pouezet ganeoc\'h war "{{int:config-continue}}"  e krogo staliadur MediaWiki.
-Pouezit war Kent mar fell deoc\'h cheñch tra pe dra.', # Fuzzy
+Pouezit war "{{int:config-back}}" mar fell deoc\'h cheñch tra pe dra.',
        'config-install-step-done' => 'graet',
        'config-install-step-failed' => "c'hwitet",
        'config-install-extensions' => 'En ur gontañ an astennoù',
@@ -2895,14 +2889,16 @@ Gwiriit hag-eñ e c'hall an implijer « $1 » skrivañ er brastres « $2 ».",
        'config-install-mainpage-failed' => "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
        'config-download-localsettings' => 'Pellgargañ <code>LocalSettings.php</code>',
        '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.
 
 == Kregiñ ganti ==
 
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Roll an arventennoù kefluniañ]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAG MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh", # Fuzzy
 );
 
 /** Bosnian (bosanski)
@@ -3050,6 +3046,9 @@ $messages['ceb'] = array(
  * @author Calak
  */
 $messages['ckb'] = array(
+       'config-wiki-language' => 'زمانی ویکی:',
+       'config-page-language' => 'زمان',
+       'config-page-name' => 'ناو',
        'mainpagetext' => "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
        'mainpagedocfooter' => 'لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.
 
@@ -4425,6 +4424,21 @@ $messages['el'] = array(
        'mainpagedocfooter' => 'Περισσότερες πληροφορίες σχετικά με τη χρήση και με τη ρύθμιση παραμέτρων θα βρείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για τροποποίηση του περιβάλλοντος εργασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Εγχειρίδιο χρήστη].', # Fuzzy
 );
 
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+       '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.
+If 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.
+You should [//www.mediawiki.org/wiki/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-install-stats' => 'Initialising statistics',
+);
+
 /** Esperanto (Esperanto)
  * @author Airon90
  * @author Yekrats
@@ -6298,7 +6312,8 @@ $messages['gd'] = array(
 == Toiseach tòiseachaidh ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]
 * [//www.mediawiki.org/wiki/Manual:FAQ CÀBHA MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cuir do chànan air MediaWiki]",
 );
 
 /** Galician (galego)
@@ -7762,16 +7777,13 @@ Změń ju jenož, jeli su přeswědčiwe přičiny za to.',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju  PHP z  MySQL-podpěru])',
        'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL]). Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać.',
        'config-support-oracle' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])',
-       'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql' => 'Nastajenja MySQL',
        'config-header-postgres' => 'Nastajenja PostgreSQL',
        'config-header-sqlite' => 'Nastajenja SQLite',
        'config-header-oracle' => 'Nastajenja Oracle',
-       'config-header-ibm_db2' => 'Nastajenja IBM DB2',
        'config-invalid-db-type' => 'Njepłaćiwy typ datoweje banki',
        'config-missing-db-name' => 'Dyrbiš hódnotu za "Mjeno datoweje banki" zapodać',
        'config-missing-db-host' => 'Dyrbiš hódnotu za "Database host" zapodać',
@@ -9367,7 +9379,6 @@ Pertimbangkan untuk menempatkan basis data di tempat lain, misalnya di <code>/va
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki mendukung sistem basis data berikut:
 
 $1
@@ -9377,12 +9388,10 @@ Jika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah i
        'config-support-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-support-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-support-oracle' => '* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])',
-       'config-support-ibm_db2' => '* $1 adalah basis data-perusahaan komersial.', # Fuzzy
        'config-header-mysql' => 'Pengaturan MySQL',
        'config-header-postgres' => 'Pengaturan PostgreSQL',
        'config-header-sqlite' => 'Pengaturan SQLite',
        'config-header-oracle' => 'Pengaturan Oracle',
-       'config-header-ibm_db2' => 'Pengaturan IBM DB2',
        '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"',
@@ -9467,7 +9476,6 @@ Basis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
 Ini lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.
 
 Dalam '''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-ibm_db2-low-db-pagesize' => "Basis data DB2 Anda tidak memiliki pagesize yang cukup untuk tablespace bawaan. Pagesize harus sama atau lebih dari '''32K'''.",
        '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.',
@@ -10050,9 +10058,9 @@ MediaWikiのインストールはできません。',
 しかし、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' => "'''警告''': Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。
+       'config-unicode-pure-php-warning' => "'''警告:''' Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。
 高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
-       'config-unicode-update-warning' => "'''警告''': インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。
+       'config-unicode-update-warning' => "'''警告:''' インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。
 Unicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]してください。",
        'config-no-db' => '適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。
 以下の種類のデータベースに対応しています: $1
@@ -10060,7 +10068,7 @@ Unicode を少しでも利用する可能性がある場合は、[//www.mediawik
 共有サーバーを使用している場合は、適切なデータベース ドライバーのインストールを、サーバーの管理者に依頼してください。
 PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
 Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
-       'config-no-fts3' => "'''警告''': SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
+       'config-no-fts3' => "'''警告:''' SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
        'config-register-globals' => "'''警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。'''
 '''可能なら無効化してください。'''
 MediaWiki は動作しますが、サーバーの潜在的なセキュリティ脆弱性が露呈されます。",
@@ -10083,7 +10091,7 @@ MediaWikiは、このモジュールの関数を必要としているため、
 Mandrakeを実行している場合、php-xmlパッケージをインストールしてください。',
        'config-pcre' => 'PCREをサポートしているモジュールが不足しているようです。
 MediaWikiは、Perl互換の正規表現関数の動作が必要です。',
-       'config-pcre-no-utf8' => "'''致命的エラー''': PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
+       '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に設定されています。
@@ -10103,7 +10111,7 @@ MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
 画像のサムネイル生成は無効になります。',
        'config-no-uri' => "'''エラー:''' 現在のURIを決定できませんでした。
 インストールは中止されました。",
-       'config-no-cli-uri' => "'''警告''': --scriptpath が指定されていないため、既定値 <code>$1</code> を使用します。",
+       'config-no-cli-uri' => "'''警告:''' --scriptpath が指定されていないため、既定値 <code>$1</code> を使用します。",
        'config-using-server' => 'サーバー名「<nowiki>$1</nowiki>」を使用しています。',
        'config-using-uri' => 'サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。',
        'config-uploads-not-safe' => "'''警告:''' アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。
@@ -10187,7 +10195,6 @@ PostgreSQLを使用している場合、UNIXソケットで接続するにはこ
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki は以下のデータベース システムに対応しています:
 
 $1
        'config-support-postgres' => '* $1は、MySQLの代替として人気があるオープンソースのデータベースシステムです ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLに対応したPHPをコンパイルする方法])',
        'config-support-sqlite' => '* $1は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)',
        'config-support-oracle' => '* $1は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])',
-       'config-support-ibm_db2' => '* $1 は商業企業のデータベースです。([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2に対応したPHPをコンパイルする方法])',
        'config-header-mysql' => 'MySQL の設定',
        'config-header-postgres' => 'PostgreSQL の設定',
        'config-header-sqlite' => 'SQLite の設定',
        'config-header-oracle' => 'Oracle の設定',
-       'config-header-ibm_db2' => 'IBM DB2 の設定',
        'config-invalid-db-type' => '無効なデータベースの種類',
        'config-missing-db-name' => '「データベース名」を入力してください',
        'config-missing-db-host' => '「データベースのホスト」を入力してください',
@@ -10297,13 +10302,13 @@ chmod a+w $3</pre>',
        'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
 この名前空間内のページのページ名はすべて特定の接頭辞で始まります。それをここで指定できます。
 通常、この接頭辞はウィキ名に基づきますが、「#」や「:」のような区切り文字を含めることはできません。",
-       'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
-違うプロジェクト名前空間を指定してください。',
+       'config-ns-invalid' => '指定した名前空間「<nowiki>$1</nowiki>」は無効です。
+別のプロジェクト名前空間を指定してください。',
        'config-admin-box' => '管理アカウント',
        'config-admin-name' => '名前:',
        'config-admin-password' => 'パスワード:',
        'config-admin-password-confirm' => 'パスワードの再入力:',
-       'config-admin-help' => '希望するユーザー名をここに入力してください (例: "Joe Bloggs")。
+       'config-admin-help' => '希望するユーザー名をここに入力してください (例:「Joe Bloggs」)。
 この名前でこのウィキにログインすることになります。',
        'config-admin-name-blank' => '管理者のユーザー名を入力してください。',
        'config-admin-name-invalid' => '指定したユーザー名「<nowiki>$1</nowiki>」は無効です。
@@ -10313,8 +10318,9 @@ chmod a+w $3</pre>',
        'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
        'config-admin-email' => 'メールアドレス:',
        'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
-       'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
-       'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
+       'config-admin-error-user' => '「<nowiki>$1</nowiki>」という名前の管理者を作成する際に内部エラーが発生しました。',
+       '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を更新してください。',
@@ -10436,12 +10442,12 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
        'config-install-user-missing-create' => '指定したユーザー「$1」は存在しません。
 アカウントを作成する場合は、下の「アカウント作成」をクリックしてください。',
        'config-install-tables' => 'テーブルの作成',
-       'config-install-tables-exist' => "'''警告''': MediaWiki テーブルは既に存在するようです。
+       'config-install-tables-exist' => "'''警告:''' MediaWiki テーブルは既に存在するようです。
 作成を省略します。",
-       'config-install-tables-failed' => "'''エラー''': テーブルの作成が、以下のエラーにより失敗しました: $1",
+       'config-install-tables-failed' => "'''エラー:''' テーブルの作成が、以下のエラーにより失敗しました: $1",
        'config-install-interwiki' => '既定のウィキ間テーブルの導入',
        'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> から読み取れませんでした。',
-       'config-install-interwiki-exists' => "'''警告''': ウィキ間テーブルは既に登録されているようです。
+       'config-install-interwiki-exists' => "'''警告:''' ウィキ間テーブルは既に登録されているようです。
 既定のテーブルを無視します。",
        'config-install-stats' => '統計情報の初期化',
        'config-install-keys' => '秘密鍵の生成',
@@ -10460,7 +10466,7 @@ MediaWikiのインストールに成功しました。
 
 $3
 
-'''注意''': この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。
+'''注意:''' この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。
 
 上記の作業が完了すると、'''[$2 ウィキに入る]'''ことができます。",
        'config-download-localsettings' => '<code>LocalSettings.php</code> をダウンロード',
@@ -19823,22 +19829,36 @@ $messages['xal'] = array(
  * @author පසිඳු කාවින්ද
  */
 $messages['yi'] = array(
+       'config-desc' => 'דער אינסטאלירער פאר מעדיעוויקי',
+       'config-title' => 'מעדיעוויקי $1 אינסטאלירונג',
+       'config-information' => 'אינפֿארמאציע',
+       'config-wiki-language' => 'ווקי שפראך:',
        'config-back' => '→ צוריק',
+       'config-continue' => 'פֿארזעצן ←',
        'config-page-language' => 'שפראַך',
        'config-page-name' => 'נאָמען',
        'config-page-options' => 'ברירות',
+       'config-db-type' => 'דאטנבאזע טיפ:',
+       'config-db-name' => 'דאטנבאזע נאָמען:',
+       'config-project-namespace' => 'פראיעקט נאָמענטייל:',
        'config-ns-generic' => 'פראיעקט',
        'config-admin-name' => 'אײַער נאָמען:',
        'config-admin-password' => 'פאַסווארט:',
+       'config-admin-password-mismatch' => 'די צוויי פאסוועטרט איר האט איינגעגעבן שטימען נישט.',
        'config-admin-email' => 'בליצפּאָסט אַדרעס:',
+       'config-install-tables' => 'שאפן טאבעלעס',
+       'config-install-tables-exist' => "'''ווארענונג''': זעט אויס אז די מעדיעוויקי טאבעלעס עקזיסטירן שוין.
+איבערהיפן שאפֿן.",
+       'config-download-localsettings' => 'אראפלאדן <code>LocalSettings.php</code>',
        'config-help' => 'הילף',
+       'config-nofile' => 'מ\'האט נישט געקענט טרעפן די טעקע "$1". צי האט מען זי אויסגעמעקט?',
        'mainpagetext' => "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
        'mainpagedocfooter' => "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.
 
 == נוצליכע וועבלינקען פֿאַר אנהייבערס ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]
 * [//www.mediawiki.org/wiki/Manual:FAQ אפֿט געפֿרעגטע שאלות]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]",
 );
 
 /** Yoruba (Yorùbá)
@@ -19958,7 +19978,7 @@ $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' => "'''警告''':因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。
+       'config-unicode-pure-php-warning' => "'''警告:'''因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。
 如果您运行着一个高流量的站点,请参阅 [//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-no-db' => '找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。
@@ -20063,7 +20083,6 @@ Object caching is not enabled.",
 请考虑将数据库统一放置在某处,如<code>/var/lib/mediawiki/yourwiki</code>下。",
        'config-oracle-def-ts' => '默认表空间:',
        'config-oracle-temp-ts' => '临时表空间:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki支持以下数据库系统:
 
 $1
        'config-support-postgres' => '* $1是一种流行的开源数据库系统,可作为MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])。本程序中可能依然存在一些小而明显的错误,因此并不建议在生产环境中使用该数据库系统。',
        'config-support-sqlite' => '* $1是一种轻量级的数据库系统,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)',
        'config-support-oracle' => '* $1是一种商用企业级的数据库。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])',
-       'config-support-ibm_db2' => '* $1是一种商用企业级数据库。([http://www.php.net/manual/en/ibm-db2.installation.php 如何编译支持IBM DB2的PHP])',
        'config-header-mysql' => 'MySQL设置',
        'config-header-postgres' => 'PostgreSQL设置',
        'config-header-sqlite' => 'SQLite设置',
        'config-header-oracle' => 'Oracle设置',
-       'config-header-ibm_db2' => 'IBM DB2设置',
        'config-invalid-db-type' => '无效的数据库类型',
        'config-missing-db-name' => '您必须为“数据库名称”输入内容',
        'config-missing-db-host' => '您必须为“数据库主机”输入内容',
@@ -20153,7 +20170,6 @@ chmod a+w $3</pre>',
        'config-mysql-charset-help' => "在'''二进制模式'''下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。
 
 在'''UTF-8模式'''下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[//zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
-       'config-ibm_db2-low-db-pagesize' => "您的DB2数据库默认表空间的页长(pagesize)不足。至少需要'''32K'''或更大的页长。",
        'config-site-name' => 'Wiki的名称:',
        'config-site-name-help' => '填入的内容会出现在浏览器的标题栏以及其他多处位置中。',
        'config-site-name-blank' => '输入网站的名称。',
@@ -20403,7 +20419,7 @@ $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' => "'''警告''':因為尚未安裝 [http://pecl.php.net/intl intl PECL 延伸函式庫]以處理 Unicode 正規化,故只能退而採用較慢的純 PHP 實作。如果您運行着一個高流量的網站,請參閱 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]一文。",
+       'config-unicode-pure-php-warning' => "'''警告:'''因為尚未安裝 [http://pecl.php.net/intl intl PECL 延伸函式庫]以處理 Unicode 正規化,故只能退而採用較慢的純 PHP 實作。如果您運行着一個高流量的網站,請參閱 [//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-no-db' => '找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。
 
@@ -20507,7 +20523,6 @@ Object caching is not enabled.",
 請考慮將數據庫統一放置在某處,如<code>/var/lib/mediawiki/yourwiki</code>下。",
        'config-oracle-def-ts' => '默認表空間:',
        'config-oracle-temp-ts' => '臨時表空間:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki支持以下數據庫系統:
 
 $1
        'config-support-postgres' => '* $1是一種流行的開源數據庫系統,可作為MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將對PostgreSQL的支持編譯進PHP中])。本程序中可能依然存在一些小而明顯的錯誤,因此並不建議在生產環境中使用該數據庫系統。',
        'config-support-sqlite' => '* $1是一種輕量級的數據庫系統,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何將對SQLite的支持編譯進PHP中],須使用PDO)',
        'config-support-oracle' => '* $1是一種商用企業級的數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將對OCI8的支持編譯進PHP中])',
-       'config-support-ibm_db2' => '* $1是一種商用企業級數據庫。', # Fuzzy
        'config-header-mysql' => 'MySQL 的設定',
        'config-header-postgres' => 'PostgreSQL設置',
        'config-header-sqlite' => 'SQLite 的設定',
        'config-header-oracle' => '甲骨文設定',
-       'config-header-ibm_db2' => 'IBM DB2設置',
        'config-invalid-db-type' => '無效的資料庫類型',
        'config-missing-db-name' => '您必須為“數據庫名稱”輸入內容',
        'config-missing-db-host' => '您必須為“數據庫主機”輸入內容',
@@ -20597,7 +20610,6 @@ chmod a+w $3</pre>',
        'config-mysql-charset-help' => "在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。
 
 在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
-       'config-ibm_db2-low-db-pagesize' => "您的DB2數據庫默認表空間的頁長(pagesize)不足。至少需要'''32K'''或更大的頁長。",
        'config-site-name' => 'Wiki的名稱:',
        'config-site-name-help' => '填入的內容會出現在瀏覽器的標題欄以及其他多處位置中。',
        'config-site-name-blank' => '輸入站點名稱。',
index 325f894..4d8e5f0 100644 (file)
@@ -88,7 +88,6 @@ abstract class Installer {
                'postgres',
                'oracle',
                'sqlite',
-               'ibm_db2',
        );
 
        /**
@@ -989,7 +988,7 @@ abstract class Installer {
                                continue;
                        }
 
-                       list( $all, $lang, $territory, $charset, $modifier ) = $m;
+                       list( , $lang, , , ) = $m;
 
                        $candidatesByLocale[$m[0]] = $m;
                        $candidatesByLang[$lang][] = $m;
@@ -1090,7 +1089,6 @@ abstract class Installer {
                }
        }
 
-
        /**
         * Check the libicu version
         */
@@ -1174,8 +1172,8 @@ abstract class Installer {
         *
         * Used only by environment checks.
         *
-        * @param $path String: path to search
-        * @param $names Array of executable names
+        * @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
@@ -1279,7 +1277,7 @@ abstract class Installer {
        /**
         * Checks for presence of an Apache module. Works only if PHP is running as an Apache module, too.
         *
-        * @param $moduleName String: Name of module to check.
+        * @param string $moduleName Name of module to check.
         * @return bool
         */
        public static function apacheModulePresent( $moduleName ) {
@@ -1436,8 +1434,8 @@ abstract class Installer {
        /**
         * Actually perform the installation.
         *
-        * @param $startCB Array A callback array for the beginning of each step
-        * @param $endCB Array A callback array for the end of each step
+        * @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
         */
@@ -1644,9 +1642,9 @@ abstract class Installer {
        /**
         * Add an installation step following the given step.
         *
-        * @param $callback Array A valid installation callback array, in this form:
+        * @param array $callback A valid installation callback array, in this form:
         *    array( 'name' => 'some-unique-name', 'callback' => array( $obj, 'function' ) );
-        * @param $findStep String 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 bbc6b64..7cb3779 100644 (file)
@@ -94,8 +94,8 @@ class LocalSettingsGenerator {
 
        /**
         * For $wgGroupPermissions, set a given ['group']['permission'] value.
-        * @param $group String Group name
-        * @param $rightsArr Array An array of permissions, in the form of:
+        * @param string $group Group name
+        * @param array $rightsArr An array of permissions, in the form of:
         *   array( 'right' => true, 'right2' => false )
         */
        public function setGroupRights( $group, $rightsArr ) {
@@ -157,7 +157,7 @@ class LocalSettingsGenerator {
        /**
         * Write the generated LocalSettings to a file
         *
-        * @param $fileName String Full path to filename to write to
+        * @param string $fileName Full path to filename to write to
         */
        public function writeFile( $fileName ) {
                file_put_contents( $fileName, $this->getText() );
@@ -255,59 +255,59 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## Uncomment this to disable output compression
 # \$wgDisableOutputCompression = true;
 
-\$wgSitename      = \"{$this->values['wgSitename']}\";
+\$wgSitename = \"{$this->values['wgSitename']}\";
 {$metaNamespace}
 ## The URL base path to the directory containing the wiki;
 ## defaults for all runtime URL paths are based off of this.
 ## For more information on customizing the URLs
 ## (like /w/index.php/Page_title to /wiki/Page_title) please see:
 ## http://www.mediawiki.org/wiki/Manual:Short_URL
-\$wgScriptPath       = \"{$this->values['wgScriptPath']}\";
-\$wgScriptExtension  = \"{$this->values['wgScriptExtension']}\";
+\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
+\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
 
 ## The protocol and server name to use in fully-qualified URLs
-\$wgServer           = \"{$this->values['wgServer']}\";
+\$wgServer = \"{$this->values['wgServer']}\";
 
 ## The relative URL path to the skins directory
-\$wgStylePath        = \"\$wgScriptPath/skins\";
+\$wgStylePath = \"\$wgScriptPath/skins\";
 
 ## The relative URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
-\$wgLogo             = \"\$wgStylePath/common/images/wiki.png\";
+\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
 
 ## UPO means: this is also a user preference option
 
-\$wgEnableEmail      = {$this->values['wgEnableEmail']};
-\$wgEnableUserEmail  = {$this->values['wgEnableUserEmail']}; # UPO
+\$wgEnableEmail = {$this->values['wgEnableEmail']};
+\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
 
 \$wgEmergencyContact = \"{$this->values['wgEmergencyContact']}\";
-\$wgPasswordSender   = \"{$this->values['wgPasswordSender']}\";
+\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
 
-\$wgEnotifUserTalk      = {$this->values['wgEnotifUserTalk']}; # UPO
-\$wgEnotifWatchlist     = {$this->values['wgEnotifWatchlist']}; # UPO
+\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
+\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
 \$wgEmailAuthentication = {$this->values['wgEmailAuthentication']};
 
 ## Database settings
-\$wgDBtype           = \"{$this->values['wgDBtype']}\";
-\$wgDBserver         = \"{$this->values['wgDBserver']}\";
-\$wgDBname           = \"{$this->values['wgDBname']}\";
-\$wgDBuser           = \"{$this->values['wgDBuser']}\";
-\$wgDBpassword       = \"{$this->values['wgDBpassword']}\";
+\$wgDBtype = \"{$this->values['wgDBtype']}\";
+\$wgDBserver = \"{$this->values['wgDBserver']}\";
+\$wgDBname = \"{$this->values['wgDBname']}\";
+\$wgDBuser = \"{$this->values['wgDBuser']}\";
+\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
 
 {$this->dbSettings}
 
 ## Shared memory settings
-\$wgMainCacheType    = $cacheType;
+\$wgMainCacheType = $cacheType;
 \$wgMemCachedServers = $mcservers;
 
 ## To enable image uploads, make sure the 'images' directory
 ## is writable, then set this to true:
-\$wgEnableUploads  = {$this->values['wgEnableUploads']};
+\$wgEnableUploads = {$this->values['wgEnableUploads']};
 {$magic}\$wgUseImageMagick = true;
 {$magic}\$wgImageMagickConvertCommand = \"{$this->values['wgImageMagickConvertCommand']}\";
 
 # InstantCommons allows wiki to use images from http://commons.wikimedia.org
-\$wgUseInstantCommons  = {$this->values['wgUseInstantCommons']};
+\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
 
 ## If you use ImageMagick (or any other shell command) on a
 ## Linux server, this will need to be set to the name of an
@@ -342,7 +342,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## appropriate copyright notice / icon. GNU Free Documentation
 ## License and Creative Commons licenses are supported so far.
 \$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
-\$wgRightsUrl  = \"{$this->values['wgRightsUrl']}\";
+\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
 \$wgRightsText = \"{$this->values['wgRightsText']}\";
 \$wgRightsIcon = \"{$this->values['wgRightsIcon']}\";
 
index 4eb2d39..f9a8ce7 100644 (file)
@@ -574,8 +574,8 @@ class MysqlInstaller extends DatabaseInstaller {
 
        /**
         * Return a formal 'User'@'Host' username for use in queries
-        * @param $name String Username, quotes will be added
-        * @param $host String Hostname, quotes will be added
+        * @param string $name Username, quotes will be added
+        * @param string $host Hostname, quotes will be added
         * @return String
         */
        private function buildFullUserName( $name, $host ) {
@@ -585,8 +585,8 @@ class MysqlInstaller extends DatabaseInstaller {
        /**
         * Try to see if the user account exists. Our "superuser" may not have
         * access to mysql.user, so false means "no" or "maybe"
-        * @param $host String Hostname to check
-        * @param $user String Username to check
+        * @param string $host Hostname to check
+        * @param string $user Username to check
         * @return boolean
         */
        private function userDefinitelyExists( $host, $user ) {
@@ -637,10 +637,10 @@ class MysqlInstaller extends DatabaseInstaller {
                $tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
                return
 "# MySQL specific settings
-\$wgDBprefix         = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
 
 # MySQL table options to use during installation or update
-\$wgDBTableOptions   = \"{$tblOpts}\";
+\$wgDBTableOptions = \"{$tblOpts}\";
 
 # Experimental charset support for MySQL 5.0.
 \$wgDBmysql5 = {$dbmysql5};";
index 6a2d50f..9978a92 100644 (file)
@@ -236,9 +236,9 @@ class MysqlUpdater extends DatabaseUpdater {
         * 1.4 betas were missing the 'binary' marker from logging.log_title,
         * which causes a collation mismatch error on joins in MySQL 4.1.
         *
-        * @param $table String: table name
-        * @param $field String: field name to check
-        * @param $patchFile String: path to the patch to correct the field
+        * @param string $table table name
+        * @param string $field field name to check
+        * @param string $patchFile path to the patch to correct the field
         */
        protected function checkBin( $table, $field, $patchFile ) {
                if ( !$this->doTable( $table ) ) {
@@ -259,9 +259,9 @@ class MysqlUpdater extends DatabaseUpdater {
        /**
         * Check whether an index contain a field
         *
-        * @param $table String: table name
-        * @param $index String: index name to check
-        * @param $field String: field that should be in the index
+        * @param string $table table name
+        * @param string $index index name to check
+        * @param string $field field that should be in the index
         * @return Boolean
         */
        protected function indexHasField( $table, $index, $field ) {
@@ -416,7 +416,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
                                        $deleteId[] = $row->cur_id;
                                }
-                               $prev_title     = $row->cur_title;
+                               $prev_title = $row->cur_title;
                                $prev_namespace = $row->cur_namespace;
                        }
                        $sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
index 4c72a8f..e853889 100644 (file)
@@ -202,7 +202,6 @@ class OracleInstaller extends DatabaseInstaller {
                $this->parent->addInstallStep( $callback, 'database' );
        }
 
-
        public function setupDatabase() {
                $status = Status::newGood();
                return $status;
@@ -294,7 +293,7 @@ class OracleInstaller extends DatabaseInstaller {
                $prefix = $this->getVar( 'wgDBprefix' );
                return
 "# Oracle specific settings
-\$wgDBprefix         = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
 ";
        }
 
index 882ec53..4e5ae8c 100644 (file)
@@ -125,9 +125,9 @@ class PostgresInstaller extends DatabaseInstaller {
 
        /**
         * Open a PG connection with given parameters
-        * @param $user string User name
-        * @param $password string Password
-        * @param $dbName string Database name
+        * @param string $user User name
+        * @param string $password Password
+        * @param string $dbName Database name
         * @return Status
         */
        protected function openConnectionWithParams( $user, $password, $dbName ) {
@@ -147,7 +147,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
        /**
         * Get a special type of connection
-        * @param $type string See openPgConnection() for details.
+        * @param string $type See openPgConnection() for details.
         * @return Status
         */
        protected function getPgConnection( $type ) {
@@ -183,7 +183,7 @@ class PostgresInstaller extends DatabaseInstaller {
         * separate connection for this allows us to avoid accidental cross-module
         * dependencies.
         *
-        * @param $type string The type of connection to get:
+        * @param string $type The type of connection to get:
         *    - create-db:     A connection for creating DBs, suitable for pre-
         *                     installation.
         *    - create-schema: A connection to the new DB, for creating schemas and
@@ -383,9 +383,9 @@ class PostgresInstaller extends DatabaseInstaller {
        /**
         * Recursive helper for canCreateObjectsForWebUser().
         * @param $conn DatabaseBase object
-        * @param $targetMember int Role ID of the member to look for
-        * @param $group int Role ID of the group to look for
-        * @param $maxDepth int Maximum recursive search depth
+        * @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
         * @return bool
         */
        protected function isRoleMember( $conn, $targetMember, $group, $maxDepth ) {
@@ -531,8 +531,8 @@ class PostgresInstaller extends DatabaseInstaller {
                $schema = $this->getVar( 'wgDBmwschema' );
                return
 "# Postgres specific settings
-\$wgDBport           = \"{$port}\";
-\$wgDBmwschema       = \"{$schema}\";";
+\$wgDBport = \"{$port}\";
+\$wgDBmwschema = \"{$schema}\";";
        }
 
        public function preUpgrade() {
index d8fa724..68df6ab 100644 (file)
@@ -240,7 +240,7 @@ class SqliteInstaller extends DatabaseInstaller {
 
                $module = DatabaseSqlite::getFulltextSearchModule();
                $fts3tTable = $this->db->checkForEnabledSearch();
-               if ( $fts3tTable &&  !$module ) {
+               if ( $fts3tTable && !$module ) {
                        $status->warning( 'config-sqlite-fts3-downgrade' );
                        $this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
                } elseif ( !$fts3tTable && $module == 'FTS3' ) {
@@ -256,6 +256,6 @@ class SqliteInstaller extends DatabaseInstaller {
                $dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
                return
 "# SQLite-specific settings
-\$wgSQLiteDataDir    = \"{$dir}\";";
+\$wgSQLiteDataDir = \"{$dir}\";";
        }
 }
index cd7a2c9..47650b6 100644 (file)
@@ -124,7 +124,7 @@ class SqliteUpdater extends DatabaseUpdater {
        protected function sqliteSetupSearchindex() {
                $module = DatabaseSqlite::getFulltextSearchModule();
                $fts3tTable = $this->updateRowExists( 'fts3' );
-               if ( $fts3tTable &&  !$module ) {
+               if ( $fts3tTable && !$module ) {
                        $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
                } elseif ( !$fts3tTable && $module == 'FTS3' ) {
                        $this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
index c080871..a325507 100644 (file)
@@ -140,7 +140,7 @@ class WebInstaller extends Installer {
        /**
         * Main entry point.
         *
-        * @param $session Array: initial session array
+        * @param array $session initial session array
         *
         * @return Array: new session array
         */
@@ -461,7 +461,7 @@ class WebInstaller extends Installer {
 
        /**
         * Set a session variable.
-        * @param $name String key for the variable
+        * @param string $name key for the variable
         * @param $value Mixed
         */
        public function setSession( $name, $value ) {
@@ -610,7 +610,7 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for an error box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMessage()->plain()
+        * @param string $text wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
@@ -621,7 +621,7 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for a warning box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMessage()->plain()
+        * @param string $text wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
@@ -632,9 +632,9 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for an info box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMessage()->plain()
-        * @param $icon String: icon name, file in skins/common/images
-        * @param $class String: additional class name to add to the wrapper div
+        * @param string $text wikitext, get this with wfMessage()->plain()
+        * @param string $icon icon name, file in skins/common/images
+        * @param string $class additional class name to add to the wrapper div
         *
         * @return string
         */
@@ -668,7 +668,7 @@ class WebInstaller extends Installer {
 
        /**
         * Output a help box.
-        * @param $msg String key for wfMessage()
+        * @param string $msg key for wfMessage()
         */
        public function showHelpBox( $msg /*, ... */ ) {
                $args = func_get_args();
@@ -1006,7 +1006,7 @@ class WebInstaller extends Installer {
         * fake) passwords.
         *
         * @param $varNames Array
-        * @param $prefix String: the prefix added to variables to obtain form names
+        * @param string $prefix the prefix added to variables to obtain form names
         *
         * @return array
         */
index 42f451f..afbb9ab 100644 (file)
@@ -104,7 +104,7 @@ class WebInstallerOutput {
 
        /**
         * Get the raw vector CSS, flipping if needed
-        * @param $dir String 'ltr' or 'rtl'
+        * @param string $dir 'ltr' or 'rtl'
         * @return String
         */
        public function getCSS( $dir ) {
index e126c23..f352cf1 100644 (file)
@@ -128,7 +128,7 @@ abstract class WebInstallerPage {
        /**
         * Get the starting tags of a fieldset.
         *
-        * @param $legend String: message name
+        * @param string $legend message name
         *
         * @return string
         */
@@ -357,7 +357,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
        /**
         * Initiate an upgrade of the existing database
-        * @param $vars array Variables from LocalSettings.php and AdminSettings.php
+        * @param array $vars Variables from LocalSettings.php and AdminSettings.php
         * @return Status
         */
        protected function handleExistingUpgrade( $vars ) {
index 9ec58c9..bcf582e 100644 (file)
@@ -59,10 +59,10 @@ abstract class Job {
        /**
         * Create the appropriate object to handle a specific job
         *
-        * @param $command String: Job command
+        * @param string $command Job command
         * @param $title Title: Associated title
-        * @param $params Array|bool: Job parameters
-        * @param $id Int: Job identifier
+        * @param array|bool $params Job parameters
+        * @param int $id Job identifier
         * @throws MWException
         * @return Job
         */
@@ -82,7 +82,7 @@ abstract class Job {
         * This may add duplicate at insert time, but they will be
         * removed later on, when the first one is popped.
         *
-        * @param $jobs array of Job objects
+        * @param array $jobs of Job objects
         * @return bool
         * @deprecated 1.21
         */
@@ -97,7 +97,7 @@ abstract class Job {
         * be rolled-back as part of a larger transaction. However,
         * large batches of jobs can cause slave lag.
         *
-        * @param $jobs array of Job objects
+        * @param array $jobs of Job objects
         * @return bool
         * @deprecated 1.21
         */
@@ -111,7 +111,7 @@ abstract class Job {
         * runners.
         *
         * @param $type string
-        * @return Job
+        * @return Job|bool Returns false if there are no jobs
         * @deprecated 1.21
         */
        public static function pop_type( $type ) {
@@ -211,7 +211,7 @@ abstract class Job {
        }
 
        /**
-        * @param $key string A key that identifies the task
+        * @param string $key A key that identifies the task
         * @return Array
         */
        public static function newRootJobParams( $key ) {
index 4996a9e..b0dd925 100644 (file)
@@ -41,11 +41,18 @@ abstract class JobQueue {
         * @param $params array
         */
        protected function __construct( array $params ) {
-               $this->wiki     = $params['wiki'];
-               $this->type     = $params['type'];
-               $this->order    = isset( $params['order'] ) ? $params['order'] : 'random';
+               $this->wiki = $params['wiki'];
+               $this->type = $params['type'];
                $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
                $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+               if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
+                       $this->order = $params['order'];
+               } else {
+                       $this->order = $this->optimalOrder();
+               }
+               if ( !in_array( $this->order, $this->supportedOrders() ) ) {
+                       throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
+               }
        }
 
        /**
@@ -60,10 +67,10 @@ abstract class JobQueue {
         *                job runners since jobs can take different times to finish once popped.
         *                If "timestamp" is used, the queue will at least be loosely ordered
         *                by timestamp, allowing for some jobs to be popped off out of order.
-        *                If "random" is used, pop() will pick jobs in random order. This might be
-        *                useful for improving concurrency depending on the queue storage medium.
-        *                Note that "random" really means "don't care", so it may actually be FIFO
-        *                or only weakly random (e.g. pop() takes one of the first X jobs randomly).
+        *                If "random" is used, pop() will pick jobs in random order.
+        *                Note that it may only be weakly random (e.g. a lottery of the oldest X).
+        *                If "any" is choosen, the queue will use whatever order is the fastest.
+        *                This might be useful for improving concurrency for job acquisition.
         *   - claimTTL : If supported, the queue will recycle jobs that have been popped
         *                but not acknowledged as completed after this many seconds. Recycling
         *                of jobs simple means re-inserting them into the queue. Jobs can be
@@ -101,10 +108,32 @@ abstract class JobQueue {
                return $this->type;
        }
 
+       /**
+        * @return string One of (random, timestamp, fifo)
+        */
+       final public function getOrder() {
+               return $this->order;
+       }
+
+       /**
+        * @return Array Subset of (random, timestamp, fifo)
+        */
+       abstract protected function supportedOrders();
+
+       /**
+        * @return string One of (random, timestamp, fifo)
+        */
+       abstract protected function optimalOrder();
+
        /**
         * Quickly check if the queue is empty (has no available jobs).
         * Queue classes should use caching if they are any slower without memcached.
         *
+        * If caching is used, this might return false when there are actually no jobs.
+        * If pop() is called and returns false then it should correct the cache. Also,
+        * calling flushCaches() first prevents this. However, this affect is typically
+        * not distinguishable from the race condition between isEmpty() and pop().
+        *
         * @return bool
         * @throws MWException
         */
@@ -122,9 +151,11 @@ abstract class JobQueue {
        abstract protected function doIsEmpty();
 
        /**
-        * Get the number of available jobs in the queue.
+        * Get the number of available (unacquired) jobs in the queue.
         * Queue classes should use caching if they are any slower without memcached.
         *
+        * If caching is used, this number might be out of date for a minute.
+        *
         * @return integer
         * @throws MWException
         */
@@ -145,6 +176,8 @@ abstract class JobQueue {
         * Get the number of acquired jobs (these are temporarily out of the queue).
         * Queue classes should use caching if they are any slower without memcached.
         *
+        * If caching is used, this number might be out of date for a minute.
+        *
         * @return integer
         * @throws MWException
         */
@@ -180,7 +213,7 @@ abstract class JobQueue {
         * This does not require $wgJobClasses to be set for the given job type.
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
-        * @param $jobs array List of Jobs
+        * @param array $jobs List of Jobs
         * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
         * @return bool Returns false on failure
         * @throws MWException
@@ -189,6 +222,7 @@ abstract class JobQueue {
                if ( !count( $jobs ) ) {
                        return true; // nothing to do
                }
+
                foreach ( $jobs as $job ) {
                        if ( $job->getType() !== $this->type ) {
                                throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
@@ -378,6 +412,16 @@ abstract class JobQueue {
         */
        protected function doFlushCaches() {}
 
+       /**
+        * Get an iterator to traverse over all of the jobs in this queue.
+        * This does not include jobs that are current acquired. In general,
+        * this should only be called on a queue that is no longer being popped.
+        *
+        * @return Iterator|Traversable|Array
+        * @throws MWException
+        */
+       abstract public function getAllQueuedJobs();
+
        /**
         * Namespace the queue with a key to isolate it for testing
         *
index fd64895..a7a459f 100644 (file)
  * @since 1.21
  */
 class JobQueueDB extends JobQueue {
-       const ROOTJOB_TTL     = 1209600; // integer; seconds to remember root jobs (14 days)
+       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
-       const CACHE_TTL_LONG  = 300; // integer; seconds to cache info that is kept up to date
-       const MAX_AGE_PRUNE   = 604800; // integer; seconds a job can live once claimed
-       const MAX_JOB_RANDOM  = 2147483647; // integer; 2^31 - 1, used for job_random
-       const MAX_OFFSET      = 255; // integer; maximum number of rows to skip
+       const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+       const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
+       const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
+       const MAX_OFFSET = 255; // integer; maximum number of rows to skip
 
        protected $cluster = false; // string; name of an external DB cluster
 
@@ -50,6 +50,14 @@ class JobQueueDB extends JobQueue {
                $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
        }
 
+       protected function supportedOrders() {
+               return array( 'random', 'timestamp', 'fifo' );
+       }
+
+       protected function optimalOrder() {
+               return 'random';
+       }
+
        /**
         * @see JobQueue::doIsEmpty()
         * @return bool
@@ -225,8 +233,8 @@ class JobQueueDB extends JobQueue {
                                $row = $this->claimOldest( $uuid );
                        } else { // random first
                                $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
-                               $gte  = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
-                               $row  = $this->claimRandom( $uuid, $rand, $gte );
+                               $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+                               $row = $this->claimRandom( $uuid, $rand, $gte );
                        }
                        // Check if we found a row to reserve...
                        if ( !$row ) {
@@ -258,9 +266,9 @@ class JobQueueDB extends JobQueue {
        /**
         * Reserve a row with a single UPDATE without holding row locks over RTTs...
         *
-        * @param $uuid string 32 char hex string
+        * @param string $uuid 32 char hex string
         * @param $rand integer Random unsigned integer (31 bits)
-        * @param $gte bool Search for job_random >= $random (otherwise job_random <= $random)
+        * @param bool $gte Search for job_random >= $random (otherwise job_random <= $random)
         * @return Row|false
         */
        protected function claimRandom( $uuid, $rand, $gte ) {
@@ -281,8 +289,8 @@ class JobQueueDB extends JobQueue {
                                // For small queues, using OFFSET will overshoot and return no rows more often.
                                // Instead, this uses job_random to pick a row (possibly checking both directions).
                                $ineq = $gte ? '>=' : '<=';
-                               $dir  = $gte ? 'ASC' : 'DESC';
-                               $row  = $dbw->selectRow( 'job', '*', // find a random job
+                               $dir = $gte ? 'ASC' : 'DESC';
+                               $row = $dbw->selectRow( 'job', '*', // find a random job
                                        array(
                                                'job_cmd'   => $this->type,
                                                'job_token' => '', // unclaimed
@@ -338,7 +346,7 @@ class JobQueueDB extends JobQueue {
        /**
         * Reserve a row with a single UPDATE without holding row locks over RTTs...
         *
-        * @param $uuid string 32 char hex string
+        * @param string $uuid 32 char hex string
         * @return Row|false
         */
        protected function claimOldest( $uuid ) {
@@ -580,6 +588,27 @@ class JobQueueDB extends JobQueue {
                }
        }
 
+       /**
+        * @see JobQueue::getAllQueuedJobs()
+        * @return Iterator
+        */
+       public function getAllQueuedJobs() {
+               list( $dbr, $scope ) = $this->getSlaveDB();
+               return new MappedIterator(
+                       $dbr->select( 'job', '*', array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+                       function( $row ) use ( $scope ) {
+                               $job = Job::factory(
+                                       $row->job_cmd,
+                                       Title::makeTitle( $row->job_namespace, $row->job_title ),
+                                       strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
+                                       $row->job_id
+                               );
+                               $job->id = $row->job_id; // XXX: work around broken subclasses
+                               return $job;
+                       }
+               );
+       }
+
        /**
         * @return Array (DatabaseBase, ScopedCallback)
         */
index 23a5494..351c71a 100644 (file)
@@ -37,7 +37,7 @@ class JobQueueGroup {
        protected $wiki; // string; wiki ID
 
        const TYPE_DEFAULT = 1; // integer; jobs popped by default
-       const TYPE_ANY     = 2; // integer; any job
+       const TYPE_ANY = 2; // integer; any job
 
        const USE_CACHE = 1; // integer; use process or persistent cache
 
@@ -46,7 +46,7 @@ class JobQueueGroup {
        const CACHE_VERSION = 1; // integer; cache version
 
        /**
-        * @param $wiki string Wiki ID
+        * @param string $wiki Wiki ID
         */
        protected function __construct( $wiki ) {
                $this->wiki = $wiki;
@@ -54,7 +54,7 @@ class JobQueueGroup {
        }
 
        /**
-        * @param $wiki string Wiki ID
+        * @param string $wiki Wiki ID
         * @return JobQueueGroup
         */
        public static function singleton( $wiki = false ) {
@@ -201,6 +201,25 @@ class JobQueueGroup {
                return $this->get( $job->getType() )->deduplicateRootJob( $job );
        }
 
+       /**
+        * Wait for any slaves or backup queue servers to catch up.
+        *
+        * This does nothing for certain queue classes.
+        *
+        * @return void
+        * @throws MWException
+        */
+       public function waitForBackups() {
+               global $wgJobTypeConf;
+
+               wfProfileIn( __METHOD__ );
+               // Try to avoid doing this more than once per queue storage medium
+               foreach ( $wgJobTypeConf as $type => $conf ) {
+                       $this->get( $type )->waitForBackups();
+               }
+               wfProfileOut( __METHOD__ );
+       }
+
        /**
         * Get the list of queue types
         *
@@ -236,6 +255,23 @@ class JobQueueGroup {
                return $types;
        }
 
+       /**
+        * Check if jobs should not be popped of a queue right now.
+        * This is only used for performance, such as to avoid spamming
+        * the queue with many sub-jobs before they actually get run.
+        *
+        * @param $type string
+        * @return bool
+        */
+       public function isQueueDeprioritized( $type ) {
+               if ( $type === 'refreshLinks2' ) {
+                       // Don't keep converting refreshLinks2 => refreshLinks jobs if the
+                       // later jobs have not been done yet. This helps throttle queue spam.
+                       return !$this->get( 'refreshLinks' )->isEmpty();
+               }
+               return false;
+       }
+
        /**
         * Execute any due periodic queue maintenance tasks for all queues.
         *
index 2ce47bb..3db8260 100644 (file)
@@ -33,7 +33,7 @@ class JobQueueRedis extends JobQueue {
 
        protected $server; // string; server address
 
-       const ROOTJOB_TTL   = 1209600; // integer; seconds to remember root jobs (14 days)
+       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
        protected $key; // string; key to prefix the queue keys with (used for testing)
@@ -52,6 +52,14 @@ class JobQueueRedis extends JobQueue {
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
        }
 
+       protected function supportedOrders() {
+               return array( 'timestamp', 'fifo' );
+       }
+
+       protected function optimalOrder() {
+               return 'fifo';
+       }
+
        /**
         * @see JobQueue::doIsEmpty()
         * @return bool
@@ -329,6 +337,52 @@ class JobQueueRedis extends JobQueue {
                return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
        }
 
+       /**
+        * @see JobQueue::getAllQueuedJobs()
+        * @return Iterator
+        */
+       public function getAllQueuedJobs() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       throw new MWException( "Unable to connect to redis server." );
+               }
+               try {
+                       $that = $this;
+                       return new MappedIterator(
+                               $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
+                               function( $uid ) use ( $that, $conn ) {
+                                       return $that->getJobFromUidInternal( $uid, $conn );
+                               }
+                       );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
+       /**
+        * This function should not be called outside RedisJobQueue
+        *
+        * @param $uid string
+        * @param $conn RedisConnRef
+        * @return Job
+        * @throws MWException
+        */
+       public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
+               try {
+                       $fields = $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
+                       if ( !is_array( $fields ) ) { // wtf?
+                               $conn->delete( $this->prefixWithQueueKey( 'data', $uid ) );
+                               throw new MWException( "Could not find job with UID '$uid'." );
+                       }
+                       $title = Title::makeTitle( $fields['namespace'], $fields['title'] );
+                       $job = Job::factory( $fields['type'], $title, $fields['params'] );
+                       $job->metadata['sourceFields'] = $fields;
+                       return $job;
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
        /**
         * Recycle or destroy any jobs that have been claimed for too long
         *
@@ -518,7 +572,7 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * @param $uid string Job UID
+        * @param string $uid Job UID
         * @return bool Whether $uid is a SHA-1 hash based identifier for de-duplication
         */
        protected function isHashUid( $uid ) {
index 57c92e9..c11d5a7 100644 (file)
@@ -7,7 +7,6 @@ Notes on the Job queuing system architecture.
 \section intro Introduction
 
 The data model consist of the following main components:
-
 * The Job object represents a particular deferred task that happens in the
   background. All jobs subclass the Job object and put the main logic in the
   function called run().
@@ -15,6 +14,8 @@ The data model consist of the following main components:
   For example there may be a queue for email jobs and a queue for squid purge
   jobs.
 
+\section jobqueue Job queues
+
 Each job type has its own queue and is associated to a storage medium. One
 queue might save its jobs in redis while another one uses would use a database.
 
@@ -27,6 +28,7 @@ The factory class JobQueueGroup provides helper functions:
 
 The following queue classes are available:
 * JobQueueDB (stores jobs in the `job` table in a database)
+* JobQueueRedis (stores jobs in a redis server)
 
 All queue classes support some basic operations (though some may be no-ops):
 * enqueueing a batch of jobs
@@ -46,6 +48,27 @@ dequeued by a job runner, which crashes before completion, the job will be
 lost. Some jobs, like purging squid caches after a template change, may not
 require durable queues, whereas other jobs might be more important.
 
+\section aggregator Job queue aggregator
+
+The aggregators are used by nextJobDB.php, which is a script that will return a
+random ready queue (on any wiki in the farm) that can be used with runJobs.php.
+This can be used in conjunction with any scripts that handle wiki farm job queues.
+Note that $wgLocalDatabases defines what wikis are in the wiki farm.
+
+Since each job type has its own queue, and wiki-farms may have many wikis,
+there might be a large number of queues to keep track of. To avoid wasting
+large amounts of time polling empty queues, aggregators exists to keep track
+of which queues are ready.
+
+The following queue aggregator classes are available:
+* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
+* JobQueueAggregatorRedis (uses a redis server to track ready queues)
+
+Some aggregators cache data for a few minutes while others may be always up to date.
+This can be an important factor for jobs that need a low pickup time (or latency).
+
+\section jobs Jobs
+
 Callers should also try to make jobs maintain correctness when executed twice.
 This is useful for queues that actually implement ack(), since they may recycle
 dequeued but un-acknowledged jobs back into the queue to be attempted again. If
diff --git a/includes/job/jobs/AssembleUploadChunksJob.php b/includes/job/jobs/AssembleUploadChunksJob.php
new file mode 100644 (file)
index 0000000..c5dd9ea
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * @ingroup Upload
+ */
+class AssembleUploadChunksJob extends Job {
+       public function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'AssembleUploadChunks', $title, $params, $id );
+               $this->removeDuplicates = true;
+       }
+
+       public function run() {
+               $scope = RequestContext::importScopedSession( $this->params['session'] );
+               $context = RequestContext::getMain();
+               try {
+                       $user = $context->getUser();
+                       if ( !$user->isLoggedIn() ) {
+                               $this->setLastError( "Could not load the author user from session." );
+                               return false;
+                       }
+
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
+                       );
+
+                       $upload = new UploadFromChunks( $user );
+                       $upload->continueChunks(
+                               $this->params['filename'],
+                               $this->params['filekey'],
+                               $context->getRequest()
+                       );
+
+                       // Combine all of the chunks into a local file and upload that to a new stash file
+                       $status = $upload->concatenateChunks();
+                       if ( !$status->isGood() ) {
+                               UploadBase::setSessionStatus(
+                                       $this->params['filekey'],
+                                       array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+                               );
+                               $this->setLastError( $status->getWikiText() );
+                               return false;
+                       }
+
+                       // We have a new filekey for the fully concatenated file
+                       $newFileKey = $upload->getLocalFile()->getFileKey();
+
+                       // Remove the old stash file row and first chunk file
+                       $upload->stash->removeFileNoAuth( $this->params['filekey'] );
+
+                       // Build the image info array while we have the local reference handy
+                       $apiMain = new ApiMain(); // dummy object (XXX)
+                       $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+                       // Cleanup any temporary local file
+                       $upload->cleanupTempFile();
+
+                       // Cache the info so the user doesn't have to wait forever to get the final info
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array(
+                                       'result'    => 'Success',
+                                       'stage'     => 'assembling',
+                                       'filekey'   => $newFileKey,
+                                       'imageinfo' => $imageInfo,
+                                       'status'    => Status::newGood()
+                               )
+                       );
+               } catch ( MWException $e ) {
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array(
+                                       'result' => 'Failure',
+                                       'stage'  => 'assembling',
+                                       'status' => Status::newFatal( 'api-error-stashfailed' )
+                               )
+                       );
+                       $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       return false;
+               }
+               return true;
+       }
+
+       public function getDeduplicationInfo() {
+               $info = parent::getDeduplicationInfo();
+               if ( is_array( $info['params'] ) ) {
+                       $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+               }
+               return $info;
+       }
+
+       public function allowRetries() {
+               return false;
+       }
+}
index 6158a67..05abeee 100644 (file)
@@ -36,9 +36,9 @@ class DoubleRedirectJob extends Job {
 
        /**
         * Insert jobs into the job queue to fix redirects to the given title
-        * @param $reason String: the reason for the fix, see message "double-redirect-fixed-<reason>"
+        * @param string $reason the reason for the fix, see message "double-redirect-fixed-<reason>"
         * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
-        * @param $destTitle bool Not used
+        * @param bool $destTitle Not used
         */
        public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
                # Need to use the master to get the redirect table updated in the same transaction
index 1b64b10..524983b 100644 (file)
@@ -31,7 +31,7 @@ final class DuplicateJob extends Job {
         * Callers should use DuplicateJob::newFromJob() instead
         *
         * @param $title Title
-        * @param $params Array: job parameters
+        * @param array $params job parameters
         * @param $id Integer: job id
         */
        function __construct( $title, $params, $id = 0 ) {
@@ -46,9 +46,9 @@ final class DuplicateJob extends Job {
         */
        public static function newFromJob( Job $job ) {
                $djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
-               $djob->command  = $job->getType();
-               $djob->params   = is_array( $djob->params ) ? $djob->params : array();
-               $djob->params   = array( 'isDuplicate' => true ) + $djob->params;
+               $djob->command = $job->getType();
+               $djob->params = is_array( $djob->params ) ? $djob->params : array();
+               $djob->params = array( 'isDuplicate' => true ) + $djob->params;
                $djob->metadata = $job->metadata;
                return $djob;
        }
index 20245b3..818c6ab 100644 (file)
@@ -52,7 +52,7 @@ class HTMLCacheUpdateJob extends Job {
        /**
         * Construct a job
         * @param $title Title: the title linked to
-        * @param $params Array: job parameters (table, start and end page_ids)
+        * @param array $params job parameters (table, start and end page_ids)
         * @param $id Integer: job id
         */
        function __construct( $title, $params, $id = 0 ) {
@@ -60,9 +60,9 @@ class HTMLCacheUpdateJob extends Job {
 
                parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
 
-               $this->rowsPerJob   = $wgUpdateRowsPerJob;
+               $this->rowsPerJob = $wgUpdateRowsPerJob;
                $this->rowsPerQuery = $wgUpdateRowsPerQuery;
-               $this->blCache      = $title->getBacklinkCache();
+               $this->blCache = $title->getBacklinkCache();
        }
 
        public function run() {
@@ -124,7 +124,7 @@ class HTMLCacheUpdateJob extends Job {
         *
         * @param $titleArray array
         * @param $rootJobParams array
-        * @rerturn void
+        * @return void
         */
        protected function insertJobsFromTitles( $titleArray, $rootJobParams = array() ) {
                // Carry over any "root job" information
index b4ea27d..d282a8e 100644 (file)
@@ -31,7 +31,7 @@
 class NullJob extends Job {
        /**
         * @param $title Title (can be anything)
-        * @param $params Array: job parameters (lives, usleep)
+        * @param array $params job parameters (lives, usleep)
         * @param $id Integer: job id
         */
        function __construct( $title, $params, $id = 0 ) {
diff --git a/includes/job/jobs/PublishStashedFileJob.php b/includes/job/jobs/PublishStashedFileJob.php
new file mode 100644 (file)
index 0000000..d3feda2
--- /dev/null
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * @ingroup Upload
+ */
+class PublishStashedFileJob extends Job {
+       public function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'PublishStashedFile', $title, $params, $id );
+               $this->removeDuplicates = true;
+       }
+
+       public function run() {
+               $scope = RequestContext::importScopedSession( $this->params['session'] );
+               $context = RequestContext::getMain();
+               try {
+                       $user = $context->getUser();
+                       if ( !$user->isLoggedIn() ) {
+                               $this->setLastError( "Could not load the author user from session." );
+                               return false;
+                       }
+
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
+                       );
+
+                       $upload = new UploadFromStash( $user );
+                       // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+                       // checks and anything else to the stash stage (which includes concatenation and
+                       // the local file is thus already there). That way, instead of GET+PUT, there could
+                       // just be a COPY operation from the stash to the public zone.
+                       $upload->initialize( $this->params['filekey'], $this->params['filename'] );
+
+                       // Check if the local file checks out (this is generally a no-op)
+                       $verification = $upload->verifyUpload();
+                       if ( $verification['status'] !== UploadBase::OK ) {
+                               $status = Status::newFatal( 'verification-error' );
+                               $status->value = array( 'verification' => $verification );
+                               UploadBase::setSessionStatus(
+                                       $this->params['filekey'],
+                                       array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+                               );
+                               $this->setLastError( "Could not verify upload." );
+                               return false;
+                       }
+
+                       // Upload the stashed file to a permanent location
+                       $status = $upload->performUpload(
+                               $this->params['comment'],
+                               $this->params['text'],
+                               $this->params['watch'],
+                               $user
+                       );
+                       if ( !$status->isGood() ) {
+                               UploadBase::setSessionStatus(
+                                       $this->params['filekey'],
+                                       array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+                               );
+                               $this->setLastError( $status->getWikiText() );
+                               return false;
+                       }
+
+                       // Build the image info array while we have the local reference handy
+                       $apiMain = new ApiMain(); // dummy object (XXX)
+                       $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+                       // Cleanup any temporary local file
+                       $upload->cleanupTempFile();
+
+                       // Cache the info so the user doesn't have to wait forever to get the final info
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array(
+                                       'result'    => 'Success',
+                                       'stage'     => 'publish',
+                                       'filename'  => $upload->getLocalFile()->getName(),
+                                       'imageinfo' => $imageInfo,
+                                       'status'    => Status::newGood()
+                               )
+                       );
+               } catch ( MWException $e ) {
+                       UploadBase::setSessionStatus(
+                               $this->params['filekey'],
+                               array(
+                                       'result' => 'Failure',
+                                       'stage'  => 'publish',
+                                       'status' => Status::newFatal( 'api-error-publishfailed' )
+                               )
+                       );
+                       $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       return false;
+               }
+               return true;
+       }
+
+       public function getDeduplicationInfo() {
+               $info = parent::getDeduplicationInfo();
+               if ( is_array( $info['params'] ) ) {
+                       $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+               }
+               return $info;
+       }
+
+       public function allowRetries() {
+               return false;
+       }
+}
index 20e4f16..9dbe827 100644 (file)
@@ -150,7 +150,7 @@ class RefreshLinksJob2 extends Job {
                        $masterPos = false;
                }
 
-               $tbc  = $this->title->getBacklinkCache();
+               $tbc = $this->title->getBacklinkCache();
 
                $jobs = array(); // jobs to insert
                if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
@@ -192,8 +192,8 @@ class RefreshLinksJob2 extends Job {
         */
        protected function getSingleTitleJobs( $table, $masterPos ) {
                # The "start"/"end" fields are not set for the base jobs
-               $start  = isset( $this->params['start'] ) ? $this->params['start'] : false;
-               $end    = isset( $this->params['end'] ) ? $this->params['end'] : false;
+               $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
+               $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
                $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
                # Convert into single page refresh links jobs.
                # This handles well when in sapi mode and is useful in any case for job
index e06f68e..8754914 100644 (file)
@@ -148,8 +148,8 @@ class UploadFromUrlJob extends Job {
         * Store a result in the session data. Note that the caller is responsible
         * for appropriate session_start and session_write_close calls.
         *
-        * @param $result String: the result (Success|Warning|Failure)
-        * @param $dataKey String: the key of the extra data
+        * @param string $result the result (Success|Warning|Failure)
+        * @param string $dataKey the key of the extra data
         * @param $dataValue Mixed: the extra data itself
         */
        protected function storeResultInSession( $result, $dataKey, $dataValue ) {
index 75da5c7..eececcb 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class.
+ * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -47,7 +47,7 @@ class FormatJson {
        /**
         * Decodes a JSON string.
         *
-        * @param $value String: the json string being decoded.
+        * @param string $value the json string being decoded.
         * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
         *
         * @return Mixed: the value encoded in json in appropriate PHP type.
index fe84369..b7c101a 100644 (file)
@@ -100,7 +100,7 @@ define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
  * // create a new instance of Services_JSON
  * $json = new Services_JSON();
  *
- * // convert a complexe value to JSON notation, and send it to the browser
+ * // convert a complex value to JSON notation, and send it to the browser
  * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
  * $output = $json->encode($value);
  *
@@ -155,9 +155,9 @@ class Services_JSON
         *
         * Normally should be handled by mb_convert_encoding, but
         * provides a slower PHP-only method for installations
-        * that lack the multibye string extension.
+        * that lack the multibyte string extension.
         *
-        * @param $utf16 String: UTF-16 character
+        * @param string $utf16 UTF-16 character
         * @return String: UTF-8 character
         * @access private
         */
@@ -210,9 +210,9 @@ class Services_JSON
         *
         * Normally should be handled by mb_convert_encoding, but
         * provides a slower PHP-only method for installations
-        * that lack the multibye string extension.
+        * that lack the multibyte string extension.
         *
-        * @param $utf8 String: UTF-8 character
+        * @param string $utf8 UTF-8 character
         * @return String: UTF-16 character
         * @access private
         */
@@ -268,7 +268,7 @@ class Services_JSON
         *
         * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
         *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a strng, note that encode() always expects it
+        *                      if var is a string, note that encode() always expects it
         *                      to be in ASCII or UTF-8 format!
         * @param $pretty Boolean: pretty-print output with indents and newlines
         *
@@ -288,7 +288,7 @@ class Services_JSON
         *
         * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
         *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a strng, note that encode() always expects it
+        *                      if var is a string, note that encode() always expects it
         *                      to be in ASCII or UTF-8 format!
         *
         * @return mixed JSON string representation of input var or an error if a problem occurs
@@ -480,7 +480,7 @@ class Services_JSON
        /**
         * array-walking function for use in generating JSON-formatted name-value pairs
         *
-        * @param $name String: name of key to use
+        * @param string $name name of key to use
         * @param $value Mixed: reference to an array element to be encoded
         *
         * @return String: JSON-formatted name-value pair, like '"name":value'
@@ -500,7 +500,7 @@ class Services_JSON
        /**
         * reduce a string by removing leading and trailing comments and whitespace
         *
-        * @param $str String: string value to strip of comments and whitespace
+        * @param string $str string value to strip of comments and whitespace
         *
         * @return String: string value stripped of comments and whitespace
         * @access private
@@ -527,7 +527,7 @@ class Services_JSON
        /**
         * decodes a JSON string into appropriate variable
         *
-        * @param $str String: JSON-formatted string
+        * @param string $str JSON-formatted string
         *
         * @return mixed number, boolean, string, array, or object
         *                 corresponding to given JSON input string.
index 76c5b6a..fb1e9a4 100644 (file)
@@ -123,7 +123,7 @@ class CSSJanus {
 
        /**
         * Transform an LTR stylesheet to RTL
-        * @param $css String: stylesheet to transform
+        * @param string $css stylesheet to transform
         * @param $swapLtrRtlInURL Boolean: If true, swap 'ltr' and 'rtl' in URLs
         * @param $swapLeftRightInURL Boolean: If true, swap 'left' and 'right' in URLs
         * @return string Transformed stylesheet
@@ -305,8 +305,8 @@ class CSSJanus_Tokenizer {
 
        /**
         * Constructor
-        * @param $regex string Regular expression whose matches to replace by a token.
-        * @param $token string Token
+        * @param string $regex Regular expression whose matches to replace by a token.
+        * @param string $token Token
         */
        public function __construct( $regex, $token ) {
                $this->regex = $regex;
@@ -317,7 +317,7 @@ class CSSJanus_Tokenizer {
        /**
         * Replace all occurrences of $regex in $str with a token and remember
         * the original strings.
-        * @param $str String to tokenize
+        * @param string $str to tokenize
         * @return string Tokenized string
         */
        public function tokenize( $str ) {
@@ -336,7 +336,7 @@ class CSSJanus_Tokenizer {
        /**
         * Replace tokens with their originals. If multiple strings were tokenized, it's important they be
         * detokenized in exactly the SAME ORDER.
-        * @param $str String: previously run through tokenize()
+        * @param string $str previously run through tokenize()
         * @return string Original string
         */
        public function detokenize( $str ) {
index fc75cdc..8b0e287 100644 (file)
@@ -59,8 +59,8 @@ class CSSMin {
        /**
         * Gets a list of local file paths which are referenced in a CSS style sheet
         *
-        * @param $source string CSS data to remap
-        * @param $path string File path where the source was read from (optional)
+        * @param string $source CSS data to remap
+        * @param string $path File path where the source was read from (optional)
         * @return array List of local file references
         */
        public static function getLocalFileReferences( $source, $path = null ) {
@@ -115,10 +115,10 @@ class CSSMin {
         * Remaps CSS URL paths and automatically embeds data URIs for URL rules
         * preceded by an /* @embed * / comment
         *
-        * @param $source string CSS data to remap
-        * @param $local string File path where the source was read from
-        * @param $remote string URL path to the file
-        * @param $embedData bool If false, never do any data URI embedding, even if / * @embed * / is found
+        * @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
         * @return string Remapped CSS data
         */
        public static function remap( $source, $local, $remote, $embedData = true ) {
@@ -219,7 +219,7 @@ class CSSMin {
        /**
         * Removes whitespace from CSS data
         *
-        * @param $css string CSS data to minify
+        * @param string $css CSS data to minify
         * @return string Minified CSS data
         */
        public static function minify( $css ) {
index ef7587d..d77d8ad 100644 (file)
@@ -191,7 +191,7 @@ abstract class GenericArrayObject extends ArrayObject {
        /**
         * Returns an array holding all the data that should go into serialization calls.
         * This is intended to allow overloading without having to reimplement the
-        * behaviour of this base class.
+        * behavior of this base class.
         *
         * @since 1.20
         *
index fae06ad..7f461a0 100644 (file)
@@ -329,9 +329,9 @@ class IEContentAnalyzer {
         * Get the MIME types from getMimesFromData(), but convert the result from IE's
         * idiosyncratic private types into something other apps will understand.
         *
-        * @param $fileName String: the file name (unused at present)
-        * @param $chunk String: the first 256 bytes of the file
-        * @param $proposed String: the MIME type proposed by the server
+        * @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: map of IE version to detected mime type
         */
@@ -367,9 +367,9 @@ class IEContentAnalyzer {
        /**
         * Get the untranslated MIME types for all known versions
         *
-        * @param $fileName String: the file name (unused at present)
-        * @param $chunk String: the first 256 bytes of the file
-        * @param $proposed String: the MIME type proposed by the server
+        * @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: map of IE version to detected mime type
         */
index e9cfa99..79387e6 100644 (file)
@@ -55,8 +55,8 @@ class IEUrlExtension {
         *
         * If the a variable is unset in $_SERVER, it should be unset in $vars.
         *
-        * @param $vars array A subset of $_SERVER.
-        * @param $extWhitelist array Extensions which are allowed, assumed harmless.
+        * @param array $vars A subset of $_SERVER.
+        * @param array $extWhitelist Extensions which are allowed, assumed harmless.
         * @return bool
         */
        public static function areServerVarsBad( $vars, $extWhitelist = array() ) {
@@ -92,8 +92,8 @@ class IEUrlExtension {
         * Given a right-hand portion of a URL, determine whether IE would detect
         * a potentially harmful file extension.
         *
-        * @param $urlPart string The right-hand portion of a URL
-        * @param $extWhitelist array An array of file extensions which may occur in this
+        * @param string $urlPart The right-hand portion of a URL
+        * @param array $extWhitelist An array of file extensions which may occur in this
         *    URL, and which should be allowed.
         * @return bool
         */
@@ -187,7 +187,7 @@ class IEUrlExtension {
         * - if we find a possible extension followed by a dot or another illegal
         *   character, we ignore it and continue searching
         *
-        * @param $url string URL
+        * @param string $url URL
         * @return mixed Detected extension (string), or false if none found
         */
        public static function findIE6Extension( $url ) {
@@ -245,7 +245,7 @@ class IEUrlExtension {
         * whether the script filename has been obscured.
         *
         * The function returns false if the server is not known to have this
-        * behaviour. Microsoft IIS in particular is known to decode escaped script
+        * behavior. Microsoft IIS in particular is known to decode escaped script
         * filenames.
         *
         * SERVER_SOFTWARE typically contains either a plain string such as "Zeus",
index db5326c..998805a 100644 (file)
@@ -72,9 +72,9 @@ class JavaScriptMinifier {
         *       literals (e.g. quoted strings) longer than $maxLineLength are encountered
         *       or when required to guard against semicolon insertion.
         *
-        * @param $s String JavaScript code to minify
-        * @param $statementsOnOwnLine Bool Whether to put each statement on its own line
-        * @param $maxLineLength Int Maximum length of a single line, or -1 for no maximum.
+        * @param string $s JavaScript code to minify
+        * @param bool $statementsOnOwnLine Whether to put each statement on its own line
+        * @param int $maxLineLength Maximum length of a single line, or -1 for no maximum.
         * @return String Minified code
         */
        public static function minify( $s, $statementsOnOwnLine = false, $maxLineLength = 1000 ) {
index 7c4e32b..f250217 100644 (file)
@@ -256,7 +256,7 @@ class JSMinPlus
                                                        }
                                                        elseif ($type == KEYWORD_VAR && $type == $lastType)
                                                        {
-                                                               // mutiple var-statements can go into one
+                                                               // multiple var-statements can go into one
                                                                $t = ',' . substr($t, 4);
                                                        }
                                                        else
@@ -298,7 +298,7 @@ class JSMinPlus
 
                                if ($elsePart)
                                {
-                                       // be carefull and always make a block out of the thenPart; could be more optimized but is a lot of trouble
+                                       // be careful and always make a block out of the thenPart; could be more optimized but is a lot of trouble
                                        if ($thenPart != ';' && $thenPart[0] != '{')
                                                $thenPart = '{' . $thenPart . '}';
 
@@ -521,7 +521,7 @@ class JSMinPlus
                                        break;
 
                                        case TOKEN_STRING:
-                                               //combine concatted strings with same quotestyle
+                                               //combine concatenated strings with same quote style
                                                if ($n->type == OP_PLUS && substr($left, -1) == $right[0])
                                                {
                                                        $s = substr($left, 0, -1) . substr($right, 1);
index 44b9edc..bc1988d 100644 (file)
@@ -36,6 +36,8 @@ if [ "$MW_MEM_LIMIT" -gt 0 ]; then
        else
                ulimit -v "$MW_MEM_LIMIT"
        fi
+else
+       MW_CGROUP=""
 fi
 if [ "$MW_FILE_SIZE_LIMIT" -gt 0 ]; then
        ulimit -f "$MW_FILE_SIZE_LIMIT"
index ed9aa5a..0f20ed1 100644 (file)
@@ -367,7 +367,7 @@ class ManualLogEntry extends LogEntryBase {
         *
         * @since 1.19
         *
-        * @param $parameters array Associative array
+        * @param array $parameters Associative array
         */
        public function setParameters( $parameters ) {
                $this->parameters = $parameters;
@@ -468,8 +468,8 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Publishes the log entry.
-        * @param $newId int id of the log entry.
-        * @param $to string: rcandudp (default), rc, udp
+        * @param int $newId id of the log entry.
+        * @param string $to rcandudp (default), rc, udp
         */
        public function publish( $newId, $to = 'rcandudp' ) {
                $log = new LogPage( $this->getType() );
index 47b2231..501af7d 100644 (file)
@@ -42,7 +42,7 @@ class LogEventsList extends ContextSource {
         *
         * @param $context IContextSource Context to use; formerly it was Skin object.
         * @param $unused void Unused; used to be an OutputPage object.
-        * @param $flags int flags; can be a combinaison of self::NO_ACTION_LINK,
+        * @param int $flags flags; can be a combinaison of self::NO_ACTION_LINK,
         *        self::NO_EXTRA_USER_LINKS or self::USE_REVDEL_CHECKBOXES.
         */
        public function __construct( $context, $unused = null, $flags = 0 ) {
@@ -88,7 +88,7 @@ class LogEventsList extends ContextSource {
        /**
         * Show options for the log list
         *
-        * @param $types string or Array
+        * @param string $types or Array
         * @param $user String
         * @param $page String
         * @param $pattern String
@@ -307,7 +307,6 @@ class LogEventsList extends ContextSource {
                $formatter->setContext( $this->getContext() );
                $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
 
-               $title = $entry->getTarget();
                $time = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
                        $entry->getTimestamp(), $this->getUser() ) );
 
@@ -450,10 +449,10 @@ class LogEventsList extends ContextSource {
         * Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey)
         *
         * @param $out OutputPage|String-by-reference
-        * @param $types String|Array Log types to show
-        * @param $page String|Title The page title to show log entries for
-        * @param $user String The user who made the log entries
-        * @param $param array Associative Array with the following additional options:
+        * @param string|array $types Log types to show
+        * @param string|Title $page The page title to show log entries for
+        * @param string $user The user who made the log entries
+        * @param array $param Associative Array with the following additional options:
         * - lim Integer Limit of items to show, default is 50
         * - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
         * - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty
index eb8779f..ace26bb 100644 (file)
@@ -402,8 +402,10 @@ class LogFormatter {
 
                // Filter out parameters which are not in format #:foo
                foreach ( $entry->getParameters() as $key => $value ) {
-                       if ( strpos( $key, ':' ) === false ) continue;
-                       list( $index, $type, $name ) = explode( ':', $key, 3 );
+                       if ( strpos( $key, ':' ) === false ) {
+                               continue;
+                       }
+                       list( $index, $type, ) = explode( ':', $key, 3 );
                        $params[$index - 1] = $this->formatParameterValue( $type, $value );
                }
 
@@ -439,7 +441,7 @@ class LogFormatter {
                $entry = $this->entry;
                $params = $this->extractParameters();
                $params[0] = Message::rawParam( $this->getPerformerElement() );
-               $params[1] = $entry->getPerformer()->getName();
+               $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformer()->getName() : '';
                $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
 
                // Bad things happens if the numbers are not in correct order
@@ -449,7 +451,7 @@ class LogFormatter {
 
        /**
         * Formats parameters values dependent to their type
-        * @param $type string The type of the value.
+        * @param string $type The type of the value.
         *   Valid are currently:
         *     * - (empty) or plain: The value is returned as-is
         *     * raw: The value will be added to the log message
@@ -468,7 +470,7 @@ class LogFormatter {
         *     * title-link: The value is a page title,
         *                   returns link to this page
         *     * number: Format value as number
-        * @param $value string The parameter value that should
+        * @param string $value The parameter value that should
         *                      be formated
         * @return string or Message::numParam or Message::rawParam
         *         Formated value
@@ -523,7 +525,7 @@ class LogFormatter {
         * Helper to make a link to the page, taking the plaintext
         * value in consideration.
         * @param $title Title the page
-        * @param $parameters array query parameters
+        * @param array $parameters query parameters
         * @throws MWException
         * @return String
         */
@@ -915,7 +917,6 @@ class DeleteLogFormatter extends LogFormatter {
                                }
                                $changeText = $this->context->getLanguage()->listToText( $changes );
 
-
                                $newParams = array_slice( $params, 0, 3 );
                                $newParams[3] = $changeText;
                                $count = count( explode( ',', $params[$paramStart] ) );
@@ -993,7 +994,7 @@ class DeleteLogFormatter extends LogFormatter {
                                                $this->msg( 'diff' )->escaped(),
                                                array(),
                                                array(
-                                                       'target'    => $this->entry->getTarget()->getPrefixedDBKey(),
+                                                       'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
                                                        'diff'      => 'prev',
                                                        'timestamp' => $ids[0]
                                                )
index 9778f27..4191c57 100644 (file)
@@ -50,16 +50,16 @@ class LogPage {
         */
        var $target;
 
-       /* @acess public */
+       /* @access public */
        var $updateRecentChanges, $sendToUDP;
 
        /**
         * Constructor
         *
-        * @param $type String: one of '', 'block', 'protect', 'rights', 'delete',
+        * @param string $type one of '', 'block', 'protect', 'rights', 'delete',
         *               'upload', 'move'
         * @param $rc Boolean: whether to update recent changes as well as the logging table
-        * @param $udp String: pass 'UDP' to send to the UDP feed if NOT sent to RC
+        * @param string $udp pass 'UDP' to send to the UDP feed if NOT sent to RC
         */
        public function __construct( $type, $rc = true, $udp = 'skipUDP' ) {
                $this->type = $type;
@@ -181,7 +181,7 @@ class LogPage {
        /**
         * Is $type a valid log type
         *
-        * @param $type String: log type to check
+        * @param string $type log type to check
         * @return Boolean
         */
        public static function isLogType( $type ) {
@@ -191,7 +191,7 @@ class LogPage {
        /**
         * Get the name for the given log type
         *
-        * @param $type String: logtype
+        * @param string $type logtype
         * @return String: log name
         * @deprecated in 1.19, warnings in 1.21. Use getName()
         */
@@ -210,7 +210,7 @@ class LogPage {
         * Get the log header for the given log type
         *
         * @todo handle missing log types
-        * @param $type String: logtype
+        * @param string $type logtype
         * @return String: headertext of this logtype
         * @deprecated in 1.19, warnings in 1.21. Use getDescription()
         */
@@ -223,12 +223,12 @@ class LogPage {
         * Generate text for a log entry.
         * Only LogFormatter should call this function.
         *
-        * @param $type String: log type
-        * @param $action String: log action
+        * @param string $type log type
+        * @param string $action log action
         * @param $title Mixed: Title object or null
         * @param $skin Mixed: Skin object or null. If null, we want to use the wiki
         *              content language, since that will go to the IRC feed.
-        * @param $params Array: parameters
+        * @param array $params parameters
         * @param $filterWikilinks Boolean: whether to filter wiki links
         * @return HTML string
         */
@@ -402,10 +402,10 @@ class LogPage {
        /**
         * Add a log entry
         *
-        * @param $action String: one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
+        * @param string $action one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
         * @param $target Title object
-        * @param $comment String: description associated
-        * @param $params Array: parameters passed later to wfMessage function
+        * @param string $comment description associated
+        * @param array $params parameters passed later to wfMessage function
         * @param $doer User object: the user doing the action
         *
         * @return int log_id of the inserted log entry
@@ -513,7 +513,7 @@ class LogPage {
         * Convert a comma-delimited list of block log flags
         * into a more readable (and translated) form
         *
-        * @param $flags string Flags to format
+        * @param string $flags Flags to format
         * @param $lang Language object to use
         * @return String
         */
@@ -534,7 +534,7 @@ class LogPage {
        /**
         * Translate a block log flag if possible
         *
-        * @param $flag int Flag to translate
+        * @param int $flag Flag to translate
         * @param $lang Language object to use
         * @return String
         */
@@ -562,7 +562,6 @@ class LogPage {
                return $messages[$flag];
        }
 
-
        /**
         * Name of the log.
         * @return Message
index fad1058..908755e 100644 (file)
@@ -35,14 +35,14 @@ class LogPager extends ReverseChronologicalPager {
         * Constructor
         *
         * @param $list LogEventsList
-        * @param $types String or Array: log types to show
-        * @param $performer String: the user who made the log entries
-        * @param $title String|Title: the page title the log entries are for
-        * @param $pattern String: do a prefix search rather than an exact title match
-        * @param $conds Array: extra conditions for the query
+        * @param string $types or Array: 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 $year Integer: the year to start from
         * @param $month Integer: the month to start from
-        * @param $tagFilter String: tag
+        * @param string $tagFilter tag
         */
        public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
                $conds = array(), $year = false, $month = false, $tagFilter = '' ) {
@@ -90,7 +90,7 @@ class LogPager extends ReverseChronologicalPager {
         * Set the log reader to return only entries of the given type.
         * Type restrictions enforced here
         *
-        * @param $types String or array: Log types ('upload', 'delete', etc);
+        * @param string $types or array: Log types ('upload', 'delete', etc);
         *   empty string means no restriction
         */
        private function limitType( $types ) {
@@ -132,7 +132,7 @@ class LogPager extends ReverseChronologicalPager {
        /**
         * Set the log reader to return only entries by the given user.
         *
-        * @param $name String: (In)valid user name
+        * @param string $name (In)valid user name
         * @return bool
         */
        private function limitPerformer( $name ) {
@@ -167,7 +167,7 @@ class LogPager extends ReverseChronologicalPager {
         * Set the log reader to return only entries affecting the given page.
         * (For the block and rights logs, this is a user page.)
         *
-        * @param $page String or Title object: Title name
+        * @param string $page or Title object: Title name
         * @param $pattern String
         * @return bool
         */
index ca9b636..e2dc68b 100644 (file)
@@ -29,7 +29,7 @@
 class BitmapHandler extends ImageHandler {
        /**
         * @param $image File
-        * @param $params array Transform parameters. Entries with the keys 'width'
+        * @param array $params Transform parameters. Entries with the keys 'width'
         * and 'height' are the respective screen width and height, while the keys
         * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
         * @return bool
@@ -75,7 +75,6 @@ class BitmapHandler extends ImageHandler {
                return true;
        }
 
-
        /**
         * Extracts the width/height if the image will be scaled before rotating
         *
@@ -84,8 +83,8 @@ class BitmapHandler extends ImageHandler {
         * stored as raw landscape with 90-degress rotation, the resulting size
         * will be wider than it is tall.
         *
-        * @param $params array Parameters as returned by normaliseParams
-        * @param $rotation int The rotation angle that will be applied
+        * @param array $params Parameters as returned by normaliseParams
+        * @param int $rotation The rotation angle that will be applied
         * @return array ($width, $height) array
         */
        public function extractPreRotationDimensions( $params, $rotation ) {
@@ -100,7 +99,6 @@ class BitmapHandler extends ImageHandler {
                return array( $width, $height );
        }
 
-
        /**
         * Function that returns the number of pixels to be thumbnailed.
         * Intended for animated GIFs to multiply by the number of frames.
@@ -158,7 +156,6 @@ class BitmapHandler extends ImageHandler {
                        return $this->getClientScalingThumbnailImage( $image, $scalerParams );
                }
 
-
                if ( $scaler == 'client' ) {
                        # Client-side image scaling, use the source URL
                        # Using the destination URL in a TRANSFORM_LATER request would be incorrect
@@ -264,7 +261,7 @@ class BitmapHandler extends ImageHandler {
         * client side
         *
         * @param $image File File associated with this thumbnail
-        * @param $scalerParams array Array with scaler params
+        * @param array $scalerParams Array with scaler params
         * @return ThumbnailImage
         *
         * @todo fixme: no rotation support
@@ -281,7 +278,7 @@ class BitmapHandler extends ImageHandler {
         * Transform an image using ImageMagick
         *
         * @param $image File File associated with this thumbnail
-        * @param $params array Array with scaler params
+        * @param array $params Array with scaler params
         *
         * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
@@ -341,7 +338,7 @@ class BitmapHandler extends ImageHandler {
                $rotation = $this->getRotation( $image );
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
 
-               $cmd  =
+               $cmd =
                        wfEscapeShellArg( $wgImageMagickConvertCommand ) .
                        // Specify white background color, will be used for transparent images
                        // in Internet Explorer/Windows instead of default black.
@@ -380,7 +377,7 @@ class BitmapHandler extends ImageHandler {
         * Transform an image using the Imagick PHP extension
         *
         * @param $image File File associated with this thumbnail
-        * @param $params array Array with scaler params
+        * @param array $params Array with scaler params
         *
         * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
@@ -457,7 +454,7 @@ class BitmapHandler extends ImageHandler {
         * Transform an image using a custom command
         *
         * @param $image File File associated with this thumbnail
-        * @param $params array Array with scaler params
+        * @param array $params Array with scaler params
         *
         * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
@@ -500,8 +497,8 @@ class BitmapHandler extends ImageHandler {
        /**
         * Get a MediaTransformError with error 'thumbnail_error'
         *
-        * @param $params array Parameter array as passed to the transform* functions
-        * @param $errMsg string Error message
+        * @param array $params Parameter array as passed to the transform* functions
+        * @param string $errMsg Error message
         * @return MediaTransformError
         */
        public function getMediaTransformError( $params, $errMsg ) {
@@ -513,7 +510,7 @@ class BitmapHandler extends ImageHandler {
         * Transform an image using the built in GD library
         *
         * @param $image File File associated with this thumbnail
-        * @param $params array Array with scaler params
+        * @param array $params Array with scaler params
         *
         * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
@@ -622,7 +619,7 @@ class BitmapHandler extends ImageHandler {
         * in a directory, so we're better off escaping and waiting for the bugfix
         * to filter down to users.
         *
-        * @param $path string The file path
+        * @param string $path The file path
         * @param bool|string $scene The scene specification, or false if there is none
         * @throws MWException
         * @return string
@@ -654,7 +651,7 @@ class BitmapHandler extends ImageHandler {
         * Armour a string against ImageMagick's GetPathComponent(). This is a
         * helper function for escapeMagickInput() and escapeMagickOutput().
         *
-        * @param $path string The file path
+        * @param string $path The file path
         * @param bool|string $scene The scene specification, or false if there is none
         * @throws MWException
         * @return string
@@ -758,6 +755,55 @@ class BitmapHandler extends ImageHandler {
                }
        }
 
+       /**
+        * @param $file File
+        * @param array $params Rotate parameters.
+        *      'rotation' clockwise rotation in degrees, allowed are multiples of 90
+        * @since 1.21
+        * @return bool
+        */
+       public function rotate( $file, $params ) {
+               global $wgImageMagickConvertCommand;
+
+               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+               $scene = false;
+
+               $scaler = self::getScalerType( null, false );
+               switch ( $scaler ) {
+                       case 'im':
+                               $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
+                                       wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+                                       " -rotate -$rotation " .
+                                       wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+                               wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
+                               wfProfileIn( 'convert' );
+                               $retval = 0;
+                               $err = wfShellExec( $cmd, $retval, $env );
+                               wfProfileOut( 'convert' );
+                               if ( $retval !== 0 ) {
+                                       $this->logErrorForExternalProcess( $retval, $err, $cmd );
+                                       return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+                               }
+                               return false;
+                       case 'imext':
+                               $im = new Imagick();
+                               $im->readImage( $params['srcPath'] );
+                               if ( !$im->rotateImage( new ImagickPixel( 'white' ), 360 - $rotation ) ) {
+                                       return new MediaTransformError( 'thumbnail_error', 0, 0,
+                                               "Error rotating $rotation degrees" );
+                               }
+                               $result = $im->writeImage( $params['dstPath'] );
+                               if ( !$result ) {
+                                       return new MediaTransformError( 'thumbnail_error', 0, 0,
+                                               "Unable to write image to {$params['dstPath']}" );
+                               }
+                               return false;
+                       default:
+                               return new MediaTransformError( 'thumbnail_error', 0, 0,
+                                       "$scaler rotation not implemented" );
+               }
+       }
+
        /**
         * Rerurns whether the file needs to be rendered. Returns true if the
         * file requires rotation and we are able to rotate it.
index 55deef0..345e786 100644 (file)
@@ -47,13 +47,13 @@ class BitmapMetadataHandler {
        private $iptcType = 'iptc-no-hash';
 
        /**
-       * This does the photoshop image resource app13 block
-       * of interest, IPTC-IIM metadata is stored here.
-       *
-       * Mostly just calls doPSIR and doIPTC
-       *
-       * @param String $app13 String containing app13 block from jpeg file
-       */
+        * This does the photoshop image resource app13 block
+        * of interest, IPTC-IIM metadata is stored here.
+        *
+        * Mostly just calls doPSIR and doIPTC
+        *
+        * @param string $app13 String containing app13 block from jpeg file
+        */
        private function doApp13 ( $app13 ) {
                try {
                        $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
@@ -69,7 +69,6 @@ class BitmapMetadataHandler {
                $this->addMetadata( $iptc, $this->iptcType );
        }
 
-
        /**
         * Get exif info using exif class.
         * Basically what used to be in BitmapHandler::getMetadata().
@@ -91,11 +90,11 @@ class BitmapMetadataHandler {
                }
        }
        /** Add misc metadata. Warning: atm if the metadata category
-       * doesn't have a priority, it will be silently discarded.
-       *
-       * @param Array $metaArray array of metadata values
-       * @param string $type type. defaults to other. if two things have the same type they're merged
-       */
+        * doesn't have a priority, it will be silently discarded.
+        *
+        * @param array $metaArray array of metadata values
+        * @param string $type type. defaults to other. if two things have the same type they're merged
+        */
        function addMetadata ( $metaArray, $type = 'other' ) {
                if ( isset( $this->metadata[$type] ) ) {
                        /* merge with old data */
@@ -106,14 +105,14 @@ class BitmapMetadataHandler {
        }
 
        /**
-       * Merge together the various types of metadata
-       * the different types have different priorites,
-       * and are merged in order.
-       *
-       * This function is generally called by the media handlers' getMetadata()
-       *
-       * @return Array metadata array
-       */
+        * Merge together the various types of metadata
+        * the different types have different priorites,
+        * and are merged in order.
+        *
+        * This function is generally called by the media handlers' getMetadata()
+        *
+        * @return Array metadata array
+        */
        function getMetadataArray () {
                // this seems a bit ugly... This is all so its merged in right order
                // based on the MWG recomendation.
@@ -144,7 +143,7 @@ class BitmapMetadataHandler {
 
        /** Main entry point for jpeg's.
         *
-        * @param $filename string filename (with full path)
+        * @param string $filename filename (with full path)
         * @return array metadata result array.
         * @throws MWException on invalid file.
         */
@@ -187,7 +186,7 @@ class BitmapMetadataHandler {
         * merge the png various tEXt chunks to that
         * are interesting, but for now it only does XMP
         *
-        * @param $filename String full path to file
+        * @param string $filename full path to file
         * @return Array Array for storage in img_metadata.
         */
        public static function PNG ( $filename ) {
@@ -216,7 +215,7 @@ class BitmapMetadataHandler {
         * They don't really have native metadata, so just merges together
         * XMP and image comment.
         *
-        * @param $filename string full path to file
+        * @param string $filename full path to file
         * @return Array metadata array
         */
        public static function GIF ( $filename ) {
@@ -282,7 +281,7 @@ class BitmapMetadataHandler {
         * Read the first 2 bytes of a tiff file to figure out
         * Little Endian or Big Endian. Needed for exif stuff.
         *
-        * @param $filename String The filename
+        * @param string $filename The filename
         * @return String 'BE' or 'LE' or false
         */
        static function getTiffByteOrder( $filename ) {
@@ -301,6 +300,4 @@ class BitmapMetadataHandler {
 
                }
        }
-
-
 }
index 9735791..4698966 100644 (file)
@@ -57,7 +57,6 @@ class DjVuImage {
                return $info !== false;
        }
 
-
        /**
         * Return data in the style of getimagesize()
         * @return array or false on failure
@@ -66,7 +65,7 @@ class DjVuImage {
                $data = $this->getInfo();
 
                if( $data !== false ) {
-                       $width  = $data['width'];
+                       $width = $data['width'];
                        $height = $data['height'];
 
                        return array( $width, $height, 'DjVu',
index 2dc2eae..c50b2f0 100644 (file)
  */
 class Exif {
 
-       const BYTE      = 1;    //!< An 8-bit (1-byte) unsigned integer.
-       const ASCII     = 2;    //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
-       const SHORT     = 3;    //!< A 16-bit (2-byte) unsigned integer.
-       const LONG      = 4;    //!< A 32-bit (4-byte) unsigned integer.
-       const RATIONAL  = 5;    //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
-       const UNDEFINED = 7;    //!< An 8-bit byte that can take any value depending on the field definition
-       const SLONG     = 9;    //!< A 32-bit (4-byte) signed integer (2's complement notation),
-       const SRATIONAL = 10;   //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
-       const IGNORE    = -1;   // A fake value for things we don't want or don't support.
+       const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
+       const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
+       const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
+       const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
+       const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+       const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
+       const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
+       const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
+       const IGNORE = -1; // A fake value for things we don't want or don't support.
 
        //@{
        /* @var array
@@ -102,8 +102,8 @@ class Exif {
        /**
         * Constructor
         *
-        * @param $file String: filename.
-        * @param $byteOrder String Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
+        * @param string $file filename.
+        * @param string $byteOrder Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
         * @throws MWException
         * @todo FIXME: The following are broke:
         * SubjectArea. Need to test the more obscure tags.
@@ -346,23 +346,23 @@ class Exif {
        }
 
        /**
-       * Collapse some fields together.
-       * This converts some fields from exif form, to a more friendly form.
-       * For example GPS latitude to a single number.
-       *
-       * The rationale behind this is that we're storing data, not presenting to the user
-       * For example a longitude is a single number describing how far away you are from
-       * the prime meridian. Well it might be nice to split it up into minutes and seconds
-       * for the user, it doesn't really make sense to split a single number into 4 parts
-       * for storage. (degrees, minutes, second, direction vs single floating point number).
-       *
-       * Other things this might do (not really sure if they make sense or not):
-       * Dates -> mediawiki date format.
-       * convert values that can be in different units to be in one standardized unit.
-       *
-       * As an alternative approach, some of this could be done in the validate phase
-       * if we make up our own types like Exif::DATE.
-       */
+        * Collapse some fields together.
+        * This converts some fields from exif form, to a more friendly form.
+        * For example GPS latitude to a single number.
+        *
+        * The rationale behind this is that we're storing data, not presenting to the user
+        * For example a longitude is a single number describing how far away you are from
+        * the prime meridian. Well it might be nice to split it up into minutes and seconds
+        * for the user, it doesn't really make sense to split a single number into 4 parts
+        * for storage. (degrees, minutes, second, direction vs single floating point number).
+        *
+        * Other things this might do (not really sure if they make sense or not):
+        * Dates -> mediawiki date format.
+        * convert values that can be in different units to be in one standardized unit.
+        *
+        * As an alternative approach, some of this could be done in the validate phase
+        * if we make up our own types like Exif::DATE.
+        */
        function collapseData( ) {
 
                $this->exifGPStoNumber( 'GPSLatitude' );
@@ -434,11 +434,11 @@ class Exif {
 
        }
        /**
-       * Do userComment tags and similar. See pg. 34 of exif standard.
-       * basically first 8 bytes is charset, rest is value.
-       * This has not been tested on any shift-JIS strings.
-       * @param $prop String prop name.
-       */
+        * Do userComment tags and similar. See pg. 34 of exif standard.
+        * basically first 8 bytes is charset, rest is value.
+        * This has not been tested on any shift-JIS strings.
+        * @param string $prop prop name.
+        */
        private function charCodeString ( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
 
@@ -495,21 +495,21 @@ class Exif {
                }
        }
        /**
-       * Convert an Exif::UNDEFINED from a raw binary string
-       * to its value. This is sometimes needed depending on
-       * the type of UNDEFINED field
-       * @param $prop String name of property
-       */
+        * Convert an Exif::UNDEFINED from a raw binary string
+        * to its value. This is sometimes needed depending on
+        * the type of UNDEFINED field
+        * @param string $prop name of property
+        */
        private function exifPropToOrd ( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
                        $this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
                }
        }
        /**
-       * Convert gps in exif form to a single floating point number
-       * for example 10 degress 20`40`` S -> -10.34444
-       * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
-       */
+        * Convert gps in exif form to a single floating point number
+        * for example 10 degress 20`40`` S -> -10.34444
+        * @param string $prop a gps coordinate exif tag name (like GPSLongitude)
+        */
        private function exifGPStoNumber ( $prop ) {
                $loc =& $this->mFilteredExifData[$prop];
                $dir =& $this->mFilteredExifData[$prop . 'Ref'];
@@ -727,8 +727,8 @@ class Exif {
         * Validates if a tag has a legal value according to the Exif spec
         *
         * @private
-        * @param $section String: section where tag is located.
-        * @param $tag String: the tag to check.
+        * @param string $section section where tag is located.
+        * @param string $tag the tag to check.
         * @param $val Mixed: the value of the tag.
         * @param $recursive Boolean: true if called recursively for array types.
         * @return bool
@@ -828,7 +828,7 @@ class Exif {
         *
         * @private
         *
-        * @param $fname String: the name of the function calling this function
+        * @param string $fname the name of the function calling this function
         * @param $io Boolean: Specify whether we're beginning or ending
         */
        private function debugFile( $fname, $io ) {
index 97aa28b..1a7d772 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Formating of image metadata values into human readable form.
+ * Formatting of image metadata values into human readable form.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,6 @@
  * @file
  */
 
-
 /**
  * Format Image metadata values into a human readable form.
  *
@@ -53,7 +52,7 @@ class FormatMetadata {
         * value which most of the time are plain integers. This function
         * formats Exif (and other metadata) values into human readable form.
         *
-        * @param $tags Array: the Exif data to format ( as returned by
+        * @param array $tags the Exif data to format ( as returned by
         *                    Exif::getFilteredData() or BitmapMetadataHandler )
         * @return array
         */
@@ -526,7 +525,6 @@ class FormatMetadata {
                                        }
                                        break;
 
-
                                case 'GPSTrackRef':
                                case 'GPSImgDirectionRef':
                                case 'GPSDestBearingRef':
@@ -829,20 +827,20 @@ class FormatMetadata {
        }
 
        /**
-       * A function to collapse multivalued tags into a single value.
-       * This turns an array of (for example) authors into a bulleted list.
-       *
-       * This is public on the basis it might be useful outside of this class.
-       *
-       * @param $vals Array array of values
-       * @param $type String Type of array (either lang, ul, ol).
-       * 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. (Ugly hack for backwards compatibility with old mediawiki).
-       * @return String single value (in wiki-syntax).
-       */
+        * A function to collapse multivalued tags into a single value.
+        * This turns an array of (for example) authors into a bulleted list.
+        *
+        * This is public on the basis it might be useful outside of this class.
+        *
+        * @param array $vals array of values
+        * @param string $type Type of array (either lang, ul, ol).
+        * 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. (Ugly hack for backwards compatibility with old mediawiki).
+        * @return String single value (in wiki-syntax).
+        */
        public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) {
                if ( isset( $vals['_type'] ) ) {
                        $type = $vals['_type'];
@@ -941,8 +939,8 @@ class FormatMetadata {
 
        /** Helper function for creating lists of translations.
         *
-        * @param $value String value (this is not escaped)
-        * @param $lang String lang code of item or false
+        * @param string $value value (this is not escaped)
+        * @param string $lang lang code of item or false
         * @param $default Boolean if it is default value.
         * @param $noHtml Boolean If to avoid html (for back-compat)
         * @throws MWException
@@ -1008,10 +1006,10 @@ class FormatMetadata {
         *
         * @private
         *
-        * @param $tag String: the tag name to pass on
-        * @param $val String: the value of the tag
-        * @param $arg String: an argument to pass ($1)
-        * @param $arg2 String: a 2nd argument to pass ($2)
+        * @param string $tag the tag name to pass on
+        * @param string $val the value of the tag
+        * @param string $arg an argument to pass ($1)
+        * @param string $arg2 a 2nd argument to pass ($2)
         * @return string A wfMessage of "exif-$tag-$val" in lower case
         */
        static function msg( $tag, $val, $arg = null, $arg2 = null ) {
@@ -1117,7 +1115,7 @@ class FormatMetadata {
         * Note, leading 0's are significant, so this is
         * a string, not an int.
         *
-        * @param $val String: The 8 digit news code.
+        * @param string $val The 8 digit news code.
         * @return string The human readable form
         */
        private static function convertNewsCode( $val ) {
@@ -1190,8 +1188,8 @@ class FormatMetadata {
         * Format a coordinate value, convert numbers from floating point
         * into degree minute second representation.
         *
-        * @param $coord int degrees, minutes and seconds
-        * @param $type String: latitude or longitude (for if its a NWS or E)
+        * @param int $coord degrees, minutes and seconds
+        * @param string $type latitude or longitude (for if its a NWS or E)
         * @return mixed A floating point number or whatever we were fed
         */
        static function formatCoords( $coord, $type ) {
@@ -1226,7 +1224,7 @@ class FormatMetadata {
        /**
         * Format the contact info field into a single value.
         *
-        * @param $vals Array array with fields of the ContactInfo
+        * @param array $vals array with fields of the ContactInfo
         *    struct defined in the IPTC4XMP spec. Or potentially
         *    an array with one element that is a free form text
         *    value from the older iptc iim 1:118 prop.
@@ -1353,7 +1351,7 @@ class FormatMetadata {
  *
  * @deprecated since 1.18
  *
-**/
+ */
 class FormatExif {
        var $meta;
 
index 8b44585..6a4e753 100644 (file)
@@ -251,7 +251,7 @@ class GIFMetadataExtractor {
         */
        static function readGCT( $fh, $bpp ) {
                if ( $bpp > 0 ) {
-                       for( $i=1; $i<=pow( 2, $bpp ); ++$i ) {
+                       for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
                                fread( $fh, 3 );
                        }
                }
index 06cbc3b..4191cde 100644 (file)
 class IPTC {
 
        /**
-       * This takes the results of iptcparse() and puts it into a
-       * form that can be handled by mediawiki. Generally called from
-       * BitmapMetadataHandler::doApp13.
-       *
-       * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
-       *
-       * @param $rawData String app13 block from jpeg containing iptc/iim data
-       * @return Array iptc metadata array
-       */
+        * This takes the results of iptcparse() and puts it into a
+        * form that can be handled by mediawiki. Generally called from
+        * BitmapMetadataHandler::doApp13.
+        *
+        * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
+        *
+        * @param string $rawData app13 block from jpeg containing iptc/iim data
+        * @return Array iptc metadata array
+        */
        static function parse( $rawData ) {
                $parsed = iptcparse( $rawData );
                $data = Array();
@@ -198,7 +198,7 @@ class IPTC {
                                        /* original transmission ref.
                                         * "A code representing the location of original transmission ac-
                                         * cording to practises of the provider."
-                                       */
+                                        */
                                        $data['OriginalTransmissionRef'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#118': /*contact*/
@@ -350,14 +350,14 @@ class IPTC {
        }
 
        /**
-       * Convert an iptc date and time tags into the exif format
-       *
-       * @todo Potentially this should also capture the timezone offset.
-       * @param Array $date The date tag
-       * @param Array $time The time tag
-       * @param $c
-       * @return String Date in exif format.
-       */
+        * Convert an iptc date and time tags into the exif format
+        *
+        * @todo Potentially this should also capture the timezone offset.
+        * @param array $date The date tag
+        * @param array $time The time tag
+        * @param $c
+        * @return String Date in exif format.
+        */
        private static function timeHelper( $date, $time, $c ) {
                if ( count( $date ) === 1 ) {
                        //the standard says this should always be 1
@@ -417,12 +417,12 @@ class IPTC {
        }
 
        /**
-       * Helper function to convert charset for iptc values.
-       * @param $data string|array The iptc string
-       * @param $charset String: The charset
+        * Helper function to convert charset for iptc values.
+        * @param string|array $data The iptc string
+        * @param string $charset The charset
         *
         * @return string|array
-       */
+        */
        private static function convIPTC ( $data, $charset ) {
                if ( is_array( $data ) ) {
                        foreach ( $data as &$val ) {
@@ -435,12 +435,12 @@ class IPTC {
                return $data;
        }
        /**
-       * Helper function of a helper function to convert charset for iptc values.
-       * @param $data Mixed String or Array: The iptc string
-       * @param $charset String: The charset
-       *
-       * @return string
-       */
+        * Helper function of a helper function to convert charset for iptc values.
+        * @param $data Mixed String or Array: The iptc string
+        * @param string $charset The charset
+        *
+        * @return string
+        */
        private static function convIPTCHelper ( $data, $charset ) {
                if ( $charset ) {
                        wfSuppressWarnings();
@@ -465,13 +465,13 @@ class IPTC {
        }
 
        /**
-       * take the value of 1:90 tag and returns a charset
-       * @param String $tag 1:90 tag.
-       * @return string charset name or "?"
-       * Warning, this function does not (and is not intended to) detect
-       * all iso 2022 escape codes. In practise, the code for utf-8 is the
-       * only code that seems to have wide use. It does detect that code.
-       */
+        * take the value of 1:90 tag and returns a charset
+        * @param string $tag 1:90 tag.
+        * @return string charset name or "?"
+        * Warning, this function does not (and is not intended to) detect
+        * all iso 2022 escape codes. In practise, the code for utf-8 is the
+        * only code that seems to have wide use. It does detect that code.
+        */
        static function getCharset( $tag ) {
 
                //According to iim standard, charset is defined by the tag 1:90.
@@ -530,7 +530,7 @@ class IPTC {
                        case "\x1b(K":
                                $c = "ISO646-DE";
                                break;
-                       case "\x1b(N":  //crylic
+                       case "\x1b(N": //crylic
                                $c = "ISO_5427";
                                break;
                        case "\x1b(`": //iso646-NO
index 472372c..419afee 100644 (file)
@@ -139,7 +139,6 @@ abstract class ImageHandler extends MediaHandler {
                        $params['height'] = $params['physicalHeight'];
                }
 
-
                if ( !$this->validateThumbParams( $params['physicalWidth'],
                                $params['physicalHeight'], $srcWidth, $srcHeight, $mimeType ) ) {
                        return false;
index 5ea30f2..8b5d651 100644 (file)
@@ -59,4 +59,36 @@ class JpegHandler extends ExifBitmapHandler {
                }
        }
 
+       /**
+        * @param $file File
+        * @param array $params Rotate parameters.
+        *      'rotation' clockwise rotation in degrees, allowed are multiples of 90
+        * @since 1.21
+        * @return bool
+        */
+       public function rotate( $file, $params ) {
+               global $wgJpegTran;
+
+               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+
+               if( $wgJpegTran && is_file( $wgJpegTran ) ){
+                       $cmd = wfEscapeShellArg( $wgJpegTran ) .
+                               " -rotate " . wfEscapeShellArg( $rotation ) .
+                               " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
+                               " " . wfEscapeShellArg( $params[ 'srcPath' ] ) .  " 2>&1";
+                               wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+                               wfProfileIn( 'jpegtran' );
+                               $retval = 0;
+                               $err = wfShellExec( $cmd, $retval, $env );
+                               wfProfileOut( 'jpegtran' );
+                       if ( $retval !== 0 ) {
+                               $this->logErrorForExternalProcess( $retval, $err, $cmd );
+                               return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+                       }
+                       return false;
+               } else {
+                       return parent::rotate( $file, $params );
+               }
+       }
+
 }
index 60fd2a0..6ff07ed 100644 (file)
@@ -25,7 +25,7 @@
  * Class for reading jpegs and extracting metadata.
  * see also BitmapMetadataHandler.
  *
- * Based somewhat on GIFMetadataExtrator.
+ * Based somewhat on GIFMetadataExtractor.
  *
  * @ingroup Media
  */
@@ -37,16 +37,16 @@ class JpegMetadataExtractor {
        // that many segments. Your average file has about 10.
 
        /** Function to extract metadata segments of interest from jpeg files
-       * based on GIFMetadataExtractor.
-       *
-       * we can almost use getimagesize to do this
-       * but gis doesn't support having multiple app1 segments
-       * and those can't extract xmp on files containing both exif and xmp data
-       *
-       * @param String $filename name of jpeg file
-       * @return Array of interesting segments.
-       * @throws MWException if given invalid file.
-       */
+        * based on GIFMetadataExtractor.
+        *
+        * we can almost use getimagesize to do this
+        * but gis doesn't support having multiple app1 segments
+        * and those can't extract xmp on files containing both exif and xmp data
+        *
+        * @param string $filename name of jpeg file
+        * @return Array of interesting segments.
+        * @throws MWException if given invalid file.
+        */
        static function segmentSplitter ( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
 
@@ -183,18 +183,18 @@ class JpegMetadataExtractor {
        }
 
        /**
-       * This reads the photoshop image resource.
-       * Currently it only compares the iptc/iim hash
-       * with the stored hash, which is used to determine the precedence
-       * of the iptc data. In future it may extract some other info, like
-       * url of copyright license.
-       *
-       * This should generally be called by BitmapMetadataHandler::doApp13()
-       *
-       * @param String $app13 photoshop psir app13 block from jpg.
-       * @throws MWException (It gets caught next level up though)
-       * @return String if the iptc hash is good or not.
-       */
+        * This reads the photoshop image resource.
+        * Currently it only compares the iptc/iim hash
+        * with the stored hash, which is used to determine the precedence
+        * of the iptc data. In future it may extract some other info, like
+        * url of copyright license.
+        *
+        * This should generally be called by BitmapMetadataHandler::doApp13()
+        *
+        * @param string $app13 photoshop psir app13 block from jpg.
+        * @throws MWException (It gets caught next level up though)
+        * @return String if the iptc hash is good or not.
+        */
        public static function doPSIR ( $app13 ) {
                if ( !$app13 ) {
                        throw new MWException( "No App13 segment given" );
index 46993e7..9a3f645 100644 (file)
@@ -103,7 +103,7 @@ abstract class MediaHandler {
         * can't be determined.
         *
         * @param $image File: the image object, or false if there isn't one
-        * @param $path String: the filename
+        * @param string $path the filename
         * @return Array Follow the format of PHP getimagesize() internal function. See http://www.php.net/getimagesize
         */
        abstract function getImageSize( $image, $path );
@@ -113,26 +113,26 @@ abstract class MediaHandler {
         *
         * @param $image File: the image object, or false if there isn't one.
         *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
-        * @param $path String: the filename
+        * @param string $path the filename
         * @return String
         */
        function getMetadata( $image, $path ) { return ''; }
 
        /**
-       * Get metadata version.
-       *
-       * This is not used for validating metadata, this is used for the api when returning
-       * metadata, since api content formats should stay the same over time, and so things
-       * using ForiegnApiRepo can keep backwards compatibility
-       *
-       * All core media handlers share a common version number, and extensions can
-       * use the GetMetadataVersion hook to append to the array (they should append a unique
-       * string so not to get confusing). If there was a media handler named 'foo' with metadata
-       * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
-       * version is 2, the end version string would look like '2;foo=3'.
-       *
-       * @return string version string
-       */
+        * Get metadata version.
+        *
+        * This is not used for validating metadata, this is used for the api when returning
+        * metadata, since api content formats should stay the same over time, and so things
+        * using ForiegnApiRepo can keep backwards compatibility
+        *
+        * All core media handlers share a common version number, and extensions can
+        * use the GetMetadataVersion hook to append to the array (they should append a unique
+        * string so not to get confusing). If there was a media handler named 'foo' with metadata
+        * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
+        * version is 2, the end version string would look like '2;foo=3'.
+        *
+        * @return string version string
+        */
        static function getMetadataVersion () {
                $version = Array( '2' ); // core metadata version
                wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
@@ -140,15 +140,15 @@ abstract class MediaHandler {
        }
 
        /**
-       * Convert metadata version.
-       *
-       * By default just returns $metadata, but can be used to allow
-       * media handlers to convert between metadata versions.
-       *
-       * @param $metadata Mixed String or Array metadata array (serialized if string)
-       * @param $version Integer target version
-       * @return Array serialized metadata in specified version, or $metadata on fail.
-       */
+        * Convert metadata version.
+        *
+        * By default just returns $metadata, but can be used to allow
+        * media handlers to convert between metadata versions.
+        *
+        * @param $metadata Mixed String or Array metadata array (serialized if string)
+        * @param $version Integer target version
+        * @return Array serialized metadata in specified version, or $metadata on fail.
+        */
        function convertMetadataVersion( $metadata, $version = 1 ) {
                if ( !is_array( $metadata ) ) {
 
@@ -181,7 +181,6 @@ abstract class MediaHandler {
                return self::METADATA_GOOD;
        }
 
-
        /**
         * Get a MediaTransformOutput object representing an alternate of the transformed
         * output which will call an intermediary thumbnail assist script.
@@ -200,9 +199,9 @@ abstract class MediaHandler {
         * actually do the transform.
         *
         * @param $image File: the image object
-        * @param $dstPath String: filesystem destination path
-        * @param $dstUrl String: Destination URL to use in output HTML
-        * @param $params Array: Arbitrary set of parameters validated by $this->validateParam()
+        * @param string $dstPath filesystem destination path
+        * @param string $dstUrl Destination URL to use in output HTML
+        * @param array $params Arbitrary set of parameters validated by $this->validateParam()
         * @return MediaTransformOutput
         */
        final function getTransform( $image, $dstPath, $dstUrl, $params ) {
@@ -214,9 +213,9 @@ abstract class MediaHandler {
         * transform unless $flags contains self::TRANSFORM_LATER.
         *
         * @param $image File: the image object
-        * @param $dstPath String: filesystem destination path
-        * @param $dstUrl String: destination URL to use in output HTML
-        * @param $params Array: arbitrary set of parameters validated by $this->validateParam()
+        * @param string $dstPath filesystem destination path
+        * @param string $dstUrl destination URL to use in output HTML
+        * @param array $params arbitrary set of parameters validated by $this->validateParam()
         * @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
         *
         * @return MediaTransformOutput
@@ -361,7 +360,7 @@ abstract class MediaHandler {
         *
         * This is used by the media handlers that use the FormatMetadata class
         *
-        * @param $metadataArray Array metadata array
+        * @param array $metadataArray metadata array
         * @return array for use displaying metadata.
         */
        function formatMetadataHelper( $metadataArray ) {
@@ -405,7 +404,6 @@ abstract class MediaHandler {
                return $fields;
        }
 
-
        /**
         * This is used to generate an array element for each metadata value
         * That array is then used to generate the table of metadata values
@@ -414,17 +412,17 @@ abstract class MediaHandler {
         * @param &$array Array An array containing elements for each type of visibility
         * and each of those elements being an array of metadata items. This function adds
         * a value to that array.
-        * @param $visibility string ('visible' or 'collapsed') if this value is hidden
+        * @param string $visibility ('visible' or 'collapsed') if this value is hidden
         * by default.
-        * @param $type String type of metadata tag (currently always 'exif')
-        * @param $id String the name of the metadata tag (like 'artist' for example).
+        * @param string $type type of metadata tag (currently always 'exif')
+        * @param string $id the name of the metadata tag (like 'artist' for example).
         * its name in the table displayed is the message "$type-$id" (Ex exif-artist ).
-        * @param $value String thingy goes into a wikitext table; it used to be escaped but
+        * @param string $value thingy goes into a wikitext table; it used to be escaped but
         * that was incompatible with previous practise of customized display
         * with wikitext formatting via messages such as 'exif-model-value'.
         * So the escaping is taken back out, but generally this seems a confusing
         * interface.
-        * @param $param String value to pass to the message for the name of the field
+        * @param string $param value to pass to the message for the name of the field
         * as $1. Currently this parameter doesn't seem to ever be used.
         *
         * Note, everything here is passed through the parser later on (!)
@@ -521,7 +519,7 @@ abstract class MediaHandler {
         * match the handler class, a Status object should be returned containing
         * relevant errors.
         *
-        * @param $fileName string The local path to the file.
+        * @param string $fileName The local path to the file.
         * @return Status object
         */
        function verifyUpload( $fileName ) {
@@ -532,8 +530,8 @@ abstract class MediaHandler {
         * Check for zero-sized thumbnails. These can be generated when
         * no disk space is available or some other error occurs
         *
-        * @param $dstPath string The location of the suspect file
-        * @param $retval int Return value of some shell process, file will be deleted if this is non-zero
+        * @param string $dstPath The location of the suspect file
+        * @param int $retval Return value of some shell process, file will be deleted if this is non-zero
         * @return bool True if removed, false otherwise
         */
        function removeBadFile( $dstPath, $retval = 0 ) {
@@ -566,4 +564,13 @@ abstract class MediaHandler {
        public function filterThumbnailPurgeList( &$files, $options ) {
                // Do nothing
        }
+
+       /*
+        * True if the handler can rotate the media
+        * @since 1.21
+        * @return bool
+        */
+       public static function canRotate() {
+               return false;
+       }
 }
index 1fbe029..1f95bc3 100644 (file)
@@ -80,7 +80,7 @@ abstract class MediaTransformOutput {
        }
 
        /**
-        * @param $storagePath string The permanent storage path
+        * @param string $storagePath The permanent storage path
         * @return void
         */
        public function setStoragePath( $storagePath ) {
@@ -90,7 +90,7 @@ abstract class MediaTransformOutput {
        /**
         * Fetch HTML for this transform output
         *
-        * @param $options array Associative array of options. Boolean options
+        * @param array $options Associative array of options. Boolean options
         *     should be indicated with a value of true for true, and false or
         *     absent for false.
         *
@@ -160,7 +160,7 @@ abstract class MediaTransformOutput {
        /**
         * Stream the file if there were no errors
         *
-        * @param $headers Array Additional HTTP headers to send on success
+        * @param array $headers Additional HTTP headers to send on success
         * @return Bool success
         */
        public function streamFile( $headers = array() ) {
@@ -228,9 +228,9 @@ class ThumbnailImage extends MediaTransformOutput {
         * It may also include a 'page' parameter for multipage files.
         *
         * @param $file File object
-        * @param $url String: URL path to the thumb
+        * @param string $url URL path to the thumb
         * @param $path String|bool|null: filesystem path to the thumb
-        * @param $parameters Array: Associative array of parameters
+        * @param array $parameters Associative array of parameters
         * @private
         */
        function __construct( $file, $url, $path = false, $parameters = array() ) {
@@ -270,7 +270,7 @@ class ThumbnailImage extends MediaTransformOutput {
         * Return HTML <img ... /> tag for the thumbnail, will include
         * width and height attributes and a blank alt text (as required).
         *
-        * @param $options array Associative array of options. Boolean options
+        * @param array $options Associative array of options. Boolean options
         *     should be indicated with a value of true for true, and false or
         *     absent for false.
         *
index e4235a7..f8cd6df 100644 (file)
@@ -51,7 +51,7 @@ class SVGReader {
         * Constructor
         *
         * Creates an SVGReader drawing from the source provided
-        * @param $source String: URI from which to read
+        * @param string $source URI from which to read
         * @throws MWException|Exception
         */
        function __construct( $source ) {
@@ -175,8 +175,8 @@ class SVGReader {
        /**
         * Read a textelement from an element
         *
-        * @param String $name of the element that we are reading from
-        * @param String $metafield that we will fill with the result
+        * @param string $name of the element that we are reading from
+        * @param string $metafield that we will fill with the result
         */
        private function readField( $name, $metafield=null ) {
                $this->debug ( "Read field $metafield" );
@@ -197,7 +197,7 @@ class SVGReader {
        /**
         * Read an XML snippet from an element
         *
-        * @param String $metafield that we will fill with the result
+        * @param string $metafield that we will fill with the result
         * @throws MWException
         */
        private function readXml( $metafield=null ) {
@@ -217,7 +217,7 @@ class SVGReader {
        /**
         * Filter all children, looking for animate elements
         *
-        * @param String $name of the element that we are reading from
+        * @param string $name of the element that we are reading from
         */
        private function animateFilter( $name ) {
                $this->debug ( "animate filter for tag $name" );
@@ -325,7 +325,7 @@ class SVGReader {
         * Return a rounded pixel equivalent for a labeled CSS/SVG length.
         * http://www.w3.org/TR/SVG11/coords.html#UnitIdentifiers
         *
-        * @param $length String: CSS/SVG length.
+        * @param string $length CSS/SVG length.
         * @param $viewportSize: Float optional scale for percentage units...
         * @return float: length in pixels
         */
index ba0d419..ba38d15 100644 (file)
@@ -72,7 +72,7 @@ class XCFHandler extends BitmapHandler {
         * @author Hexmode
         * @author Hashar
         *
-        * @param $filename String Full path to a XCF file
+        * @param string $filename Full path to a XCF file
         * @return bool|array metadata array just like PHP getimagesize()
         */
        static function getXCFMetaData( $filename ) {
index 0decb75..62738a0 100644 (file)
  */
 
 /**
-* Class for reading xmp data containing properties relevant to
-* images, and spitting out an array that FormatExif accepts.
-*
-* Note, this is not meant to recognize every possible thing you can
-* encode in XMP. It should recognize all the properties we want.
-* For example it doesn't have support for structures with multiple
-* nesting levels, as none of the properties we're supporting use that
-* feature. If it comes across properties it doesn't recognize, it should
-* ignore them.
-*
-* The public methods one would call in this class are
-* - parse( $content )
-     Reads in xmp content.
-     Can potentially be called multiple times with partial data each time.
-* - parseExtended( $content )
-     Reads XMPExtended blocks (jpeg files only).
-* - getResults
-     Outputs a results array.
-*
-* Note XMP kind of looks like rdf. They are not the same thing - XMP is
-* encoded as a specific subset of rdf. This class can read XMP. It cannot
-* read rdf.
-*
-*/
+ * Class for reading xmp data containing properties relevant to
+ * images, and spitting out an array that FormatExif accepts.
+ *
+ * Note, this is not meant to recognize every possible thing you can
+ * encode in XMP. It should recognize all the properties we want.
+ * For example it doesn't have support for structures with multiple
+ * nesting levels, as none of the properties we're supporting use that
+ * feature. If it comes across properties it doesn't recognize, it should
+ * ignore them.
+ *
+ * The public methods one would call in this class are
+ * - parse( $content )
+ *     Reads in xmp content.
+ *     Can potentially be called multiple times with partial data each time.
+ * - parseExtended( $content )
+ *     Reads XMPExtended blocks (jpeg files only).
+ * - getResults
+ *     Outputs a results array.
+ *
+ * Note XMP kind of looks like rdf. They are not the same thing - XMP is
+ * encoded as a specific subset of rdf. This class can read XMP. It cannot
+ * read rdf.
+ *
+ */
 class XMPReader {
 
        private $curItem = array();        // array to hold the current element (and previous element, and so on)
@@ -63,39 +63,38 @@ class XMPReader {
        protected $items;
 
        /**
-       * These are various mode constants.
-       * they are used to figure out what to do
-       * with an element when its encountered.
-       *
-       * For example, MODE_IGNORE is used when processing
-       * a property we're not interested in. So if a new
-       * element pops up when we're in that mode, we ignore it.
-       */
+        * These are various mode constants.
+        * they are used to figure out what to do
+        * with an element when its encountered.
+        *
+        * For example, MODE_IGNORE is used when processing
+        * a property we're not interested in. So if a new
+        * element pops up when we're in that mode, we ignore it.
+        */
        const MODE_INITIAL = 0;
-       const MODE_IGNORE  = 1;
-       const MODE_LI      = 2;
+       const MODE_IGNORE = 1;
+       const MODE_LI = 2;
        const MODE_LI_LANG = 3;
-       const MODE_QDESC   = 4;
+       const MODE_QDESC = 4;
 
        // The following MODE constants are also used in the
        // $items array to denote what type of property the item is.
-       const MODE_SIMPLE    = 10;
-       const MODE_STRUCT    = 11; // structure (associative array)
-       const MODE_SEQ       = 12; // ordered list
-       const MODE_BAG       = 13; // unordered list
-       const MODE_LANG      = 14;
-       const MODE_ALT       = 15; // non-language alt. Currently not implemented, and not needed atm.
+       const MODE_SIMPLE = 10;
+       const MODE_STRUCT = 11; // structure (associative array)
+       const MODE_SEQ = 12; // ordered list
+       const MODE_BAG = 13; // unordered list
+       const MODE_LANG = 14;
+       const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
        const MODE_BAGSTRUCT = 16; // A BAG of Structs.
 
        const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
        const NS_XML = 'http://www.w3.org/XML/1998/namespace';
 
-
        /**
-       * Constructor.
-       *
-       * Primary job is to initialize the XMLParser
-       */
+        * Constructor.
+        *
+        * Primary job is to initialize the XMLParser
+        */
        function __construct() {
 
                if ( !function_exists( 'xml_parser_create_ns' ) ) {
@@ -109,9 +108,9 @@ class XMPReader {
 
        }
        /**
-       * Main use is if a single item has multiple xmp documents describing it.
-       * For example in jpeg's with extendedXMP
-       */
+        * Main use is if a single item has multiple xmp documents describing it.
+        * For example in jpeg's with extendedXMP
+        */
        private function resetXMLParser() {
 
                if ( $this->xmlParser ) {
@@ -131,20 +130,20 @@ class XMPReader {
        }
 
        /** Destroy the xml parser
-       *
-       * Not sure if this is actually needed.
-       */
+        *
+        * Not sure if this is actually needed.
+        */
        function __destruct() {
                // not sure if this is needed.
                xml_parser_free( $this->xmlParser );
        }
 
        /** 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
-             FormatMetadata::getFormattedData().
-       */
+        * the array, and transform any metadata that is special-cased.
+        *
+        * @return Array array of results as an array of arrays suitable for
+        *      FormatMetadata::getFormattedData().
+        */
        public function getResults() {
                // xmp-special is for metadata that affects how stuff
                // is extracted. For example xmpNote:HasExtendedXMP.
@@ -207,7 +206,6 @@ class XMPReader {
                        }
                }
 
-
                // We don't want to return the special values, since they're
                // special and not info to be stored about the file.
                unset( $data['xmp-special'] );
@@ -238,7 +236,7 @@ class XMPReader {
         * Also catches any errors during processing, writes them to
         * debug log, blanks result array and returns false.
         *
-        * @param $content String: XMP data
+        * @param string $content XMP data
         * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
         * @param $reset Boolean: does xml parser need to be reset. Default false
         * @throws MWException
@@ -312,7 +310,7 @@ class XMPReader {
         *
         * @todo In serious need of testing
         * @see http://www.adobe.ge/devnet/xmp/pdfs/XMPSpecificationPart3.pdf XMP spec part 3 page 20
-        * @param String $content XMPExtended block minus the namespace signature
+        * @param string $content XMPExtended block minus the namespace signature
         * @return Boolean If it succeeded.
         */
        public function parseExtended( $content ) {
@@ -331,7 +329,6 @@ class XMPReader {
                        return false;
                }
 
-
                // we're not very robust here. we should accept it in the wrong order. To quote
                // the xmp standard:
                // "A JPEG writer should write the ExtendedXMP marker segments in order, immediately following the
@@ -368,21 +365,21 @@ class XMPReader {
        }
 
        /**
-       * Character data handler
-       * Called whenever character data is found in the xmp document.
-       *
-       * does nothing if we're in MODE_IGNORE or if the data is whitespace
-       * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
-       * data in the other modes).
-       *
-       * As an example, this happens when we encounter XMP like:
-       * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
-       * and are processing the 0/10 bit.
-       *
-       * @param $parser XMLParser reference to the xml parser
-       * @param $data String Character data
-       * @throws MWException on invalid data
-       */
+        * Character data handler
+        * Called whenever character data is found in the xmp document.
+        *
+        * does nothing if we're in MODE_IGNORE or if the data is whitespace
+        * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
+        * data in the other modes).
+        *
+        * As an example, this happens when we encounter XMP like:
+        * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+        * and are processing the 0/10 bit.
+        *
+        * @param $parser XMLParser reference to the xml parser
+        * @param string $data Character data
+        * @throws MWException on invalid data
+        */
        function char( $parser, $data ) {
 
                $data = trim( $data );
@@ -412,11 +409,11 @@ class XMPReader {
        }
 
        /** When we hit a closing element in MODE_IGNORE
-       * Check to see if this is the element we started to ignore,
-       * in which case we get out of MODE_IGNORE
-       *
-       * @param $elm String Namespace of element followed by a space and then tag name of element.
-       */
+        * Check to see if this is the element we started to ignore,
+        * in which case we get out of MODE_IGNORE
+        *
+        * @param string $elm Namespace of element followed by a space and then tag name of element.
+        */
        private function endElementModeIgnore ( $elm ) {
                if ( $this->curItem[0] === $elm ) {
                        array_shift( $this->curItem );
@@ -425,20 +422,20 @@ class XMPReader {
        }
 
        /**
-       * Hit a closing element when in MODE_SIMPLE.
-       * This generally means that we finished processing a
-       * property value, and now have to save the result to the
-       * results array
-       *
-       * For example, when processing:
-       * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
-       * this deals with when we hit </exif:DigitalZoomRatio>.
-       *
-       * Or it could be if we hit the end element of a property
-       * of a compound data structure (like a member of an array).
-       *
-       * @param $elm String namespace, space, and tag name.
-       */
+        * Hit a closing element when in MODE_SIMPLE.
+        * This generally means that we finished processing a
+        * property value, and now have to save the result to the
+        * results array
+        *
+        * For example, when processing:
+        * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+        * this deals with when we hit </exif:DigitalZoomRatio>.
+        *
+        * Or it could be if we hit the end element of a property
+        * of a compound data structure (like a member of an array).
+        *
+        * @param string $elm namespace, space, and tag name.
+        */
        private function endElementModeSimple ( $elm ) {
                if ( $this->charContent !== false ) {
                        if ( $this->processingArray ) {
@@ -472,7 +469,7 @@ class XMPReader {
         *
         * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
         *
-        * @param $elm String namespace . space . tag name.
+        * @param string $elm namespace . space . tag name.
         * @throws MWException
         */
        private function endElementNested( $elm ) {
@@ -539,7 +536,7 @@ class XMPReader {
         * (For comparison, we call endElementModeSimple when we
         * hit the "</rdf:li>")
         *
-        * @param $elm String namespace . ' ' . element name
+        * @param string $elm namespace . ' ' . element name
         * @throws MWException
         */
        private function endElementModeLi( $elm ) {
@@ -572,15 +569,15 @@ class XMPReader {
        }
 
        /**
-       * End element while in MODE_QDESC
-       * mostly when ending an element when we have a simple value
-       * that has qualifiers.
-       *
-       * Qualifiers aren't all that common, and we don't do anything
-       * with them.
-       *
-       * @param $elm String namespace and element
-       */
+        * End element while in MODE_QDESC
+        * mostly when ending an element when we have a simple value
+        * that has qualifiers.
+        *
+        * Qualifiers aren't all that common, and we don't do anything
+        * with them.
+        *
+        * @param string $elm namespace and element
+        */
        private function endElementModeQDesc( $elm ) {
 
                if ( $elm === self::NS_RDF . ' value' ) {
@@ -591,8 +588,6 @@ class XMPReader {
                        array_shift( $this->mode );
                        array_shift( $this->curItem );
                }
-
-
        }
 
        /**
@@ -605,7 +600,7 @@ class XMPReader {
         * xmp and have no meaning.
         *
         * @param $parser XMLParser
-        * @param $elm String namespace . ' ' . element name
+        * @param string $elm namespace . ' ' . element name
         * @throws MWException
         */
        function endElement( $parser, $elm ) {
@@ -679,16 +674,16 @@ class XMPReader {
        }
 
        /**
-       * Hit an opening element while in MODE_IGNORE
-       *
-       * XMP is extensible, so ignore any tag we don't understand.
-       *
-       * Mostly ignores, unless we encounter the element that we are ignoring.
-       * in which case we add it to the item stack, so we can ignore things
-       * that are nested, correctly.
-       *
-       * @param $elm String namespace . ' ' . tag name
-       */
+        * Hit an opening element while in MODE_IGNORE
+        *
+        * XMP is extensible, so ignore any tag we don't understand.
+        *
+        * Mostly ignores, unless we encounter the element that we are ignoring.
+        * in which case we add it to the item stack, so we can ignore things
+        * that are nested, correctly.
+        *
+        * @param string $elm namespace . ' ' . tag name
+        */
        private function startElementModeIgnore( $elm ) {
                if ( $elm === $this->curItem[0] ) {
                        array_unshift( $this->curItem, $elm );
@@ -697,12 +692,12 @@ class XMPReader {
        }
 
        /**
-       *  Start element in MODE_BAG (unordered array)
-       * this should always be <rdf:Bag>
-       *
-       * @param $elm String namespace . ' ' . tag
-       * @throws MWException if we have an element that's not <rdf:Bag>
-       */
+        *  Start element in MODE_BAG (unordered array)
+        * this should always be <rdf:Bag>
+        *
+        * @param string $elm namespace . ' ' . tag
+        * @throws MWException if we have an element that's not <rdf:Bag>
+        */
        private function startElementModeBag( $elm ) {
                if ( $elm === self::NS_RDF . ' Bag' ) {
                        array_unshift( $this->mode, self::MODE_LI );
@@ -713,12 +708,12 @@ class XMPReader {
        }
 
        /**
-       * Start element in MODE_SEQ (ordered array)
-       * this should always be <rdf:Seq>
-       *
-       * @param $elm String namespace . ' ' . tag
-       * @throws MWException if we have an element that's not <rdf:Seq>
-       */
+        * Start element in MODE_SEQ (ordered array)
+        * this should always be <rdf:Seq>
+        *
+        * @param string $elm namespace . ' ' . tag
+        * @throws MWException if we have an element that's not <rdf:Seq>
+        */
        private function startElementModeSeq( $elm ) {
                if ( $elm === self::NS_RDF . ' Seq' ) {
                        array_unshift( $this->mode, self::MODE_LI );
@@ -734,19 +729,19 @@ class XMPReader {
        }
 
        /**
-       * Start element in MODE_LANG (language alternative)
-       * this should always be <rdf:Alt>
-       *
-       * This tag tends to be used for metadata like describe this
-       * picture, which can be translated into multiple languages.
-       *
-       * XMP supports non-linguistic alternative selections,
-       * which are really only used for thumbnails, which
-       * we don't care about.
-       *
-       * @param $elm String namespace . ' ' . tag
-       * @throws MWException if we have an element that's not <rdf:Alt>
-       */
+        * Start element in MODE_LANG (language alternative)
+        * this should always be <rdf:Alt>
+        *
+        * This tag tends to be used for metadata like describe this
+        * picture, which can be translated into multiple languages.
+        *
+        * XMP supports non-linguistic alternative selections,
+        * which are really only used for thumbnails, which
+        * we don't care about.
+        *
+        * @param string $elm namespace . ' ' . tag
+        * @throws MWException if we have an element that's not <rdf:Alt>
+        */
        private function startElementModeLang( $elm ) {
                if ( $elm === self::NS_RDF . ' Alt' ) {
                        array_unshift( $this->mode, self::MODE_LI_LANG );
@@ -770,8 +765,8 @@ class XMPReader {
         *
         * This method is called when processing the <rdf:Description> element
         *
-        * @param $elm String namespace and tag names separated by space.
-        * @param $attribs Array Attributes of the element.
+        * @param string $elm namespace and tag names separated by space.
+        * @param array $attribs Attributes of the element.
         * @throws MWException
         */
        private function startElementModeSimple( $elm, $attribs ) {
@@ -799,19 +794,19 @@ class XMPReader {
        }
 
        /**
-       * Start an element when in MODE_QDESC.
-       * This generally happens when a simple element has an inner
-       * rdf:Description to hold qualifier elements.
-       *
-       * For example in:
-       * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
-       *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
-       *   </exif:DigitalZoomRatio>
-       * Called when processing the <rdf:value> or <foo:someQualifier>.
-       *
-       * @param $elm String namespace and tag name separated by a space.
-       *
-       */
+        * Start an element when in MODE_QDESC.
+        * This generally happens when a simple element has an inner
+        * rdf:Description to hold qualifier elements.
+        *
+        * For example in:
+        * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
+        *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
+        *   </exif:DigitalZoomRatio>
+        * Called when processing the <rdf:value> or <foo:someQualifier>.
+        *
+        * @param string $elm namespace and tag name separated by a space.
+        *
+        */
        private function startElementModeQDesc( $elm ) {
                if ( $elm === self::NS_RDF . ' value' ) {
                        return; // do nothing
@@ -829,9 +824,9 @@ class XMPReader {
         *
         * This is generally where most properties start.
         *
-        * @param $ns String Namespace
-        * @param $tag String tag name (without namespace prefix)
-        * @param $attribs Array array of attributes
+        * @param string $ns Namespace
+        * @param string $tag tag name (without namespace prefix)
+        * @param array $attribs array of attributes
         * @throws MWException
         */
        private function startElementModeInitial( $ns, $tag, $attribs ) {
@@ -890,9 +885,9 @@ class XMPReader {
         * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
         *  <exif:Mode>1</exif:Mode></exif:Flash>
         *
-        * @param $ns String namespace
-        * @param $tag String tag name (no ns)
-        * @param $attribs Array array of attribs w/ values.
+        * @param string $ns namespace
+        * @param string $tag tag name (no ns)
+        * @param array $attribs array of attribs w/ values.
         * @throws MWException
         */
        private function startElementModeStruct( $ns, $tag, $attribs ) {
@@ -930,18 +925,18 @@ class XMPReader {
        }
 
        /**
-       * opening element in MODE_LI
-       * process elements of arrays.
-       *
-       * Example:
-       * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
-       *   </rdf:Seq> </exif:ISOSpeedRatings>
-       * This method is called when we hit the <rdf:li> element.
-       *
-       * @param $elm String: namespace . ' ' . tagname
-       * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
-       * @throws MWException if gets a tag other than <rdf:li>
-       */
+        * opening element in MODE_LI
+        * process elements of arrays.
+        *
+        * Example:
+        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
+        *   </rdf:Seq> </exif:ISOSpeedRatings>
+        * This method is called when we hit the <rdf:li> element.
+        *
+        * @param string $elm namespace . ' ' . tagname
+        * @param array $attribs Attributes. (needed for BAGSTRUCTS)
+        * @throws MWException if gets a tag other than <rdf:li>
+        */
        private function startElementModeLi( $elm, $attribs ) {
                if ( ( $elm ) !== self::NS_RDF . ' li' ) {
                        throw new MWException( "<rdf:li> expected but got $elm." );
@@ -981,19 +976,19 @@ class XMPReader {
        }
 
        /**
-       * Opening element in MODE_LI_LANG.
-       * process elements of language alternatives
-       *
-       * Example:
-       * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
-       *  </rdf:li> </rdf:Alt> </dc:title>
-       *
-       * This method is called when we hit the <rdf:li> element.
-       *
-       * @param $elm String namespace . ' ' . tag
-       * @param $attribs array array of elements (most importantly xml:lang)
-       * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
-       */
+        * Opening element in MODE_LI_LANG.
+        * process elements of language alternatives
+        *
+        * Example:
+        * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
+        *  </rdf:li> </rdf:Alt> </dc:title>
+        *
+        * This method is called when we hit the <rdf:li> element.
+        *
+        * @param string $elm namespace . ' ' . tag
+        * @param array $attribs array of elements (most importantly xml:lang)
+        * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
+        */
        private function startElementModeLiLang( $elm, $attribs ) {
                if ( $elm !== self::NS_RDF . ' li' ) {
                        throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
@@ -1021,8 +1016,8 @@ class XMPReader {
         * Also does some initial set up for the wrapper element
         *
         * @param $parser XMLParser
-        * @param $elm String namespace "<space>" element
-        * @param $attribs Array attribute name => value
+        * @param string $elm namespace "<space>" element
+        * @param array $attribs attribute name => value
         * @throws MWException
         */
        function startElement( $parser, $elm, $attribs ) {
@@ -1112,7 +1107,7 @@ class XMPReader {
         * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
         * @endcode
         *
-        * @param $attribs Array attribute=>value array.
+        * @param array $attribs attribute=>value array.
         * @throws MWException
         */
        private function doAttribs( $attribs ) {
@@ -1128,8 +1123,6 @@ class XMPReader {
                        $this->mode[0] = self::MODE_QDESC;
                }
                foreach ( $attribs as $name => $val ) {
-
-
                        if ( strpos( $name, ' ' ) === false ) {
                                // This shouldn't happen, but so far some old software forgets namespace
                                // on rdf:about.
@@ -1157,16 +1150,16 @@ class XMPReader {
        }
 
        /**
-       * Given an extracted value, save it to results array
-       *
-       * note also uses $this->ancestorStruct and
-       * $this->processingArray to determine what name to
-       * save the value under. (in addition to $tag).
-       *
-       * @param $ns String namespace of tag this is for
-       * @param $tag String tag name
-       * @param $val String value to save
-       */
+        * Given an extracted value, save it to results array
+        *
+        * note also uses $this->ancestorStruct and
+        * $this->processingArray to determine what name to
+        * save the value under. (in addition to $tag).
+        *
+        * @param string $ns namespace of tag this is for
+        * @param string $tag tag name
+        * @param string $val value to save
+        */
        private function saveValue( $ns, $tag, $val ) {
 
                $info =& $this->items[$ns][$tag];
index a4ba741..01b07db 100644 (file)
  */
 
 /**
-* This class is just a container for a big array
-* used by XMPReader to determine which XMP items to
-* extract.
-*/
+ * This class is just a container for a big array
+ * used by XMPReader to determine which XMP items to
+ * extract.
+ */
 class XMPInfo {
 
        /** get the items array
         * @return Array XMP item configuration array.
-       */
+        */
        public static function getItems ( ) {
                if( !self::$ranHooks ) {
                        // This is for if someone makes a custom metadata extension.
@@ -44,26 +44,25 @@ class XMPInfo {
        static private $ranHooks = false;
 
        /**
-       * XMPInfo::$items keeps a list of all the items
-       * we are interested to extract, as well as
-       * information about the item like what type
-       * it is.
-       *
-       * Format is an array of namespaces,
-       * each containing an array of tags
-       * each tag is an array of information about the
-       * tag, including:
-       *       * map_group - what group (used for precedence during conflicts)
-       *       * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
-       *       * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
-       *       * choices  - array of potential values (format of 'value' => true ). Only used with validateClosed
-       *       * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
-       *       * children - for MODE_STRUCT items, allowed children.
-       *       * structPart - Indicates that this element can only appear as a member of a structure.
-       *
-       * currently this just has a bunch of exif values as this class is only half-done
-       */
-
+        * XMPInfo::$items keeps a list of all the items
+        * we are interested to extract, as well as
+        * information about the item like what type
+        * it is.
+        *
+        * Format is an array of namespaces,
+        * each containing an array of tags
+        * each tag is an array of information about the
+        * tag, including:
+        *       * map_group - what group (used for precedence during conflicts)
+        *       * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
+        *       * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
+        *       * choices  - array of potential values (format of 'value' => true ). Only used with validateClosed
+        *      * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
+        *       * children - for MODE_STRUCT items, allowed children.
+        *      * structPart - Indicates that this element can only appear as a member of a structure.
+        *
+        * currently this just has a bunch of exif values as this class is only half-done
+        */
        static private $items = array(
                'http://ns.adobe.com/exif/1.0/' => array(
                        'ApertureValue' => array(
index e2ae535..f98f0b5 100644 (file)
  */
 
 /**
-* This contains some static methods for
-* validating XMP properties. See XMPInfo and XMPReader classes.
-*
-* Each of these functions take the same parameters
-* * an info array which is a subset of the XMPInfo::items array
-* * A value (passed as reference) to validate. This can be either a
-     simple value or an array
-* * A boolean to determine if this is validating a simple or complex values
-*
-* It should be noted that when an array is being validated, typically the validation
-* function is called once for each value, and then once at the end for the entire array.
-*
-* These validation functions can also be used to modify the data. See the gps and flash one's
-* for example.
-*
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
-*/
+ * This contains some static methods for
+ * validating XMP properties. See XMPInfo and XMPReader classes.
+ *
+ * Each of these functions take the same parameters
+ * * an info array which is a subset of the XMPInfo::items array
+ * * A value (passed as reference) to validate. This can be either a
+ *     simple value or an array
+ * * A boolean to determine if this is validating a simple or complex values
+ *
+ * It should be noted that when an array is being validated, typically the validation
+ * function is called once for each value, and then once at the end for the entire array.
+ *
+ * These validation functions can also be used to modify the data. See the gps and flash one's
+ * for example.
+ *
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
+ */
 class XMPValidate {
        /**
-       * function to validate boolean properties ( True or False )
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate boolean properties ( True or False )
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateBoolean( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -61,12 +61,12 @@ class XMPValidate {
        }
 
        /**
-       * function to validate rational properties ( 12/10 )
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate rational properties ( 12/10 )
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateRational( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -80,15 +80,15 @@ class XMPValidate {
        }
 
        /**
-       * function to validate rating properties -1, 0-5
-       *
-       * if its outside of range put it into range.
-       *
-       * @see MWG spec
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate rating properties -1, 0-5
+        *
+        * if its outside of range put it into range.
+        *
+        * @see MWG spec
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateRating( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -119,12 +119,12 @@ class XMPValidate {
        }
 
        /**
-       * function to validate integers
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate integers
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateInteger( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -138,13 +138,13 @@ class XMPValidate {
        }
 
        /**
-       * function to validate properties with a fixed number of allowed
-       * choices. (closed choice)
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate properties with a fixed number of allowed
+        * choices. (closed choice)
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateClosed( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -169,12 +169,12 @@ class XMPValidate {
        }
 
        /**
-       * function to validate and modify flash structure
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate and modify flash structure
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateFlash( $info, &$val, $standalone ) {
                if ( $standalone ) {
                        // this only validates flash structs, not individual properties
@@ -198,17 +198,17 @@ class XMPValidate {
        }
 
        /**
-       * function to validate LangCode properties ( en-GB, etc )
-       *
-       * This is just a naive check to make sure it somewhat looks like a lang code.
-       *
-       * @see rfc 3066
-       * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate LangCode properties ( en-GB, etc )
+        *
+        * This is just a naive check to make sure it somewhat looks like a lang code.
+        *
+        * @see rfc 3066
+        * @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 $standalone Boolean if this is a simple property or array
+        */
        public static function validateLangCode( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -223,22 +223,22 @@ class XMPValidate {
        }
 
        /**
-       * function to validate date properties, and convert to (partial) Exif format.
-       *
-       * Dates can be one of the following formats:
-       * YYYY
-       * YYYY-MM
-       * YYYY-MM-DD
-       * YYYY-MM-DDThh:mmTZD
-       * YYYY-MM-DDThh:mm:ssTZD
-       * YYYY-MM-DDThh:mm:ss.sTZD
-       *
-       * @param $info Array information about current property
-       * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
-             in cases where there's only a partial date, it will give things like
-             2011:04.
-       * @param $standalone Boolean if this is a simple property or array
-       */
+        * function to validate date properties, and convert to (partial) Exif format.
+        *
+        * Dates can be one of the following formats:
+        * YYYY
+        * YYYY-MM
+        * YYYY-MM-DD
+        * YYYY-MM-DDThh:mmTZD
+        * YYYY-MM-DDThh:mm:ssTZD
+        * YYYY-MM-DDThh:mm:ss.sTZD
+        *
+        * @param array $info information about current property
+        * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
+        *      in cases where there's only a partial date, it will give things like
+        *      2011:04.
+        * @param $standalone Boolean if this is a simple property or array
+        */
        public static function validateDate( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
@@ -295,7 +295,6 @@ class XMPValidate {
                                return;
                        }
 
-
                        // Extra check for empty string necessary due to TZ but no second case.
                        $stripSeconds = false;
                        if ( !isset( $res[6] ) || $res[6] === '' ) {
@@ -331,7 +330,7 @@ class XMPValidate {
         * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf
         *        section 1.2.7.4 on page 23
         *
-        * @param $info Array unused (info about prop)
+        * @param array $info unused (info about prop)
         * @param &$val String GPS string in either DDD,MM,SSk or
         *           or DDD,MM.mmk form
         * @param $standalone Boolean if its a simple prop (should always be true)
index f0c340f..66348ee 100644 (file)
@@ -8,7 +8,7 @@
 # Explicitly using Unicode 6.0
 BASE=http://www.unicode.org/Public/6.0.0/ucd
 
-# Can override to php-cli or php5 or whatevah
+# Can override to php-cli or php5 or whatever
 PHP=php
 #PHP=php-cli
 
index f5b698a..77ddb79 100644 (file)
@@ -37,7 +37,7 @@ define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
  *
  * Not as fast as I'd like, but should be usable for most purposes.
  * UtfNormal::toNFC() will bail early if given ASCII text or text
- * it can quickly deterimine is already normalized.
+ * it can quickly determine is already normalized.
  *
  * All functions can be called static.
  *
@@ -73,7 +73,7 @@ class UtfNormal {
         * Fast return for pure ASCII strings; some lesser optimizations for
         * strings containing only known-good characters. Not as fast as toNFC().
         *
-        * @param $string String: a UTF-8 string
+        * @param string $string a UTF-8 string
         * @return string a clean, shiny, normalized UTF-8 string
         */
        static function cleanUp( $string ) {
@@ -114,7 +114,7 @@ class UtfNormal {
         * Fast return for pure ASCII strings; some lesser optimizations for
         * strings containing only known-good characters.
         *
-        * @param $string String: a valid UTF-8 string. Input is not validated.
+        * @param string $string a valid UTF-8 string. Input is not validated.
         * @return string a UTF-8 string in normal form C
         */
        static function toNFC( $string ) {
@@ -132,7 +132,7 @@ class UtfNormal {
         * Convert a UTF-8 string to normal form D, canonical decomposition.
         * Fast return for pure ASCII strings.
         *
-        * @param $string String: a valid UTF-8 string. Input is not validated.
+        * @param string $string a valid UTF-8 string. Input is not validated.
         * @return string a UTF-8 string in normal form D
         */
        static function toNFD( $string ) {
@@ -151,7 +151,7 @@ class UtfNormal {
         * This may cause irreversible information loss, use judiciously.
         * Fast return for pure ASCII strings.
         *
-        * @param $string String: a valid UTF-8 string. Input is not validated.
+        * @param string $string a valid UTF-8 string. Input is not validated.
         * @return string a UTF-8 string in normal form KC
         */
        static function toNFKC( $string ) {
@@ -170,7 +170,7 @@ class UtfNormal {
         * This may cause irreversible information loss, use judiciously.
         * Fast return for pure ASCII strings.
         *
-        * @param $string String: a valid UTF-8 string. Input is not validated.
+        * @param string $string a valid UTF-8 string. Input is not validated.
         * @return string a UTF-8 string in normal form KD
         */
        static function toNFKD( $string ) {
@@ -197,7 +197,7 @@ class UtfNormal {
        /**
         * Returns true if the string is _definitely_ in NFC.
         * Returns false if not or uncertain.
-        * @param $string String: a valid UTF-8 string. Input is not validated.
+        * @param string $string a valid UTF-8 string. Input is not validated.
         * @return bool
         */
        static function quickIsNFC( $string ) {
@@ -237,7 +237,7 @@ class UtfNormal {
        /**
         * Returns true if the string is _definitely_ in NFC.
         * Returns false if not or uncertain.
-        * @param $string String: a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
+        * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
         * @return bool
         */
        static function quickIsNFCVerify( &$string ) {
@@ -503,8 +503,8 @@ class UtfNormal {
         * (depending on which decomposition map is passed to us).
         * Input is assumed to be *valid* UTF-8. Invalid code will break.
         * @private
-        * @param $string String: valid UTF-8 string
-        * @param $map Array: hash of expanded decomposition map
+        * @param string $string valid UTF-8 string
+        * @param array $map hash of expanded decomposition map
         * @return string a UTF-8 string decomposed, not yet normalized (needs sorting)
         */
        static function fastDecompose( $string, $map ) {
@@ -564,7 +564,7 @@ class UtfNormal {
         * Sorts combining characters into canonical order. This is the
         * final step in creating decomposed normal forms D and KD.
         * @private
-        * @param $string String: a valid, decomposed UTF-8 string. Input is not validated.
+        * @param string $string a valid, decomposed UTF-8 string. Input is not validated.
         * @return string a UTF-8 string with combining characters sorted in canonical order
         */
        static function fastCombiningSort( $string ) {
@@ -616,7 +616,7 @@ 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.
+        * @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 ) {
@@ -762,7 +762,7 @@ class UtfNormal {
         * Function to replace some characters that we don't want
         * but most of the native normalize functions keep.
         *
-        * @param $string String The string
+        * @param string $string The string
         * @return String String with the character codes replaced.
         */
        private static function replaceForNativeNormalize( $string ) {
index bfad709..9b96a07 100644 (file)
@@ -71,7 +71,7 @@ function hexSequenceToUtf8( $sequence ) {
  * Take a UTF-8 string and return a space-separated series of hex
  * numbers representing Unicode code points. For debugging.
  *
- * @param $str String: UTF-8 string.
+ * @param string $str UTF-8 string.
  * @return string
  * @private
  */
@@ -114,7 +114,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;
        }
@@ -125,7 +125,7 @@ function utf8ToCodepoint( $char ) {
 /**
  * Escape a string for inclusion in a PHP single-quoted string literal.
  *
- * @param $string String: string to be escaped.
+ * @param string $string string to be escaped.
  * @return String: escaped string.
  * @public
  */
index 6c558ce..3fb8083 100644 (file)
@@ -90,8 +90,8 @@ class APCBagOStuff extends BagOStuff {
        /**
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
index 1205ceb..dd74467 100644 (file)
@@ -65,7 +65,7 @@ abstract class BagOStuff {
         * Set an item.
         * @param $key string
         * @param $value mixed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @return bool success
         */
        abstract public function set( $key, $value, $exptime = 0 );
@@ -75,7 +75,7 @@ abstract class BagOStuff {
         * @param $casToken mixed
         * @param $key string
         * @param $value mixed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @return bool success
         */
        abstract public function cas( $casToken, $key, $value, $exptime = 0 );
@@ -83,7 +83,7 @@ abstract class BagOStuff {
        /**
         * Delete an item.
         * @param $key string
-        * @param $time int Amount of time to delay the operation (mostly memcached-specific)
+        * @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
         */
        abstract public function delete( $key, $time = 0 );
@@ -95,8 +95,8 @@ abstract class BagOStuff {
         *
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
@@ -108,8 +108,8 @@ abstract class BagOStuff {
         *
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        protected function mergeViaCas( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
@@ -137,8 +137,8 @@ abstract class BagOStuff {
         *
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        protected function mergeViaLock( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
@@ -174,10 +174,10 @@ abstract class BagOStuff {
                        return true;
                }
 
-               $uRTT  = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
+               $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
                $sleep = 2*$uRTT; // rough time to do get()+set()
 
-               $locked   = false; // lock acquired
+               $locked = false; // lock acquired
                $attempts = 0; // failed attempts
                do {
                        if ( ++$attempts >= 3 && $sleep <= 1e6 ) {
@@ -202,7 +202,7 @@ abstract class BagOStuff {
 
        /**
         * Delete all objects expiring before a certain date.
-        * @param $date string The reference date in MW format
+        * @param string $date The reference date in MW format
         * @param $progressCallback callback|bool Optional, a function which will be called
         *     regularly during long-running operations with the percentage progress
         *     as the first parameter.
@@ -218,7 +218,7 @@ abstract class BagOStuff {
 
        /**
         * Get an associative array containing the item for each of the keys that have items.
-        * @param $keys Array List of strings
+        * @param array $keys List of strings
         * @return Array
         */
        public function getMulti( array $keys ) {
@@ -260,7 +260,7 @@ abstract class BagOStuff {
 
        /**
         * Increase stored value of $key by $value while preserving its TTL
-        * @param $key String: Key to increase
+        * @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
         */
index 51ce777..c82b3aa 100644 (file)
@@ -251,7 +251,7 @@ class DBABagOStuff extends BagOStuff {
 
                # Insert failed, check to see if it failed due to an expired key
                if ( !$ret ) {
-                       list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
+                       list( , $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
 
                        if ( $expiry && $expiry < time() ) {
                                # Yes expired, delete and try again
index cc57ff1..6206057 100644 (file)
@@ -70,8 +70,8 @@ class EmptyBagOStuff extends BagOStuff {
        /**
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
index 4f8209d..3f1fa3a 100644 (file)
@@ -99,7 +99,7 @@ class MemcachedBagOStuff extends BagOStuff {
        /**
         * @param $key string
         * @param $value int
-        * @param $exptime int (default 0)
+        * @param int $exptime (default 0)
         * @return Mixed
         */
        public function add( $key, $value, $exptime = 0 ) {
index 2342d63..0d96ed6 100644 (file)
@@ -99,7 +99,6 @@ class MWMemcached {
 
        // }}}
 
-
        /**
         * Command statistics
         *
@@ -242,7 +241,7 @@ class MWMemcached {
        /**
         * Memcache initializer
         *
-        * @param $args Array Associative array of settings
+        * @param array $args Associative array of settings
         *
         * @return  mixed
         */
@@ -272,7 +271,7 @@ class MWMemcached {
         * Adds a key/value to the memcache server if one isn't already set with
         * that key
         *
-        * @param $key String: key to set with data
+        * @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
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
@@ -292,7 +291,7 @@ class MWMemcached {
        /**
         * Decrease a value stored on the memcache server
         *
-        * @param $key String: key to decrease
+        * @param string $key key to decrease
         * @param $amt Integer: (optional) amount to decrease
         *
         * @return Mixed: FALSE on failure, value on success
@@ -307,7 +306,7 @@ class MWMemcached {
        /**
         * Deletes a key from the server, optionally after $time
         *
-        * @param $key String: key to delete
+        * @param string $key key to delete
         * @param $time Integer: (optional) how long to wait before deleting
         *
         * @return Boolean: TRUE on success, FALSE on failure
@@ -407,7 +406,7 @@ class MWMemcached {
        /**
         * Retrieves the value associated with the key from the memcache server
         *
-        * @param $key array|string key to retrieve
+        * @param array|string $key key to retrieve
         * @param $casToken[optional] Float
         *
         * @return Mixed
@@ -467,7 +466,7 @@ class MWMemcached {
        /**
         * Get multiple keys from the server(s)
         *
-        * @param $keys Array: keys to retrieve
+        * @param array $keys keys to retrieve
         *
         * @return Array
         */
@@ -531,7 +530,7 @@ class MWMemcached {
        /**
         * Increments $key (optionally) by $amt
         *
-        * @param $key String: key to increment
+        * @param string $key key to increment
         * @param $amt Integer: (optional) amount to increment
         *
         * @return Integer: null if the key does not exist yet (this does NOT
@@ -548,7 +547,7 @@ class MWMemcached {
        /**
         * Overwrites an existing value for key; only works if key is already set
         *
-        * @param $key String: key to set value as
+        * @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
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
@@ -570,7 +569,7 @@ class MWMemcached {
         * output as an array (null array if no output)
         *
         * @param $sock Resource: socket to send command on
-        * @param $cmd String: command to run
+        * @param string $cmd command to run
         *
         * @return Array: output array
         */
@@ -604,7 +603,7 @@ class MWMemcached {
         * Unconditionally sets a key to a given value in the memcache.  Returns true
         * if set successfully.
         *
-        * @param $key String: key to set value as
+        * @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
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
@@ -626,7 +625,7 @@ class MWMemcached {
         * to a known, given value.  Returns true if set successfully.
         *
         * @param $casToken Float: current known value
-        * @param $key String: key to set value as
+        * @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
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
@@ -672,7 +671,7 @@ class MWMemcached {
        /**
         * Sets the server list to distribute key gets and puts between
         *
-        * @param $list Array of servers to connect to
+        * @param array $list of servers to connect to
         *
         * @see     MWMemcached::__construct()
         */
@@ -707,7 +706,7 @@ class MWMemcached {
        /**
         * Close the specified socket
         *
-        * @param $sock String: socket to close
+        * @param string $sock socket to close
         *
         * @access  private
         */
@@ -724,7 +723,7 @@ class MWMemcached {
         * Connects $sock to $host, timing out after $timeout
         *
         * @param $sock Integer: socket to connect
-        * @param $host String: Host:IP to connect to
+        * @param string $host Host:IP to connect to
         *
         * @return  boolean
         * @access  private
@@ -766,7 +765,7 @@ class MWMemcached {
        /**
         * Marks a host as dead until 30-40 seconds in the future
         *
-        * @param $sock String: socket to mark as dead
+        * @param string $sock socket to mark as dead
         *
         * @access  private
         */
@@ -792,7 +791,7 @@ class MWMemcached {
        /**
         * get_sock
         *
-        * @param $key String: key to retrieve value for;
+        * @param string $key key to retrieve value for;
         *
         * @return Mixed: resource on success, false on failure
         * @access private
@@ -841,7 +840,7 @@ class MWMemcached {
        /**
         * Creates a hash integer based on the $key
         *
-        * @param $key String: key to hash
+        * @param string $key key to hash
         *
         * @return Integer: hash value
         * @access private
@@ -859,8 +858,8 @@ class MWMemcached {
        /**
         * Perform increment/decriment on $key
         *
-        * @param $cmd String command to perform
-        * @param $key String|array key to perform it on
+        * @param string $cmd command to perform
+        * @param string|array $key key to perform it on
         * @param $amt Integer amount to adjust
         *
         * @return Integer: new value of $key
@@ -901,41 +900,78 @@ class MWMemcached {
         * Load items into $ret from $sock
         *
         * @param $sock Resource: socket to read from
-        * @param $ret Array: returned values
+        * @param array $ret returned values
         * @param $casToken[optional] Float
         * @return boolean True for success, false for failure
         *
         * @access private
         */
        function _load_items( $sock, &$ret, &$casToken = null ) {
+               $results = array();
+
                while ( 1 ) {
                        $decl = $this->_fgets( $sock );
+
                        if( $decl === false ) {
+                               /*
+                                * If nothing can be read, something is wrong because we know exactly when
+                                * to stop reading (right after "END") and we return right after that.
+                                */
                                return false;
-                       } elseif ( $decl == "END" ) {
-                               return true;
                        } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
-                               list( $rkey, $flags, $len, $casToken ) = array( $match[1], $match[2], $match[3], $match[4] );
-                               $data = $this->_fread( $sock, $len + 2 );
-                               if ( $data === false ) {
-                                       return false;
-                               }
-                               if ( substr( $data, -2 ) !== "\r\n" ) {
-                                       $this->_handle_error( $sock,
-                                               'line ending missing from data block from $1' );
+                               /*
+                                * Read all data returned. This can be either one or multiple values.
+                                * Save all that data (in an array) to be processed later: we'll first
+                                * want to continue reading until "END" before doing anything else,
+                                * to make sure that we don't leave our client in a state where it's
+                                * output is not yet fully read.
+                                */
+                               $results[] = array(
+                                       $match[1], // rkey
+                                       $match[2], // flags
+                                       $match[3], // len
+                                       $match[4], // casToken
+                                       $this->_fread( $sock, $match[3] + 2 ), // data
+                               );
+                       } elseif ( $decl == "END" ) {
+                               if ( count( $results ) == 0 ) {
                                        return false;
                                }
-                               $data = substr( $data, 0, -2 );
-                               $ret[$rkey] = $data;
 
-                               if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
-                                       $ret[$rkey] = gzuncompress( $ret[$rkey] );
-                               }
+                               /**
+                                * All data has been read, time to process the data and build
+                                * meaningful return values.
+                                */
+                               foreach ( $results as $vars ) {
+                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+                                               $this->_handle_error( $sock,
+                                                       'line ending missing from data block from $1' );
+                                               return false;
+                                       }
+                                       $data = substr( $data, 0, -2 );
+                                       $ret[$rkey] = $data;
+
+                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
+                                       }
 
-                               if ( $flags & self::SERIALIZED ) {
-                                       $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       /*
+                                        * This unserialize is the exact reason that we only want to
+                                        * process data after having read until "END" (instead of doing
+                                        * this right away): "unserialize" can trigger outside code:
+                                        * in the event that $ret[$rkey] is a serialized object,
+                                        * unserializing it will trigger __wakeup() if present. If that
+                                        * function attempted to read from memcached (while we did not
+                                        * yet read "END"), these 2 calls would collide.
+                                        */
+                                       if ( $flags & self::SERIALIZED ) {
+                                               $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       }
                                }
 
+                               return true;
                        } else {
                                $this->_handle_error( $sock, 'Error parsing response from $1' );
                                return false;
@@ -949,8 +985,8 @@ class MWMemcached {
        /**
         * Performs the requested storage operation to the memcache server
         *
-        * @param $cmd String: command to perform
-        * @param $key String: key to act on
+        * @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
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
@@ -1032,7 +1068,7 @@ class MWMemcached {
        /**
         * Returns the socket for the host
         *
-        * @param $host String: Host:IP to get socket for
+        * @param string $host Host:IP to get socket for
         *
         * @return Mixed: IO Stream or false
         * @access private
@@ -1211,7 +1247,6 @@ class MWMemcached {
        // }}}
 }
 
-
 // }}}
 
 class MemCachedClientforWiki extends MWMemcached {
index 9f06fa0..3192429 100644 (file)
@@ -47,7 +47,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                if ( $params['persistent'] ) {
                        // The pool ID must be unique to the server/option combination.
                        // The Memcached object is essentially shared for each pool ID.
-                       // We can only resuse a pool ID if we keep the config consistent.
+                       // We can only reuse a pool ID if we keep the config consistent.
                        $this->client = new Memcached( md5( serialize( $params ) ) );
                        if ( count( $this->client->getServerList() ) ) {
                                wfDebug( __METHOD__ . ": persistent Memcached object already loaded.\n" );
@@ -206,7 +206,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * the client, but some day we might find a case where it should be
         * different.
         *
-        * @param $key string The key used by the caller, or false if there wasn't one.
+        * @param string $key The key used by the caller, or false if there wasn't one.
         * @param $result Mixed The return value
         * @return Mixed
         */
index 4120749..92afaac 100644 (file)
@@ -171,8 +171,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        /**
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
index f55da94..bc76294 100644 (file)
@@ -58,7 +58,7 @@ class ObjectCacheSessionHandler {
        /**
         * Get a cache key for the given session id.
         *
-        * @param $id String: session id
+        * @param string $id session id
         * @return String: cache key
         */
        static function getKey( $id ) {
@@ -89,7 +89,7 @@ class ObjectCacheSessionHandler {
        /**
         * Callback when reading session data.
         *
-        * @param $id String: session id
+        * @param string $id session id
         * @return Mixed: session data
         */
        static function read( $id ) {
@@ -103,7 +103,7 @@ class ObjectCacheSessionHandler {
        /**
         * Callback when writing session data.
         *
-        * @param $id String: session id
+        * @param string $id session id
         * @param $data Mixed: session data
         * @return Boolean: success
         */
@@ -116,7 +116,7 @@ class ObjectCacheSessionHandler {
        /**
         * Callback to destroy a session when calling session_destroy().
         *
-        * @param $id String: session id
+        * @param string $id session id
         * @return Boolean: success
         */
        static function destroy( $id ) {
index a9f5f8c..f9feaf9 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+
 class RedisBagOStuff extends BagOStuff {
        /** @var RedisConnectionPool */
        protected $redisPool;
index 5cc02d3..87f787d 100644 (file)
@@ -133,7 +133,7 @@ class SqlBagOStuff extends BagOStuff {
                        } else {
                                /*
                                 * We must keep a separate connection to MySQL in order to avoid deadlocks
-                                * However, SQLite has an opposite behaviour. And PostgreSQL needs to know
+                                * However, SQLite has an opposite behavior. And PostgreSQL needs to know
                                 * if we are in transaction or no
                                 */
                                if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
@@ -359,7 +359,7 @@ class SqlBagOStuff extends BagOStuff {
                        );
                        $db->commit( __METHOD__ );
                } catch ( DBQueryError $e ) {
-                       $this->handleWriteError( $e );
+                       $this->handleWriteError( $e, $serverIndex );
 
                        return false;
                }
index 83f51f9..6d9b47a 100644 (file)
@@ -32,7 +32,7 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Get a value from the WinCache object cache
         *
-        * @param $key String: cache key
+        * @param string $key cache key
         * @param $casToken[optional] int: cas token
         * @return mixed
         */
@@ -51,9 +51,9 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Store a value in the WinCache object cache
         *
-        * @param $key String: cache key
+        * @param string $key cache key
         * @param $value Mixed: object to store
-        * @param $expire Int: expiration time
+        * @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 $casToken int: cas token
-        * @param $key String: cache key
-        * @param $value int: object to store
-        * @param $exptime Int: 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 $key String: cache key
-        * @param $time Int: 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 2722e9c..0f45db7 100644 (file)
@@ -31,7 +31,7 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Get a value from the XCache object cache
         *
-        * @param $key String: cache key
+        * @param string $key cache key
         * @param $casToken mixed: cas token
         * @return mixed
         */
@@ -54,9 +54,9 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Store a value in the XCache object cache
         *
-        * @param $key String: cache key
+        * @param string $key cache key
         * @param $value Mixed: object to store
-        * @param $expire Int: expiration time
+        * @param int $expire expiration time
         * @return bool
         */
        public function set( $key, $value, $expire = 0 ) {
@@ -83,8 +83,8 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Remove a value from the XCache object cache
         *
-        * @param $key String: cache key
-        * @param $time Int: 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 ) {
@@ -99,8 +99,8 @@ class XCacheBagOStuff extends BagOStuff {
         *
         * @param $key string
         * @param $callback closure Callback method to be executed
-        * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
-        * @param $attempts int The amount of times to attempt a merge in case of failure
+        * @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
         */
        public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
index 881dded..6b70e1d 100644 (file)
@@ -116,7 +116,7 @@ class CacheTime {
         * per-article cache invalidation timestamps, or if it comes from
         * an incompatible older version.
         *
-        * @param $touched String: the affected article's last touched timestamp
+        * @param string $touched the affected article's last touched timestamp
         * @return Boolean
         */
        public function expired( $touched ) {
index a1b7ca0..542ac0f 100644 (file)
@@ -175,8 +175,8 @@ class CoreParserFunctions {
         * For links to "wiki"s, or similar software, spaces are encoded as '_',
         *
         * @param $parser Parser object
-        * @param $s String: The text to encode.
-        * @param $arg String (optional): The type of encoding.
+        * @param string $s The text to encode.
+        * @param string $arg (optional): The type of encoding.
         * @return string
         */
        static function urlencode( $parser, $s = '', $arg = null ) {
@@ -353,7 +353,7 @@ class CoreParserFunctions {
         * title which will normalise to the canonical title
         *
         * @param $parser Parser: parent parser
-        * @param $text String: desired title text
+        * @param string $text desired title text
         * @return String
         */
        static function displaytitle( $parser, $text = '' ) {
@@ -442,7 +442,6 @@ class CoreParserFunctions {
                return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
        }
 
-
        /**
         * Given a title, return the namespace name that would be given by the
         * corresponding magic word
@@ -646,7 +645,7 @@ class CoreParserFunctions {
         * @todo Document parameters
         *
         * @param $parser Parser
-        * @param $page String TODO DOCUMENT (Default: empty string)
+        * @param string $page TODO DOCUMENT (Default: empty string)
         * @param $raw TODO DOCUMENT (Default: null)
         * @return string
         */
@@ -700,8 +699,8 @@ class CoreParserFunctions {
        /**
         * Gives language names.
         * @param $parser Parser
-        * @param $code String  Language code (of which to get name)
-        * @param $inLanguage String  Language code (in which to get name)
+        * @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 = '' ) {
@@ -773,8 +772,8 @@ class CoreParserFunctions {
 
        /**
         * @param $parser Parser
-        * @param $text String The sortkey to use
-        * @param $uarg String Either "noreplace" or "noerror" (in en)
+        * @param string $text The sortkey to use
+        * @param string $uarg Either "noreplace" or "noerror" (in en)
         *   both suppress errors, and noreplace does nothing if
         *   a default sortkey already exists.
         * @return string
index 88d68a7..a2da307 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /**
- * Date formatter, recognises dates in plain text and formats them accoding to user preferences.
+ * Date formatter, recognises dates in plain text and formats them according to user preferences.
  * @todo preferences, OutputPage
  * @ingroup Parser
  */
@@ -55,7 +55,7 @@ class DateFormatter {
                $this->lang = $lang;
 
                $this->monthNames = $this->getMonthRegex();
-               for ( $i=1; $i<=12; $i++ ) {
+               for ( $i = 1; $i <= 12; $i++ ) {
                        $this->xMonths[$this->lang->lc( $this->lang->getMonthName( $i ) )] = $i;
                        $this->xMonths[$this->lang->lc( $this->lang->getMonthAbbreviation( $i ) )] = $i;
                }
@@ -140,9 +140,9 @@ class DateFormatter {
        }
 
        /**
-        * @param $preference String: User preference
-        * @param $text String: Text to reformat
-        * @param $options Array: can contain 'linked' and/or 'match-whole'
+        * @param string $preference User preference
+        * @param string $text Text to reformat
+        * @param array $options can contain 'linked' and/or 'match-whole'
         * @return mixed|String
         */
        function reformat( $preference, $text, $options = array( 'linked' ) ) {
@@ -154,7 +154,7 @@ class DateFormatter {
                } else {
                        $preference = self::NONE;
                }
-               for ( $i=1; $i<=self::LAST; $i++ ) {
+               for ( $i = 1; $i <= self::LAST; $i++ ) {
                        $this->mSource = $i;
                        if ( isset ( $this->rules[$preference][$i] ) ) {
                                # Specific rules
@@ -203,7 +203,7 @@ class DateFormatter {
 
                $bits = array();
                $key = $this->keys[$this->mSource];
-               for ( $p=0; $p < strlen( $key ); $p++ ) {
+               for ( $p = 0; $p < strlen( $key ); $p++ ) {
                        if ( $key[$p] != ' ' ) {
                                $bits[$key[$p]] = $matches[$p+1];
                        }
@@ -250,7 +250,7 @@ class DateFormatter {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
 
-               for ( $p=0; $p < strlen( $format ); $p++ ) {
+               for ( $p = 0; $p < strlen( $format ); $p++ ) {
                        $char = $format[$p];
                        switch ( $char ) {
                                case 'd': # ISO day of month
@@ -321,7 +321,7 @@ class DateFormatter {
 
        /**
         * Makes an ISO month, e.g. 02, from a month name
-        * @param $monthName String: month name
+        * @param string $monthName month name
         * @return string ISO month name
         */
        function makeIsoMonth( $monthName ) {
@@ -331,7 +331,7 @@ class DateFormatter {
 
        /**
         * @todo document
-        * @param $year String: Year name
+        * @param string $year Year name
         * @return string ISO year name
         */
        function makeIsoYear( $year ) {
index ff1e0af..49b2d33 100644 (file)
@@ -111,7 +111,7 @@ class LinkHolderArray {
         * strings will be returned.
         *
         * @param $other LinkHolderArray
-        * @param $texts Array of strings
+        * @param array $texts of strings
         * @return Array
         */
        function mergeForeign( $other, $texts ) {
@@ -210,9 +210,9 @@ class LinkHolderArray {
         *
         * @param $nt Title
         * @param $text String
-        * @param $query Array [optional]
-        * @param $trail String [optional]
-        * @param $prefix String [optional]
+        * @param array $query [optional]
+        * @param string $trail [optional]
+        * @param string $prefix [optional]
         * @return string
         */
        function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
@@ -513,7 +513,6 @@ class LinkHolderArray {
                        }
                }
 
-
                if( !$linkBatch->isEmpty() ) {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
@@ -614,7 +613,7 @@ class LinkHolderArray {
         */
        function replaceTextCallback( $matches ) {
                $type = $matches[1];
-               $key  = $matches[2];
+               $key = $matches[2];
                if( $type == 'LINK' ) {
                        list( $ns, $index ) = explode( ':', $key, 2 );
                        if( isset( $this->internals[$ns][$index]['text'] ) ) {
index ed5071e..7f21449 100644 (file)
@@ -122,8 +122,8 @@ class Parser {
        var $mFunctionHooks = array();
        var $mFunctionSynonyms = array( 0 => array(), 1 => array() );
        var $mFunctionTagHooks = array();
-       var $mStripList  = array();
-       var $mDefaultStripList  = array();
+       var $mStripList = array();
+       var $mDefaultStripList = array();
        var $mVarCache = array();
        var $mImageParams = array();
        var $mImageParamsMagicArray = array();
@@ -305,12 +305,11 @@ class Parser {
                 * string constructs.
                 *
                 * Must not consist of all title characters, or else it will change
-                * the behaviour of <nowiki> in a link.
+                * the behavior of <nowiki> in a link.
                 */
                $this->mUniqPrefix = "\x7fUNIQ" . self::getRandomString();
                $this->mStripState = new StripState( $this->mUniqPrefix );
 
-
                # Clear these on every parse, bug 4549
                $this->mTplExpandCache = $this->mTplRedirCache = $this->mTplDomCache = array();
 
@@ -341,12 +340,12 @@ class Parser {
         * Convert wikitext to HTML
         * Do not call this function recursively.
         *
-        * @param $text String: text we want to parse
+        * @param string $text text we want to parse
         * @param $title Title object
         * @param $options ParserOptions
         * @param $linestart boolean
         * @param $clearState boolean
-        * @param $revid Int: number to pass in {{REVISIONID}}
+        * @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 ) {
@@ -527,7 +526,7 @@ class Parser {
         *
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
-        * @param $text String: text extension wants to have parsed
+        * @param string $text text extension wants to have parsed
         * @param $frame PPFrame: The frame to use for expanding any template variables
         *
         * @return string
@@ -564,7 +563,7 @@ class Parser {
         * Recursive parser entry point that can be called from an extension tag
         * hook.
         *
-        * @param $text String: text to be expanded
+        * @param string $text text to be expanded
         * @param $frame PPFrame: The frame to use for expanding any template variables
         * @return String
         * @since 1.19
@@ -694,7 +693,7 @@ class Parser {
        /**
         * Accessor/mutator for the output type
         *
-        * @param $x int|null New value or null to just get the current one
+        * @param int|null $x New value or null to just get the current one
         * @return Integer
         */
        function OutputType( $x = null ) {
@@ -821,9 +820,9 @@ class Parser {
         *     '<element param="x">tag content</element>' ) )
         * @endcode
         *
-        * @param $elements array list of element names. Comments are always extracted.
-        * @param $text string Source text string.
-        * @param $matches array Out parameter, Array: extracted tags
+        * @param array $elements list of element names. Comments are always extracted.
+        * @param string $text Source text string.
+        * @param array $matches Out parameter, Array: extracted tags
         * @param $uniq_prefix string
         * @return String: stripped text
         */
@@ -843,16 +842,16 @@ class Parser {
                        }
                        if ( count( $p ) > 5 ) {
                                # comment
-                               $element    = $p[4];
+                               $element = $p[4];
                                $attributes = '';
-                               $close      = '';
-                               $inside     = $p[5];
+                               $close = '';
+                               $inside = $p[5];
                        } else {
                                # tag
-                               $element    = $p[1];
+                               $element = $p[1];
                                $attributes = $p[2];
-                               $close      = $p[3];
-                               $inside     = $p[4];
+                               $close = $p[3];
+                               $inside = $p[4];
                        }
 
                        $marker = "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
@@ -1005,7 +1004,7 @@ 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 = '+';
@@ -1314,7 +1313,6 @@ class Parser {
                return $text . $trail;
        }
 
-
        /**
         * Parse headers and return html
         *
@@ -1542,8 +1540,7 @@ class Parser {
                $i = 0;
                while ( $i<count( $bits ) ) {
                        $url = $bits[$i++];
-                       // @todo FIXME: Unused variable.
-                       $protocol = $bits[$i++];
+                       $i++; // protocol
                        $text = $bits[$i++];
                        $trail = $bits[$i++];
 
@@ -1605,7 +1602,7 @@ class Parser {
         * Get the rel attribute for a particular external link.
         *
         * @since 1.21
-        * @param $url String|bool 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
@@ -1626,7 +1623,7 @@ class Parser {
         * (depending on configuration, namespace, and the URL's domain) and/or a
         * target attribute (depending on configuration).
         *
-        * @param $url String|bool 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
         */
@@ -1952,7 +1949,7 @@ class Parser {
                                wfProfileOut( __METHOD__ . "-might_be_img" );
                        }
 
-                       $wasblank = ( $text  == '' );
+                       $wasblank = ( $text == '' );
                        if ( $wasblank ) {
                                $text = $link;
                        } else {
@@ -2092,7 +2089,7 @@ class Parser {
         *
         * @param $nt Title
         * @param $text String
-        * @param $query Array or String
+        * @param array $query or String
         * @param $trail String
         * @param $prefix String
         * @return String: HTML-wikitext mix oh yuck
@@ -2119,7 +2116,7 @@ class Parser {
         * Not needed quite as much as it used to be since free links are a bit
         * more sensible these days. But bracketed links are still an issue.
         *
-        * @param $text String: more-or-less HTML
+        * @param string $text more-or-less HTML
         * @return String: less-or-more HTML with NOPARSE bits
         */
        function armorLinks( $text ) {
@@ -2139,7 +2136,7 @@ class Parser {
        /**
         * Handle link to subpage if necessary
         *
-        * @param $target String: the source of the link
+        * @param string $target the source of the link
         * @param &$text String: the link text, modified as necessary
         * @return string the full name of the link
         * @private
@@ -2459,7 +2456,7 @@ class Parser {
         * Split up a string on ':', ignoring any occurrences inside tags
         * to prevent illegal overlapping.
         *
-        * @param $str String the string to split
+        * @param string $str the string to split
         * @param &$before String set to everything before the ':'
         * @param &$after String set to everything after the ':'
         * @throws MWException
@@ -2988,7 +2985,7 @@ class Parser {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of replace_variables().
         *
-        * @param $text String: The text to parse
+        * @param string $text The text to parse
         * @param $flags Integer: bitwise combination of:
         *          self::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
         *                                     included. Default is to assume a direct page view.
@@ -3043,7 +3040,7 @@ class Parser {
         *  self::OT_PREPROCESS: templates but not extension tags
         *  self::OT_HTML: all templates and extension tags
         *
-        * @param $text String the text to transform
+        * @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.
@@ -3107,7 +3104,7 @@ class Parser {
         * Warn the user when a parser limitation is reached
         * Will warn at most once the user per limitation type
         *
-        * @param $limitationType String: should be one of:
+        * @param string $limitationType should be one of:
         *   'expensive-parserfunction' (corresponding messages:
         *       'expensive-parserfunction-warning',
         *       'expensive-parserfunction-category')
@@ -3117,8 +3114,8 @@ class Parser {
         *   'post-expand-template-inclusion' (corresponding messages:
         *       'post-expand-template-inclusion-warning',
         *       'post-expand-template-inclusion-category')
-        * @param $current int|null Current value
-        * @param $max int|null Maximum allowed, when an explicit limit has been
+        * @param int|null $current Current value
+        * @param int|null $max Maximum allowed, when an explicit limit has been
         *       exceeded, provide the values (optional)
         */
        function limitationWarn( $limitationType, $current = '', $max = '' ) {
@@ -3133,7 +3130,7 @@ class Parser {
         * Return the text of a template, after recursively
         * replacing any variables or templates within the template.
         *
-        * @param $piece Array: the parts of 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
@@ -3471,7 +3468,7 @@ class Parser {
                {
                        # Bug 529: if the template begins with a table or block-level
                        # element, it should be treated as beginning a new line.
-                       # This behaviour is somewhat controversial.
+                       # This behavior is somewhat controversial.
                        $text = "\n" . $text;
                }
 
@@ -3658,7 +3655,7 @@ class Parser {
         * Fetch a file and its title and register a reference to it.
         * 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
+        * @param array $options Array of options to RepoGroup::findFile
         * @return File|bool
         */
        function fetchFile( $title, $options = array() ) {
@@ -3670,7 +3667,7 @@ class Parser {
         * Fetch a file and its title and register a reference to it.
         * 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
+        * @param array $options Array of options to RepoGroup::findFile
         * @return Array ( File or false, Title of file )
         */
        function fetchFileAndTitle( $title, $options = array() ) {
@@ -3808,7 +3805,7 @@ class Parser {
         * Return the text to be used for a given extension tag.
         * This is the ghost of strip().
         *
-        * @param $params array Associative array of parameters:
+        * @param array $params Associative array of parameters:
         *     name       PPNode for the tag name
         *     attr       PPNode for unparsed text where tag attributes are thought to be
         *     attributes Optional associative array of parsed attributes
@@ -3847,7 +3844,7 @@ class Parser {
                                $output = call_user_func_array( $this->mTagHooks[$name],
                                        array( $content, $attributes, $this, $frame ) );
                        } elseif ( isset( $this->mFunctionTagHooks[$name] ) ) {
-                               list( $callback, $flags ) = $this->mFunctionTagHooks[$name];
+                               list( $callback, ) = $this->mFunctionTagHooks[$name];
                                if ( !is_callable( $callback ) ) {
                                        throw new MWException( "Tag hook for $name is not callable\n" );
                                }
@@ -3898,7 +3895,7 @@ class Parser {
        /**
         * Increment an include size counter
         *
-        * @param $type String: the type of expansion
+        * @param string $type the type of expansion
         * @param $size Integer: the size of the text
         * @return Boolean: false if this inclusion would take it over the maximum, true otherwise
         */
@@ -3984,7 +3981,7 @@ class Parser {
         * Add a tracking category, getting the title from a system message,
         * or print a debug message if the title is invalid.
         *
-        * @param $msg String: message key
+        * @param string $msg message key
         * @return Boolean: whether the addition was successful
         */
        public function addTrackingCategory( $msg ) {
@@ -4024,7 +4021,7 @@ class Parser {
         * string and re-inserts the newly formatted headlines.
         *
         * @param $text String
-        * @param $origText String: original, untouched wikitext
+        * @param string $origText original, untouched wikitext
         * @param $isMain Boolean
         * @return mixed|string
         * @private
@@ -4120,7 +4117,7 @@ class Parser {
                                # Increase TOC level
                                $toclevel++;
                                $sublevelCount[$toclevel] = 0;
-                               if ( $toclevel<$wgMaxTocLevel ) {
+                               if ( $toclevel < $wgMaxTocLevel ) {
                                        $prevtoclevel = $toclevel;
                                        $toc .= Linker::tocIndent();
                                        $numVisible++;
@@ -4142,7 +4139,7 @@ class Parser {
                                if ( $i == 0 ) {
                                        $toclevel = 1;
                                }
-                               if ( $toclevel<$wgMaxTocLevel ) {
+                               if ( $toclevel < $wgMaxTocLevel ) {
                                        if ( $prevtoclevel < $wgMaxTocLevel ) {
                                                # Unindent only if the previous toc level was shown :p
                                                $toc .= Linker::tocUnindent( $prevtoclevel - $toclevel );
@@ -4153,7 +4150,7 @@ class Parser {
                                }
                        } else {
                                # No change in level, end TOC line
-                               if ( $toclevel<$wgMaxTocLevel ) {
+                               if ( $toclevel < $wgMaxTocLevel ) {
                                        $toc .= Linker::tocLineEnd();
                                }
                        }
@@ -4401,7 +4398,7 @@ class Parser {
         * Transform wiki markup when saving a page by doing "\r\n" -> "\n"
         * conversion, substitting signatures, {{subst:}} templates, etc.
         *
-        * @param $text String: the text to transform
+        * @param string $text the text to transform
         * @param $title Title: the Title object for the current article
         * @param $user User: the User object describing the current user
         * @param $options ParserOptions: parsing options
@@ -4524,7 +4521,7 @@ class Parser {
         * as it may have changed if it's the $wgParser.
         *
         * @param $user User
-        * @param $nickname String|bool nickname to use or false to use user's default nickname
+        * @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
         * @return string
@@ -4587,7 +4584,7 @@ class Parser {
         * 2) Substitute all transclusions
         *
         * @param $text String
-        * @param $parsing bool Whether we're cleaning (preferences save) or parsing
+        * @param bool $parsing Whether we're cleaning (preferences save) or parsing
         * @return String: signature text
         */
        public function cleanSig( $text, $parsing = false ) {
@@ -4662,7 +4659,7 @@ class Parser {
        /**
         * Wrapper for preprocess()
         *
-        * @param $text String: the text to preprocess
+        * @param string $text the text to preprocess
         * @param $options ParserOptions: options
         * @param $title Title object or null to use $wgTitle
         * @return String
@@ -4780,7 +4777,7 @@ class Parser {
         *   nowiki                    Wiki markup in the return value should be escaped
         *   isHTML                    The returned text is HTML, armour it against wikitext transformation
         *
-        * @param $id String: The magic word ID
+        * @param string $id The magic word ID
         * @param $callback Mixed: the callback function (and object) to use
         * @param $flags Integer: a combination of the following flags:
         *     SFH_NO_HASH   No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
@@ -5358,8 +5355,8 @@ class Parser {
         *
         * External callers should use the getSection and replaceSection methods.
         *
-        * @param $text String: Page wikitext
-        * @param $section String: a section identifier string of the form:
+        * @param string $text Page wikitext
+        * @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
@@ -5376,8 +5373,8 @@ class Parser {
         * string. If $text is the empty string and section 0 is replaced, $newText is
         * returned.
         *
-        * @param $mode String: one of "get" or "replace"
-        * @param $newText String: replacement text for section data.
+        * @param string $mode one of "get" or "replace"
+        * @param string $newText replacement text for section data.
         * @return String: for "get", the extracted section text.
         *                 for "replace", the whole page with the section replaced.
         */
@@ -5497,9 +5494,9 @@ class Parser {
         *
         * If a section contains subsections, these are also returned.
         *
-        * @param $text String: text to look in
-        * @param $section String: section identifier
-        * @param $deftext String: default to return if section is not found
+        * @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 = '' ) {
@@ -5511,9 +5508,9 @@ class Parser {
         * specified by $section has been replaced with $text. If the target
         * section does not exist, $oldtext is returned unchanged.
         *
-        * @param $oldtext String: former text of the article
-        * @param $section int section identifier
-        * @param $text String: replacing text
+        * @param string $oldtext former text of the article
+        * @param int $section section identifier
+        * @param string $text replacing text
         * @return String: modified text
         */
        public function replaceSection( $oldtext, $section, $text ) {
@@ -5595,7 +5592,7 @@ class Parser {
        /**
         * Mutator for $mDefaultSort
         *
-        * @param $sort string New value
+        * @param string $sort New value
         */
        public function setDefaultSort( $sort ) {
                $this->mDefaultSort = $sort;
@@ -5651,7 +5648,7 @@ class Parser {
         * instead.  For use in redirects, since IE6 interprets Redirect: headers
         * as something other than UTF-8 (apparently?), resulting in breakage.
         *
-        * @param $text String: The section name
+        * @param string $text The section name
         * @return string An anchor
         */
        public function guessLegacySectionNameFromWikiText( $text ) {
@@ -5671,7 +5668,7 @@ class Parser {
         * to create valid section anchors by mimicing the output of the
         * parser when headings are parsed.
         *
-        * @param $text String: 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
         */
@@ -5822,7 +5819,7 @@ class Parser {
         * If the $data array has been stored persistently, the caller should first
         * check whether it is still valid, by calling isValidHalfParsedText().
         *
-        * @param $data array Serialized data
+        * @param array $data Serialized data
         * @throws MWException
         * @return String
         */
index bd4bcac..3eb83e3 100644 (file)
@@ -505,7 +505,6 @@ class ParserOptions {
                        $confstr .= '*';
                }
 
-
                // Space assigned for the stubthreshold but unused
                // since it disables the parser cache, its value will always
                // be 0 when this function is called by parsercache.
index 27b75ac..db649f1 100644 (file)
@@ -156,8 +156,8 @@ class ParserOutput extends CacheTime {
        /**
         * Checks, if a url is pointing to the own server
         *
-        * @param $internal String the server to check against
-        * @param $url String 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 ) {
@@ -220,9 +220,9 @@ class ParserOutput extends CacheTime {
 
        /**
         * Register a file dependency for this output
-        * @param $name string Title dbKey
-        * @param $timestamp string MW timestamp of file creation (or false if non-existing)
-        * @param $sha1 string base 36 SHA-1 of file (or false if non-existing)
+        * @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)
         * @return void
         */
        function addImage( $name, $timestamp = null, $sha1 = null ) {
@@ -315,7 +315,7 @@ class ParserOutput extends CacheTime {
         * -- this is assumed to have been validated
         * (check equal normalisation, etc.)
         *
-        * @param $text String: desired title text
+        * @param string $text desired title text
         */
        public function setDisplayTitle( $text ) {
                $this->setTitleText( $text );
@@ -418,7 +418,6 @@ class ParserOutput extends CacheTime {
                return $this->mProperties;
        }
 
-
        /**
         * Returns the options from its ParserOptions which have been taken
         * into account to produce this output or false if not available.
index 687dceb..aeacd2e 100644 (file)
@@ -205,7 +205,6 @@ interface PPNode {
         */
        function getChildrenOfType( $type );
 
-
        /**
         * Returns the length of the array, or false if this is not an array-type node
         */
index 468802d..d0c57ab 100644 (file)
@@ -110,7 +110,7 @@ class Preprocessor_DOM implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param $text String: the text to parse
+        * @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.
@@ -522,7 +522,7 @@ class Preprocessor_DOM implements Preprocessor {
                                if ( $equalsLength > 0 ) {
                                        if ( $searchStart - $equalsLength == $piece->startPos ) {
                                                // This is just a single string of equals signs on its own line
-                                               // Replicate the doHeadings behaviour /={count}(.+)={count}/
+                                               // Replicate the doHeadings behavior /={count}(.+)={count}/
                                                // First find out how many equals signs there really are (don't stop at 6)
                                                $count = $equalsLength;
                                                if ( $count < 3 ) {
@@ -911,7 +911,6 @@ class PPFrame_DOM implements PPFrame {
         */
        var $depth;
 
-
        /**
         * Construct a new preprocessor frame.
         * @param $preprocessor Preprocessor The parent preprocessor
index c22da64..fad1adb 100644 (file)
@@ -89,7 +89,7 @@ class Preprocessor_Hash implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param $text String: the text to parse
+        * @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.
@@ -462,7 +462,7 @@ class Preprocessor_Hash implements Preprocessor {
                                if ( $equalsLength > 0 ) {
                                        if ( $searchStart - $equalsLength == $piece->startPos ) {
                                                // This is just a single string of equals signs on its own line
-                                               // Replicate the doHeadings behaviour /={count}(.+)={count}/
+                                               // Replicate the doHeadings behavior /={count}(.+)={count}/
                                                // First find out how many equals signs there really are (don't stop at 6)
                                                $count = $equalsLength;
                                                if ( $count < 3 ) {
@@ -861,7 +861,6 @@ class PPFrame_Hash implements PPFrame {
         */
        var $depth;
 
-
        /**
         * Construct a new preprocessor frame.
         * @param $preprocessor Preprocessor: the parent preprocessor
index 4994d3e..0f7e0d3 100644 (file)
@@ -118,7 +118,7 @@ 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 $text String: hideous HTML input
+        * @param string $text hideous HTML input
         * @return String: corrected HTML output
         */
        public static function tidy( $text ) {
@@ -171,7 +171,7 @@ class MWTidy {
         * Spawn an external HTML tidy process and get corrected markup back from it.
         * Also called in OutputHandler.php for full page validation
         *
-        * @param $text String: HTML to check
+        * @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
@@ -235,7 +235,7 @@ class MWTidy {
         * Use the HTML tidy extension to use the tidy library in-process,
         * saving the overhead of spawning a new process.
         *
-        * @param $text String: HTML to check
+        * @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
index 1ead836..5ecdc4f 100644 (file)
@@ -28,7 +28,7 @@
 
 /**
  * Begin profiling of a function
- * @param $functionname String: name of the function we will profile
+ * @param string $functionname name of the function we will profile
  */
 function wfProfileIn( $functionname ) {
        global $wgProfiler;
@@ -39,7 +39,7 @@ function wfProfileIn( $functionname ) {
 
 /**
  * Stop profiling of a function
- * @param $functionname String: name of the function we have profiled
+ * @param string $functionname name of the function we have profiled
  */
 function wfProfileOut( $functionname = 'missing' ) {
        global $wgProfiler;
@@ -250,7 +250,7 @@ class Profiler {
        /**
         * Recursive function the format the current profiling array into a tree
         *
-        * @param $stack array profiling array
+        * @param array $stack profiling array
         * @return array
         */
        function remapCallTree( $stack ) {
@@ -305,7 +305,7 @@ 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 $metric string|false: metric to use, with the following possibilities:
+        * @param string|false $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
@@ -338,7 +338,7 @@ 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 $metric string|false: metric to use, with the following possibilities:
+        * @param string|false $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
@@ -460,7 +460,7 @@ class Profiler {
 
                $width = 140;
                $nameWidth = $width - 65;
-               $format =      "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
+               $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' );
@@ -582,7 +582,7 @@ class Profiler {
        /**
         * Add an entry in the debug log file
         *
-        * @param $s String to output
+        * @param string $s to output
         */
        function debug( $s ) {
                if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
index 1322e47..1d4873c 100644 (file)
@@ -29,7 +29,7 @@
 class ProfilerSimple extends Profiler {
        var $mMinimumTime = 0;
 
-       var $zeroEntry = array( 'cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0 );
+       var $zeroEntry = array( 'cpu' => 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0 );
        var $errorEntry;
 
        public function isPersistent() {
index 5abe226..27f682c 100644 (file)
@@ -60,7 +60,7 @@ class ResourceLoader {
         * requests its own information. This sacrifice of modularity yields a substantial
         * performance improvement.
         *
-        * @param $modules Array: List of module names to preload information for
+        * @param array $modules List of module names to preload information for
         * @param $context ResourceLoaderContext: Context to load the information within
         */
        public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
@@ -127,8 +127,8 @@ class ResourceLoader {
         * If $data is empty, only contains whitespace or the filter was unknown,
         * $data is returned unmodified.
         *
-        * @param $filter String: Name of filter to run
-        * @param $data String: Text to filter, such as JavaScript or CSS text
+        * @param string $filter Name of filter to run
+        * @param string $data Text to filter, such as JavaScript or CSS text
         * @return String: Filtered data, or a comment containing an error message
         */
        protected function filter( $filter, $data ) {
@@ -210,7 +210,6 @@ class ResourceLoader {
                        $this->registerTestModules();
                }
 
-
                wfProfileOut( __METHOD__ );
        }
 
@@ -218,7 +217,7 @@ class ResourceLoader {
         * Registers a module with the ResourceLoader system.
         *
         * @param $name Mixed: Name of module as a string or List of name/object pairs as an array
-        * @param $info array Module info array. For backwards compatibility with 1.17alpha,
+        * @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
@@ -309,7 +308,7 @@ class ResourceLoader {
         * 'loadScript': URL (either fully-qualified or protocol-relative) of load.php for this source
         *
         * @param $id Mixed: source ID (string), or array( id1 => props1, id2 => props2, ... )
-        * @param $properties Array: source properties
+        * @param array $properties source properties
         * @throws MWException
         */
        public function addSource( $id, $properties = null) {
@@ -353,7 +352,7 @@ class ResourceLoader {
         * If the given framework id is unknkown, or if the in-object variable is not an array,
         * then it will return an empty array.
         *
-        * @param $framework String: Optional. Get only the test module names for one
+        * @param string $framework Optional. Get only the test module names for one
         * particular framework.
         * @return Array
         */
@@ -371,7 +370,7 @@ class ResourceLoader {
        /**
         * Get the ResourceLoaderModule object for a given module name.
         *
-        * @param $name String: Module name
+        * @param string $name Module name
         * @return ResourceLoaderModule if module has been registered, null otherwise
         */
        public function getModule( $name ) {
@@ -451,7 +450,7 @@ class ResourceLoader {
                                        $this->hasErrors = true;
                                        continue;
                                }
-                               $modules[$name] = $this->getModule( $name );
+                               $modules[$name] = $module;
                        } else {
                                $missing[] = $name;
                        }
@@ -531,8 +530,8 @@ class ResourceLoader {
        /**
         * Send content type and last modified headers to the client.
         * @param $context ResourceLoaderContext
-        * @param $mtime string TS_MW timestamp to use for last-modified
-        * @param $error bool Whether there are commented-out errors in the response
+        * @param string $mtime TS_MW timestamp to use for last-modified
+        * @param bool $error Whether there are commented-out errors in the response
         * @return void
         */
        protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) {
@@ -541,12 +540,12 @@ class ResourceLoader {
                // to propagate to clients quickly
                // If there were errors, we also need a shorter expiry time so we can recover quickly
                if ( is_null( $context->getVersion() ) || $errors ) {
-                       $maxage  = $wgResourceLoaderMaxage['unversioned']['client'];
+                       $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
                        $smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
                // If a version was specified we can use a longer expiry time since changing
                // version numbers causes cache misses
                } else {
-                       $maxage  = $wgResourceLoaderMaxage['versioned']['client'];
+                       $maxage = $wgResourceLoaderMaxage['versioned']['client'];
                        $smaxage = $wgResourceLoaderMaxage['versioned']['server'];
                }
                if ( $context->getOnly() === 'styles' ) {
@@ -570,7 +569,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 $mtime string The TS_MW timestamp to check the header against
+        * @param string $mtime The TS_MW timestamp to check the header against
         * @return bool True iff 304 header sent and output handled
         */
        protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) {
@@ -667,8 +666,8 @@ class ResourceLoader {
         * Generates code for a response
         *
         * @param $context ResourceLoaderContext: Context in which to generate a response
-        * @param $modules Array: List of module objects keyed by module name
-        * @param $missing Array: List of unavailable modules (optional)
+        * @param array $modules List of module objects keyed by module name
+        * @param array $missing List of unavailable modules (optional)
         * @return String: Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
@@ -835,7 +834,7 @@ class ResourceLoader {
         * Returns JS code to call to mw.loader.implement for a module with
         * given properties.
         *
-        * @param $name string Module name
+        * @param string $name Module name
         * @param $scripts Mixed: List of URLs to JavaScript files or String of JavaScript code
         * @param $styles Mixed: Array of CSS strings keyed by media type, or an array of lists of URLs to
         * CSS files keyed by media type
@@ -883,7 +882,7 @@ class ResourceLoader {
         * Combines an associative array mapping media type to CSS into a
         * single stylesheet with "@media" blocks.
         *
-        * @param $stylePairs Array: Array keyed by media type containing (arrays of) CSS strings.
+        * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings.
         *
         * @return Array
         */
@@ -943,12 +942,12 @@ class ResourceLoader {
         * which will have values corresponding to $name, $version, $dependencies
         * and $group as supplied.
         *
-        * @param $name String: Module name
+        * @param string $name Module name
         * @param $version Integer: Module version number as a timestamp
-        * @param $dependencies Array: List of module names on which this module depends
-        * @param $group String: Group which the module is in.
-        * @param $source String: Source of the module, or 'local' if not foreign.
-        * @param $script String: JavaScript code
+        * @param array $dependencies List of module names on which this module depends
+        * @param string $group Group which the module is in.
+        * @param string $source Source of the module, or 'local' if not foreign.
+        * @param string $script JavaScript code
         *
         * @return string
         */
@@ -976,11 +975,11 @@ class ResourceLoader {
         *     ) ):
         *        Registers modules with the given names and parameters.
         *
-        * @param $name String: Module name
+        * @param string $name Module name
         * @param $version Integer: Module version number as a timestamp
-        * @param $dependencies Array: List of module names on which this module depends
-        * @param $group String: group which the module is in.
-        * @param $source String: source of the module, or 'local' if not foreign
+        * @param array $dependencies List of module names on which this module depends
+        * @param string $group group which the module is in.
+        * @param string $source source of the module, or 'local' if not foreign
         *
         * @return string
         */
@@ -1006,8 +1005,8 @@ class ResourceLoader {
         *   - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $props1, $id2 => $props2, ... ) );
         *       Register sources with the given IDs and properties.
         *
-        * @param $id String: source ID
-        * @param $properties Array: source properties (see addSource())
+        * @param string $id source ID
+        * @param array $properties source properties (see addSource())
         *
         * @return string
         */
@@ -1023,7 +1022,7 @@ class ResourceLoader {
         * Returns JS code which runs given JS code if the client-side framework is
         * present.
         *
-        * @param $script String: JavaScript code
+        * @param string $script JavaScript code
         *
         * @return string
         */
@@ -1035,7 +1034,7 @@ class ResourceLoader {
         * Returns JS code which will set the MediaWiki configuration array to
         * the given value.
         *
-        * @param $configuration Array: List of configuration values keyed by variable name
+        * @param array $configuration List of configuration values keyed by variable name
         *
         * @return string
         */
@@ -1048,7 +1047,7 @@ class ResourceLoader {
         *
         * For example, array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' )
         * becomes 'foo.bar,baz|bar.baz,quux'
-        * @param $modules array of module names (strings)
+        * @param array $modules of module names (strings)
         * @return string Packed query string
         */
        public static function makePackedModulesString( $modules ) {
@@ -1086,16 +1085,16 @@ class ResourceLoader {
 
        /**
         * Build a load.php URL
-        * @param $modules array of module names (strings)
-        * @param $lang string Language code
-        * @param $skin string Skin name
-        * @param $user string|null User name. If null, the &user= parameter is omitted
-        * @param $version string|null Versioning timestamp
-        * @param $debug bool Whether the request should be in debug mode
-        * @param $only string|null &only= parameter
-        * @param $printable bool Printable mode
-        * @param $handheld bool Handheld mode
-        * @param $extraQuery array Extra query parameters to add
+        * @param array $modules 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
+        * @param string|null $version Versioning timestamp
+        * @param bool $debug Whether the request should be in debug mode
+        * @param string|null $only &only= parameter
+        * @param bool $printable Printable mode
+        * @param bool $handheld Handheld mode
+        * @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,
@@ -1151,7 +1150,7 @@ class ResourceLoader {
         * Module names may not contain pipes (|), commas (,) or exclamation marks (!) and can be
         * at most 255 bytes.
         *
-        * @param $moduleName string Module name to check
+        * @param string $moduleName Module name to check
         * @return bool Whether $moduleName is a valid module name
         */
        public static function isValidModuleName( $moduleName ) {
index 0e96c6c..4588015 100644 (file)
@@ -58,14 +58,14 @@ class ResourceLoaderContext {
                // Interpret request
                // List of modules
                $modules = $request->getVal( 'modules' );
-               $this->modules   = $modules ? self::expandModuleNames( $modules ) : array();
+               $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
                // Various parameters
-               $this->skin      = $request->getVal( 'skin' );
-               $this->user      = $request->getVal( 'user' );
-               $this->debug     = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
-               $this->only      = $request->getVal( 'only' );
-               $this->version   = $request->getVal( 'version' );
-               $this->raw       = $request->getFuzzyBool( 'raw' );
+               $this->skin = $request->getVal( 'skin' );
+               $this->user = $request->getVal( 'user' );
+               $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
+               $this->only = $request->getVal( 'only' );
+               $this->version = $request->getVal( 'version' );
+               $this->raw = $request->getFuzzyBool( 'raw' );
 
                $skinnames = Skin::getSkinNames();
                // If no skin is specified, or we don't recognize the skin, use the default skin
@@ -78,7 +78,7 @@ class ResourceLoaderContext {
         * Expand a string of the form jquery.foo,bar|jquery.ui.baz,quux to
         * an array of module names like array( 'jquery.foo', 'jquery.bar',
         * 'jquery.ui.baz', 'jquery.ui.quux' )
-        * @param $modules String Packed module name list
+        * @param string $modules Packed module name list
         * @return array of module names
         */
        public static function expandModuleNames( $modules ) {
@@ -145,7 +145,7 @@ class ResourceLoaderContext {
        public function getLanguage() {
                if ( $this->language === null ) {
                        global $wgLang;
-                       $this->language  = $this->request->getVal( 'lang' );
+                       $this->language = $this->request->getVal( 'lang' );
                        if ( !$this->language ) {
                                $this->language = $wgLang->getCode();
                        }
index 9904107..cedb5dc 100644 (file)
@@ -137,11 +137,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Constructs a new module from an options array.
         *
-        * @param $options Array: List of options; if not given or empty, an empty module will be
+        * @param array $options List of options; if not given or empty, an empty module will be
         *     constructed
-        * @param $localBasePath String: Base path to prepend to all local paths in $options. Defaults
+        * @param string $localBasePath Base path to prepend to all local paths in $options. Defaults
         *     to $IP
-        * @param $remoteBasePath String: Base path to prepend to all remote paths in $options. Defaults
+        * @param string $remoteBasePath Base path to prepend to all remote paths in $options. Defaults
         *     to $wgScriptPath
         *
         * Below is a description for the $options array:
@@ -473,9 +473,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Collates file paths by option (where provided).
         *
-        * @param $list Array: List of file paths in any combination of index/path
+        * @param array $list List of file paths in any combination of index/path
         *     or path/options pairs
-        * @param $option String: option name
+        * @param string $option option name
         * @param $default Mixed: default value if the option isn't set
         * @return Array: List of file paths, collated by $option
         */
@@ -503,9 +503,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets a list of element that match a key, optionally using a fallback key.
         *
-        * @param $list Array: List of lists to select from
-        * @param $key String: Key to look for in $map
-        * @param $fallback String: Key to look for in $list if $key doesn't exist
+        * @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,
         *     or an empty list in case of no match
         */
@@ -558,7 +558,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets the contents of a list of JavaScript files.
         *
-        * @param $scripts Array: List of file paths to scripts to read, remap and concetenate
+        * @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
         */
@@ -588,7 +588,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets the contents of a list of CSS files.
         *
-        * @param $styles Array: List of media type/list of file paths pairs, to read, remap and
+        * @param array $styles List of media type/list of file paths pairs, to read, remap and
         * concetenate
         *
         * @param $flip bool
@@ -619,7 +619,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * This method can be used as a callback for array_map()
         *
-        * @param $path String: File path of style file to read
+        * @param string $path File path of style file to read
         * @param $flip bool
         *
         * @return String: CSS data in script file
index e4ae0a2..03f3cc3 100644 (file)
@@ -81,7 +81,7 @@ abstract class ResourceLoaderModule {
         * Set this module's name. This is called by ResourceLoader::register()
         * when registering the module. Other code should not call this.
         *
-        * @param $name String: Name
+        * @param string $name Name
         */
        public function setName( $name ) {
                $this->name = $name;
@@ -99,10 +99,10 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Set this module's origin. This is called by ResourceLodaer::register()
+        * Set this module's origin. This is called by ResourceLoader::register()
         * when registering the module. Other code should not call this.
         *
-        * @param $origin Int origin
+        * @param int $origin origin
         */
        public function setOrigin( $origin ) {
                $this->origin = $origin;
@@ -303,7 +303,7 @@ abstract class ResourceLoaderModule {
         * Get the files this module depends on indirectly for a given skin.
         * Currently these are only image files referenced by the module's CSS.
         *
-        * @param $skin String: Skin name
+        * @param string $skin Skin name
         * @return Array: List of files
         */
        public function getFileDependencies( $skin ) {
@@ -329,8 +329,8 @@ abstract class ResourceLoaderModule {
        /**
         * Set preloaded file dependency information. Used so we can load this
         * information for all modules at once.
-        * @param $skin String: Skin name
-        * @param $deps Array: Array of file names
+        * @param string $skin Skin name
+        * @param array $deps Array of file names
         */
        public function setFileDependencies( $skin, $deps ) {
                $this->fileDeps[$skin] = $deps;
@@ -339,7 +339,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the last modification timestamp of the message blob for this
         * module in a given language.
-        * @param $lang String: Language code
+        * @param string $lang Language code
         * @return Integer: UNIX timestamp, or 0 if the module doesn't have messages
         */
        public function getMsgBlobMtime( $lang ) {
@@ -367,7 +367,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 $lang String: Language code
+        * @param string $lang Language code
         * @param $mtime Integer: UNIX timestamp or 0 if there is no such blob
         */
        public function setMsgBlobMtime( $lang, $mtime ) {
@@ -408,7 +408,6 @@ abstract class ResourceLoaderModule {
                return false;
        }
 
-
        /** @var JSParser lazy-initialized; use self::javaScriptParser() */
        private static $jsParser;
        private static $parseCacheVersion = 1;
@@ -463,7 +462,7 @@ abstract class ResourceLoaderModule {
        /**
         * Safe version of filemtime(), which doesn't throw a PHP warning if the file doesn't exist
         * but returns 1 instead.
-        * @param $filename string File name
+        * @param string $filename File name
         * @return int UNIX timestamp, or 1 if the file doesn't exist
         */
        protected static function safeFilemtime( $filename ) {
index 4ea9f4e..6c60d47 100644 (file)
@@ -126,7 +126,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( strval( $script ) !== '' ) {
                                $script = $this->validateScriptFile( $titleText, $script );
                                if ( strpos( $titleText, '*/' ) === false ) {
-                                       $scripts .=  "/* $titleText */\n";
+                                       $scripts .= "/* $titleText */\n";
                                }
                                $scripts .= $script . "\n";
                        }
@@ -163,7 +163,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                                $styles[$media] = array();
                        }
                        if ( strpos( $titleText, '*/' ) === false ) {
-                               $style =  "/* $titleText */\n" . $style;
+                               $style = "/* $titleText */\n" . $style;
                        }
                        $styles[$media][] = $style;
                }
index d64201c..1ace383 100644 (file)
@@ -398,7 +398,6 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
        }
 }
 
-
 /**
  * Item class for a archive table row by ar_rev_id -- actually
  * used via RevDel_RevisionList.
index 8b8a3a3..b2108de 100644 (file)
@@ -47,7 +47,7 @@ abstract class RevDel_List extends RevisionListBase {
         * Set the visibility for the revisions in this list. Logging and
         * transactions are done here.
         *
-        * @param $params array Associative array of parameters. Members are:
+        * @param array $params Associative array of parameters. Members are:
         *     value:       The integer value to set the visibility to
         *     comment:     The log comment.
         * @return Status
@@ -176,7 +176,7 @@ abstract class RevDel_List extends RevisionListBase {
 
        /**
         * Record a log entry on the action
-        * @param $params array Associative array of parameters:
+        * @param array $params Associative array of parameters:
         *     newBits:         The new value of the *_deleted bitfield
         *     oldBits:         The old value of the *_deleted bitfield.
         *     title:           The target title
@@ -220,7 +220,7 @@ abstract class RevDel_List extends RevisionListBase {
 
        /**
         * Get log parameter array.
-        * @param $params array Associative array of log parameters, same as updateLog()
+        * @param array $params Associative array of log parameters, same as updateLog()
         * @return array
         */
        public function getLogParams( $params ) {
index c59edc2..fe351c5 100644 (file)
@@ -31,12 +31,12 @@ class RevisionDeleter {
         * Checks for a change in the bitfield for a certain option and updates the
         * provided array accordingly.
         *
-        * @param $desc String: description to add to the array if the option was
+        * @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 $arr Array: the array to update.
+        * @param array $arr the array to update.
         */
        protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
                if( $diff & $field ) {
index 5e5755c..6b3e62b 100644 (file)
@@ -58,7 +58,7 @@ class SearchEngine {
         * If title searches are not supported or disabled, return null.
         * STUB
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SearchResultSet
         */
        function searchText( $term ) {
@@ -70,7 +70,7 @@ class SearchEngine {
         * If title searches are not supported or disabled, return null.
         * STUB
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SearchResultSet
         */
        function searchTitle( $term ) {
@@ -118,7 +118,7 @@ class SearchEngine {
         * on text to be used for searching or updating search index.
         * Default implementation does nothing (simply returns $string).
         *
-        * @param $string string: String to process
+        * @param string $string String to process
         * @return string
         */
        public function normalizeText( $string ) {
@@ -239,7 +239,6 @@ class SearchEngine {
 
                $title = Title::newFromText( $searchterm );
 
-
                # Entering an IP address goes to the contributions page
                if ( $wgEnableSearchContributorsByIP ) {
                        if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
@@ -248,7 +247,6 @@ class SearchEngine {
                        }
                }
 
-
                # Entering a user goes to the user page whether it's there or not
                if ( $title->getNamespace() == NS_USER ) {
                        return $title;
@@ -675,7 +673,6 @@ class SearchResultTooMany {
        # # Some search engines may bail out if too many matches are found
 }
 
-
 /**
  * @todo FIXME: This class is horribly factored. It would probably be better to
  * have a useful base class to which you pass some standard information, then
@@ -809,7 +806,7 @@ class SearchResult {
        }
 
        /**
-        * @param $terms Array: terms to highlight
+        * @param array $terms terms to highlight
         * @return String: highlighted text snippet, null (and not '') if not supported
         */
        function getTextSnippet( $terms ) {
@@ -826,7 +823,7 @@ class SearchResult {
        }
 
        /**
-        * @param $terms Array: terms to highlight
+        * @param array $terms terms to highlight
         * @return String: highlighted title, '' if not supported
         */
        function getTitleSnippet( $terms ) {
@@ -834,7 +831,7 @@ class SearchResult {
        }
 
        /**
-        * @param $terms Array: terms to highlight
+        * @param array $terms terms to highlight
         * @return String: highlighted redirect name (redirect to this page), '' if none or not supported
         */
        function getRedirectSnippet( $terms ) {
@@ -945,7 +942,7 @@ class SearchHighlighter {
         * Default implementation of wikitext highlighting
         *
         * @param $text String
-        * @param $terms Array: terms to highlight (unescaped)
+        * @param array $terms terms to highlight (unescaped)
         * @param $contextlines Integer
         * @param $contextchars Integer
         * @return String
@@ -973,7 +970,7 @@ class SearchHighlighter {
                }
                $spat .= '/';
                $textExt = array(); // text extracts
-               $otherExt = array();  // other extracts
+               $otherExt = array(); // other extracts
                wfProfileIn( "$fname-split" );
                $start = 0;
                $textLen = strlen( $text );
@@ -1188,7 +1185,7 @@ class SearchHighlighter {
        /**
         * Split text into lines and add it to extracts array
         *
-        * @param $extracts Array: index -> $line
+        * @param array $extracts index -> $line
         * @param $count Integer
         * @param $text String
         */
@@ -1283,12 +1280,12 @@ class SearchHighlighter {
        /**
         * Search extracts for a pattern, and return snippets
         *
-        * @param $pattern String: regexp for matching lines
-        * @param $extracts Array: extracts to search
+        * @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 $out Array: map for highlighted snippets
-        * @param $offsets Array: map of starting points of snippets
+        * @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 ) {
diff --git a/includes/search/SearchIBM_DB2.php b/includes/search/SearchIBM_DB2.php
deleted file mode 100644 (file)
index ebc9d5a..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-/**
- * IBM DB2 search engine
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Search
- */
-
-/**
- * Search engine hook base class for IBM DB2
- * @ingroup Search
- */
-class SearchIBM_DB2 extends SearchEngine {
-
-       /**
-        * Creates an instance of this class
-        * @param $db DatabaseIbm_db2: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
-       /**
-        * Perform a full text search query and return a result set.
-        *
-        * @param $term String: raw search term
-        * @return SqlSearchResultSet
-        */
-       function searchText( $term ) {
-               $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 $term String: taw search term
-        * @return SqlSearchResultSet
-        */
-       function searchTitle( $term ) {
-               $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 exclude redirects, if so set
-        * @return String
-        */
-       function queryRedirect() {
-               if ( $this->showRedirects ) {
-                       return '';
-               } else {
-                       return 'AND page_is_redirect=0';
-               }
-       }
-
-       /**
-        * Return a partial WHERE clause to limit the search to the given namespaces
-        * @return String
-        */
-       function queryNamespaces() {
-               if( is_null( $this->namespaces ) )
-                       return '';
-               $namespaces = implode( ',', $this->namespaces );
-               if ( $namespaces == '' ) {
-                       $namespaces = '0';
-               }
-               return 'AND page_namespace IN (' . $namespaces . ')';
-       }
-
-       /**
-        * Return a LIMIT clause to limit results on the query.
-        * @return String
-        */
-       function queryLimit( $sql ) {
-               return $this->db->limitResult( $sql, $this->limit, $this->offset );
-       }
-
-       /**
-        * Does not do anything for generic search engine
-        * subclasses may define this though
-        * @return String
-        */
-       function queryRanking( $filteredTerm, $fulltext ) {
-               // requires Net Search Extender or equivalent
-               // return ' ORDER BY score(1)';
-               return '';
-       }
-
-       /**
-        * Construct the full SQL query to do the search.
-        * The guts shoulds be constructed in queryMain()
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
-        */
-       function getQuery( $filteredTerm, $fulltext ) {
-               return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
-                       $this->queryRedirect() . ' ' .
-                       $this->queryNamespaces() . ' ' .
-                       $this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
-       }
-
-
-       /**
-        * Picks which field to index on, depending on what type of query.
-        * @param $fulltext Boolean
-        * @return String
-        */
-       function getIndexField( $fulltext ) {
-               return $fulltext ? 'si_text' : 'si_title';
-       }
-
-       /**
-        * Get the base part of the search query.
-        *
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
-        */
-       function queryMain( $filteredTerm, $fulltext ) {
-               $match = $this->parseQuery( $filteredTerm, $fulltext );
-               $page = $this->db->tableName( 'page' );
-               $searchindex = $this->db->tableName( 'searchindex' );
-               return 'SELECT page_id, page_namespace, page_title ' .
-                       "FROM $page,$searchindex " .
-                       'WHERE page_id=si_page AND ' . $match;
-       }
-
-       /** @todo document
-        * @return string
-        */
-       function parseQuery( $filteredText, $fulltext ) {
-               global $wgContLang;
-               $lc = SearchEngine::legalSearchChars();
-               $this->searchTerms = array();
-
-               # @todo FIXME: This doesn't handle parenthetical expressions.
-               $m = array();
-               $q = array();
-
-               if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
-                               $filteredText, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $terms ) {
-
-                               // Search terms in all variant forms, only
-                               // apply on wiki with LanguageConverter
-                               $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
-                               if( is_array( $temp_terms )) {
-                                       $temp_terms = array_unique( array_values( $temp_terms ));
-                                       foreach( $temp_terms as $t )
-                                               $q[] = $terms[1] . $wgContLang->normalizeForSearch( $t );
-                               }
-                               else
-                                       $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] );
-
-                               if ( !empty( $terms[3] ) ) {
-                                       $regexp = preg_quote( $terms[3], '/' );
-                                       if ( $terms[4] )
-                                               $regexp .= "[0-9A-Za-z_]+";
-                               } else {
-                                       $regexp = preg_quote(str_replace( '"', '', $terms[2]), '/' );
-                               }
-                               $this->searchTerms[] = $regexp;
-                       }
-               }
-
-               $searchon = $this->db->strencode( join( ',', $q ) );
-               $field = $this->getIndexField( $fulltext );
-
-               // requires Net Search Extender or equivalent
-               //return " CONTAINS($field, '$searchon') > 0 ";
-
-               return " lcase($field) LIKE lcase('%$searchon%')";
-       }
-
-       /**
-        * 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
-        */
-       function update( $id, $title, $text ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'searchindex',
-                       array( 'si_page' ),
-                       array(
-                               'si_page' => $id,
-                               'si_title' => $title,
-                               'si_text' => $text
-                       ), 'SearchIBM_DB2::update' );
-               // ?
-               //$dbw->query( "CALL ctx_ddl.sync_index('si_text_idx')" );
-               //$dbw->query( "CALL ctx_ddl.sync_index('si_title_idx')" );
-       }
-
-       /**
-        * Update a search index record's title only.
-        * Title should be pre-processed.
-        *
-        * @param $id Integer
-        * @param $title String
-        */
-       function updateTitle( $id, $title ) {
-               $dbw = wfGetDB( DB_MASTER );
-
-               $dbw->update( 'searchindex',
-                       array( 'si_title' => $title ),
-                       array( 'si_page'  => $id ),
-                       'SearchIBM_DB2::updateTitle',
-                       array() );
-       }
-}
index 85fe148..163d9dc 100644 (file)
@@ -38,7 +38,7 @@ class SearchMssql extends SearchEngine {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return MssqlSearchResultSet
         * @access public
         */
@@ -50,7 +50,7 @@ class SearchMssql extends SearchEngine {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return MssqlSearchResultSet
         * @access public
         */
@@ -59,7 +59,6 @@ class SearchMssql extends SearchEngine {
                return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
-
        /**
         * Return a partial WHERE clause to exclude redirects, if so set
         *
@@ -144,7 +143,7 @@ class SearchMssql extends SearchEngine {
         */
        function queryMain( $filteredTerm, $fulltext ) {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
-               $page        = $this->db->tableName( 'page' );
+               $page = $this->db->tableName( 'page' );
                $searchindex = $this->db->tableName( 'searchindex' );
 
                return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
index a76662b..4a501fd 100644 (file)
@@ -156,7 +156,7 @@ class SearchMySQL extends SearchEngine {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return MySQLSearchResultSet
         */
        function searchText( $term ) {
@@ -166,7 +166,7 @@ class SearchMySQL extends SearchEngine {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return MySQLSearchResultSet
         */
        function searchTitle( $term ) {
index 009502b..b0ea97f 100644 (file)
@@ -68,7 +68,7 @@ class SearchOracle extends SearchEngine {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SqlSearchResultSet
         */
        function searchText( $term ) {
@@ -82,7 +82,7 @@ class SearchOracle extends SearchEngine {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SqlSearchResultSet
         */
        function searchTitle( $term ) {
@@ -93,7 +93,6 @@ class SearchOracle extends SearchEngine {
                return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
        }
 
-
        /**
         * Return a partial WHERE clause to exclude redirects, if so set
         * @return String
@@ -156,7 +155,6 @@ class SearchOracle extends SearchEngine {
                        $this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
        }
 
-
        /**
         * Picks which field to index on, depending on what type of query.
         * @param $fulltext Boolean
@@ -221,7 +219,6 @@ class SearchOracle extends SearchEngine {
                        }
                }
 
-
                $searchon = $this->db->addQuotes( ltrim( $searchon, ' &' ) );
                $field = $this->getIndexField( $fulltext );
                return " CONTAINS($field, $searchon, 1) > 0 ";
@@ -281,7 +278,6 @@ class SearchOracle extends SearchEngine {
                        array() );
        }
 
-
        public static function legalSearchChars() {
                return "\"" . parent::legalSearchChars();
        }
index 727cc16..56464e9 100644 (file)
@@ -47,7 +47,7 @@ class SearchPostgres extends SearchEngine {
         * Currently searches a page's current title (page.page_title) and
         * latest revision article text (pagecontent.old_text)
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return PostgresSearchResultSet
         */
        function searchTitle( $term ) {
index f91399a..f3f4788 100644 (file)
@@ -156,7 +156,7 @@ class SearchSqlite extends SearchEngine {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SqliteSearchResultSet
         */
        function searchText( $term ) {
@@ -166,7 +166,7 @@ class SearchSqlite extends SearchEngine {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param $term String: raw search term
+        * @param string $term raw search term
         * @return SqliteSearchResultSet
         */
        function searchTitle( $term ) {
@@ -196,7 +196,6 @@ class SearchSqlite extends SearchEngine {
                return new SqliteSearchResultSet( $resultSet, $this->searchTerms, $total );
        }
 
-
        /**
         * Return a partial WHERE clause to exclude redirects, if so set
         * @return String
@@ -275,7 +274,7 @@ class SearchSqlite extends SearchEngine {
 
        function getCountQuery( $filteredTerm, $fulltext ) {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
-               $page        = $this->db->tableName( 'page' );
+               $page = $this->db->tableName( 'page' );
                $searchindex = $this->db->tableName( 'searchindex' );
                return "SELECT COUNT(*) AS c " .
                        "FROM $page,$searchindex " .
index 68161b9..0509272 100644 (file)
@@ -67,7 +67,7 @@ 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
         */
@@ -169,7 +169,6 @@ class MediaWikiSite extends Site {
                return $page['title'];
        }
 
-
        /**
         * Get normalization record for a given page title from an API response.
         *
@@ -304,7 +303,7 @@ class MediaWikiSite extends Site {
         * @see Site::getPageUrl
         *
         * This implementation returns a URL constructed using the path returned by getLinkPath().
-        * In addition to the default behaviour implemented by Site::getPageUrl(), this
+        * In addition to the default behavior implemented by Site::getPageUrl(), this
         * method converts the $pageName to DBKey-format by replacing spaces with underscores
         * before using it in the URL.
         *
index 525c375..076dc88 100644 (file)
@@ -40,7 +40,6 @@ class Site implements Serializable {
 
        const PATH_LINK = 'link';
 
-
        /**
         * A version ID that identifies the serialization structure used by getSerializationData()
         * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
index 994365e..c9c82ad 100644 (file)
@@ -50,7 +50,7 @@ class ActiveUsersPager extends UsersPager {
        /**
         * @param $context IContextSource
         * @param $group null Unused
-        * @param $par string Parameter passed to the page
+        * @param string $par Parameter passed to the page
         */
        function __construct( IContextSource $context = null, $group = null, $par = null ) {
                global $wgActiveUserDays;
@@ -97,17 +97,19 @@ class ActiveUsersPager extends UsersPager {
                        $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
                }
                $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
-               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
+                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
 
                if( $this->requestedUser != '' ) {
                        $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
                }
 
-               $query = array(
-                       'tables' => array( 'recentchanges', 'user', 'ipblocks' ),
-                       'fields' => array( 'user_name' => 'rc_user_text', // inheritance
+               return array(
+                       'tables' => array( 'recentchanges', 'ipblocks' ),
+                       'fields' => array(
+                               'user_name' => 'rc_user_text', // for Pager inheritance
                                'rc_user_text', // for Pager
-                               'user_id',
+                               'user_id' => 'rc_user',
                                'recentedits' => 'COUNT(*)',
                                'ipb_deleted' => 'MAX(ipb_deleted)'
                        ),
@@ -115,16 +117,14 @@ class ActiveUsersPager extends UsersPager {
                                'GROUP BY' => array( 'rc_user_text', 'user_id' ),
                                'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
                        ),
-                       'join_conds' => array(
-                               'user' => array( 'INNER JOIN', 'rc_user_text=user_name' ),
+                       'join_conds' => array( // check for suppression blocks
                                'ipblocks' => array( 'LEFT JOIN', array(
-                                       'user_id=ipb_user',
-                                       'ipb_auto' => 0
+                                       'rc_user=ipb_user',
+                                       'ipb_auto' => 0 # avoid duplicate blocks
                                )),
                        ),
                        'conds' => $conds
                );
-               return $query;
        }
 
        function formatRow( $row ) {
@@ -244,4 +244,7 @@ class SpecialActiveUsers extends SpecialPage {
                }
        }
 
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 5f8a0e4..a60c8ef 100644 (file)
@@ -77,6 +77,9 @@ class SpecialAllmessages extends SpecialPage {
 
        }
 
+       protected function getGroupName() {
+               return 'wiki';
+       }
 }
 
 /**
@@ -113,7 +116,7 @@ class AllmessagesTablePager extends TablePager {
 
                $this->lang = ( $langObj ? $langObj : $wgContLang );
                $this->langcode = $this->lang->getCode();
-               $this->foreign  = $this->langcode != $wgContLang->getCode();
+               $this->foreign = $this->langcode != $wgContLang->getCode();
 
                $request = $this->getRequest();
 
@@ -333,11 +336,9 @@ class AllmessagesTablePager extends TablePager {
 
        function formatValue( $field, $value ) {
                switch( $field ) {
-
                        case 'am_title' :
-
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
-                               $talk  = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+                               $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
 
                                if( $this->mCurrentRow->am_customised ) {
                                        $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
index eeda739..f9cb5cd 100644 (file)
@@ -59,7 +59,7 @@ class SpecialAllpages extends IncludableSpecialPage {
        /**
         * Constructor
         *
-        * @param $name string: name of the special page, as seen in links and URLs (default: 'Allpages')
+        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
         */
        function __construct( $name = 'Allpages' ) {
                parent::__construct( $name );
@@ -68,7 +68,7 @@ class SpecialAllpages extends IncludableSpecialPage {
        /**
         * Entry point : initialise variables and call subfunctions.
         *
-        * @param $par String: 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 ) {
                global $wgContLang;
@@ -107,16 +107,16 @@ class SpecialAllpages extends IncludableSpecialPage {
         * HTML for the top form
         *
         * @param $namespace Integer: a namespace constant (default NS_MAIN).
-        * @param $from String: dbKey we are starting listing at.
-        * @param $to String: dbKey we are ending listing at.
-        * @param $hideredirects Bool: dont show redirects  (default FALSE)
+        * @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 ) {
                global $wgScript;
                $t = $this->getTitle();
 
-               $out  = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
                $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $out .= Html::hidden( 'title', $t->getPrefixedText() );
                $out .= Xml::openElement( 'fieldset' );
@@ -165,9 +165,9 @@ class SpecialAllpages extends IncludableSpecialPage {
 
        /**
         * @param $namespace Integer (default NS_MAIN)
-        * @param $from String: list all pages from this name
-        * @param $to String: list all pages to this name
-        * @param $hideredirects Bool: dont show redirects (default FALSE)
+        * @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();
@@ -294,10 +294,10 @@ class SpecialAllpages extends IncludableSpecialPage {
        /**
         * Show a line of "ABC to DEF" ranges of articles
         *
-        * @param $inpoint String: lower limit of pagenames
-        * @param $outpoint String: upper limit of pagenames
+        * @param string $inpoint lower limit of pagenames
+        * @param string $outpoint upper limit of pagenames
         * @param $namespace Integer (Default NS_MAIN)
-        * @param $hideredirects Bool: dont show redirects (default FALSE)
+        * @param bool $hideredirects dont show redirects (default FALSE)
         * @return string
         */
        function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
@@ -327,9 +327,9 @@ class SpecialAllpages extends IncludableSpecialPage {
 
        /**
         * @param $namespace Integer (Default NS_MAIN)
-        * @param $from String: list all pages from this name (default FALSE)
-        * @param $to String: list all pages to this name (default FALSE)
-        * @param $hideredirects Bool: 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 ) {
                global $wgContLang;
@@ -457,7 +457,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                                                                Linker::link( $self, $this->msg( 'allpages' )->escaped() );
 
                        # Do we put a previous link ?
-                       if( isset( $prevTitle ) &&  $pt = $prevTitle->getText() ) {
+                       if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
                                $query = array( 'from' => $prevTitle->getText() );
 
                                if( $namespace )
@@ -515,7 +515,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 
        /**
         * @param $ns Integer: the namespace of the article
-        * @param $text String: the name 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 ) {
@@ -538,4 +538,8 @@ class SpecialAllpages extends IncludableSpecialPage {
                        return null;
                }
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
index fc5df4f..b0f333c 100644 (file)
@@ -71,4 +71,8 @@ class AncientPagesPage extends QueryPage {
                );
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index ac05f67..50fdbc2 100644 (file)
@@ -225,7 +225,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 $fields Array HTMLForm descriptor array
+        * @param array $fields HTMLForm descriptor array
         * @return Bool whether fields were altered (that is, whether the target is
         *     already blocked)
         */
@@ -451,7 +451,7 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Determine the target of the block, and the type of target
         * TODO: should be in Block.php?
-        * @param $par String subpage parameter passed to setup, or data value from
+        * @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
         * @return array( User|string|null, Block::TYPE_ constant|null )
@@ -521,7 +521,7 @@ class SpecialBlock extends FormSpecialPage {
         * Validate a block target.
         *
         * @since 1.21
-        * @param String $value Block target to check
+        * @param string $value Block target to check
         * @param User $user Performer of the block
         * @return Status
         */
@@ -810,7 +810,7 @@ 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 $expiry String: whatever was typed into the form
+        * @param string $expiry whatever was typed into the form
         * @return String: timestamp or "infinity" string for the DB implementation
         */
        public static function parseExpiryInput( $expiry ) {
@@ -883,7 +883,7 @@ 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 $data Array from HTMLForm data
+        * @param array $data from HTMLForm data
         * @param $type Block::TYPE_ constant (USER, RANGE, or IP)
         * @return string
         */
@@ -946,6 +946,10 @@ class SpecialBlock extends FormSpecialPage {
                $out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
                $out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
 
 # BC @since 1.18
index 56b9b00..e10df4f 100644 (file)
@@ -37,7 +37,7 @@ class SpecialBlockList extends SpecialPage {
        /**
         * Main execution point
         *
-        * @param $par String title fragment
+        * @param string $par title fragment
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -205,6 +205,10 @@ class SpecialBlockList extends SpecialPage {
                        $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
                }
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
 
 class BlockListPager extends TablePager {
index 3840b2f..85a3019 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /**
- * A special page called by proxy_check.php to block open proxies
+ * A special page called by proxyCheck.php to block open proxies
  *
  * @ingroup SpecialPage
  */
@@ -59,4 +59,8 @@ class SpecialBlockme extends UnlistedSpecialPage {
 
                $this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
        }
+
+       protected function getGroupName() {
+               return 'other';
+       }
 }
index 255b1b6..bdbd77b 100644 (file)
@@ -46,7 +46,7 @@ class SpecialBookSources extends SpecialPage {
        /**
         * Show the special page
         *
-        * @param $isbn string ISBN passed as a subpage parameter
+        * @param string $isbn ISBN passed as a subpage parameter
         */
        public function execute( $isbn ) {
                $this->setHeaders();
@@ -63,7 +63,7 @@ class SpecialBookSources extends SpecialPage {
 
        /**
         * Returns whether a given ISBN (10 or 13) is valid. True indicates validity.
-        * @param $isbn string ISBN passed for check
+        * @param string $isbn ISBN passed for check
         * @return bool
         */
        public static function isValidISBN( $isbn ) {
@@ -101,7 +101,7 @@ class SpecialBookSources extends SpecialPage {
        /**
         * Trim ISBN and remove characters which aren't required
         *
-        * @param $isbn string Unclean ISBN
+        * @param string $isbn Unclean ISBN
         * @return string
         */
        private static function cleanIsbn( $isbn ) {
@@ -116,7 +116,7 @@ class SpecialBookSources extends SpecialPage {
        private function makeForm() {
                global $wgScript;
 
-               $form  = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
+               $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
                $form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
                $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
@@ -171,12 +171,16 @@ class SpecialBookSources extends SpecialPage {
        /**
         * Format a book source list item
         *
-        * @param $label string Book source label
-        * @param $url string Book source URL
+        * @param string $label Book source label
+        * @param string $url Book source URL
         * @return string
         */
        private function makeListItem( $label, $url ) {
                $url = str_replace( '$1', $this->isbn, $url );
                return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
        }
+
+       protected function getGroupName() {
+               return 'other';
+       }
 }
index 77b69e8..fac4123 100644 (file)
@@ -151,4 +151,8 @@ class BrokenRedirectsPage extends QueryPage {
                $out .= " {$arr} {$to}";
                return $out;
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 44388c4..9040c64 100644 (file)
@@ -50,6 +50,10 @@ class SpecialCategories extends SpecialPage {
                        Html::closeElement( 'div' )
                );
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
 
 /**
index 53faba7..59a0257 100644 (file)
@@ -254,4 +254,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                return $status->value;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 2b505b3..73eb97f 100644 (file)
@@ -270,4 +270,8 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 
                $user->saveSettings();
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 8be1cf0..c3bd3fe 100644 (file)
@@ -163,4 +163,8 @@ class SpecialComparePages extends SpecialPage {
                }
                return true;
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 85a415d..078c386 100644 (file)
@@ -98,7 +98,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
                        }
                        $out->addWikiMsg( 'confirmemail_text' );
-                       $form  = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
+                       $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
                        $form .= Html::hidden( 'token', $user->getEditToken() );
                        $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
                        $form .= Xml::closeElement( 'form' );
@@ -110,7 +110,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
         * Attempt to confirm the user's email address and show success or failure
         * as needed; if successful, take the user to log in
         *
-        * @param $code string Confirmation code
+        * @param string $code Confirmation code
         */
        function attemptConfirm( $code ) {
                $user = User::newFromConfirmationCode( $code );
@@ -154,7 +154,7 @@ class EmailInvalidation extends UnlistedSpecialPage {
         * Attempt to invalidate the user's email address and show success or failure
         * as needed; if successful, link to main page
         *
-        * @param $code string Confirmation code
+        * @param string $code Confirmation code
         */
        function attemptInvalidate( $code ) {
                $user = User::newFromConfirmationCode( $code );
index d156d20..b118059 100644 (file)
@@ -192,7 +192,6 @@ class SpecialContributions extends SpecialPage {
                        }
                        $out->preventClickjacking( $pager->getPreventClickjacking() );
 
-
                        # Show the appropriate "footer" message - WHOIS tools, etc.
                        if ( $this->opts['contribs'] == 'newbie' ) {
                                $message = 'sp-contributions-footer-newbies';
@@ -541,6 +540,10 @@ class SpecialContributions extends SpecialPage {
                        Xml::closeElement( 'form' );
                return $form;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
 
 /**
@@ -594,7 +597,7 @@ 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 $offset String: index offset, inclusive
+        * @param string $offset index offset, inclusive
         * @param $limit Integer: exact query limit
         * @param $descending Boolean: query direction, false for ascending, true for descending
         * @return ResultWrapper
@@ -627,7 +630,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $result = array();
 
                // loop all results and collect them in an array
-               foreach ( $data as $j => $query ) {
+               foreach ( $data as $query ) {
                        foreach ( $query as $i => $row ) {
                                // use index column as key, allowing us to easily sort in PHP
                                $result[$row->{$this->getIndexField()} . "-$i"] = $row;
index f4904a5..6978d6b 100644 (file)
@@ -82,4 +82,8 @@ class DeadendPagesPage extends PageQueryPage {
                        return array( 'page_title' );
                }
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 0c934a4..e374979 100644 (file)
@@ -261,7 +261,7 @@ class DeletedContributionsPage extends SpecialPage {
         * Special page "deleted user contributions".
         * Shows a list of the deleted contributions of a user.
         *
-        * @param $par String: (optional) user name of the user for which to show the contributions
+        * @param string $par (optional) user name of the user for which to show the contributions
         */
        function execute( $par ) {
                global $wgQueryPageDefaultLimit;
@@ -465,7 +465,7 @@ class DeletedContributionsPage extends SpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
-        * @param $options Array: the options to be included.
+        * @param array $options the options to be included.
         * @return string
         */
        function getForm( $options ) {
@@ -522,4 +522,8 @@ class DeletedContributionsPage extends SpecialPage {
                        Xml::closeElement( 'form' );
                return $f;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index a9c554a..2126ca5 100644 (file)
@@ -158,4 +158,8 @@ class DisambiguationsPage extends QueryPage {
 
                return "$from $edit $arr $to";
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
index 512fd85..5a5d749 100644 (file)
@@ -162,4 +162,8 @@ class DoubleRedirectsPage extends QueryPage {
 
                return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 7e1b44a..d2838e0 100644 (file)
@@ -205,7 +205,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 $titles array of strings, or Title objects
+        * @param array $titles of strings, or Title objects
         * @param $output String
         */
        private function showTitles( $titles, &$output ) {
@@ -313,7 +313,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         *
         * @param Title $title
         * @param int $namespace
-        * @param String $dbKey
+        * @param string $dbKey
         * @return bool: Whether this item is valid
         */
        private function checkTitle( $title, $namespace, $dbKey ) {
@@ -382,7 +382,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 $titles Array of strings, or Title objects
+        * @param array $titles of strings, or Title objects
         */
        private function watchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -415,7 +415,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 $titles Array of strings, or Title objects
+        * @param array $titles of strings, or Title objects
         */
        private function unwatchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -668,8 +668,8 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         * form is open (bug 32126), but we know that invalid items will
         * be harmless so we can override it here.
         *
-        * @param $value String the value the field was submitted with
-        * @param $alldata Array the data collected from the form
+        * @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.
         */
        function validate( $value, $alldata ) {
index 9a42c09..b5ad589 100644 (file)
@@ -163,7 +163,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        /**
         * Validate target User
         *
-        * @param $target String: target user name
+        * @param string $target target user name
         * @return User object on success or a string on error
         */
        public static function getTarget( $target ) {
@@ -191,7 +191,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * Check whether a user is allowed to send email
         *
         * @param $user User object
-        * @param $editToken String: edit token
+        * @param string $editToken edit token
         * @return null on success or string on error
         */
        public static function getPermissionsError( $user, $editToken ) {
@@ -231,7 +231,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        /**
         * Form to ask for target user name.
         *
-        * @param $name String: user name submitted.
+        * @param string $name user name submitted.
         * @return String: form asking for user name.
         */
        protected function userForm( $name ) {
@@ -337,4 +337,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return $status;
                }
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 9d1ec10..7abfefe 100644 (file)
@@ -272,7 +272,7 @@ class SpecialExport extends SpecialPage {
        /**
         * Do the actual page exporting
         *
-        * @param $page String: user input on what page(s) to export
+        * @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)
@@ -561,4 +561,7 @@ class SpecialExport extends SpecialPage {
                return $pageSet;
        }
 
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 7e4bc9c..5b7f353 100644 (file)
@@ -60,7 +60,6 @@ class FewestrevisionsPage extends QueryPage {
                );
        }
 
-
        function sortDescending() {
                return false;
        }
@@ -94,4 +93,8 @@ class FewestrevisionsPage extends QueryPage {
 
                return $this->getLanguage()->specialList( $plink, $nlink );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 366aa81..3fe64e6 100644 (file)
@@ -67,7 +67,7 @@ class FileDuplicateSearchPage extends QueryPage {
 
        /**
         *
-        * @param $dupes Array of File objects
+        * @param array $dupes of File objects
         */
        function showList( $dupes ) {
                $html = array();
@@ -114,7 +114,7 @@ class FileDuplicateSearchPage extends QueryPage {
                # Create the input form
                $out->addHTML(
                        Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
                        Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
@@ -215,4 +215,8 @@ class FileDuplicateSearchPage extends QueryPage {
 
                return "$plink . . $user . . $time";
        }
+
+       protected function getGroupName() {
+               return 'media';
+       }
 }
index e086650..bbcced2 100644 (file)
@@ -47,7 +47,7 @@ class SpecialFilepath extends SpecialPage {
                        $file = wfFindFile( $title );
 
                        if ( $file && $file->exists() ) {
-                               // Default behaviour: Use the direct link to the file.
+                               // Default behavior: Use the direct link to the file.
                                $url = $file->getURL();
                                $width = $request->getInt( 'width', -1 );
                                $height = $request->getInt( 'height', -1 );
@@ -86,4 +86,8 @@ class SpecialFilepath extends SpecialPage {
                        Html::closeElement( 'form' )
                );
        }
+
+       protected function getGroupName() {
+               return 'media';
+       }
 }
index 16772ec..aa56041 100644 (file)
@@ -341,6 +341,10 @@ class SpecialImport extends SpecialPage {
                        );
                }
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
 
 /**
index 84e3cb7..d204d50 100644 (file)
@@ -102,8 +102,8 @@ class SpecialJavaScriptTest extends SpecialPage {
         * Function to wrap the summary.
         * It must be given a valid state as a second parameter or an exception will
         * be thrown.
-        * @param $html String: The raw HTML.
-        * @param $state String: State, one of 'noframework', 'unknownframework' or 'frameworkfound'
+        * @param string $html The raw HTML.
+        * @param string $state State, one of 'noframework', 'unknownframework' or 'frameworkfound'
         * @throws MWException
         * @return string
         */
@@ -157,4 +157,8 @@ HTML;
                // $wgJavaScriptTestConfig in DefaultSettings.php
                $out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
        }
+
+       protected function getGroupName() {
+               return 'other';
+       }
 }
index f5fa697..030416f 100644 (file)
@@ -22,7 +22,6 @@
  * @author Brion Vibber
  */
 
-
 /**
  * Special:LinkSearch to search the external-links table.
  * @ingroup SpecialPage
@@ -43,7 +42,7 @@ class LinkSearchPage extends QueryPage {
        }
 
        function execute( $par ) {
-               global $wgUrlProtocols, $wgMiserMode;
+               global $wgUrlProtocols, $wgMiserMode, $wgScript;
 
                $this->setHeaders();
                $this->outputHeader();
@@ -89,11 +88,11 @@ class LinkSearchPage extends QueryPage {
                        '<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>',
                        count( $protocols_list )
                );
-               $s = Xml::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $GLOBALS['wgScript'] ) ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
-                       '<fieldset>' .
-                       Xml::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . ' ';
+               $s = Html::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+                       Html::openElement( 'fieldset' ) . "\n" .
+                       Html::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) . "\n" .
+                       Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . "\n";
                if ( !$wgMiserMode ) {
                        $s .= Html::namespaceSelector(
                                array(
@@ -107,9 +106,9 @@ class LinkSearchPage extends QueryPage {
                                )
                        );
                }
-               $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) .
-                       '</fieldset>' .
-                       Xml::closeElement( 'form' );
+               $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) . "\n" .
+                       Html::closeElement( 'fieldset' ) . "\n" .
+                       Html::closeElement( 'form' ) . "\n";
                $out->addHTML( $s );
 
                if( $target != '' ) {
@@ -222,4 +221,8 @@ class LinkSearchPage extends QueryPage {
        function getOrderFields() {
                return array();
        }
+
+       protected function getGroupName() {
+               return 'redirects';
+       }
 }
index 661db7b..c864ae2 100644 (file)
@@ -51,6 +51,10 @@ class SpecialListFiles extends IncludableSpecialPage {
                }
                $this->getOutput()->addHTML( $html );
        }
+
+       protected function getGroupName() {
+               return 'media';
+       }
 }
 
 /**
index c82522a..7cccf88 100644 (file)
@@ -139,12 +139,12 @@ class SpecialListGroupRights extends SpecialPage {
        /**
         * Create a user-readable list of permissions from the given array.
         *
-        * @param $permissions Array of permission => bool (from $wgGroupPermissions items)
-        * @param $revoke Array of permission => bool (from $wgRevokePermissions items)
-        * @param $add Array of groups this group is allowed to add or true
-        * @param $remove Array of groups this group is allowed to remove or true
-        * @param $addSelf Array of groups this group is allowed to add to self or true
-        * @param $removeSelf Array of group this group is allowed to remove from self or true
+        * @param array $permissions of permission => bool (from $wgGroupPermissions items)
+        * @param array $revoke of permission => bool (from $wgRevokePermissions items)
+        * @param array $add of groups this group is allowed to add or true
+        * @param array $remove of groups this group is allowed to remove or true
+        * @param array $addSelf of groups this group is allowed to add to self or true
+        * @param array $removeSelf of group this group is allowed to remove from self or true
         * @return string List of all granted permissions, separated by comma separator
         */
        private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
@@ -212,4 +212,8 @@ class SpecialListGroupRights extends SpecialPage {
                        return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
                }
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index cdad688..0283767 100644 (file)
@@ -126,4 +126,8 @@ class ListredirectsPage extends QueryPage {
                        return "<del>$rd_link</del>";
                }
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
index 3265d1a..ed21396 100644 (file)
@@ -36,7 +36,7 @@ class UsersPager extends AlphabeticPager {
 
        /**
         * @param $context IContextSource
-        * @param $par array (Default null)
+        * @param array $par (Default null)
         * @param $including boolean Whether this page is being transcluded in
         * another page
         */
@@ -297,8 +297,8 @@ class UsersPager extends AlphabeticPager {
        /**
         * Format a link to a group description page
         *
-        * @param $group String: group name
-        * @param $username String Username
+        * @param string $group group name
+        * @param string $username Username
         * @return string
         */
        protected static function buildGroupLink( $group, $username ) {
@@ -321,7 +321,7 @@ class SpecialListUsers extends IncludableSpecialPage {
        /**
         * Show the special page
         *
-        * @param $par string (optional) A group to list users from
+        * @param string $par (optional) A group to list users from
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -347,4 +347,8 @@ class SpecialListUsers extends IncludableSpecialPage {
 
                $this->getOutput()->addHTML( $s );
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index d71ac6e..95ef951 100644 (file)
@@ -102,4 +102,8 @@ class SpecialLockdb extends FormSpecialPage {
                $out->addSubtitle( $this->msg( 'lockdbsuccesssub' ) );
                $out->addWikiMsg( 'lockdbsuccesstext' );
        }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
 }
index 7800e56..4fc0f6e 100644 (file)
@@ -182,7 +182,6 @@ class SpecialLog extends SpecialPage {
                return $s;
        }
 
-
        /**
         * Set page title and show header for this log type
         * @param $type string
@@ -194,4 +193,7 @@ class SpecialLog extends SpecialPage {
                $this->getOutput()->addHTML( $page->getDescription()->parseAsBlock() );
        }
 
+       protected function getGroupName() {
+               return 'changes';
+       }
 }
index 2889f7e..8c6a88a 100644 (file)
@@ -81,4 +81,8 @@ class LonelyPagesPage extends PageQueryPage {
                        return array( 'page_title' );
                }
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index dd60e37..c045f9e 100644 (file)
@@ -34,4 +34,8 @@ class LongPagesPage extends ShortPagesPage {
        function sortDescending() {
                return true;
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 432956f..c5a109d 100644 (file)
@@ -92,7 +92,6 @@ class MIMEsearchPage extends QueryPage {
                parent::execute( $par );
        }
 
-
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
@@ -134,4 +133,8 @@ class MIMEsearchPage extends QueryPage {
                );
                return in_array( $type, $types );
        }
+
+       protected function getGroupName() {
+               return 'media';
+       }
 }
index 85e1d65..1476e15 100644 (file)
@@ -141,7 +141,7 @@ class SpecialMergeHistory extends SpecialPage {
                        '<fieldset>' .
                        Xml::element( 'legend', array(),
                                $this->msg( 'mergehistory-box' )->text() ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
                        Html::hidden( 'submitted', '1' ) .
                        Html::hidden( 'mergepoint', $this->mTimestamp ) .
                        Xml::openElement( 'table' ) .
@@ -423,6 +423,10 @@ class SpecialMergeHistory extends SpecialPage {
 
                return true;
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
index 085a09f..11f26bd 100644 (file)
@@ -99,4 +99,8 @@ class MostcategoriesPage extends QueryPage {
 
                return $this->getLanguage()->specialList( $link, $count );
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index 01a5caf..78b2d91 100644 (file)
@@ -58,4 +58,7 @@ class MostimagesPage extends ImageQueryPage {
                return $this->msg( 'nimagelinks' )->numParams( $row->value )->escaped() . '<br />';
        }
 
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index e08cdf3..574a9af 100644 (file)
@@ -114,4 +114,8 @@ class MostinterwikisPage extends QueryPage {
 
                return $this->getLanguage()->specialList( $link, $count );
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index 66814cb..4b6e567 100644 (file)
@@ -81,7 +81,7 @@ class MostlinkedPage extends QueryPage {
         * Make a link to "what links here" for the specified title
         *
         * @param $title Title being queried
-        * @param $caption String: text to display on the link
+        * @param string $caption text to display on the link
         * @return String
         */
        function makeWlhLink( $title, $caption ) {
@@ -107,4 +107,8 @@ class MostlinkedPage extends QueryPage {
                        $this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
                return $this->getLanguage()->specialList( $link, $wlh );
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index df2975c..a1bce45 100644 (file)
@@ -94,4 +94,8 @@ class MostlinkedCategoriesPage extends QueryPage {
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
                return $this->getLanguage()->specialList( $plink, $nlinks );
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index a2d51db..506e6b2 100644 (file)
@@ -124,4 +124,8 @@ class MostlinkedTemplatesPage extends QueryPage {
                $label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
                return Linker::link( $wlh, $label );
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index b025331..ad6b788 100644 (file)
@@ -31,4 +31,8 @@ class MostrevisionsPage extends FewestrevisionsPage {
        function sortDescending() {
                return true;
        }
+
+       protected function getGroupName() {
+               return 'highuse';
+       }
 }
index bf93ef2..4adb037 100644 (file)
@@ -71,7 +71,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        ? Title::newFromText( $newTitleText_bc )
                        : Title::makeTitleSafe( $newTitleTextNs, $newTitleTextMain );
 
-
                $user = $this->getUser();
 
                # Check rights
@@ -104,7 +103,7 @@ class MovePageForm extends UnlistedSpecialPage {
        /**
         * Show the form
         *
-        * @param $err Array: error messages. Each item is an error message.
+        * @param array $err error messages. Each item is an error message.
         *    It may either be a string message name or array message name and
         *    parameters, like the second argument to OutputPage::wrapWikiMsg().
         */
@@ -494,7 +493,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        $msgName = 'movepage-moved-noredirect';
                }
 
-
                $out->addHTML( $this->msg( 'movepage-moved' )->rawParams( $oldLink,
                        $newLink )->params( $oldText, $newText )->parseAsBlock() );
                $out->addWikiMsg( $msgName );
@@ -677,4 +675,8 @@ class MovePageForm extends UnlistedSpecialPage {
                }
                $out->addHTML( "</ul>\n" );
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index caf48be..52cbc3a 100644 (file)
@@ -42,8 +42,11 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        $this->getOutput()->addHTML( $pager->getNavigationBar() );
                }
        }
-}
 
+       protected function getGroupName() {
+               return 'changes';
+       }
+}
 
 /**
  * @ingroup SpecialPage Pager
index 0499e57..ebb3021 100644 (file)
@@ -53,7 +53,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                $opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'newpageshidepatrolled' ) );
                $opts->add( 'hidebots', false );
                $opts->add( 'hideredirs', true );
-               $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+               $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
                $opts->add( 'offset', '' );
                $opts->add( 'namespace', '0' );
                $opts->add( 'username', '' );
@@ -476,6 +476,10 @@ class SpecialNewpages extends IncludableSpecialPage {
                }
                return '';
        }
+
+       protected function getGroupName() {
+               return 'changes';
+       }
 }
 
 /**
index 189798d..8f8c981 100644 (file)
@@ -131,4 +131,8 @@ class SpecialPagesWithProp extends QueryPage {
                }
                return $ret;
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
index f42a7a1..90b0ac8 100644 (file)
@@ -326,4 +326,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                return false;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 99b586e..7ce8c13 100644 (file)
@@ -72,4 +72,8 @@ class PopularPagesPage extends QueryPage {
                $nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
                return $this->getLanguage()->specialList( $link, $nv );
        }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
 }
index 340172c..a50e7c1 100644 (file)
@@ -87,4 +87,8 @@ class SpecialPreferences extends SpecialPage {
 
                return true;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index e1e18e4..6affa73 100644 (file)
@@ -35,7 +35,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 
        /**
         * Entry point : initialise variables and call subfunctions.
-        * @param $par String: 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;
@@ -83,14 +83,14 @@ class SpecialPrefixindex extends SpecialAllpages {
        /**
         * HTML for the top form
         * @param $namespace Integer: a namespace constant (default NS_MAIN).
-        * @param $from String: dbKey we are starting listing at.
-        * @param $hideredirects Bool: hide redirects (default FALSE)
+        * @param string $from dbKey we are starting listing at.
+        * @param bool $hideredirects hide redirects (default FALSE)
         * @return string
         */
        function namespacePrefixForm( $namespace = NS_MAIN, $from = '', $hideredirects = false ) {
                global $wgScript;
 
-               $out  = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
                $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $out .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
                $out .= Xml::openElement( 'fieldset' );
@@ -135,8 +135,8 @@ class SpecialPrefixindex extends SpecialAllpages {
        /**
         * @param $namespace Integer, default NS_MAIN
         * @param $prefix String
-        * @param $from String: list all pages from this name (default FALSE)
-        * @param $hideredirects Bool: hide redirects (default FALSE)
+        * @param string $from list all pages from this name (default FALSE)
+        * @param bool $hideredirects hide redirects (default FALSE)
         */
        function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null, $hideredirects = false ) {
                global $wgContLang;
@@ -263,4 +263,8 @@ class SpecialPrefixindex extends SpecialAllpages {
 
                $this->getOutput()->addHTML( $out2 . $out . $footer );
        }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
 }
index d580d62..eb89bec 100644 (file)
@@ -29,7 +29,7 @@
 class SpecialProtectedpages extends SpecialPage {
 
        protected $IdLevel = 'level';
-       protected $IdType  = 'type';
+       protected $IdType = 'type';
 
        public function __construct() {
                parent::__construct( 'Protectedpages' );
@@ -146,9 +146,9 @@ class SpecialProtectedpages extends SpecialPage {
 
        /**
         * @param $namespace Integer
-        * @param $type String: restriction type
-        * @param $level String: restriction level
-        * @param $sizetype String: "min" or "max"
+        * @param string $type restriction type
+        * @param string $level restriction level
+        * @param string $sizetype "min" or "max"
         * @param $size Integer
         * @param $indefOnly Boolean: only indefinie protection
         * @param $cascadeOnly Boolean: only cascading protection
@@ -290,6 +290,10 @@ class SpecialProtectedpages extends SpecialPage {
                                array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
                                implode( "\n", $options ) ) . "</span>";
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
 
 /**
index abb4af3..6a94deb 100644 (file)
@@ -29,7 +29,7 @@
 class SpecialProtectedtitles extends SpecialPage {
 
        protected $IdLevel = 'level';
-       protected $IdType  = 'type';
+       protected $IdType = 'type';
 
        public function __construct() {
                parent::__construct( 'Protectedtitles' );
@@ -182,6 +182,10 @@ class SpecialProtectedtitles extends SpecialPage {
                                array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
                                implode( "\n", $options ) );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
 
 /**
index 13a7043..b59f834 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup SpecialPage
  */
 class RandomPage extends SpecialPage {
-       private $namespaces;  // namespaces to select pages from
+       private $namespaces; // namespaces to select pages from
        protected $isRedir = false; // should the result be a redirect?
        protected $extra = array(); // Extra SQL statements
 
@@ -159,4 +159,8 @@ class RandomPage extends SpecialPage {
 
                return $dbr->fetchObject( $res );
        }
+
+       protected function getGroupName() {
+               return 'redirects';
+       }
 }
index 7ea3a94..008678f 100644 (file)
@@ -42,8 +42,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        public function getDefaultOptions() {
                $opts = new FormOptions();
 
-               $opts->add( 'days', (int)$this->getUser()->getOption( 'rcdays' ) );
-               $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+               $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
+               $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
                $opts->add( 'from', '' );
 
                $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
@@ -129,7 +129,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                return $this->rcOptions;
        }
 
-
        /**
         * Main execution point
         *
@@ -340,7 +339,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                if( $opts['namespace'] !== '' ) {
                        $selectedNS = $dbr->addQuotes( $opts['namespace'] );
                        $operator = $opts['invert'] ? '!='  : '=';
-                       $boolean  = $opts['invert'] ? 'AND' : 'OR';
+                       $boolean = $opts['invert'] ? 'AND' : 'OR';
 
                        # namespace association (bug 2429)
                        if( !$opts['associated'] ) {
@@ -469,7 +468,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Send output to the OutputPage object, only called if not used feeds
         *
-        * @param $rows Array of database rows
+        * @param array $rows of database rows
         * @param $opts FormOptions
         */
        public function webOutput( $rows, $opts ) {
@@ -725,7 +724,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Filter $rows by categories set in $opts
         *
-        * @param $rows Array of database rows
+        * @param array $rows of database rows
         * @param $opts FormOptions
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
@@ -790,8 +789,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Makes change an option link which carries all the other options
         *
         * @param $title Title
-        * @param $override Array: options to override
-        * @param $options Array: current options
+        * @param array $override options to override
+        * @param array $options current options
         * @param $active Boolean: whether to show the link in bold
         * @return string
         */
@@ -863,7 +862,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
                $dl = $lang->pipeList( $dl );
 
-
                // show/hide links
                $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
@@ -909,4 +907,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        'mediawiki.special.recentchanges',
                ) );
        }
+
+       protected function getGroupName() {
+               return 'changes';
+       }
 }
index 6d7173b..391c4a7 100644 (file)
@@ -128,7 +128,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                if( $ns == NS_CATEGORY && !$showlinkedto ) {
                        // special handling for categories
-                       // XXX: should try to make this less klugy
+                       // XXX: should try to make this less kludgy
                        $link_tables = array( 'categorylinks' );
                        $showlinkedto = true;
                } else {
index 6f75da4..c85e891 100644 (file)
@@ -464,8 +464,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
 
        /**
-       * @return String: HTML
-       */
+        * @return String: HTML
+        */
        protected function buildCheckBoxes() {
                $html = '<table>';
                // If there is just one item, use checkboxes
@@ -594,8 +594,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Put together a rev_deleted bitfield
-        * @param $bitPars array extractBitParams() params
-        * @param $oldfield int current bitfield
+        * @param array $bitPars extractBitParams() params
+        * @param int $oldfield current bitfield
         * @return array
         */
        public static function extractBitfield( $bitPars, $oldfield ) {
@@ -623,4 +623,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        array( 'value' => $bitfield, 'comment' => $reason )
                );
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 77f0ddb..6c40148 100644 (file)
@@ -78,7 +78,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Entry point
         *
-        * @param $par String or null
+        * @param string $par or null
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -261,7 +261,7 @@ class SpecialSearch extends SpecialPage {
                if( $textMatches && $textMatches->hasSuggestion() ) {
                        $st = SpecialPage::getTitleFor( 'Search' );
 
-                       # mirror Go/Search behaviour of original request ..
+                       # mirror Go/Search behavior of original request ..
                        $didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
 
                        if( $this->fulltext != null ) {
@@ -356,7 +356,6 @@ class SpecialSearch extends SpecialPage {
                $out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
                $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
 
-
                $out->addHtml( Xml::closeElement( 'form' ) );
                $out->addHtml( "<div class='searchresults'>" );
 
@@ -537,7 +536,7 @@ class SpecialSearch extends SpecialPage {
         * Format a single hit result
         *
         * @param $result SearchResult
-        * @param $terms Array: terms to highlight
+        * @param array $terms terms to highlight
         *
         * @return string
         */
@@ -759,7 +758,7 @@ class SpecialSearch extends SpecialPage {
         * @param $lastInterwiki String
         * @param $terms Array
         * @param $query String
-        * @param $customCaptions Array: iw prefix -> caption
+        * @param array $customCaptions iw prefix -> caption
         *
         * @return string
         */
@@ -852,7 +851,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Generates the power search box at [[Special:Search]]
         *
-        * @param $term String: search term
+        * @param string $term search term
         * @param $opts array
         * @return String: HTML form
         */
@@ -1074,10 +1073,10 @@ class SpecialSearch extends SpecialPage {
         * Make a search link with some target namespaces
         *
         * @param $term String
-        * @param $namespaces Array ignored
-        * @param $label String: link's text
-        * @param $tooltip String: link's tooltip
-        * @param $params Array: query string parameters
+        * @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() ) {
@@ -1107,7 +1106,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Check if query starts with image: prefix
         *
-        * @param $term String: the string to check
+        * @param string $term the string to check
         * @return Boolean
         */
        protected function startsWithImage( $term ) {
@@ -1123,7 +1122,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Check if query starts with all: prefix
         *
-        * @param $term String: the string to check
+        * @param string $term the string to check
         * @return Boolean
         */
        protected function startsWithAll( $term ) {
@@ -1162,4 +1161,7 @@ class SpecialSearch extends SpecialPage {
                $this->extraParams[$key] = $value;
        }
 
+       protected function getGroupName() {
+               return 'redirects';
+       }
 }
index 5a4e8f0..1be7fbe 100644 (file)
@@ -110,4 +110,8 @@ class ShortPagesPage extends QueryPage {
                                ? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"
                                : "<del>${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]</del>";
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index d80218f..57fffb8 100644 (file)
@@ -62,7 +62,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                $groups = array();
                foreach ( $pages as $page ) {
                        if ( $page->isListed() ) {
-                               $group = SpecialPageFactory::getGroup( $page );
+                               $group = $page->getFinalGroupName();
                                if( !isset( $groups[$group] ) ) {
                                        $groups[$group] = array();
                                }
index f4bc666..bc1b600 100644 (file)
@@ -277,21 +277,60 @@ class SpecialStatistics extends SpecialPage {
                return $text;
        }
 
-       private function getOtherStats( $stats ) {
-               if ( !count( $stats ) )
-                       return '';
+       /**
+        * Conversion of external statistics into an internal representation
+        * Following a ([<header-message>][<item-message>] = number) pattern
+        *
+        * @param array $stats
+        * @return string
+        */
+       private function getOtherStats( array $stats ) {
+               $return = '';
 
-               $return = Xml::openElement( 'tr' ) .
-                       Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-hooks' )->parse() ) .
-                       Xml::closeElement( 'tr' );
+               foreach( $stats as $header => $items ) {
+
+                       // Identify the structure used
+                       if ( is_array( $items ) ) {
 
-               foreach( $stats as $name => $number ) {
-                       $name = htmlspecialchars( $name );
-                       $number = htmlspecialchars( $number );
+                               // Ignore headers that are recursively set as legacy header
+                               if ( $header !== 'statistics-header-hooks' ) {
+                                       $return .= $this->formatRowHeader( $header );
+                               }
+
+                               // Collect all items that belong to the same header
+                               foreach( $items as $key => $value ) {
+                                       $name = $this->msg( $key )->inContentLanguage()->parse();
+                                       $number = htmlspecialchars( $value );
+
+                                       $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+                               }
+                       } else {
+                               // Create the legacy header only once
+                               if ( $return === '' ) {
+                                       $return .= $this->formatRowHeader( 'statistics-header-hooks' );
+                               }
 
-                       $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+                               // Recursively remap the legacy structure
+                               $return .= $this->getOtherStats( array( 'statistics-header-hooks' => array( $header => $items ) ) );
+                       }
                }
 
                return $return;
        }
+
+       /**
+        * Format row header
+        *
+        * @param string $header
+        * @return string
+        */
+       private function formatRowHeader( $header ) {
+               return Xml::openElement( 'tr' ) .
+                       Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( $header )->parse() ) .
+                       Xml::closeElement( 'tr' );
+       }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
 }
index 4036ebb..6d16103 100644 (file)
@@ -92,4 +92,8 @@ class SpecialTags extends SpecialPage {
 
                return Xml::tags( 'tr', null, $newRow ) . "\n";
        }
+
+       protected function getGroupName() {
+               return 'changes';
+       }
 }
index 076469c..c4a53cf 100644 (file)
@@ -213,4 +213,8 @@ class SpecialUnblock extends SpecialPage {
 
                return true;
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index 5865bf6..53aa3f3 100644 (file)
@@ -60,4 +60,7 @@ class UncategorizedImagesPage extends ImageQueryPage {
                );
        }
 
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 37fcb2f..b518e6f 100644 (file)
@@ -55,7 +55,7 @@ class UncategorizedPagesPage extends PageQueryPage {
                        // default for page_namespace is all content namespaces (if requestedNamespace is false)
                        // otherwise, page_namespace is requestedNamespace
                        'conds' => array ( 'cl_from IS NULL',
-                                       'page_namespace' => ( $this->requestedNamespace!==false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
+                                       'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
                                        'page_is_redirect' => 0 ),
                        'join_conds' => array ( 'categorylinks' => array (
                                        'LEFT JOIN', 'cl_from = page_id' ) )
@@ -69,4 +69,8 @@ class UncategorizedPagesPage extends PageQueryPage {
                        return array( 'page_namespace', 'page_title' );
                return array( 'page_title' );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index afc41bf..e036348 100644 (file)
@@ -67,7 +67,7 @@ class PageArchive {
         * given title prefix.
         * Returns result wrapper with (ar_namespace, ar_title, count) fields.
         *
-        * @param $prefix String: title prefix
+        * @param string $prefix title prefix
         * @return ResultWrapper
         */
        public static function listPagesByPrefix( $prefix ) {
@@ -331,7 +331,7 @@ class PageArchive {
         * Once restored, the items will be removed from the archive tables.
         * The deletion log will be updated with an undeletion notice.
         *
-        * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
         * @param $comment String
         * @param $fileVersions Array
         * @param $unsuppress Boolean
@@ -413,7 +413,7 @@ class PageArchive {
         * to the cur/old tables. If the page currently exists, all revisions will
         * be stuffed into old, otherwise the most recent will go into cur.
         *
-        * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
         * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
         *
         * @param $comment String
@@ -447,9 +447,9 @@ class PageArchive {
                        $makepage = false;
                        # Page already exists. Import the history, and if necessary
                        # we'll update the latest revision field in the record.
-                       $newid             = 0;
-                       $pageId            = $page->page_id;
-                       $previousRevId    = $page->page_latest;
+
+                       $previousRevId = $page->page_latest;
+
                        # Get the time span of this page
                        $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
                                array( 'rev_id' => $previousRevId ),
@@ -532,10 +532,8 @@ class PageArchive {
                $revision = Revision::newFromArchiveRow( $row,
                        array(
                                'title' => $article->getTitle(), // used to derive default content model
-                       ) );
-
-               $m = $revision->getContentModel();
-
+                       )
+               );
                $user = User::newFromName( $revision->getRawUserText(), false );
                $content = $revision->getContent( Revision::RAW );
 
@@ -552,7 +550,7 @@ class PageArchive {
                                return Status::newFatal( "undeleterevdel" );
                        }
                        // Safe to insert now...
-                       $newid  = $article->insertOn( $dbw );
+                       $newid = $article->insertOn( $dbw );
                        $pageId = $newid;
                } else {
                        // Check if a deleted revision will become the current revision...
@@ -563,7 +561,7 @@ class PageArchive {
                                }
                        }
 
-                       $newid  = false;
+                       $newid = false;
                        $pageId = $article->getId();
                }
 
@@ -783,7 +781,7 @@ class SpecialUndelete extends SpecialPage {
                                'action' => $wgScript ) ) .
                        Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
                        Html::hidden( 'title',
-                               $this->getTitle()->getPrefixedDbKey() ) .
+                               $this->getTitle()->getPrefixedDBkey() ) .
                        Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
                                'prefix', 'prefix', 20,
                                $this->mSearchPrefix ) . ' ' .
@@ -939,8 +937,8 @@ class SpecialUndelete extends SpecialPage {
                        // source view for textual content
                        $sourceView = Xml::element( 'textarea', array(
                                'readonly' => 'readonly',
-                               'cols' => intval( $user->getOption( 'cols' ) ),
-                               'rows' => intval( $user->getOption( 'rows' ) ) ),
+                               'cols' => $user->getIntOption( 'cols' ),
+                               'rows' => $user->getIntOption( 'rows' ) ),
                                $content->getNativeData() . "\n" );
 
                        $previewButton = Xml::element( 'input', array(
@@ -967,7 +965,7 @@ class SpecialUndelete extends SpecialPage {
                        Xml::element( 'input', array(
                                'type' => 'hidden',
                                'name' => 'target',
-                               'value' => $this->mTargetObj->getPrefixedDbKey() ) ) .
+                               'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
                        Xml::element( 'input', array(
                                'type' => 'hidden',
                                'name' => 'timestamp',
@@ -1260,7 +1258,7 @@ class SpecialUndelete extends SpecialPage {
 
                if ( $this->mAllowed ) {
                        # Slip in the hidden controls here
-                       $misc  = Html::hidden( 'target', $this->mTarget );
+                       $misc = Html::hidden( 'target', $this->mTarget );
                        $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
                        $misc .= Xml::closeElement( 'form' );
                        $out->addHTML( $misc );
@@ -1380,7 +1378,7 @@ class SpecialUndelete extends SpecialPage {
         *
         * @param $rev Revision
         * @param $titleObj Title
-        * @param $ts string Timestamp
+        * @param string $ts Timestamp
         * @return string
         */
        function getPageLink( $rev, $titleObj, $ts ) {
@@ -1411,8 +1409,8 @@ class SpecialUndelete extends SpecialPage {
         *
         * @param $file File
         * @param $titleObj Title
-        * @param $ts string A timestamp
-        * @param $key String: a storage key
+        * @param string $ts A timestamp
+        * @param string $key a storage key
         *
         * @return String: HTML fragment
         */
@@ -1525,4 +1523,8 @@ class SpecialUndelete extends SpecialPage {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
                }
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 2e77254..35141d8 100644 (file)
@@ -84,4 +84,8 @@ class SpecialUnlockdb extends FormSpecialPage {
                $out->addSubtitle( $this->msg( 'unlockdbsuccesssub' ) );
                $out->addWikiMsg( 'unlockdbsuccesstext' );
        }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
 }
index 69c42d5..6b91dd3 100644 (file)
@@ -64,4 +64,8 @@ class UnusedCategoriesPage extends QueryPage {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
                return Linker::link( $title, htmlspecialchars( $title->getText() ) );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index cdab557..6955328 100644 (file)
@@ -80,4 +80,7 @@ class UnusedimagesPage extends ImageQueryPage {
                return $this->msg( 'unusedimagestext' )->parseAsBlock();
        }
 
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index fe79731..493e936 100644 (file)
@@ -85,4 +85,8 @@ class UnusedtemplatesPage extends QueryPage {
        function getPageHeader() {
                return $this->msg( 'unusedtemplatestext' )->parseAsBlock();
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index d397149..05ec6b0 100644 (file)
@@ -94,4 +94,8 @@ class UnwatchedpagesPage extends QueryPage {
 
                return $this->getLanguage()->specialList( $plink, $wlink );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index c1505a0..89c06b2 100644 (file)
@@ -39,7 +39,7 @@ class SpecialUpload extends SpecialPage {
        }
 
        /** Misc variables **/
-       public $mRequest;                       // The WebRequest or FauxRequest this form is supposed to handle
+       public $mRequest; // The WebRequest or FauxRequest this form is supposed to handle
        public $mSourceType;
 
        /**
@@ -54,7 +54,7 @@ class SpecialUpload extends SpecialPage {
        public $mUploadClicked;
 
        /** User input variables from the "description" section **/
-       public $mDesiredDestName;       // The requested target file name
+       public $mDesiredDestName; // The requested target file name
        public $mComment;
        public $mLicense;
 
@@ -66,10 +66,10 @@ class SpecialUpload extends SpecialPage {
 
        /** Hidden variables **/
        public $mDestWarningAck;
-       public $mForReUpload;           // The user followed an "overwrite this file" link
-       public $mCancelUpload;          // The user clicked "Cancel and return to upload form" button
+       public $mForReUpload; // The user followed an "overwrite this file" link
+       public $mCancelUpload; // The user clicked "Cancel and return to upload form" button
        public $mTokenOk;
-       public $mUploadSuccessful = false;      // Subclasses can use this to determine whether a file was uploaded
+       public $mUploadSuccessful = false; // Subclasses can use this to determine whether a file was uploaded
 
        /** Text injection points for hooks not using HTMLForm **/
        public $uploadFormTextTop;
@@ -103,7 +103,6 @@ class SpecialUpload extends SpecialPage {
                $this->mCopyrightStatus = $request->getText( 'wpUploadCopyStatus' );
                $this->mCopyrightSource = $request->getText( 'wpUploadSource' );
 
-
                $this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
                $this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
                        || $request->getCheck( 'wpReUpload' ); // b/w compat
@@ -208,8 +207,8 @@ class SpecialUpload extends SpecialPage {
        /**
         * Get an UploadForm instance with title and text properly set.
         *
-        * @param $message String: HTML string to add to the form
-        * @param $sessionKey String: session key in case this is a stashed upload
+        * @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
         * @return UploadForm
         */
@@ -299,7 +298,7 @@ class SpecialUpload extends SpecialPage {
         * essentially means that UploadBase::VERIFICATION_ERROR and
         * UploadBase::EMPTY_FILE should not be passed here.
         *
-        * @param $message String: HTML message to be passed to mainUploadForm
+        * @param string $message HTML message to be passed to mainUploadForm
         */
        protected function showRecoverableUploadError( $message ) {
                $sessionKey = $this->mUpload->stashSession();
@@ -373,7 +372,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Show the upload form with error message, but do not stash the file.
         *
-        * @param $message string HTML string
+        * @param string $message HTML string
         */
        protected function showUploadError( $message ) {
                $message = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n" .
@@ -522,11 +521,10 @@ class SpecialUpload extends SpecialPage {
                }
        }
 
-
        /**
         * Provides output to the user for a result of UploadBase::verifyUpload
         *
-        * @param $details Array: result of UploadBase::verifyUpload
+        * @param array $details result of UploadBase::verifyUpload
         * @throws MWException
         */
        protected function processVerificationError( $details ) {
@@ -625,7 +623,7 @@ 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 $exists Array: the result of UploadBase::getExistsWarning
+        * @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 ) {
@@ -678,7 +676,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Get a list of warnings
         *
-        * @param $filename String: local filename, e.g. 'file exists', 'non-descriptive filename'
+        * @param string $filename local filename, e.g. 'file exists', 'non-descriptive filename'
         * @return Array: list of warning messages
         */
        public static function ajaxGetExistsWarning( $filename ) {
@@ -719,6 +717,9 @@ class SpecialUpload extends SpecialPage {
                        $gallery->toHtml() . "</li>\n";
        }
 
+       protected function getGroupName() {
+               return 'media';
+       }
 }
 
 /**
@@ -953,7 +954,7 @@ class UploadForm extends HTMLForm {
                                        ? 'filereuploadsummary'
                                        : 'fileuploadsummary',
                                'default' => $this->mComment,
-                               'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
+                               'cols' => $this->getUser()->getIntOption( 'cols' ),
                                'rows' => 8,
                        )
                );
@@ -1084,7 +1085,6 @@ class UploadForm extends HTMLForm {
                $out = $this->getOutput();
                $out->addJsConfigVars( $scriptVars );
 
-
                $out->addModules( array(
                        'mediawiki.action.edit', // For <charinsert> support
                        'mediawiki.legacy.upload', // Old form stuff...
index 31f9669..ddf0c6d 100644 (file)
@@ -57,7 +57,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Execute page -- can output a file directly or show a listing of them.
         *
-        * @param $subPage String: subpage, e.g. in http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
+        * @param string $subPage subpage, e.g. in http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
         * @return Boolean: success
         */
        public function execute( $subPage ) {
@@ -73,7 +73,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * If file available in stash, cats it out to the client as a simple HTTP response.
         * n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
         *
-        * @param $key String: the key of a particular requested file
+        * @param string $key the key of a particular requested file
         * @throws HttpError
         * @return bool
         */
@@ -167,8 +167,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Scale a file (probably with a locally installed imagemagick, or similar) and output it to STDOUT.
         * @param $file File
-        * @param $params array Scaling parameters ( e.g. array( width => '50' ) );
-        * @param $flags int Scaling flags ( see File:: constants )
+        * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
+        * @param int $flags Scaling flags ( see File:: constants )
         * @throws MWException
         * @throws UploadStashFileNotFoundException
         * @return boolean success
@@ -277,8 +277,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Output HTTP response of raw content
         * Side effect: writes HTTP response to STDOUT.
-        * @param $content String content
-        * @param $contentType String mime type
+        * @param string $content content
+        * @param string $contentType mime type
         * @throws SpecialUploadStashTooLargeException
         * @return bool
         */
@@ -296,8 +296,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Output headers for streaming
         * XXX unsure about encoding as binary; if we received from HTTP perhaps we should use that encoding, concatted with semicolon to mimeType as it usually is.
         * Side effect: preps PHP to write headers to STDOUT.
-        * @param String $contentType : string suitable for content-type header
-        * @param String $size: length in bytes
+        * @param string $contentType : string suitable for content-type header
+        * @param string $size: length in bytes
         */
        private static function outputFileHeaders( $contentType, $size ) {
                header( "Content-Type: $contentType", true );
@@ -327,14 +327,9 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Default action when we don't have a subpage -- just show links to the uploads we have,
         * Also show a button to clear stashed files
-        * @param $status [optional] Status: the result of processRequest
         * @return bool
         */
-       private function showUploads( $status = null ) {
-               if ( $status === null ) {
-                       $status = Status::newGood();
-               }
-
+       private function showUploads() {
                // sets the title, etc.
                $this->setHeaders();
                $this->outputHeader();
index 27701d4..dc350bf 100644 (file)
@@ -201,7 +201,7 @@ class LoginForm extends SpecialPage {
                if( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
-                       return false;
+                       return;
                }
 
                $u = $status->getValue();
@@ -604,7 +604,7 @@ class LoginForm extends SpecialPage {
                                // faces etc will probably just fail cleanly here.
                                $retval = self::RESET_PASS;
                        } else {
-                               $retval = ( $this->mPassword  == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
+                               $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
                        }
                } elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
                        // If we've enabled it, make it so that a blocked user cannot login
@@ -636,7 +636,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 $username string The user name
+        * @param string $username The user name
         * @return Bool|Integer The integer hit count or True if it is already at the limit
         */
        public static function incLoginThrottle( $username ) {
@@ -664,7 +664,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * Clear the login attempt throttle hit count for the (username,current IP) tuple.
-        * @param $username string The user name
+        * @param string $username The user name
         * @return void
         */
        public static function clearLoginThrottle( $username ) {
@@ -747,7 +747,7 @@ class LoginForm extends SpecialPage {
                        case self::SUCCESS:
                                # We've verified now, update the real record
                                $user = $this->getUser();
-                               if( (bool)$this->mRemember != (bool)$user->getOption( 'rememberpassword' ) ) {
+                               if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
                                        $user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
                                        $user->saveSettings();
                                } else {
@@ -831,6 +831,9 @@ class LoginForm extends SpecialPage {
                }
        }
 
+       /**
+        * @param $error string
+        */
        function resetLoginForm( $error ) {
                $this->getOutput()->addHTML( Xml::element( 'p', array( 'class' => 'error' ), $error ) );
                $reset = new SpecialChangePassword();
@@ -841,8 +844,8 @@ class LoginForm extends SpecialPage {
        /**
         * @param $u User object
         * @param $throttle Boolean
-        * @param $emailTitle String: message name of email title
-        * @param $emailText String: message name of email text
+        * @param string $emailTitle message name of email title
+        * @param string $emailText message name of email text
         * @return Status object
         */
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
@@ -870,7 +873,6 @@ class LoginForm extends SpecialPage {
                return $result;
        }
 
-
        /**
         * Run any hooks registered for logins, then HTTP redirect to
         * $this->mReturnTo (or Main Page if that's undefined).  Formerly we had a
@@ -923,7 +925,7 @@ class LoginForm extends SpecialPage {
        /**
         * Display an "successful action" page.
         *
-        * @param $title string|Message page's title
+        * @param string|Message $title page's title
         * @param $msgname string
         * @param $injected_html string
         */
@@ -945,6 +947,7 @@ class LoginForm extends SpecialPage {
         * User::isBlockedFromCreateAccount(), which gets this block, ignores the 'hardblock'
         * setting on blocks (bug 13611).
         * @param $block Block the block causing this error
+        * @throws ErrorPageError
         */
        function userBlockedMessage( Block $block ) {
                # Let's be nice about this, it's likely that this feature will be used
@@ -1334,8 +1337,8 @@ class LoginForm extends SpecialPage {
         * Create a language selector link for a particular language
         * Links back to this page preserving type and returnto
         *
-        * @param $text Link text
-        * @param $lang Language code
+        * @param string $text Link text
+        * @param string $lang Language code
         * @return string
         */
        function makeLanguageSelectorLink( $text, $lang ) {
@@ -1363,4 +1366,8 @@ class LoginForm extends SpecialPage {
                        $query
                );
        }
+
+       protected function getGroupName() {
+               return 'login';
+       }
 }
index 4be36c6..d957e87 100644 (file)
@@ -62,4 +62,8 @@ class SpecialUserlogout extends UnlistedSpecialPage {
 
                $out->returnToMain();
        }
+
+       protected function getGroupName() {
+               return 'login';
+       }
 }
index 4d43baf..d4baae2 100644 (file)
@@ -153,8 +153,8 @@ class UserrightsPage extends SpecialPage {
         * Save user groups changes in the database.
         * Data comes from the editUserGroupsForm() form function
         *
-        * @param $username String: username to apply changes to.
-        * @param $reason String: reason for group change
+        * @param string $username username to apply changes to.
+        * @param string $reason reason for group change
         * @return null
         */
        function saveUserGroups( $username, $reason = '' ) {
@@ -189,9 +189,9 @@ class UserrightsPage extends SpecialPage {
         * Save user groups changes in the database.
         *
         * @param $user User object
-        * @param $add Array of groups to add
-        * @param $remove Array of groups to remove
-        * @param $reason String: reason for group change
+        * @param array $add of groups to add
+        * @param array $remove of groups to remove
+        * @param string $reason reason for group change
         * @return Array: Tuple of added, then removed groups
         */
        function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
@@ -240,7 +240,6 @@ class UserrightsPage extends SpecialPage {
                return array( $add, $remove );
        }
 
-
        /**
         * Add a rights log entry for an action.
         */
@@ -259,7 +258,7 @@ class UserrightsPage extends SpecialPage {
 
        /**
         * Edit user groups membership
-        * @param $username String: name of the user.
+        * @param string $username name of the user.
         */
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username );
@@ -393,7 +392,7 @@ class UserrightsPage extends SpecialPage {
         * form will be able to manipulate based on the current user's system
         * permissions.
         *
-        * @param $groups Array: list of groups the given user is in
+        * @param array $groups list of groups the given user is in
         * @return Array:  Tuple of addable, then removable groups
         */
        protected function splitGroups( $groups ) {
@@ -528,7 +527,7 @@ 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 $usergroups Array: groups the user belongs to
+        * @param array $usergroups groups the user belongs to
         * @param $user User a user object
         * @return string XHTML table element with checkboxes
         */
@@ -612,7 +611,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * @param $group string: 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 ) {
@@ -640,4 +639,8 @@ class UserrightsPage extends SpecialPage {
                $output->addHTML( Xml::element( 'h2', null, $rightsLogPage->getName()->text() ) );
                LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() );
        }
+
+       protected function getGroupName() {
+               return 'users';
+       }
 }
index f847ca3..81d1781 100644 (file)
@@ -620,7 +620,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Convert an array of items into a list for display.
         *
-        * @param $list Array of elements to display
+        * @param array $list of elements to display
         * @param $sort Boolean: whether to sort the items in $list
         *
         * @return String
@@ -754,7 +754,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Retrieve the revision number of a Subversion working directory.
         *
-        * @param $dir String: directory of the svn checkout
+        * @param string $dir directory of the svn checkout
         *
         * @return Integer: revision number as int
         */
@@ -771,7 +771,7 @@ class SpecialVersion extends SpecialPage {
        }
 
        /**
-        * @param $dir String: directory of the git checkout
+        * @param string $dir directory of the git checkout
         * @return bool|String sha1 of commit HEAD points to
         */
        public static function getGitHeadSha1( $dir ) {
@@ -779,7 +779,6 @@ class SpecialVersion extends SpecialPage {
                return $repo->getHeadSHA1();
        }
 
-
        /**
         * Get the list of entry points and their URLs
         * @return string Wikitext
@@ -828,6 +827,10 @@ class SpecialVersion extends SpecialPage {
                return $out;
        }
 
+       protected function getGroupName() {
+               return 'wiki';
+       }
+
        function showEasterEgg() {
                $rx = $rp = $xe = '';
                $alpha = array( "", "kbQW", "\$\n()" );
index 0b1fb25..0035bfa 100644 (file)
@@ -72,4 +72,8 @@ class WantedCategoriesPage extends WantedQueryPage {
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
                return $this->getLanguage()->specialList( $plink, $nlinks );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index ddeb4a1..9a2d30a 100644 (file)
@@ -87,4 +87,8 @@ class WantedFilesPage extends WantedQueryPage {
                        )
                );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index 05df400..acec4ea 100644 (file)
@@ -91,4 +91,8 @@ class WantedPagesPage extends WantedQueryPage {
                wfRunHooks( 'WantedPages::getQueryInfo', array( &$this, &$query ) );
                return $query;
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index f3e3369..f5539c1 100644 (file)
@@ -52,4 +52,8 @@ class WantedTemplatesPage extends WantedQueryPage {
                                                'page_title = tl_title' ) ) )
                );
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index bf2d08b..f52c9a7 100644 (file)
@@ -116,7 +116,7 @@ class SpecialWatchlist extends SpecialPage {
                $this->customFilters = array();
                wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
                foreach( $this->customFilters as $key => $params ) {
-                       $defaults[$key] = $params['msg'];
+                       $defaults[$key] = $params['default'];
                }
 
                # Extract variables from the request, falling back to user preferences or
@@ -131,7 +131,7 @@ class SpecialWatchlist extends SpecialPage {
                $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
                $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
                foreach( $this->customFilters as $key => $params ) {
-                       $values[$key] = (int)$request->getBool( $key );
+                       $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
                }
 
                # Get namespace value, if supplied, and prepare a WHERE fragment
@@ -200,7 +200,6 @@ class SpecialWatchlist extends SpecialPage {
 
                # Up estimate of watched items by 15% to compensate for talk pages...
 
-
                # Toggles
                if( $values['hideOwn'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
@@ -226,7 +225,7 @@ class SpecialWatchlist extends SpecialPage {
 
                # Toggle watchlist content (all recent edits or just the latest)
                if( $values['extended'] ) {
-                       $limitWatchlist = intval( $user->getOption( 'wllimit' ) );
+                       $limitWatchlist = $user->getIntOption( 'wllimit' );
                        $usePage = false;
                } else {
                        # Top log Ids for a page are not stored
@@ -504,4 +503,8 @@ class SpecialWatchlist extends SpecialPage {
 
                return floor( $count / 2 );
        }
+
+       protected function getGroupName() {
+               return 'changes';
+       }
 }
index 0b835a2..cb3e985 100644 (file)
@@ -94,9 +94,9 @@ class SpecialWhatLinksHere extends SpecialPage {
        }
 
        /**
-        * @param $level int     Recursion level
+        * @param int $level     Recursion level
         * @param $target Title   Target title
-        * @param $limit int     Number of entries to display
+        * @param int $limit     Number of entries to display
         * @param $from Title   Display from this article ID
         * @param $back Title   Display from this article ID at backwards scrolling
         */
@@ -464,4 +464,8 @@ class SpecialWhatLinksHere extends SpecialPage {
                }
                return Xml::fieldset( $this->msg( 'whatlinkshere-filters' )->text(), $this->getLanguage()->pipeList( $links ) );
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 2988b04..3723740 100644 (file)
@@ -95,4 +95,8 @@ class WithoutInterwikiPage extends PageQueryPage {
                }
                return $query;
        }
+
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }
index bf5c487..2483e58 100644 (file)
  * @ingroup Templates
  */
 
+if ( !defined( 'MEDIAWIKI' ) ) {
+        die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+}
+
 if ( !isset( $wgVersion ) ) {
        $wgVersion = 'VERSION';
 }
diff --git a/includes/upload/AssembleUploadChunks.php b/includes/upload/AssembleUploadChunks.php
deleted file mode 100644 (file)
index 54ef840..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * Assemble the segments of a chunked upload.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
-set_time_limit( 3600 ); // 1 hour
-
-/**
- * Assemble the segments of a chunked upload.
- *
- * @ingroup Maintenance
- */
-class AssembleUploadChunks extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Re-assemble the segments of a chunked upload into a single file";
-               $this->addOption( 'filename', "Desired file name", true, true );
-               $this->addOption( 'filekey', "Upload stash file key", true, true );
-               $this->addOption( 'userid', "Upload owner user ID", true, true );
-               $this->addOption( 'sessionid', "Upload owner session ID", true, true );
-       }
-
-       public function execute() {
-               $e = null;
-               wfDebug( "Started assembly for file {$this->getOption( 'filename' )}\n" );
-               wfSetupSession( $this->getOption( 'sessionid' ) );
-               try {
-                       $user = User::newFromId( $this->getOption( 'userid' ) );
-                       if ( !$user ) {
-                               throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." );
-                       }
-
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
-                       );
-
-                       $upload = new UploadFromChunks( $user );
-                       $upload->continueChunks(
-                               $this->getOption( 'filename' ),
-                               $this->getOption( 'filekey' ),
-                               // @TODO: set User?
-                               RequestContext::getMain()->getRequest() // dummy request
-                       );
-
-                       // Combine all of the chunks into a local file and upload that to a new stash file
-                       $status = $upload->concatenateChunks();
-                       if ( !$status->isGood() ) {
-                               UploadBase::setSessionStatus(
-                                       $this->getOption( 'filekey' ),
-                                       array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
-                               );
-                               session_write_close();
-                               $this->error( $status->getWikiText() . "\n", 1 ); // die
-                       }
-
-                       // We have a new filekey for the fully concatenated file
-                       $newFileKey = $upload->getLocalFile()->getFileKey();
-
-                       // Remove the old stash file row and first chunk file
-                       $upload->stash->removeFileNoAuth( $this->getOption( 'filekey' ) );
-
-                       // Build the image info array while we have the local reference handy
-                       $apiMain = new ApiMain(); // dummy object (XXX)
-                       $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
-                       // Cleanup any temporary local file
-                       $upload->cleanupTempFile();
-
-                       // Cache the info so the user doesn't have to wait forever to get the final info
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array(
-                                       'result'    => 'Success',
-                                       'stage'     => 'assembling',
-                                       'filekey'   => $newFileKey,
-                                       'imageinfo' => $imageInfo,
-                                       'status'    => Status::newGood()
-                               )
-                       );
-               } catch ( MWException $e ) {
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array(
-                                       'result' => 'Failure',
-                                       'stage'  => 'assembling',
-                                       'status' => Status::newFatal( 'api-error-stashfailed' )
-                               )
-                       );
-               }
-               session_write_close();
-               if ( $e ) {
-                       throw $e;
-               }
-               wfDebug( "Finished assembly for file {$this->getOption( 'filename' )}\n" );
-       }
-}
-
-$maintClass = "AssembleUploadChunks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/includes/upload/PublishStashedFile.php b/includes/upload/PublishStashedFile.php
deleted file mode 100644 (file)
index 8198dea..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to 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/Maintenance.php' );
-set_time_limit( 3600 ); // 1 hour
-
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * @ingroup Maintenance
- */
-class PublishStashedFile extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Upload stashed file into the local file repo";
-               $this->addOption( 'filename', "Desired file name", true, true );
-               $this->addOption( 'filekey', "Upload stash file key", true, true );
-               $this->addOption( 'userid', "Upload owner user ID", true, true );
-               $this->addOption( 'comment', "Upload comment", true, true );
-               $this->addOption( 'text', "Upload description", true, true );
-               $this->addOption( 'watch', "Whether the uploader should watch the page", true, true );
-               $this->addOption( 'sessionid', "Upload owner session ID", true, true );
-       }
-
-       public function execute() {
-               wfSetupSession( $this->getOption( 'sessionid' ) );
-               try {
-                       $user = User::newFromId( $this->getOption( 'userid' ) );
-                       if ( !$user ) {
-                               throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." );
-                       }
-
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
-                       );
-
-                       $upload = new UploadFromStash( $user );
-                       // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
-                       // checks and anything else to the stash stage (which includes concatenation and
-                       // the local file is thus already there). That way, instead of GET+PUT, there could
-                       // just be a COPY operation from the stash to the public zone.
-                       $upload->initialize( $this->getOption( 'filekey' ), $this->getOption( 'filename' ) );
-
-                       // Check if the local file checks out (this is generally a no-op)
-                       $verification = $upload->verifyUpload();
-                       if ( $verification['status'] !== UploadBase::OK ) {
-                               $status = Status::newFatal( 'verification-error' );
-                               $status->value = array( 'verification' => $verification );
-                               UploadBase::setSessionStatus(
-                                       $this->getOption( 'filekey' ),
-                                       array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
-                               );
-                               $this->error( "Could not verify upload.\n", 1 ); // die
-                       }
-
-                       // Upload the stashed file to a permanent location
-                       $status = $upload->performUpload(
-                               $this->getOption( 'comment' ),
-                               $this->getOption( 'text' ),
-                               $this->getOption( 'watch' ),
-                               $user
-                       );
-                       if ( !$status->isGood() ) {
-                               UploadBase::setSessionStatus(
-                                       $this->getOption( 'filekey' ),
-                                       array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
-                               );
-                               $this->error( $status->getWikiText() . "\n", 1 ); // die
-                       }
-
-                       // Build the image info array while we have the local reference handy
-                       $apiMain = new ApiMain(); // dummy object (XXX)
-                       $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
-                       // Cleanup any temporary local file
-                       $upload->cleanupTempFile();
-
-                       // Cache the info so the user doesn't have to wait forever to get the final info
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array(
-                                       'result'    => 'Success',
-                                       'stage'     => 'publish',
-                                       'filename'  => $upload->getLocalFile()->getName(),
-                                       'imageinfo' => $imageInfo,
-                                       'status'    => Status::newGood()
-                               )
-                       );
-               } catch ( MWException $e ) {
-                       UploadBase::setSessionStatus(
-                               $this->getOption( 'filekey' ),
-                               array(
-                                       'result' => 'Failure',
-                                       'stage'  => 'publish',
-                                       'status' => Status::newFatal( 'api-error-publishfailed' )
-                               )
-                       );
-                       throw $e;
-               }
-               session_write_close();
-       }
-}
-
-$maintClass = "PublishStashedFile";
-require_once( RUN_MAINTENANCE_IF_MAIN );
index 3a37f11..8381b4c 100644 (file)
@@ -108,7 +108,7 @@ abstract class UploadBase {
        /**
         * Returns true if the user can use this upload module or else a string
         * identifying the missing permission.
-        * Can be overriden by subclasses.
+        * Can be overridden by subclasses.
         *
         * @param $user User
         * @return bool
@@ -190,10 +190,10 @@ abstract class UploadBase {
 
        /**
         * Initialize the path information
-        * @param $name string the desired destination name
-        * @param $tempPath string the temporary path
-        * @param $fileSize int the file size
-        * @param $removeTempFile bool (false) remove the temporary file?
+        * @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
         */
        public function initializePathInfo( $name, $tempPath, $fileSize, $removeTempFile = false ) {
@@ -239,12 +239,12 @@ abstract class UploadBase {
         * Get the base 36 SHA1 of the file
         * @return string
         */
-       protected function getTempFileSha1Base36() {
+       public function getTempFileSha1Base36() {
                return FSFile::getSha1Base36FromPath( $this->mTempPath );
        }
 
        /**
-        * @param $srcPath String: the source path
+        * @param string $srcPath the source path
         * @return string the real path if it was a virtual URL
         */
        function getRealPath( $srcPath ) {
@@ -252,7 +252,7 @@ abstract class UploadBase {
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        // @TODO: just make uploads work with storage paths
-                       // UploadFromStash loads files via virtuals URLs
+                       // UploadFromStash loads files via virtual URLs
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        $tmpFile->bind( $this ); // keep alive with $this
                        wfProfileOut( __METHOD__ );
@@ -353,7 +353,7 @@ abstract class UploadBase {
        /**
         * Verify the mime type
         *
-        * @param $mime string representing the mime
+        * @param string $mime representing the mime
         * @return mixed true if the file is verified, an array otherwise
         */
        protected function verifyMimeType( $mime ) {
@@ -704,8 +704,6 @@ abstract class UploadBase {
                }
                $this->mFilteredName = $nt->getDBkey();
 
-
-
                /**
                 * We'll want to blacklist against *any* 'extension', and use
                 * only the final one for the whitelist.
@@ -733,7 +731,6 @@ abstract class UploadBase {
                                        $ext = array( $this->mFinalExtension );
                                }
                        }
-
                }
 
                /* Don't allow users to override the blacklist (check file extension) */
@@ -887,8 +884,8 @@ abstract class UploadBase {
        /**
         * Checks if the mime type of the uploaded file matches the file extension.
         *
-        * @param $mime String: the mime type of the uploaded file
-        * @param $extension String: the filename extension that the file is to be served with
+        * @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
         */
        public static function verifyExtension( $mime, $extension ) {
@@ -928,9 +925,9 @@ abstract class UploadBase {
         * potentially harmful. The present implementation will produce false
         * positives in some situations.
         *
-        * @param $file String: pathname to the temporary upload file
-        * @param $mime String: the mime type of the file
-        * @param $extension String: the extension of the file
+        * @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
         */
        public static function detectScript( $file, $mime, $extension ) {
@@ -970,7 +967,7 @@ abstract class UploadBase {
 
                $chunk = trim( $chunk );
 
-               # @todo FIXME: Convert from UTF-16 if necessarry!
+               # @todo FIXME: Convert from UTF-16 if necessary!
                wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
 
                # check for HTML doctype
@@ -1103,13 +1100,13 @@ abstract class UploadBase {
                                return true;
                        }
 
-                       # href with embeded svg as target
+                       # 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" );
                                return true;
                        }
 
-                       # href with embeded (text/xml) svg as target
+                       # 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" );
                                return true;
@@ -1123,19 +1120,18 @@ abstract class UploadBase {
 
                        # use set to add href attribute to parent element
                        if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
+                               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 ) ) {
-                               wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
+                       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 ) ) {
+                       if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
@@ -1177,7 +1173,7 @@ abstract class UploadBase {
         * This relies on the $wgAntivirus and $wgAntivirusSetup variables.
         * $wgAntivirusRequired may be used to deny upload if the scan fails.
         *
-        * @param $file String: pathname to the temporary upload file
+        * @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.
@@ -1305,7 +1301,7 @@ abstract class UploadBase {
         * Check if a user is the last uploader
         *
         * @param $user User object
-        * @param $img String: image name
+        * @param string $img image name
         * @return Boolean
         */
        public static function userCanReUpload( User $user, $img ) {
@@ -1377,6 +1373,17 @@ abstract class UploadBase {
                        }
                }
 
+               // Check for files with the same name but a different extension
+               $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
+                               "{$partname}.", 1 );
+               if ( count( $similarFiles ) ) {
+                       return array(
+                               'warning' => 'exists-normalized',
+                               'file' => $file,
+                               'normalizedFile' => $similarFiles[0],
+                       );
+               }
+
                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 );
@@ -1397,7 +1404,6 @@ abstract class UploadBase {
                        }
                }
 
-
                foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
                        if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
                                return array(
index 5a838ab..e784e51 100644 (file)
@@ -66,7 +66,7 @@ class UploadFromChunks extends UploadFromFile {
         *
         * @return UploadStashFile stashed file
         */
-       public function stashFile() {
+       public function stashFile( User $user = null ) {
                // Stash file is the called on creating a new chunk session:
                $this->mChunkIndex = 0;
                $this->mOffset = 0;
@@ -173,9 +173,9 @@ class UploadFromChunks extends UploadFromFile {
        /**
         * Add a chunk to the temporary directory
         *
-        * @param $chunkPath string path to temporary chunk file
-        * @param $chunkSize int size of the current chunk
-        * @param $offset int offset of current chunk ( mutch match database chunk offset )
+        * @param string $chunkPath path to temporary chunk file
+        * @param int $chunkSize size of the current chunk
+        * @param int $offset offset of current chunk ( mutch match database chunk offset )
         * @return Status
         */
        public function addChunk( $chunkPath, $chunkSize, $offset ) {
index 71ee96b..fd2416d 100644 (file)
@@ -133,7 +133,7 @@ class UploadFromStash extends UploadBase {
         * Get the base 36 SHA1 of the file
         * @return string
         */
-       protected function getTempFileSha1Base36() {
+       public function getTempFileSha1Base36() {
                return $this->mFileProps['sha1'];
        }
 
index 65626cf..cfa3879 100644 (file)
@@ -97,7 +97,7 @@ 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.
         *
-        * @param $key String: key under which file information is stored
+        * @param string $key key under which file information is stored
         * @param $noAuth Boolean (optional) Don't check authentication. Used by maintenance scripts.
         * @throws UploadStashFileNotFoundException
         * @throws UploadStashNotLoggedInException
@@ -155,7 +155,7 @@ class UploadStash {
        /**
         * Getter for file metadata.
         *
-        * @param $key String: key under which file information is stored
+        * @param string $key key under which file information is stored
         * @return Array
         */
        public function getMetadata ( $key ) {
@@ -166,7 +166,7 @@ class UploadStash {
        /**
         * Getter for fileProps
         *
-        * @param $key String: key under which file information is stored
+        * @param string $key key under which file information is stored
         * @return Array
         */
        public function getFileProps ( $key ) {
@@ -177,8 +177,8 @@ class UploadStash {
        /**
         * Stash a file in a temp directory and record that we did this in the database, along with other metadata.
         *
-        * @param $path String: path to file you want stashed
-        * @param $sourceType String: the type of upload that generated this file (currently, I believe, 'file' or null)
+        * @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)
         * @throws UploadStashBadPathException
         * @throws UploadStashFileException
         * @throws UploadStashNotLoggedInException
@@ -349,7 +349,6 @@ class UploadStash {
                return $this->removeFileNoAuth( $key );
        }
 
-
        /**
         * Remove a file (see removeFile), but doesn't check ownership first.
         *
@@ -358,6 +357,9 @@ class UploadStash {
        public function removeFileNoAuth( $key ) {
                wfDebug( __METHOD__ . " clearing row $key\n" );
 
+               // Ensure we have the UploadStashFile loaded for this key
+               $this->getFile( $key );
+
                $dbw = $this->repo->getMasterDb();
 
                $dbw->delete(
@@ -445,7 +447,7 @@ class UploadStash {
        /**
         * Helper function: do the actual database query to fetch file metadata.
         *
-        * @param $key String: key
+        * @param string $key key
         * @param $readFromDB: constant (default: DB_SLAVE)
         * @return boolean
         */
@@ -479,7 +481,7 @@ class UploadStash {
        /**
         * Helper function: Initialize the UploadStashFile for a given file.
         *
-        * @param $key String: key under which to store the object
+        * @param string $key key under which to store the object
         * @throws UploadStashZeroLengthFileException
         * @return bool
         */
@@ -503,8 +505,8 @@ class UploadStashFile extends UnregisteredLocalFile {
         * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
         *
         * @param $repo FileRepo: repository where we should find the path
-        * @param $path String: path to file
-        * @param $key String: key to store the path and any stashed data under
+        * @param string $path path to file
+        * @param string $key key to store the path and any stashed data under
         * @throws UploadStashBadPathException
         * @throws UploadStashFileNotFoundException
         */
@@ -553,7 +555,7 @@ 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 $thumbName String: name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
+        * @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 ) {
@@ -569,7 +571,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * We override this because we want to use the pretty url name instead of the
         * ugly file name.
         *
-        * @param $params Array: handler-specific parameters
+        * @param array $params handler-specific parameters
         * @param $flags integer Bitfield that supports THUMB_* constants
         * @return String: base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
@@ -592,7 +594,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
         * (that's hidden in the db)
         *
-        * @param $thumbName String: 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 ) {
index 2c3dc07..b3e40b6 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of index.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ef6a367..01751db 100644 (file)
@@ -3984,6 +3984,45 @@ class Language {
                }
        }
 
+       /**
+        * Get the ordered list of fallback languages, ending with the fallback
+        * language chain for the site language.
+        *
+        * @since 1.21
+        * @param $code string Language code
+        * @return array
+        */
+       public static function getFallbacksIncludingSiteLanguage( $code ) {
+               global $wgLanguageCode;
+
+               // Usually, we will only store a tiny number of fallback chains, so we
+               // keep them in static memory.
+               static $fallbackLanguageCache = array();
+               $cacheKey = "{$code}-{$wgLanguageCode}";
+
+               if ( !array_key_exists( $cacheKey, $fallbackLanguageCache ) ) {
+                       $fallbacks = self::getFallbacksFor( $code );
+
+                       // Take the final 'en' off of the array before splicing
+                       if ( end( $fallbacks ) === 'en' ) {
+                               array_pop( $fallbacks );
+                       }
+                       // Append the site's fallback chain
+                       $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+
+                       // Eliminate any languages already included in the chain
+                       $siteFallbacks = array_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
+                       if ( $siteFallbacks ) {
+                               $fallbacks = array_merge( $fallbacks, $siteFallbacks );
+                       }
+                       if ( end( $fallbacks ) !== 'en' ) {
+                               $fallbacks[] = 'en';
+                       }
+                       $fallbackLanguageCache[$cacheKey] = $fallbacks;
+               }
+               return $fallbackLanguageCache[$cacheKey];
+       }
+
        /**
         * Get all messages for a given language
         * WARNING: this may take a long time. If you just need all message *keys*
index 8b03eee..bce1663 100644 (file)
        'pdc' => 'Deitsch',     # Pennsylvania German
        'pdt' => 'Plautdietsch',        # Plautdietsch/Mennonite Low German
        'pfl' => 'Pälzisch',   # Palatinate German
-       'pi' => 'पाळि', # Pali
+       'pi' => 'पालि', # Pali
        'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
        'pl' => 'polski',               # Polish
        'pms' => 'Piemontèis', # Piedmontese
diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php
deleted file mode 100644 (file)
index ac4ebda..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-/**
- * Lithuanian (Lietuvių) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Lithuanian (Lietuvių)
- *
- * @ingroup Language
- */
-class LanguageLt extends Language {
-       /* Word forms (with examples):
-               1 - vienas (1) lapas, dvidešimt vienas (21) lapas
-               2 - trys (3) lapai
-               3 - penkiolika (15) lapų
-       */
-
-       /**
-        * Lithuanian plural forms as per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lt
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               // if the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
-               if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
-
-               $forms = $this->preConvertPlural( $forms, 3 );
-               // Form[0] if n mod 10 is 1 and n mod 100 not in 11..19;
-               if ( $count % 10 == 1 && $count % 100 != 11 ) return $forms[0];
-               // Forms[1] if n mod 10 in 2..9 and n mod 100 not in 11..19;
-               if ( $count % 10 >= 2 && ( $count % 100 < 10 || $count % 100 >= 20 ) ) return $forms[1];
-               return $forms[2];
-       }
-}
diff --git a/languages/classes/LanguageLv.php b/languages/classes/LanguageLv.php
deleted file mode 100644 (file)
index e76f6f9..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Latvian (Latviešu) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Niklas Laxström
- * @copyright Copyright © 2006, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @ingroup Language
- */
-
-/**
- * Latvian (Latviešu)
- *
- * @ingroup Language
- */
-class LanguageLv extends Language {
-       /**
-        * Plural form transformations. Using the first form for words with the last digit 1, but not for words with the last digits 11, and the second form for all the others.
-        *
-        * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
-        *
-        * @param $count Integer
-        * @param $forms Array
-        * @return String
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               // @todo FIXME: CLDR defines 3 plural forms instead of 2.  Form for 0 is missing.
-               //        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lv
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $forms[0] : $forms[1];
-       }
-}
index e4262a4..21eaf4a 100644 (file)
@@ -642,7 +642,7 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
 'gotaccount' => "Het u reeds 'n rekening? '''$1'''.",
 'gotaccountlink' => 'Teken in',
 'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
-'createaccountmail' => 'deur e-pos',
+'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
 'createaccountreason' => 'Rede:',
 'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
 'userexists' => "Die gebruikersnaam wat u gekies het is reeds geneem.
@@ -710,7 +710,7 @@ Wag asseblief alvorens u weer probeer.",
 '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.",
 
-# E-mail sending
+# Email sending
 '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.",
@@ -855,9 +855,9 @@ Dis was moontlik geskuif of verwyder terwyl u die bladsy gelees het.",
 'loginreqlink' => 'teken in',
 'loginreqpagetext' => 'U moet $1 om ander bladsye te bekyk.',
 'accmailtitle' => 'Wagwoord gestuur.',
-'accmailtext' => "'n Lukraakgegenereerde wagwoord vir [[User talk:$1|$1]] is na $2 gestuur.
+'accmailtext' => "'n Lukrake wagwoord vir [[User talk:$1|$1]] is na $2 gestuur.
 
-Die wagwoord vir hierdie nuwe gebruiker kan verander word op die ''[[Special:ChangePassword|verander wagwoord]]'' bladsy nadat ingeteken is.",
+Die wagwoord vir hierdie nuwe gebruiker kan op die ''[[Special:ChangePassword|verander wagwoord]]''-bladsy verander word nadat ingeteken is.",
 'newarticle' => '(Nuut)',
 'newarticletext' => "Hierdie bladsy bestaan nie.
 Tik iets in die invoerboks hier onder om 'n nuwe bladsy te skep. Meer inligting is op die [[{{MediaWiki:Helppage}}|hulpbladsy]] beskikbaar.
@@ -945,7 +945,7 @@ Die administrateur wat dit gesluit het se verduideliking: $1",
 'cascadeprotectedwarning' => "'''Waarskuwing:''' Die bladsy was beveilig sodat dit slegs deur administrateurs gewysig kan word, omrede dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat kaskade-beskerming geniet:",
 'titleprotectedwarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig. Slegs gebruikers met [[Special:ListGroupRights|spesiale regte]] sal dit kan skep.'''
 Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'templatesused' => 'Hierdie bladsy {{PLURAL:$1|gebruik sjabloon|gebruik sjablone}}:',
+'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik op hierdie blad:',
 'templatesusedpreview' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik in hierdie voorskou:',
 'templatesusedsection' => 'Die volgende {{PLURAL:$1|sjabloon|sjablone}} word in hierdie afdeling gebruik:',
 'template-protected' => '(beskermd)',
@@ -1242,7 +1242,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'search-interwiki-default' => '$1 resultate:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwante',
-'mwsuggest-disable' => 'Deaktiveer AJAX-voorstelle',
+'mwsuggest-disable' => 'Deaktiveer soek-voorstelle',
 'searcheverything-enable' => 'Soek in alle naamruimtes',
 'searchrelated' => 'verwante',
 'searchall' => 'alle',
@@ -1350,9 +1350,9 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 Die aksie kan nie ongedaan gemaak word nie.',
 'prefs-emailconfirm-label' => 'E-posbevestiging:',
 'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
-'youremail' => 'E-pos',
+'youremail' => 'E-posadres:',
 'username' => '{{GENDER:$1|Gebruikersnaam}}:',
-'uid' => '{{GENDER:$1|Gebruikersnommer}}:',
+'uid' => '{{GENDER:$1|Gebruiker-ID}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:',
 'prefs-registration' => 'Registrasiedatum:',
 'yourrealname' => 'Regte naam:',
@@ -1391,7 +1391,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'prefs-displaywatchlist' => 'Weergaweopsies',
 'prefs-diffs' => 'Verskille',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Die e-posadres lyk geldig',
 'email-address-validity-invalid' => "Verskaf 'n geldige e-posadres",
 
@@ -1990,6 +1990,12 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
 'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-legend' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-text' => "Hierdie bladsy lys blaaie met 'n bepaalde blady-eienskap.",
+'pageswithprop-prop' => 'Naam van die eienskap:',
+'pageswithprop-submit' => 'OK',
+
 'doubleredirects' => 'Dubbele aansture',
 'doubleredirectstext' => 'Hierdie lys bevat bladsye wat aansture na ander aanstuurblaaie is.
 Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuur se teks, wat gewoonlik die "regte" teiken-bladsy gee waarna die eerste aanstuur behoort te wys.
@@ -2182,7 +2188,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'listgrouprights-addgroup-self-all' => 'Alle groepe byvoeg tot eie gebruiker',
 'listgrouprights-removegroup-self-all' => 'Alle groepe verwyder van eie gebruiker',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Geen versendadres beskikbaar',
 'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in die [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te stuur.",
 'emailuser' => 'Stuur e-pos na hierdie gebruiker',
@@ -2219,7 +2225,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'usermessage-editor' => 'Stelselboodskapper',
 
 # Watchlist
-'watchlist' => 'My dophoulys',
+'watchlist' => 'Dophoulys',
 'mywatchlist' => 'Dophoulys',
 'watchlistfor2' => 'Vir $1 $2',
 'nowatchlist' => 'U het geen items in u dophoulys nie.',
@@ -2319,7 +2325,7 @@ Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit d
 Kyk na $2 vir \'n rekord van onlangse skrappings.',
 'dellogpage' => 'Skraplogboek',
 'dellogpagetext' => "Hier onder is 'n lys van die mees onlangse skrappings. Alle tye is bedienertyd (UGT).",
-'deletionlog' => 'skrappings-logboek',
+'deletionlog' => 'skraplogboek',
 'reverted' => 'Het terug gegaan na vroeëre weergawe',
 'deletecomment' => 'Rede:',
 'deleteotherreason' => 'Ander/ekstra rede:',
@@ -2691,9 +2697,9 @@ Om die databasis te ontsluit moet u skyfregte aan die lêer op die webbediener t
 # Move page
 'move-page' => 'Skuif "$1"',
 'move-page-legend' => 'Skuif bladsy',
-'movepagetext' => "Die vorm hier onder hernoem 'n bladsy en skuif die hele wysigingsgeskiedenis na die nuwe naam.
+'movepagetext' => "ie vorm hier onder hernoem 'n bladsy en skuif die hele wysigingsgeskiedenis na die nuwe naam.
 Die ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.
-'''Skakels na die ou bladsytitel sal nie outomaties verander word nie; maak seker dat dubbele aanstuurverwysings nie voorkom nie deur die \"wat skakel hierheen\"-funksie na die skuif te gebruik.''' Dit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.
+'''Skakels na die ou bladsytitel sal nie outomaties verander word nie; maak seker dat [[Special:DoubleRedirects|dubbele aanstuurverwysings]] en [[Special:BrokenRedirects|stukkende aansture]] nie voorkom nie deur die \"wat skakel hierheen\"-funksie na die skuif te gebruik.''' Dit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.
 
 Let daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout gemaak het, maar u kan nie 'n bestaande bladsy oorskryf nie.
 
@@ -3016,6 +3022,7 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-robot-noindex' => 'Nie indekseerbaar nie',
 'pageinfo-views' => 'Aantal kere gewys',
 'pageinfo-watchers' => 'Aantal dophouers',
+'pageinfo-few-watchers' => 'Minder as {{PLURAL:$1|dophouer|$1 dophouers}}',
 'pageinfo-redirects-name' => 'Aansture na die bladsy',
 'pageinfo-subpages-name' => 'Subblaaie van die bladsy',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|aanstuur|aansture}}; $3 {{PLURAL:$3|nie-aanstuur|nie-aansture}})',
@@ -3556,7 +3563,7 @@ Ander velde sal versteek wees.
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Bevestig e-posadres',
 'confirmemail_noemail' => "U het nie 'n geldige e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] gestel nie.",
 'confirmemail_text' => "Hierdie wiki vereis dat u e-posadres bevestig word voordat epos-funksies gebruik word. Klik onderstaande knoppie om 'n bevestigingspos na u adres te stuur. Die pos sal 'n skakel met 'n kode insluit; maak hierdie skakel oop in u webblaaier om te bevestig dat die adres geldig is.",
@@ -3779,10 +3786,10 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'specialpages-group-changes' => 'Onlangse wysigings en boekstawings',
 'specialpages-group-media' => 'Media verslae en oplaai',
 'specialpages-group-users' => 'Gebruikers en regte',
-'specialpages-group-highuse' => 'Baie gebruikte bladsye',
+'specialpages-group-highuse' => 'Mees gebruikte bladsye',
 'specialpages-group-pages' => 'Lyste van bladsye',
 'specialpages-group-pagetools' => 'Bladsyhulpmiddels',
-'specialpages-group-wiki' => 'Wiki data en hulpmiddels',
+'specialpages-group-wiki' => 'Data en hulpmiddels',
 'specialpages-group-redirects' => 'Aanstuur gewone bladsye',
 'specialpages-group-spam' => 'Spam-hulpmiddels',
 
@@ -3851,8 +3858,8 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
 
 # New logging system
-'logentry-delete-delete' => '$1 het die bladsy $3 verwyder',
-'logentry-delete-restore' => '$1 het die bladsy $3 teruggeplaas',
+'logentry-delete-delete' => '$1 het bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 het bladsy $3 teruggeplaas',
 'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
 'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
 'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
@@ -3879,6 +3886,7 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
 'logentry-newusers-create' => 'Gebruiker $1 is geskep',
 'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
+'logentry-newusers-byemail' => 'Gebruiker $3 is deur $1 geskep en die wagwoord is per e-pos aangestuur',
 'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
 'logentry-rights-rights' => '$1 het groepslidmaatskap vir $3 van $4 na $5 gewysig',
 'logentry-rights-rights-legacy' => '$1 het groepslidmaatskap vir $3 gewysig',
@@ -3937,6 +3945,7 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
 'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
 'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
+'api-error-publishfailed' => 'Interne fout: bediener kon nie die tydelike lêer publiseer nie.',
 'api-error-timeout' => 'Die bediener het nie reageer binne die verwagte tyd.',
 'api-error-unclassified' => "'n Onbekende fout het voorgekom.",
 'api-error-unknown-code' => 'Onbekende fout: "$1"',
@@ -3957,4 +3966,7 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 'duration-centuries' => '$1 {{PLURAL:$1|eeu|eeue}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Image rotation
+'rotate-comment' => 'Beeld $1 {{PLURAL:$1|graad|grade}} kloksgewys gedraai',
+
 );
index 25b82cc..40837e9 100644 (file)
@@ -15,6 +15,7 @@
  * @author Ali1
  * @author Alnokta
  * @author Antime
+ * @author Arjanizary
  * @author Avocato
  * @author Bassem JARKAS
  * @author Chaos
@@ -566,18 +567,18 @@ $messages = array(
 'october-gen' => 'أكتوبر',
 'november-gen' => 'نوفمبر',
 'december-gen' => 'ديسمبر',
-'jan' => 'Ù\8aÙ\86اÙ\8aر',
-'feb' => 'فبراير',
-'mar' => 'مارس',
-'apr' => 'أبريل',
-'may' => 'مايو',
-'jun' => 'يونيو',
-'jul' => 'يوليو',
-'aug' => 'أغسطس',
-'sep' => 'سبتÙ\85بر',
-'oct' => 'Ø£Ù\83تÙ\88بر',
-'nov' => 'نوفمبر',
-'dec' => 'ديسمبر',
+'jan' => 'Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a',
+'feb' => 'شباط',
+'mar' => 'آذار',
+'apr' => 'نيسان',
+'may' => 'أيار',
+'jun' => 'حزيران',
+'jul' => 'تموز',
+'aug' => 'آب',
+'sep' => 'Ø£Ù\8aÙ\84Ù\88Ù\84',
+'oct' => 'تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84',
+'nov' => 'تشرين الثاني',
+'dec' => 'كانون الأول',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|لا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
@@ -817,7 +818,7 @@ $1',
 'missingarticle-rev' => '(رقم المراجعة: $1)',
 'missingarticle-diff' => '(فرق: $1، $2)',
 'readonly_lag' => 'تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي',
-'internalerror' => 'خطأ داخلي',
+'internalerror' => 'عطÙ\84 داخلي',
 'internalerror_info' => 'خطأ داخلي: $1',
 'fileappenderrorread' => 'تعذرت قراءة "$1" أثناء الإضافة.',
 'fileappenderror' => 'تعذرت إضافة "$1" إلى "$2".',
@@ -986,7 +987,7 @@ $2',
 'loginlanguagelabel' => 'اللغة: $1',
 'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "خطأ غير معروف في وظيفة البريد PHP's mail()",
 'user-mail-no-addy' => 'لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.',
 'user-mail-no-body' => 'محاول ارسال بريد إلكتروني فارغ أو ذو نص قصير.',
@@ -1682,7 +1683,7 @@ $1",
 'prefs-displaywatchlist' => 'خصائص العرض',
 'prefs-diffs' => 'فروقات',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
 'email-address-validity-invalid' => 'أدخل عنوان بريد إلكتروني صالح',
 
@@ -2287,6 +2288,12 @@ $1',
 ربما ينبغي أن تصل إلى صفحة أكثر ملائمة. <br />
 تعامل الصفحة كصفحة توضيح إذا كان بها قالب موجود في [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'صفحات مع خاصية الصفحة',
+'pageswithprop-legend' => 'صفحات مع خاصية الصفحة',
+'pageswithprop-text' => 'تسرد هذه الصفحة الصفحات التي تستخدم خاصية صفحة معينة.',
+'pageswithprop-prop' => 'اسم الخاصية:',
+'pageswithprop-submit' => 'اذهب',
+
 'doubleredirects' => 'تحويلات مزدوجة',
 'doubleredirectstext' => 'هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.
 كل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف "الحقيقية"، التي من المفترض أن تحول إليها التحويلة الأولى.
@@ -2479,7 +2486,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'يمكنه إضافة كل المجموعات إلى حسابه الخاص',
 'listgrouprights-removegroup-self-all' => 'يمكنه إزالة كل المجموعات من حسابه الخاص',
 
-# E-mail user
+# Email user
 'mailnologin' => 'لا يوجد عنوان للإرسال',
 'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
 'emailuser' => 'إرسال رسالة لهذا المستخدم',
@@ -3183,6 +3190,7 @@ $1',
 'import-error-interwiki' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
 'import-error-special' => 'صفحة "$1" لم تستورد لأنها تنتمي إلى نطاق خاص يمنع الصفحات.',
 'import-error-invalid' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها غير صحيح.',
+'import-error-unserialize' => 'مراجعة  $2  من صفحة " $1 " لا يمكن أن يكون أونسيرياليزيد. وأفيد المراجعة استخدام طراز المحتوى  $3  تسلسل ك  $4 .',
 'import-options-wrong' => 'خطأ {{PLURAL:$2|خيار|خيارات}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'إن عنوان الصفحة الجذر المعطاة هي ذات عنوان غير صالح.',
 'import-rootpage-nosubpage' => 'إن النطاق "$1" لصفحة الجذر لا يسمح بصفحات فرعية.',
@@ -3934,7 +3942,7 @@ $1',
 'monthsall' => 'الكل',
 'limitall' => 'الكل',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'تأكيد عنوان البريد الإلكتروني',
 'confirmemail_noemail' => 'ليس لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]].',
 'confirmemail_text' => '{{SITENAME}} يجب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
@@ -4433,4 +4441,7 @@ $5
 'duration-centuries' => '{{PLURAL: $1||قرن واحد|قرنان|$1 قرون|$1 قرنًا|$1 قرن}}',
 'duration-millennia' => '{{PLURAL: $1||ألفية واحدة|ألفيتان|$1 ألفيات|$1 ألفية}}',
 
+# Image rotation
+'rotate-comment' => 'تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
+
 );
index a992f44..03416b1 100644 (file)
@@ -1188,7 +1188,7 @@ $1',
 'listgrouprights-removegroup-self' => 'ܠܚܝ {{PLURAL:$2|ܟܢܘܫܬܐ|ܟܢܘܫܬ̈ܐ}} ܡܢ ܚܘܫܒܢܗ ܕܝܠܢܝܐ: $1',
 'listgrouprights-removegroup-self-all' => 'ܠܚܝ ܟܠ ܟܢܘܫܬ̈ܐ ܡܢ ܚܘܫܒܢܗ ܕܝܠܢܝܐ',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ܠܝܬ ܡܘܢܥܐ ܠܫܘܕܪܐ',
 'emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
 'emailpage' => 'ܫܕܪ ܐܓܪܬܐ ܒܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ',
@@ -1567,7 +1567,7 @@ Do you want to change the settings?',
 'pageinfo-lasttime' => 'ܣܝܩܘܡܐ ܕܫܘܚܠܦܐ ܐܚܪܝܐ',
 'pageinfo-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ',
 'pageinfo-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ',
-'pageinfo-recent-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ (ܒ {{PLURAL:$1||ܚܕ ܝܘܡܐ|$1 ܝܘܡܬ̈ܐ}})',
+'pageinfo-recent-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ (ܒ $1 ܕܕܥܒܪ)',
 'pageinfo-recent-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ ܐܚܪ̈ܝܐ',
 'pageinfo-toolboxlink' => 'ܝܕ̈ܥܬܐ ܥܠ ܦܐܬܐ',
 'pageinfo-contentpage-yes' => 'ܐܝܢ',
@@ -1698,7 +1698,7 @@ $1',
 'monthsall' => 'ܟܠ',
 'limitall' => 'ܟܠ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'confirmemail_subject' => 'ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܢ {{SITENAME}}',
 'confirmemail_invalidated' => 'ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܐܬܒܛܠ',
@@ -1821,9 +1821,9 @@ $1',
 'logentry-move-move_redir-noredirect' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ ܘܕܠܐ ܫܒܩܐ ܦܐܬܐ ܕܨܘܝܒܐ',
 'logentry-patrol-patrol' => '$1 ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
 'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-newusers-newusers' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $1 Ü\90ܬÜ\92ܪÜ\90',
-'logentry-newusers-create' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $1 Ü\90ܬÜ\92ܪÜ\90',
-'logentry-newusers-create2' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $3 Ü\90ܬÜ\92ܪÜ\90 ܒܝܕ $1',
+'logentry-newusers-newusers' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $1 Ü\90ܬܬÜ\9fÜ\9dÜ¢',
+'logentry-newusers-create' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $1 Ü\90ܬܬÜ\9fÜ\9dÜ¢',
+'logentry-newusers-create2' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95ܡܦܠÜ\9aÜ¢Ü\90 $3 Ü\90ܬܬÜ\9fÜ\9dÜ¢ ܒܝܕ $1',
 'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
 'rightsnone' => '(ܠܐ ܡܕܡ)',
 
index f71437c..8dd9dba 100644 (file)
@@ -575,7 +575,7 @@ Por favor espera enantes d'intentalo otra vuelta.",
 'loginlanguagelabel' => 'Llingua: $1',
 'suspicious-userlogout' => "Negósete'l pidimientu de desconexón porque paez que vien d'un restolador frañíu o d'un proxy de caché.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
 'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
 'user-mail-no-body' => "Trató d'unviar un corréu electrónicu con un cuerpu baleru o curtiu enforma.",
@@ -1272,7 +1272,7 @@ Esta información sedrá pública.",
 'prefs-displaywatchlist' => 'Opciones de vista',
 'prefs-diffs' => 'Diferencies',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'La direición de corréu paez válida',
 'email-address-validity-invalid' => 'Escribi una direición de corréu válida',
 
@@ -1543,9 +1543,9 @@ Por favor, camienta si daveres quies xubir esti archivu.",
 'windows-nonascii-filename' => 'Esta wiki nun permite nomes de ficheru con caráuteres especiales.',
 'fileexists' => 'Yá esiste un ficheru con esti nome, por favor comprueba <strong>[[:$1]]</strong> si nun tas seguru de querer camudalu.
 [[$1|thumb]]',
-'filepageexists' => "La páxina de descripción d'esti ficheru yá se creó en <strong>[[:$1]]</strong>, pero anguaño nun esiste nengún ficheru con esti nome.
+'filepageexists' => "La páxina de descripción d'esti ficheru creóse yá en <strong>[[:$1]]</strong>, pero anguaño nun esiste nengún ficheru con esti nome.
 El resume que pongas nun va apaecer na páxina de descripción.
-Pa facer que'l to resume apaeza, vas tener que lu editar manualmente.
+Pa facer que'l to resume apaeza, vas tener qu'editalu manualmente.
 [[$1|thumb]]",
 'fileexists-extension' => 'Yá esiste un ficheru con un nome asemeyáu: [[$2|thumb]]
 * Nome del ficheru que se quier xubir: <strong>[[:$1]]</strong>
@@ -1657,7 +1657,7 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
 'backend-fail-internal' => 'Hebo un fallu desconocíu nel motor d\'almacenamientu "$1".',
 'backend-fail-contenttype' => 'Non se pudo determinar la triba de conteníu de ficheru a guardar en "$1".',
 'backend-fail-batchsize' => "El motor d'almacenamientu dio un llote de $1 {{PLURAL:$1|operación|operaciones}} en ficheros; el llímite ye de $2 {{PLURAL:$2|operación|operaciones}}.",
-'backend-fail-usable' => 'Nun se pudo llee o escribir el ficheru «$1» porque nun hai permisos bastantes o falten los direutorios/contenedores.',
+'backend-fail-usable' => 'Nun pudo lleese o escribise nel ficheru «$1» porque nun hai permisos bastantes o falten los direutorios/contenedores.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nun se pudo coneutar cola base de datos del diariu pal sofitu d\'almacenamientu "$1".',
@@ -1777,7 +1777,7 @@ Hai disponible una [[Special:WhatLinksHere/$2|llista completa]].",
 'duplicatesoffile' => "{{PLURAL:$1|El siguiente archivu ye un duplicáu|Los siguientes $1 archivos son duplicaos}} d'esti archivu ([[Special:FileDuplicateSearch/$2|más detalles]]):",
 'sharedupload' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.",
 'sharedupload-desc-there' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
-Llee la [páxina de descripción del ficheru $2] pa más información.',
+Llea la [páxina de descripción del ficheru $2] pa más información.',
 'sharedupload-desc-here' => "Esti ficheru ye de $1 y puen usalu otros proyeutos.
 La descripción de la [$2 páxina de descripción del ficheru] s'amuesa darréu.",
 'sharedupload-desc-edit' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
@@ -1874,6 +1874,12 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
 'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
 Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Páxines con una propiedá de páxina',
+'pageswithprop-legend' => 'Páxines con una propiedá de páxina',
+'pageswithprop-text' => "Esta páxina llista les páxines qu'usen una propiedá de páxina determinada.",
+'pageswithprop-prop' => 'Nome de la propiedá:',
+'pageswithprop-submit' => 'Dir',
+
 'doubleredirects' => 'Redireiciones dobles',
 'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
 Cada 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.
@@ -2064,7 +2070,7 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
 'listgrouprights-addgroup-self-all' => 'Amestar tolos grupos a la cuenta propia',
 'listgrouprights-removegroup-self-all' => 'Desaniciar tolos grupos de la cuenta propia',
 
-# E-mail user
+# Email user
 'mailnologin' => "Ensin direición d'unviu",
 'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
 y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
@@ -3472,7 +3478,7 @@ Los demás tarán anubríos de mou predetermináu.
 'monthsall' => 'toos',
 'limitall' => 'toos',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar direición de corréu',
 'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
 'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
@@ -3657,11 +3663,11 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
 'version-poweredby-credits' => "Esta wiki funciona con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
 'version-credits-summary' => 'Nos prestaría dar reconocimientu a les siguientes persones pola so contribución a [[Special:Version|MediaWiki]].',
-'version-license-info' => "MediaWiki ye software llibre; pues redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
+'version-license-info' => "MediaWiki ye software llibre; pue redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
 
-MediaWiki se distribúi col envís de que seya afayadiza, pero ENSIN GARANTÍA DALA; ensin siquiera garantía implícita de COMERCIALIDÁ o ADAUTACIÓN A UN DETERMINÁU PROPÓSITU. Llee la Llicencia Pública Xeneral GNU pa más detalles.
+MediaWiki distribúise col envís de que seya afayadiza, pero ENSIN GARANTÍA DALA; ensin siquiera garantía implícita de COMERCIALIDÁ o ADAUTACIÓN A UN DETERMINÁU PROPÓSITU. Llea la Llicencia Pública Xeneral GNU pa más detalles.
 
-Tendríes d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llicencia Pública Xeneral GNU] xunto con esti programa; sinón, escribi a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lleela en llinia].",
+Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llicencia Pública Xeneral GNU] xunto con esti programa; sinón, escriba a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lleala en llinia].",
 'version-software' => 'Software instaláu',
 'version-software-product' => 'Productu',
 'version-software-version' => 'Versión',
@@ -3796,11 +3802,11 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
 'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
 'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Se creó la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Se creó la cuenta d'usuariu $1",
+'logentry-newusers-newusers' => "Creóse la cuenta d'usuariu $1",
+'logentry-newusers-create' => "Creóse la cuenta d'usuariu $1",
 'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
 'logentry-newusers-byemail' => "$1 creó la cuenta d'usuariu $3 y la contraseña uviose per corréu electrónicu",
-'logentry-newusers-autocreate' => 'La cuenta $1 se creó automáticamente',
+'logentry-newusers-autocreate' => 'La cuenta $1 creóse automáticamente',
 'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
 'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
 'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
@@ -3879,4 +3885,7 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
 
+# Image rotation
+'rotate-comment' => 'Imaxe xirada $1 {{PLURAL:$1|grau|graos}} en sentíu horariu',
+
 );
index 1e54f43..85246aa 100644 (file)
@@ -378,7 +378,7 @@ $1',
 'pool-errorunknown' => 'Билдәһеҙ хата',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} тураһында',
+'aboutsite' => '{{SITENAME}} тураһында',
 'aboutpage' => 'Project:Тасуирлама',
 'copyright' => '$1 ярашлы эстәлеге менән һәр кем файҙалана ала.',
 'copyrightpage' => '{{ns:project}}:Авторлыҡ хоҡуҡтары',
@@ -645,7 +645,7 @@ $2',
 'loginlanguagelabel' => 'Тел: $1',
 'suspicious-userlogout' => 'Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP-ның mail() функцияһында билдәһеҙ хата',
 'user-mail-no-addy' => 'Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны',
 
@@ -1323,7 +1323,7 @@ $1",
 'prefs-displaywatchlist' => 'Күренеш көйләүҙәре',
 'prefs-diffs' => 'Айырмалар',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail адрес дөрөҫ булғанға оҡшаған',
 'email-address-validity-invalid' => 'Дөрөҫ e-mail адресын керетегеҙ',
 
@@ -2103,7 +2103,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Үҙенең иҫәп яҙмаһына бөтә төркөмдәрҙе өҫтәү',
 'listgrouprights-removegroup-self-all' => 'Үҙенең иҫәп яҙмаһынан бөтә төркөмдәрҙе юйыу',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Хат ебәреү өсөн адрес юҡ',
 'mailnologintext' => 'Башҡа ҡатнашыусыларға хат ебәреү өсөн, һеҙ [[Special:UserLogin|танылырға]] һәм [[Special:Preferences|көйләүҙәрегеҙҙә]] ысын электрон адрес почтаһы кереткән булырға тейешһегеҙ.',
 'emailuser' => 'Ҡатнашыусыға хат',
@@ -3472,7 +3472,7 @@ $1',
 'monthsall' => 'бөтә',
 'limitall' => 'бөтә',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Электрон почта адресын раҫлау',
 'confirmemail_noemail' => 'Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ электрон почта адресы юҡ.',
 'confirmemail_text' => '{{SITENAME}} проекты электрон почта мөмкинлектәрен ҡулланыр алдынан электрон почта адресының раҫланыуын талап итә.
index e910798..ec98157 100644 (file)
@@ -565,7 +565,7 @@ $2',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Невядомая памылка ў функцыі PHP-пошты',
 'user-mail-no-addy' => 'Паспрабаваў адправіць электронны ліст без адрасу электроннай пошты',
 
@@ -1198,7 +1198,7 @@ $1",
 'prefs-displaywatchlist' => 'Паказ',
 'prefs-diffs' => 'Розніцы',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "Адрас электроннай пошты з'яўляецца сапраўдным",
 'email-address-validity-invalid' => 'Увядзіце слушны адрас электроннай пошты',
 
@@ -1355,7 +1355,7 @@ $1",
 'action-sendemail' => 'адпраўка электронных пісем',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|мена|менаў}}',
+'nchanges' => '$1 {{PLURAL:$1|змена|зменÑ\8b|зменаў}}',
 'recentchanges' => 'Нядаўнія змяненні',
 'recentchanges-legend' => 'Магчымасці паказу',
 'recentchanges-summary' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
@@ -1929,7 +1929,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Дадаць усе групы да свайго акаунта',
 'listgrouprights-removegroup-self-all' => 'Выдаліць усе групы са свайго акаунта',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Няма эл.адрасу',
 'mailnologintext' => 'Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.',
 'emailuser' => 'Эл.пошта ўдзельніка',
@@ -2216,7 +2216,7 @@ $1',
 'contributions-title' => 'Уклад удзельніка $1',
 'mycontris' => 'Уклад',
 'contribsub2' => 'Для $1 ($2)',
-'nocontribs' => 'Не знойдзена менаў, адпаведных зададзеным параметрам.',
+'nocontribs' => 'Ð\9dе Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð° Ð·Ð¼ÐµÐ½Ð°Ñ\9e, Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ñ\8bÑ\85 Ð·Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8bм Ð¿Ð°Ñ\80амеÑ\82Ñ\80ам.',
 'uctop' => '(апошн.)',
 'month' => 'Ад месяцу (і раней):',
 'year' => 'Ад году (і раней):',
@@ -3223,7 +3223,7 @@ $1',
 'monthsall' => 'усе',
 'limitall' => 'усе',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Пацвердзіць адрас эл.пошты',
 'confirmemail_noemail' => 'У [[Special:Preferences|вашых настаўленнях]] няма дапушчальнага адрасу эл.пошты.',
 'confirmemail_text' => 'На пляцоўцы {{SITENAME}} патрабуецца праверка адрасу эл.пошты перад тым, як карыстацца магчымасцямі эл.пошты. Націсніце кнопку, што ніжэй, каб адаслаць сабе пацвярджальны ліст. У лісце будзе спасылка на спецыяльную пацвярджальную старонку, якую трэба будзе адкрыць у браўзеры, каб пацвердзіць правільнасць свайго адрасу эл.пошты.',
@@ -3458,7 +3458,7 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'tags-description-header' => 'Поўнае апісанне значэння',
 'tags-hitcount-header' => 'Пазначаных правак',
 'tags-edit' => 'правіць',
-'tags-hitcount' => '$1 {{PLURAL:$1|мена|менаў}}',
+'tags-hitcount' => '$1 {{PLURAL:$1|змена|зменÑ\8b|зменаў}}',
 
 # Special:ComparePages
 'comparepages' => 'Параўнанне старонак',
index 5c69c17..09bf4e4 100644 (file)
@@ -464,7 +464,7 @@ $messages = array(
 'postcomment' => 'Новая сэкцыя',
 'articlepage' => 'Паказаць старонку зьместу',
 'talk' => 'Абмеркаваньне',
-'views' => 'Ð\9fÑ\80аглÑ\8fды',
+'views' => 'РÑ\8dжÑ\8bмы',
 'toolbox' => 'Інструмэнты',
 'userpage' => 'Паказаць старонку ўдзельніка',
 'projectpage' => 'Паказаць старонку праекту',
@@ -547,7 +547,7 @@ $1',
 'restorelink' => '$1 {{PLURAL:$1|выдаленую зьмену|выдаленыя зьмены|выдаленых зьменаў}}',
 'feedlinks' => 'Стужка:',
 'feed-invalid' => 'Памылковы тып стужкі.',
-'feed-unavailable' => 'Стужкі не працуюць',
+'feed-unavailable' => 'Стужкі сындыкацыі недаступныя',
 'site-rss-feed' => '$1 — RSS-стужка',
 'site-atom-feed' => '$1 — Atom-стужка',
 'page-rss-feed' => '«$1» — RSS-стужка',
@@ -592,9 +592,9 @@ $1',
 «$1»
 адбыўся з функцыі «$2».
 База зьвестак вярнула памылку «$3: $4»',
-'laggedslavemode' => 'Увага: старонка можа ня ўтрымліваць апошніх зьменаў.',
+'laggedslavemode' => "'''Увага:''' старонка можа ня ўтрымліваць апошніх зьменаў.",
 'readonly' => 'База зьвестак заблякаваная',
-'enterlockreason' => 'Ð\9fазнаÑ\87Ñ\86е Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\83 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8f Ñ\96 Ð²Ñ\8bзнаÑ\87аны час разблякаваньня',
+'enterlockreason' => 'Ð\9fазнаÑ\87Ñ\86е Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\83 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8f Ñ\96 Ð·Ð°Ð¿Ð»Ñ\8fнаваны час разблякаваньня',
 'readonlytext' => 'База зьвестак заблякаваная для дадаваньня новых старонак і іншых зьменаў, верагодна з прычыны тэхнічнага абслугоўваньня, пасьля якога будзе адноўлена звычайная праца.
 
 Адміністратар, які заблякаваў базу зьвестак, пакінуў наступнае тлумачэньне: $1',
@@ -689,12 +689,12 @@ $2',
 'logout' => 'Выйсьці',
 'userlogout' => 'Выйсьці',
 'notloggedin' => 'Вы не ўвайшлі ў сыстэму',
-'nologin' => "Ня маеце рахунку? '''$1'''.",
-'nologinlink' => 'Стварыць рахунак',
-'createaccount' => 'СÑ\82ваÑ\80Ñ\8bÑ\86Ñ\8c Ñ\80аÑ\85Ñ\83нак',
-'gotaccount' => "Ужо маеце рахунак? '''$1'''.",
+'nologin' => 'Ня маеце рахунку? $1.',
+'nologinlink' => 'Стварыце рахунак',
+'createaccount' => 'СÑ\82ваÑ\80Ñ\8dнÑ\8cне Ñ\80аÑ\85Ñ\83нкÑ\83',
+'gotaccount' => 'Ужо маеце рахунак? $1.',
 'gotaccountlink' => 'Увайдзіце',
-'userlogin-resetlink' => 'Ð\97абÑ\8bлÑ\96Ñ\81Ñ\8f Ð¿Ñ\80а зьвесткі для ўваходу?',
+'userlogin-resetlink' => 'Ð\97абÑ\8bлÑ\96Ñ\81Ñ\8f Ð½а зьвесткі для ўваходу?',
 'createaccountmail' => 'Стварыць часовы адвольны пароль і даслаць яго на e-mail адрас, пазначаны ніжэй',
 'createaccountreason' => 'Прычына:',
 'badretype' => 'Уведзеныя Вамі паролі не супадаюць.',
@@ -764,7 +764,7 @@ $2',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запыт на выхад з сыстэмы быў адхілены, таму што выглядае, што ён быў дасланы пашкоджаным браўзэрам альбо кэшаваным проксі-сэрвэрам.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Узьнікла невядомая памылка ў функцыі PHP mail()',
 'user-mail-no-addy' => 'Спроба даслаць электронны ліст без адрасу дастаўкі',
 'user-mail-no-body' => 'Спроба даслаць ліст з пустым або надзвычай кароткім зьместам.',
@@ -1443,7 +1443,7 @@ $1",
 'prefs-displaywatchlist' => 'Налады паказу',
 'prefs-diffs' => 'Розьніцы вэрсіяў',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядае слушна',
 'email-address-validity-invalid' => 'Неабходны слушны адрас!',
 
@@ -2027,6 +2027,12 @@ $1',
 Замест гэтага, яны павінны спасылацца на пэўныя старонкі.<br />
 Старонка лічыцца шматзначнай, калі яна ўтрымлівае шаблён назва якога знаходзіцца на старонцы [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Старонкі з уласьцівасьцямі старонак',
+'pageswithprop-legend' => 'Старонкі з уласьцівасьцямі старонак',
+'pageswithprop-text' => 'На гэтай старонцы адлюстроўваюцца старонкі, якія ўжываюць пэўныя ўласьцівасьці старонак',
+'pageswithprop-prop' => 'Імя ўласьцівасьці:',
+'pageswithprop-submit' => 'Паказаць',
+
 'doubleredirects' => 'Двайныя перанакіраваньні',
 'doubleredirectstext' => 'На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.
 <del>Закрэсьленыя</del> элемэнты былі выпраўленыя.',
@@ -2217,7 +2223,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Можа дадаць уласны рахунак да ўсіх груп',
 'listgrouprights-removegroup-self-all' => 'Можа выдаліць уласны рахунак з ўсіх груп',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Няма адрасу атрымальніка',
 'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.',
 'emailuser' => 'Даслаць ліст',
@@ -3599,7 +3605,7 @@ $1',
 'monthsall' => 'усе',
 'limitall' => 'усе',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Пацьвердзіць адрас электроннай пошты',
 'confirmemail_noemail' => 'Вы не пазначылі слушны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах удзельніка]].',
 'confirmemail_text' => '{{SITENAME}} патрабуе, каб Вы пацьвердзілі Ваш адрас электроннай пошты перад ўжываньнем магчымасьцяў электроннай пошты. Актывізуйце кнопку ніжэй, каб даслаць ліст з пацьверджаньнем на Ваш адрас. Ліст будзе ўтрымліваць спасылку з кодам; загрузіце спасылку ў Вашым браўзэры, каб пацьвердзіць, што Ваш адрас электроннай пошты зьяўляецца слушным.',
@@ -4010,4 +4016,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'duration-centuries' => '$1 {{PLURAL:$1|стагодзьдзе|стагодзьдзі|стагодзьдзяў}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тысячагодзьдзе|тысячагодзьдзі|тысячагодзьдзяў}}',
 
+# Image rotation
+'rotate-comment' => 'Выява павернутая на $1{{PLURAL:$1|°}} па гадзіньнікавай стрэлцы',
+
 );
index 7e76a2d..35c9b4f 100644 (file)
@@ -731,7 +731,7 @@ $2',
 'loginlanguagelabel' => 'Език: $1',
 'suspicious-userlogout' => 'Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Неизвестна грешка в mail() функцията на PHP',
 'user-mail-no-addy' => 'Опитвате се да изпратите е-писмо без да е посочен адрес за електронна поща.',
 
@@ -1207,6 +1207,10 @@ $1",
 'editundo' => 'връщане',
 'diff-multi' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|един потребител|$2 потребителя}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})',
+'difference-missing-revision' => '{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).
+
+Това обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.
+Повече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].',
 
 # Search results
 'searchresults' => 'Резултати от търсенето',
@@ -1250,7 +1254,7 @@ $1",
 'search-interwiki-default' => '$1 резултата:',
 'search-interwiki-more' => '(още)',
 'search-relatedarticle' => 'Свързани',
-'mwsuggest-disable' => 'Изключване на AJAX предположенията',
+'mwsuggest-disable' => 'Изключване на предположенията при търсене',
 'searcheverything-enable' => 'Търсене във всички именни пространства',
 'searchrelated' => 'свързани',
 'searchall' => 'всички',
@@ -1396,7 +1400,7 @@ $1",
 'prefs-displaywatchlist' => 'Видими настройки',
 'prefs-diffs' => 'Разлики',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адресът за е-поща изглежда валиден',
 'email-address-validity-invalid' => 'Въведете валиден адрес за е-поща',
 
@@ -1737,7 +1741,8 @@ $1',
 'backend-fail-writetemp' => 'Грешка при записването във временния файл.',
 'backend-fail-closetemp' => 'Не може да бъде затворен временният файл.',
 'backend-fail-read' => 'Файлът $1 не може да бъде прочетен.',
-'backend-fail-create' => 'Файлът $1 не може да бъде създаден.',
+'backend-fail-create' => 'Файлът „$1“ не може да бъде съхранен.',
+'backend-fail-maxsize' => 'Файлът „$1“ не може да бъде съхранен, тъй като размерът му надвишава {{PLURAL:$2|един байт|$2 байт}}.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Възникна грешка при отваряне на файла за проверка на ZIP.',
@@ -2083,7 +2088,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => 'Списък на активните потребители',
 'activeusers-intro' => 'Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|редакция|редакции}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
+'activeusers-count' => '$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
 'activeusers-from' => 'Показване на потребителите, започвайки от:',
 'activeusers-hidebots' => 'Скриване на ботовете',
 'activeusers-hidesysops' => 'Скриване на администраторите',
@@ -2107,13 +2112,13 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Може да добавя всички групи към своята сметка',
 'listgrouprights-removegroup-self-all' => 'Може да премахва всички групи от собствената сметка',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Няма електронна поща',
 'mailnologintext' => 'Необходимо е да [[Special:UserLogin|влезете]] и да посочите валидна електронна поща в [[Special:Preferences|настройките]] си, за да може да пращате писма на други потребители.',
 'emailuser' => 'Писмо до потребителя',
 'emailpage' => 'Пращане писмо на потребител',
-'emailpagetext' => 'Можете да използвате формуляра по-долу, за да изпратите електронно писмо на този потребител.
-Адресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори.',
+'emailpagetext' => 'Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.
+Адресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.',
 'usermailererror' => 'Пощенският обект даде грешка:',
 'defemailsubject' => 'Писмо от потребител $1 в {{SITENAME}}',
 'usermaildisabled' => 'Потребителят не е разрешил да получава електронна поща',
@@ -2143,8 +2148,8 @@ $1',
 'usermessage-editor' => 'Системни съобщения',
 
 # Watchlist
-'watchlist' => 'Ð\9cоÑ\8fÑ\82 Ñ\81писък за наблюдение',
-'mywatchlist' => 'Ð\9cоÑ\8fÑ\82 Ñ\81писък за наблюдение',
+'watchlist' => 'Списък за наблюдение',
+'mywatchlist' => 'Списък за наблюдение',
 'watchlistfor2' => 'За $1 $2',
 'nowatchlist' => 'Списъкът ви за наблюдение е празен.',
 'watchlistanontext' => 'За преглеждане и редактиране на списъка за наблюдение се изисква $1 в системата.',
@@ -2896,7 +2901,9 @@ $1',
 'pageinfo-lasttime' => 'Дата на последнoто редактиране',
 'pageinfo-edits' => 'Общ брой редакции',
 'pageinfo-authors' => 'Общ брой на отделните автори',
+'pageinfo-recent-edits' => 'Скорошен брой редакции (в рамките на $1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрита категория|Скрити категории}} ($1)',
 'pageinfo-toolboxlink' => 'Информация за страницата',
 'pageinfo-contentpage-yes' => 'Да',
 'pageinfo-protect-cascading-yes' => 'Да',
@@ -2956,6 +2963,7 @@ $1',
 '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',
 'show-big-image' => 'Пълна разделителна способност',
 'show-big-image-preview' => 'Размер на този преглед: $1.',
@@ -3378,7 +3386,7 @@ $1',
 'monthsall' => 'всички',
 'limitall' => 'всички',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Потвърждаване на адрес за електронна поща',
 'confirmemail_noemail' => 'Не сте посочили валиден адрес за електронна поща в [[Special:Preferences|настройки си]].',
 'confirmemail_text' => '{{SITENAME}} изисква да потвърдите адреса си за електронна поща преди да използвате възможностите за е-поща. Натиснете долния бутон, за да ви бъде изпратено писмо, съдържащо специално генерирана препратка, чрез която ще можете да потвърдите валидността на адреса си.',
@@ -3543,6 +3551,7 @@ $5
 'version-license' => 'Лиценз',
 'version-poweredby-credits' => "Това уики се задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
+'version-credits-summary' => 'Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.
 
 MediaWiki се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.
index 2b2a528..91a73c4 100644 (file)
@@ -581,7 +581,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'allpagessubmit' => 'जाईं',
 'allpagesprefix' => 'उपसर्ग के साथे पन्ना प्रदर्शन:',
 
-# E-mail user
+# Email user
 'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
 
 # Watchlist
@@ -696,6 +696,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'tooltip-n-help' => 'जगह पता लगावे खातिर',
 'tooltip-t-whatlinkshere' => 'अहिजा लिंक होखे वाला सब विकि पन्ना के सूची',
 'tooltip-t-recentchangeslinked' => 'ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन',
+'tooltip-feed-atom' => 'ई पन्ना खातिर अणु फ़ीड',
 'tooltip-t-upload' => 'फाईल लादीं (अपलोड )',
 'tooltip-t-specialpages' => 'ख़ाश पन्नवन के सूची',
 'tooltip-t-print' => 'ई पन्ना के छापे लायक संस्करण।',
@@ -749,7 +750,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'monthsall' => 'सब',
 'limitall' => 'सब',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'इ-मेल पता कन्फर्म करीं',
 
 # Special:SpecialPages
index c425d6a..05f0256 100644 (file)
@@ -504,7 +504,7 @@ $2',
 'gotaccount' => "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
 'gotaccountlink' => 'প্রবেশ',
 'userlogin-resetlink' => 'আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?',
-'createaccountmail' => 'à¦\87-মà§\87à¦\87লà§\87র à¦®à¦¾à¦§à§\8dযমà§\87',
+'createaccountmail' => 'à¦\8fà¦\95à¦\9fি à¦°â\80\8cà§\8dযানà§\8dডম à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রà§\81ন à¦\8fবà¦\82 à¦¨à¦¿à¦\9aà§\87র à¦¨à¦¿à¦°à§\8dধারিত à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানায় à¦ªà¦¾à¦ à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¨',
 'createaccountreason' => 'কারণ:',
 'badretype' => 'শব্দচাবি (password) দুটি মিলছেনা।',
 'userexists' => 'এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।
@@ -566,9 +566,10 @@ $2',
 'loginlanguagelabel' => 'ভাষা: $1',
 'suspicious-userlogout' => 'আপনার প্রস্থানের অনুরোধ বাতিল হয়েছে কারণ অনুমিত যে আপনার ব্রাউজার অসম্পূর্ণ অথবা পূবর্বতী তথ্য প্রেরণ করেছে।',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'পিএইচপি এর মেইল () কার্যে অজ্ঞাত ভুল',
 'user-mail-no-addy' => 'কোনো ইমেইল ঠিকানা ছাড়াই ইমেইল করার চেষ্টা করা হয়েছে।',
+'user-mail-no-body' => 'অত্যান্ত সংক্ষিপ্ত অথবা কোনো তথ্য ছাড়াই ইমেইল পাঠানোর চেষ্টা করা হয়েছিল।',
 
 # Change password dialog
 'resetpass' => 'শব্দচাবি পরিবর্তন',
@@ -787,8 +788,8 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'copyrightwarning2' => "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
 'longpageerror' => "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''
 এটি সংরক্ষণ করা সম্ভব নয়।",
-'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।
-আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।'''
+'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।'''
+আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।
 
 যে প্রশাসক এই ডাটাবেজটি অবরুদ্ধ করেছেন তিনি যা ব্যাখ্যা দিয়েছেন: $1",
 'protectedpagewarning' => "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''
@@ -1094,7 +1095,7 @@ $1",
 'search-interwiki-default' => '$1 ফলাফলসমূহ:',
 'search-interwiki-more' => '(আরও)',
 'search-relatedarticle' => 'সম্পর্কিত',
-'mwsuggest-disable' => 'AJAX পরামর্শ নিষ্ক্রিয় করা হোক',
+'mwsuggest-disable' => 'অনুসন্ধান পরামর্শ বন্ধ করুন',
 'searcheverything-enable' => 'সকল নামস্থানে অনুসন্ধান করো',
 'searchrelated' => 'সম্পর্কিত',
 'searchall' => 'সমস্ত',
@@ -1238,7 +1239,7 @@ $1",
 'prefs-displaywatchlist' => 'প্রদর্শনী অপশন',
 'prefs-diffs' => 'পার্থক্য',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ইমেইল ঠিকানাটি সঠিক',
 'email-address-validity-invalid' => 'সঠিক ইমেই ঠিকানা প্রদান করুন',
 
@@ -1817,6 +1818,8 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />
 যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
+'pageswithprop-submit' => 'চলো',
+
 'doubleredirects' => 'দুইবার করা পুনর্নির্দেশনাগুলি',
 'doubleredirectstext' => 'এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত "আসল" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।
 <del>কেটে দেওয়া</del> ভুক্তিগুলো ঠিক করা হয়েছে।',
@@ -2007,7 +2010,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'listgrouprights-addgroup-self-all' => 'নিজের অ্যাকাউন্টে সকল দল সংযোজন',
 'listgrouprights-removegroup-self-all' => 'নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ',
 
-# E-mail user
+# Email user
 'mailnologin' => 'প্রাপকের ঠিকানা নেই',
 'mailnologintext' => "অন্য ব্যবহারকারীদেরকে ই-মেইল পাঠাতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে এবং ''[[Special:Preferences|আপনার পছন্দ তালিকায়]] আপনার ই-মেইল ঠিকানাটি ঠিকমত দিতে হবে।",
 'emailuser' => 'ইমেইল করো',
@@ -2210,8 +2213,8 @@ $UNWATCHURL
 এখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
 'protect-cascadeon' => 'এই পাতাটি বর্তমানে সুরক্ষিত আছে, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতায়|টি পাতায়}} অন্তর্ভুক্ত, যাতে (যেগুলিতে) প্রপাতাকারে সুরক্ষা চালু আছে। আপনি এই পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারেন, তবে এটি প্রপাতাকার সুরক্ষাটিতে কোন পরিবর্তন সাধন করবে না।',
 'protect-default' => 'সমস্ত ব্যবহারকারীর জন্য',
-'protect-fallback' => '"$1" à¦\85নà§\81মতি à¦¦à¦°à¦\95ার',
-'protect-level-autoconfirmed' => 'নতà§\81ন à¦\8fবà¦\82 à¦¬à§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¬à¦¾à¦§à¦¾ à¦¦à¦¾à¦\93',
+'protect-fallback' => '"$1" à¦\85ধিà¦\95ার à¦°à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fমন à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦\9cনà§\8dয à¦\85নà§\81মতি',
+'protect-level-autoconfirmed' => 'à¦\95à§\87বলমাতà§\8dর à¦¸à¦¯à¦¼à¦\82à¦\95à§\8dরিয় à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦\9cনà§\8dয',
 'protect-level-sysop' => 'কেবল প্রশাসকদের জন্য',
 'protect-summary-cascade' => 'প্রপাতাকার',
 'protect-expiring' => '$1 (UTC) সময়ে মেয়াদোত্তীর্ণ',
@@ -3324,7 +3327,7 @@ $1',
 'monthsall' => 'সমস্ত',
 'limitall' => 'সমস্ত',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ই-মেইলের ঠিকানা নিশ্চিত করুন',
 'confirmemail_noemail' => 'আপনার [[Special:Preferences|ব্যবহারকারী পছন্দগুলিতে]] কোন বৈধ ই-মেইল ঠিকানা দেয়া হয়নি।',
 'confirmemail_text' => '{{SITENAME}}-এ ই-মেইল ফিচারগুলি ব্যবহার করার আগে আপনাকে আপনার ই-মেইল ঠিকানা নিশ্চিত করতে হবে। নিচের বোতামটি চেপে আপনার ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ চিঠি পাঠান। এই চিঠিতে একটি কোড ধারণকারী সংযোগ থাকবে; আপনার ই-মেইল ঠিকানা যা বৈধ, তা নিশ্চিত করতে আপনার ব্রাউজারে এই সংযোগটি লোড করুন।',
index 0098433..832d514 100644 (file)
@@ -291,7 +291,7 @@ $messages = array(
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Rummad |Rummad }}',
 'category_header' => 'Niver a bennadoù er rummad "$1"',
-'subcategories' => 'Isrummad',
+'subcategories' => 'Isrummad',
 'category-media-header' => 'Restroù liesvedia er rummad "$1"',
 'category-empty' => "''N'eus na pajenn na media ebet er rummad-mañ evit ar mare.''",
 'hidden-categories' => '{{PLURAL:$1|Rummad kuzhet|Rummad kuzhet}}',
@@ -450,7 +450,7 @@ $1',
 'youhavenewmessagesmulti' => "Kemennoù nevez zo ganeoc'h war $1",
 'editsection' => 'kemmañ',
 'editold' => 'kemmañ',
-'viewsourceold' => 'gwelet ar vammenn',
+'viewsourceold' => 'sellet ouzh tarzh an destenn',
 'editlink' => 'kemmañ',
 'viewsourcelink' => 'gwelet an tarzh',
 'editsectionhint' => 'Kemmañ ar rann : $1',
@@ -678,7 +678,7 @@ Gortozit a-raok klask en-dro.",
 'loginlanguagelabel' => 'Yezh : $1',
 'suspicious-userlogout' => 'Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
 'user-mail-no-addy' => "Klasket kas ur postel hep lakaat ur chomlec'h postel.",
 
@@ -1350,7 +1350,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
 'prefs-diffs' => "Diforc'hioù",
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
 'email-address-validity-invalid' => "Ebarzhit ur chomlec'h postel reizh",
 
@@ -1529,7 +1529,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'rclinks' => "Diskouez an $1 kemm diwezhañ c'hoarvezet e-pad an $2 devezh diwezhañ<br />$3",
 'diff' => "diforc'h",
 'hist' => 'ist',
-'hide' => 'kuzhat',
+'hide' => 'Kuzhat',
 'show' => 'Diskouez',
 'minoreditletter' => 'D',
 'newpageletter' => 'N',
@@ -1544,9 +1544,9 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'rc-old-title' => 'bet krouet da gentañ gant an anv "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Heuliañ al liammoù',
-'recentchangeslinked-feed' => 'Heuliañ al liammoù',
-'recentchangeslinked-toolbox' => 'Heuliañ al liammoù',
+'recentchangeslinked' => 'Heuliañ ar pajennoù liammet',
+'recentchangeslinked-feed' => 'Heuliañ ar pajennoù liammet',
+'recentchangeslinked-toolbox' => 'Heuliañ ar pajennoù liammet',
 'recentchangeslinked-title' => 'Kemmoù a denn da "$1"',
 'recentchangeslinked-noresult' => 'Kemm ebet war ar pajennoù liammet e-pad an amzer spisaet.',
 'recentchangeslinked-summary' => "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).
@@ -1941,6 +1941,9 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 Padal e tlefent kas war-eeun d'an danvez anezho.<br />
 Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patrom liammet ouzh [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop-prop' => 'Anv ar perzh :',
+'pageswithprop-submit' => 'Mont',
+
 'doubleredirects' => 'Adkasoù doubl',
 'doubleredirectstext' => 'Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.
 War 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.
@@ -2133,7 +2136,7 @@ Gallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]
 'listgrouprights-addgroup-self-all' => 'Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan',
 'listgrouprights-removegroup-self-all' => 'Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.',
 
-# E-mail user
+# Email user
 'mailnologin' => "Chomlec'h ebet",
 'mailnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]
 ha bezañ merket ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù]]
@@ -2495,7 +2498,7 @@ Roit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou
 ** Emzalc'h hegazus/handeus betek re
 ** Mont re bell gant implij meur a gont
 ** Anv implijer n'eo ket aotreet",
-'ipb-hardblock' => "Mirout a ra ouzh an implijerien kevreet da zegas kemmoù adalek ar c'homlec'h IP-mañ",
+'ipb-hardblock' => "Mirout ouzh an implijerien kevreet da zegas kemmoù adalek ar chomlec'h IP-mañ",
 'ipbcreateaccount' => 'Mirout ouzh an implijer da grouiñ kontoù',
 'ipbemailban' => 'Mirout ouzh an implijer da gas posteloù',
 'ipbenableautoblock' => "Stankañ war-eeun ar chomlec'h IP diwezhañ implijet gant an den-mañ hag an holl chomlec'hioù a c'hallfe klask kemmañ traoù drezo drezo diwezhatoc'h",
@@ -3511,7 +3514,7 @@ Kuzhet e vo ar re all dre ziouer.
 'monthsall' => 'an holl',
 'limitall' => 'An holl',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Kadarnaat ar chomlec'h postel",
 'confirmemail_noemail' => "N'hoc'h eus ket spisaet chomlec'h postel mat ebet en ho [[Special:Preferences|penndibaboù implijer]].",
 'confirmemail_text' => "Rankout a ra ar wiki-mañ bezañ gwiriet ho chomlec'h postel a-raok gallout implijout nep arc'hwel postel. Implijit ar bouton a-is evit kas ur postel kadarnaat d'ho chomlec'h. Ul liamm ennañ ur c'hod a vo er postel. Kargit al liamm-se en o merdeer evit kadarnaat ho chomlec'h.",
@@ -3852,6 +3855,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'logentry-newusers-create' => 'Krouet eo bet ar gont implijer $1',
 'logentry-newusers-create2' => 'Gant $1 eo bet krouet ar gont implijer $3',
 'logentry-newusers-autocreate' => 'Krouet eo bet kont $1 ent emgefre',
+'logentry-rights-autopromote' => '$1 zo bet anvet ent emgefre a $4 da $5',
 'rightsnone' => '(netra)',
 
 # Feedback
@@ -3906,6 +3910,7 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'api-error-ok-but-empty' => 'Fazi diabarzh : respont ebet a-berzh ar servijer.',
 'api-error-overwrite' => "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
 'api-error-stashfailed' => "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
+'api-error-publishfailed' => "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
 'api-error-timeout' => "N'eo ket bet ar servijer evit respont en termen lakaet.",
 'api-error-unclassified' => "C'hoarvezet ez eus ur gudenn dianav.",
 'api-error-unknown-code' => 'Fazi dianav : "$1"',
index b41c354..1b91967 100644 (file)
@@ -672,6 +672,7 @@ $2',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Iz razloga "\'\'$2\'\'".',
 '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.',
 
@@ -779,7 +780,7 @@ Molimo Vas da sačekate prije nego što pokušate ponovo.',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
 'user-mail-no-addy' => 'Pokušaj slanja e-maila bez navedene e-mail adrese.',
 
@@ -948,6 +949,10 @@ Možete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim s
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
 'noarticletext-nopermission' => 'Trenutno nema teksta na ovoj stranici.
 Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.',
+'missing-revision' => 'Uređivanje broj $1 na stranici "{{PAGENAME}}" ne postoji.
+
+Ovo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].',
 'userpage-userdoesnotexist' => 'Korisnički račun "<nowiki>$1</nowiki>" nije registrovan.
 Molimo provjerite da li želite napraviti/izmijeniti ovu stranicu.',
 'userpage-userdoesnotexist-view' => 'Korisnički račun "$1" nije registrovan.',
@@ -1083,6 +1088,7 @@ Ovakvi argumenti se trebaju izbjegavati.',
 'expansion-depth-exceeded-warning' => 'Stranice koje su prekoračile dubinu proširenja',
 'parser-unstrip-loop-warning' => 'Pronađena petlja',
 'parser-unstrip-recursion-limit' => 'Prekoračeno ograničenje rekurzije ($1)',
+'converter-manual-rule-error' => 'Pronađena je greška u pravilu za ručno pretvaranje jezika',
 
 # "Undo" feature
 'undo-success' => 'Izmjena se može vratiti.
@@ -1463,7 +1469,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'prefs-displaywatchlist' => 'Postavke izgleda',
 'prefs-diffs' => 'Razlike',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Izgleda valjano',
 'email-address-validity-invalid' => 'Neophodna valjana adresa!',
 
@@ -1538,6 +1544,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'right-writeapi' => "Korištenje opcije ''write API''",
 'right-delete' => 'Brisanje stranica',
 'right-bigdelete' => 'Brisanje stranica sa velikom historijom',
+'right-deletelogentry' => 'Brisanje i vraćanje određenih zapisa u evidenciji',
 'right-deleterevision' => 'Brisanje i vraćanje određenih revizija stranice',
 'right-deletedhistory' => 'Pregled stavki obrisane historije, bez povezanog teksta',
 'right-deletedtext' => 'Pregled obrisanog teksta i izmjena između obrisanih revizija',
@@ -1952,11 +1959,16 @@ Ovdje je dostupan [[Special:WhatLinksHere/$2|potpuni spisak]].',
 Molimo pogledajte [$2 stranicu opisa datoteke] za ostale informacije.',
 'sharedupload-desc-here' => 'Ova datoteka je sa $1 i može se koristiti i na drugim projektima.
 Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
+'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete urediti na [$2 stranici opisa datoteke].',
+'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'filepage-nofile' => 'Ne postoji datoteka s ovim nazivom.',
 'filepage-nofile-link' => 'Ne postoji datoteka s ovim imenom, ali je možete [$1 postaviti].',
 'uploadnewversion-linktext' => 'Postavite noviju verziju ove datoteke',
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'dijeljeni repozitorijum',
+'upload-disallowed-here' => 'Ne možete prepisati ovu datoteku.',
 
 # File reversion
 'filerevert' => 'Vrati $1',
@@ -2042,6 +2054,8 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 Umjesto toga, one se trebaju povezati sa konkretnim konkretnim stranicom.<br />
 Stranica se smatra čvorom, ukoliko koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop-submit' => 'Idi',
+
 'doubleredirects' => 'Dvostruka preusmjerenja',
 'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
 Svaki 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.
@@ -2065,6 +2079,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajtova}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorija|kategorije}}',
+'ninterwikis' => '$1 {{PLURAL:$1|međujezična veza|međujezične veze}}',
 'nlinks' => '$1 {{PLURAL:$1|veza|veze}}',
 'nmembers' => '$1 {{PLURAL:$1|član|članova}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizija|revizije|revizija}}',
@@ -2168,6 +2183,8 @@ Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
 'allpages-hide-redirects' => 'Sakrij preusmjerenja',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Gledate keširanu verziju ove stranice, koja može biti stara i do $1.',
+'cachedspecial-viewing-cached-ts' => 'Gledate keširanu verziju ove stranice, koja možda nije potpuno aktualna.',
 'cachedspecial-refresh-now' => 'Pogledaj najnoviju.',
 
 # Special:Categories
@@ -2229,7 +2246,7 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 'listgrouprights-addgroup-self-all' => 'Može dodati sve grupe na svoj račun',
 'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog računa',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nema adrese za slanje',
 'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
 i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
@@ -2889,6 +2906,7 @@ Sve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisu u
 'import-interwiki-templates' => 'Uključi sve šablone',
 'import-interwiki-submit' => 'Uvoz',
 'import-interwiki-namespace' => 'Odredišni imenski prostor:',
+'import-interwiki-rootpage' => 'Odredišna osnovna stranica (opcionalno):',
 'import-upload-filename' => 'Naziv datoteke:',
 'import-comment' => 'Komentar:',
 'importtext' => 'Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].
@@ -2925,6 +2943,8 @@ Nedostaje privremeni folder.',
 'import-error-special' => 'Stranica "$1" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.',
 'import-error-invalid' => 'Stranica "$1" nije uvezena jer je njen naziv neispravan.',
 'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
+'import-rootpage-nosubpage' => 'Imenski prostor "$1" osnovne stranice ne dozvoljava podstranice.',
 
 # Import log
 'importlogpage' => 'Zapisnik uvoza',
@@ -3070,6 +3090,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
 'pageinfo-header-properties' => 'Svojstva stranice',
 'pageinfo-display-title' => 'Naslov stranice',
+'pageinfo-default-sort' => 'Podrazumijevani ključ sortiranja',
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
@@ -3077,6 +3098,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-watchers' => 'Broj pratitelja stranice',
 'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja}})',
 'pageinfo-firstuser' => 'Korisnik koji je napravio stranicu',
 'pageinfo-firsttime' => 'Datum stvaranja stranice',
 'pageinfo-lastuser' => 'Posljednji urednik stranice',
@@ -3148,6 +3170,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 piksela, veličina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
 'file-nohires' => 'Veća rezolucija nije dostupna.',
 'svg-long-desc' => 'SVG fajl, dozvoljeno $1 × $2 piksela, veličina fajla: $3',
+'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina datoteke: $3',
 'show-big-image' => 'Vidi sliku u punoj veličini (rezoluciji)',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
@@ -3157,6 +3180,8 @@ $1',
 'file-info-png-looped' => 'stalno iznova',
 'file-info-png-repeat' => 'pregledano $1 {{PLURAL:$1|put|puta}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|sličica|sličice|sličica}}',
+'file-no-thumb-animation' => "'''Napomena: Zbog tehničkih ograničenja minijature ove datoteke neće biti animirane.'''",
+'file-no-thumb-animation-gif' => "'''Napomena: Zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće biti animirane.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerija novih slika',
@@ -3610,7 +3635,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'monthsall' => 'sve',
 'limitall' => 'sve',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potvrdite adresu e-pošte',
 'confirmemail_noemail' => 'Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].',
 'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu. Pošta uključuje link koji sadrži kod; učitajte link u Vaš preglednik da bi ste potvrdili da je adresa Vaše e-pošte validna.',
@@ -3854,6 +3879,7 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
index 44f7c31..020c424 100644 (file)
@@ -20,6 +20,7 @@
  * @author Jordi Roqué
  * @author Juanpabl
  * @author Kaganer
+ * @author Marcmpujol
  * @author Martorell
  * @author McDutchie
  * @author Pasqual (ca)
@@ -330,6 +331,7 @@ $messages = array(
 'newwindow' => '(obre en una nova finestra)',
 'cancel' => 'Anuŀla',
 'moredotdotdot' => 'Més...',
+'morenotlisted' => 'Més no en la llista...',
 'mypage' => 'Pàgina',
 'mytalk' => 'Discussió',
 'anontalk' => "Discussió d'aquesta IP",
@@ -692,9 +694,10 @@ Si us plau, esperi abans de tornar-ho a intentar.",
 'loginlanguagelabel' => 'Llengua: $1',
 'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
 'user-mail-no-addy' => "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
+'user-mail-no-body' => 'Vas intentar enviar un correu electrònic amb un cos buit o excessivament curt.',
 
 # Change password dialog
 'resetpass' => 'Canvia la contrasenya',
@@ -1364,7 +1367,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'prefs-displaywatchlist' => 'Opcions de visualització',
 'prefs-diffs' => 'Difs',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "L'adreça de correu electrònic sembla vàlida",
 'email-address-validity-invalid' => 'Escriviu una adreça vàlida de correu electrònic',
 
@@ -2125,7 +2128,7 @@ Pot ser que hi hagi més informació sobre drets individuals [[{{MediaWiki:Listg
 'listgrouprights-addgroup-self-all' => 'Afegir-se a qualsevol grup',
 'listgrouprights-removegroup-self-all' => 'Abandona tots els grups',
 
-# E-mail user
+# Email user
 'mailnologin' => "No enviïs l'adreça",
 'mailnologintext' => "Heu d'haver [[Special:UserLogin|entrat]]
 i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|preferències]]
@@ -2313,6 +2316,8 @@ Vegeu la [[Special:ProtectedPages|llista de pàgines protegides]] per a la llist
 'prot_1movedto2' => '[[$1]] mogut a [[$2]]',
 'protect-badnamespace-title' => 'Espai de nom no-protectable',
 'protect-badnamespace-text' => 'Les pàgines en aquest espai de nom no pot ser protegit.',
+'protect-norestrictiontypes-text' => 'Aquesta pàgina no es pot protegir ja que no hi ha cap tipus de restricció disponible.',
+'protect-norestrictiontypes-title' => 'Pàgina no protegible',
 'protect-legend' => 'Confirmeu la protecció',
 'protectcomment' => 'Motiu:',
 'protectexpiry' => "Data d'expiració",
@@ -2490,7 +2495,7 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipadressorusername' => "Adreça IP o nom de l'usuari",
 'ipbexpiry' => 'Venciment',
 'ipbreason' => 'Motiu:',
-'ipbreasonotherlist' => 'Un altre motiu',
+'ipbreasonotherlist' => 'Altres motius',
 'ipbreason-dropdown' => "*Motius de bloqueig més freqüents
 ** Inserció d'informació falsa
 ** Supressió de contingut sense justificació
@@ -2507,7 +2512,7 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipbother' => 'Un altre termini',
 'ipboptions' => '2 hores:2 hours,1 dia:1 day,3 dies:3 days,1 setmana:1 week,2 setmanes:2 weeks,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year,infinit:infinite',
 'ipbotheroption' => 'un altre',
-'ipbotherreason' => 'Motiu diferent o addicional:',
+'ipbotherreason' => 'Altres motius o addicionals:',
 'ipbhidename' => "Amaga el nom d'usuari de les edicions i llistes",
 'ipbwatchuser' => "Vigila les pàgines d'usuari i de discussió de l'usuari",
 'ipb-disableusertalk' => 'Impedeix que aquest usuari pugui modificar la seva pàgina de discussió mentre dura el blocatge',
@@ -2554,7 +2559,7 @@ l'accés a l'escriptura a una adreça IP o un usuari prèviament bloquejat.",
 'createaccountblock' => "s'ha blocat la creació de nous comptes",
 'emailblock' => "s'ha blocat l'enviament de correus electrònics",
 'blocklist-nousertalk' => 'no podeu modificar la pàgina de discussió pròpia',
-'ipblocklist-empty' => 'La llista de bloqueig està buida.',
+'ipblocklist-empty' => 'La llista de bloqueigs està buida.',
 'ipblocklist-no-results' => "L'adreça IP o nom d'usuari soŀlicitat no està bloquejat.",
 'blocklink' => 'bloca',
 'unblocklink' => 'desbloca',
@@ -3492,7 +3497,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 'monthsall' => 'tots',
 'limitall' => 'tots',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Confirma l'adreça de correu electrònic",
 'confirmemail_noemail' => "No heu introduït una direcció vàlida de correu electrònic en les vostres [[Special:Preferences|preferències d'usuari]].",
 'confirmemail_text' => "El projecte {{SITENAME}} necessita que valideu la vostra adreça de correu
index afcd744..795456b 100644 (file)
@@ -149,7 +149,7 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
 'tog-justify' => 'پەرەگرافەکان پڕاوپر نیشان بدە',
-'tog-hideminor' => 'دەستکارییە بچووکەکان بشارەوە لە دوایین گۆڕانکارییەکاندا',
+'tog-hideminor' => 'دەستکارییە بچووکەکان لە دوایین گۆڕانکارییەکاندا بشارەوە',
 'tog-hidepatrolled' => 'لە دوایین گۆڕانکاریەکان، دەستکاریە پارێزراوەکان داشارە',
 'tog-newpageshidepatrolled' => 'لە لیستی لاپەڕە نوێکان، لاپەڕە پارێزراوەکان داشارە',
 'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
@@ -281,6 +281,7 @@ $messages = array(
 'newwindow' => '(لە پەڕەیەکی نوێدا دەکرێتەوە)',
 'cancel' => 'ھەڵیوەشێنەوە',
 'moredotdotdot' => 'زیاتر',
+'morenotlisted' => 'درێژەی پێرست...',
 'mypage' => 'پەڕه‌',
 'mytalk' => 'لێدوان',
 'anontalk' => 'وتووێژ بۆ ئەم ئای‌پی یە',
@@ -325,7 +326,7 @@ $messages = array(
 'searcharticle' => 'بڕۆ',
 'history' => 'مێژووی پەڕە',
 'history_short' => 'مێژووی پەڕە',
-'updatedmarker' => 'لە دوای دواسەردانم نوێکراوەتەوە',
+'updatedmarker' => 'لە دوایین سەردانمدا نوێ کراوەتەوە',
 'printableversion' => 'وەشانی ئامادەی چاپ',
 'permalink' => 'بەستەری ھەمیشەیی',
 'print' => 'چاپ',
@@ -364,7 +365,7 @@ $messages = array(
 'otherlanguages' => 'بە زمانەکانی تر',
 'redirectedfrom' => '(ڕەوانەکراوە لە $1 ەوە)',
 'redirectpagesub' => 'پەڕەی ڕەوانەکردن',
-'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێکراوەتەوە.',
+'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێ کراوەتەوە.',
 'viewcount' => 'ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.',
 'protectedpage' => 'پەڕەی پارێزراو',
 'jumpto' => 'باز بدە بۆ:',
@@ -468,7 +469,7 @@ $1',
 
 # General errors
 'error' => 'هه‌ڵه‌',
-'databaseerror' => 'Ú¾Û\95ÚµÛ\95Û\8c Ø¯Ø§ØªØ§Ø¨Û\95Û\8cس',
+'databaseerror' => 'Ú¾Û\95ÚµÛ\95Û\8c Ø¨Ù\86Ú©Û\95دراÙ\88Ù\87',
 'dberrortext' => 'ھەڵەیەکی ڕستەنووسی لە داواکاریی بنکەیدراو ڕووی داوە.
 لەوانەیە ئەوە نیشاندەری کەلێنێک لە نەرمامێرەکەدا بێت.
 دوایین تێکۆشان بۆ داواکاری بنکەیدراو:  
@@ -897,7 +898,7 @@ $2
 ئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.
 لۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
 'moveddeleted-notice' => 'ئەم پەڕەیە سڕاوەتەوە.
-لۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە خوارەوە دابینکراوە.',
+لۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.',
 'log-fulllog' => 'دیتنی لۆگی تەواو',
 'edit-hook-aborted' => 'دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.
 ھۆکارەکەی لەبەر دەست نییە.',
@@ -1158,7 +1159,7 @@ $1",
 'search-interwiki-default' => '$1 ئەنجام:',
 'search-interwiki-more' => '(زیاتر)',
 'search-relatedarticle' => 'پەیوەست',
-'mwsuggest-disable' => 'پێشنیارەکانی AJAX نیشان مەدە',
+'mwsuggest-disable' => 'پێشنیارەکانی گەڕان ناچالاک بکە',
 'searcheverything-enable' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕێ',
 'searchrelated' => 'پەیوەست',
 'searchall' => 'ھەموو',
@@ -1252,7 +1253,7 @@ $1",
 'timezoneregion-australia' => 'ئۆسترالیا',
 'timezoneregion-europe' => 'ئەورووپا',
 'timezoneregion-indian' => 'ئوقیانووسی ھیند',
-'timezoneregion-pacific' => 'ئوقیانووسی پاسیفیک',
+'timezoneregion-pacific' => 'ئۆقیانووسی پاسیفیک',
 'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
 'prefs-searchoptions' => 'گەڕان',
 'prefs-namespaces' => 'بۆشایی‌ناوەکان',
@@ -1306,7 +1307,7 @@ $1",
 'prefs-displaywatchlist' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-diffs' => 'جیاوازییەکان',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ناونیشانی ئیمەیل دروست وە بەر چاو دێت',
 'email-address-validity-invalid' => 'ناونیشانێکی دروستی ئیمەیل بنووسە',
 
@@ -1480,7 +1481,7 @@ $1",
 'diff' => 'جیاوازی',
 'hist' => 'مێژوو',
 'hide' => 'بشارەوە',
-'show' => 'نیشانبدە',
+'show' => 'نیشان بدە',
 'minoreditletter' => 'ب',
 'newpageletter' => 'ن',
 'boteditletter' => '.بۆت',
@@ -1989,7 +1990,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'زیادکردنی هەموو گرووپەکان بۆ سه‌ر هه‌ژماری خۆ',
 'listgrouprights-removegroup-self-all' => 'لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ناونیشان بۆ ناردن نییه‌',
 'mailnologintext' => 'ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.',
 'emailuser' => 'ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە',
@@ -2568,7 +2569,7 @@ $1',
 '''ئاگاداربە: '''ھەناردنی ھەموو مێژووی پەڕەکان لەم فۆرمەوە لەبەر ھۆکاری ڕێخستن، داخراوە.",
 'export-submit' => 'هەناردن',
 'export-addcattext' => 'پەڕەکان زێدەبکە لە پۆلی:',
-'export-addcat' => 'زÛ\8eدÛ\95بکە',
+'export-addcat' => 'زÛ\8cاد بکە',
 'export-addnstext' => 'پەڕەکان زێدەبکە لە بۆشایی‌ناوی:',
 'export-addns' => 'زێدەبکە',
 'export-download' => 'وەک پەڕگە پاشەکەوتی بکە',
@@ -2765,6 +2766,7 @@ $1',
 'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
 'pageinfo-views' => 'ژمارەی بینینەکان',
 'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
+'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاوەدێر}}',
 'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
 'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
@@ -3131,7 +3133,7 @@ $1',
 'monthsall' => 'ھەموو',
 'limitall' => 'ھەموو',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'بڕواپێکردنی ناونیشانی ئیمەیل',
 'confirmemail_noemail' => 'لە [[Special:Preferences|هەڵبژاردەکانی بەکارهێنەر]] ناونیشانی ئی‌مەیلی گونجاوت دیاری نەکردووە.',
 'confirmemail_text' => '{{SITENAME}} بە پێویستی دەزانێ پێش کەڵک وەرگرتن لە تایبەتمەندیەکانی ئی‌مەیل، ناونیشانی ئی‌مەیلی خۆت ڕاچاو بکەیت.
@@ -3301,7 +3303,7 @@ $5
 'hijri-calendar-m2' => 'سەفەر',
 'hijri-calendar-m3' => 'ڕەبیعەلئەووەڵ',
 'hijri-calendar-m4' => 'ڕەبیعەلئاخیر',
-'hijri-calendar-m5' => 'جومادەلئەووەل',
+'hijri-calendar-m5' => 'جومادەلئوولا',
 'hijri-calendar-m6' => 'جومادەسسانی',
 'hijri-calendar-m7' => 'ڕەجەب',
 'hijri-calendar-m8' => 'شەعبان',
index ce43c0b..0a087e1 100644 (file)
@@ -861,7 +861,7 @@ Počkejte chvíli, než to zkusíte znovu.',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Váš požadavek na odhlášení byl odmítnut, neboť to vypadá, že ho poslal rozbitý prohlížeč nebo cachující proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
 'user-mail-no-addy' => 'Pokus o odeslání e-mailu bez e-mailové adresy',
 'user-mail-no-body' => 'Pokus o odeslání prázdného nebo nesmyslně krátkého e-mailu.',
@@ -1534,7 +1534,7 @@ Tuto operaci nelze vrátit zpět.',
 'prefs-displaywatchlist' => 'Možnosti zobrazení',
 'prefs-diffs' => 'Porovnání verzí',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailová adresa vypadá platně',
 'email-address-validity-invalid' => 'Zadejte platnou e-mailovou adresu',
 
@@ -2121,6 +2121,12 @@ Vstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.',
 Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
 Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Stránky s vlastností',
+'pageswithprop-legend' => 'Stránky s vlastností',
+'pageswithprop-text' => 'Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.',
+'pageswithprop-prop' => 'Název vlastnosti:',
+'pageswithprop-submit' => 'Provést',
+
 '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í.
 Kaž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.
@@ -2312,7 +2318,7 @@ Povinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br
 'listgrouprights-addgroup-self-all' => 'Přidání svého účtu do libovolné skupiny',
 'listgrouprights-removegroup-self-all' => 'Vyřazení svého účtu z libovolné skupiny',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Bez odesílací adresy',
 'mailnologintext' => 'Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].',
 'emailuser' => 'Poslat e-mail',
@@ -3266,7 +3272,7 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'months' => '{{PLURAL:$1|$1 měsícem|$1 měsíci}}',
 'years' => '{{PLURAL:$1|$1 rokem|$1 roky}}',
 'ago' => 'před $1',
-'just-now' => 'Právě teď',
+'just-now' => 'právě teď',
 
 # Bad image list
 'bad_image_list' => 'Tato stránka má následující formát:
@@ -3692,7 +3698,7 @@ Obsahuje pouze seznam s odrážkami (řádka začíná s *). První odkaz na ř
 'monthsall' => 'všechny',
 'limitall' => 'vše',
 
-# E-mail address confirmation
+# Email address confirmation
 '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á.',
@@ -4154,4 +4160,7 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'duration-centuries' => '$1 {{PLURAL:$1|století}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
 
+# Image rotation
+'rotate-comment' => 'Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček',
+
 );
index c39aa66..6d0156c 100644 (file)
@@ -611,7 +611,7 @@ Oedwch ychydig cyn mentro eto.',
 'loginlanguagelabel' => 'Iaith: $1',
 'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
 'user-mail-no-addy' => 'Wedi ceisio anfon e-bost heb gyfeiriad e-bost',
 'user-mail-no-body' => 'Ceisiwyd anfon e-bost gwag neu e-bost oedd a thestun rhy bwt iddo.',
@@ -1284,7 +1284,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'prefs-displaywatchlist' => 'Dewisiadau arddangos',
 'prefs-diffs' => "Cymharu golygiadau ('gwahan')",
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Y cyfeiriad e-bost yn ymddangos yn un dilys',
 'email-address-validity-invalid' => 'Rhowch gyfeiriad e-bost dilys',
 
@@ -1867,6 +1867,12 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
 'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
 Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
 
+'pageswithprop' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-legend' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-text' => "Mae'r dudalen hon yn rhestru tudalennau sydd yn defnyddio nodwedd arbennig yn y dudalen.",
+'pageswithprop-prop' => "Enw'r nodwedd:",
+'pageswithprop-submit' => 'Gwneler',
+
 '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.
 Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
@@ -2056,7 +2062,7 @@ Mae angen parth lefel-uchaf o leiaf, er enghraifft "*.org".<br />
 '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",
 
-# E-mail user
+# Email user
 'mailnologin' => "Does dim cyfeiriad i'w anfon iddo",
 'mailnologintext' => 'Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]
 a bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]
@@ -3427,7 +3433,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
 'monthsall' => 'pob mis',
 'limitall' => 'oll',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Cadarnhau'r cyfeiriad e-bost",
 'confirmemail_noemail' => 'Does dim cyfeiriad e-bost dilys wedi ei osod yn eich [[Special:Preferences|dewisiadau defnyddiwr]].',
 'confirmemail_text' => "Cyn i chi allu defnyddio'r nodweddion e-bost, mae'n rhaid i {{SITENAME}} ddilysu'ch cyfeiriad e-bost. Pwyswch y botwm isod er mwyn anfon côd cadarnhau i'ch cyfeiriad e-bost. Bydd yr e-bost yn cynnwys cyswllt gyda chôd ynddi; llwythwch y cyswllt ar eich porwr er mwyn cadarnhau dilysrwydd eich cyfeiriad e-bost.",
@@ -3816,4 +3822,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'duration-centuries' => '$1 {{PLURAL:$1|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
 
+# Image rotation
+'rotate-comment' => "Trowyd y llun $1 {{PLURAL:$1|gradd|radd|radd|gradd}} gyda'r cloc",
+
 );
index c6f969d..88ffe6f 100644 (file)
@@ -41,6 +41,7 @@
  * @author Sarrus
  * @author Sir48
  * @author Slomox
+ * @author Steenth
  * @author Svip
  * @author Søren Løvborg
  * @author Tjernobyl
@@ -691,7 +692,7 @@ Vent venligst før du prøver igen.',
 'loginlanguagelabel' => 'Sprog: $1',
 'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
 'user-mail-no-addy' => 'Forsøgte at sende email uden en email-adresse',
 'user-mail-no-body' => 'Forsøgte at sende en e-mail med tomt eller urimeligt kort indhold.',
@@ -1351,7 +1352,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'prefs-info' => 'Grundlæggende information',
 'prefs-i18n' => 'Internationalisering:',
 'prefs-signature' => 'Signatur',
-'prefs-dateformat' => 'Dataformat',
+'prefs-dateformat' => 'Formatering af datoer',
 'prefs-timeoffset' => 'Tidsforskel',
 'prefs-advancedediting' => 'Avancerede indstillinger',
 'prefs-advancedrc' => 'Avancerede indstillinger',
@@ -1363,7 +1364,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'prefs-displaywatchlist' => 'Visningsmuligheder',
 'prefs-diffs' => 'Forskelle',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
 'email-address-validity-invalid' => 'Indtast en gyldig e-mail adresse',
 
@@ -1953,6 +1954,12 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 De bør henvise direkte til et mere passende emne i stedet.<br />
 En side behandles som en side med en flertydig titel hvis den bruger en skabelon som der er henvist til fra [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Sider med en sideegenskab',
+'pageswithprop-legend' => 'Sider med en sideegenskab',
+'pageswithprop-text' => 'Denne side viser en liste over sider, der bruger en bestemt sideegenskaben.',
+'pageswithprop-prop' => 'Egenskabsnavn:',
+'pageswithprop-submit' => 'Gå',
+
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
 Hver linje indeholder henvisninger til den første og den anden omdirigering, såvel som til målet for den anden omdirigering som sædvanligvis er den "rigtige" målside som den første omdirigering burde henvise til.
@@ -2144,7 +2151,7 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat
 'listgrouprights-addgroup-self-all' => 'Kan tilføje alle grupper til egen konto',
 'listgrouprights-removegroup-self-all' => 'Kan fjerne alle grupper fra egen konto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Du er ikke logget på',
 'mailnologintext' => 'Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.',
 'emailuser' => 'E-mail til denne bruger',
@@ -3510,7 +3517,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Bekræft e-mail-adressen',
 'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mail-adresse i din [[Special:Preferences|brugerprofil]].',
 'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mail-adressen er gyldig.',
@@ -3904,4 +3911,7 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'duration-centuries' => '$1 {{PLURAL:$1|århundrede|århundreder}}',
 'duration-millennia' => '$1 {{PLURAL:$1|årtusind|årtusinder}}',
 
+# Image rotation
+'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
+
 );
index 654bd05..d481de3 100644 (file)
@@ -53,6 +53,7 @@
  * @author Rillke
  * @author SVG
  * @author Saibo
+ * @author Sebastian Wallroth
  * @author Spacebirdy
  * @author Srhat
  * @author TMg
@@ -194,7 +195,6 @@ $specialPageAliases = array(
        'Userlogin'                 => array( 'Anmelden' ),
        'Userlogout'                => array( 'Abmelden' ),
        'Userrights'                => array( 'Benutzerrechte' ),
-       'Version'                   => array( 'Versionsinformationen' ),
        'Wantedcategories'          => array( 'Gewünschte_Kategorien' ),
        'Wantedfiles'               => array( 'Gewünschte_Dateien', 'Fehlende_Dateien' ),
        'Wantedpages'               => array( 'Gewünschte_Seiten' ),
@@ -416,7 +416,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden',
 'tog-extendwatchlist' => 'Erweiterte Beobachtungsliste zur Anzeige aller Änderungen',
-'tog-usenewrc' => 'Seitenbezogene Gruppierung in den „Letzten Änderungen“ und auf der Beobachtungsliste (benötigt JavaScript)',
+'tog-usenewrc' => 'Änderungen auf „Letzte Änderungen“ und Beobachtungsliste nach Seite gruppieren (benötigt JavaScript)',
 'tog-numberheadings' => 'Überschriften automatisch nummerieren',
 'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen (benötigt JavaScript)',
 'tog-editondblclick' => 'Seiten mit Doppelklick bearbeiten (benötigt JavaScript)',
@@ -722,7 +722,7 @@ Siehe die [[Special:Version|Versionsseite]]',
 'nosuchaction' => 'Diese Aktion gibt es nicht',
 'nosuchactiontext' => 'Die in der URL angegebene Aktion wird von MediaWiki nicht unterstützt.
 Es kann ein Schreibfehler in der URL vorliegen oder es wurde ein fehlerhafter Link angeklickt.
-Es kann sich auch um einen Programmierfehler in der Software, die auf {{SITENAME}} benutzt wird, handeln.',
+Es kann sich auch um einen Programmierfehler in der Software, die von {{SITENAME}} benutzt wird, handeln.',
 'nosuchspecialpage' => 'Spezialseite nicht vorhanden',
 'nospecialpagetext' => '<strong>Die aufgerufene Spezialseite ist nicht vorhanden.</strong>
 
@@ -913,7 +913,7 @@ Bitte warte, bevor du es erneut probierst.',
 'loginlanguagelabel' => 'Sprache: $1',
 'suspicious-userlogout' => 'Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.',
 
-# E-mail sending
+# Email sending
 '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.',
 'user-mail-no-body' => 'Es wurde versucht, eine E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
@@ -1581,7 +1581,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'prefs-displaywatchlist' => 'Anzeigeoptionen',
 'prefs-diffs' => 'Versionsvergleich',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Diese E-Mail-Adresse scheint gültig zu sein.',
 'email-address-validity-invalid' => 'Eine gültige E-Mail-Adresse ist erforderlich.',
 
@@ -2174,6 +2174,12 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 
 Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
 
+'pageswithprop' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-legend' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-text' => 'Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.',
+'pageswithprop-prop' => 'Eigenschaftsname:',
+'pageswithprop-submit' => 'Los',
+
 'doubleredirects' => 'Doppelte Weiterleitungen',
 'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
 Jede 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.
@@ -2362,7 +2368,7 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
 'listgrouprights-addgroup-self-all' => 'Kann alle Gruppen zum eigenen Konto hinzufügen',
 'listgrouprights-removegroup-self-all' => 'Kann alle Gruppen vom eigenen Konto entfernen',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Fehler beim E-Mail-Versand',
 'mailnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
 'emailuser' => 'E-Mail an diesen Benutzer',
@@ -3195,7 +3201,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-header-restrictions' => 'Seitenschutz',
 'pageinfo-header-properties' => 'Seiteneigenschaften',
 'pageinfo-display-title' => 'Anzeigetitel',
-'pageinfo-default-sort' => 'Standard-Sortierschlüssel',
+'pageinfo-default-sort' => 'Standardsortierschlüssel',
 'pageinfo-length' => 'Seitenlänge (in Bytes)',
 'pageinfo-article-id' => 'Seitenkennnummer',
 'pageinfo-language' => 'Seiteninhaltssprache',
@@ -3751,7 +3757,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-Mail-Adresse bestätigen (Authentifizierung)',
 'confirmemail_noemail' => 'Du hast keine gültige E-Mail-Adresse in deinen [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
 'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizieren), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
@@ -4175,4 +4181,7 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
 'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
 
+# Image rotation
+'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
+
 );
index 95c7b88..905afc8 100644 (file)
@@ -696,7 +696,7 @@ Perse: $2',
 'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
 'viewyourtext' => "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
 'protectedinterface' => 'Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.',
-'editinginterface' => "'''İqaz:''' Şıma hao jû pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
+'editinginterface' => "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
 Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
 Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
 'sqlhidden' => '(SQL pers kerdışê nımıte)',
@@ -818,7 +818,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'loginlanguagelabel' => 'Zıwan: $1',
 'suspicious-userlogout' => 'Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyoni de xırabin vıcyê.",
 'user-mail-no-addy' => 'Bê E-posta kerd ju e-posta bırşo cırê.',
 
@@ -1304,8 +1304,8 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchsubtitle' => 'Tı semedê \'\'\'[[:$1]]\'\'\' cıgeyra. ([[Special:Prefixindex/$1|pelê ke pêro be "$1" ra dest niyaê pıra]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|pelê ke pêro be "$1"\' ra gırê xo esto]])',
 'searchsubtitleinvalid' => "Tı cıgeyra qe '''$1'''",
 'toomanymatches' => 'Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.',
-'titlematches' => 'tekê (zewcê) sernamey pele',
-'notitlematches' => 'Tekê (zewcê) sernamey pele çıniyê.',
+'titlematches' => 'Tekê (zewcê) sernameyê pele',
+'notitlematches' => 'Tekê (zewcê) sernameyê pele çıniyê.',
 'textmatches' => 'Tekê (zewcê) nuştey pele',
 'notextmatches' => 'tekê (zewcê) nuştey pele çıniyê',
 'prevn' => '{{PLURAL:$1|$1}} verên',
@@ -1490,7 +1490,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
 'prefs-diffs' => 'Ferqi',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'e-posta adresi raştayo',
 'email-address-validity-invalid' => 'e-postayo raştay defiye de',
 
@@ -2020,12 +2020,12 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'filedelete-success-old' => "Versiyonê'''[[Media:$1|$1]]'''î $3, $2 esteriyayo.",
 'filedelete-nofile' => "'''$1''' çin o.",
 'filedelete-nofile-old' => "Versiyonê arşivi ye '''$1'''î pê enê detayanê xasî çin o.",
-'filedelete-otherreason' => 'Sebebê binî',
-'filedelete-reason-otherlist' => 'Sebebê binî',
+'filedelete-otherreason' => 'Sebebo bin/ilaweyın:',
+'filedelete-reason-otherlist' => 'Sebebo bin',
 'filedelete-reason-dropdown' => '*sebebê hewna kerdışi
 ** ihlalê heqê telifi
 ** Çift/dosyaya kopyayın',
-'filedelete-edit-reasonlist' => 'Sebebê esterayîşî bivurne',
+'filedelete-edit-reasonlist' => 'Sebebanê esterıtışi bıvurne',
 'filedelete-maintenance' => 'Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.',
 'filedelete-maintenance-title' => 'Dosyaya nêbesterneyêna',
 
@@ -2272,7 +2272,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 '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',
 
-# E-mail user
+# Email user
 '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.',
 'emailuser' => 'Ena karberi rê mesac bırse',
@@ -2602,7 +2602,7 @@ qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
 'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'sp-contributions-search' => 'Dekerdena cı geyrê',
-'sp-contributions-username' => 'Adresa IP yana namey karberi:',
+'sp-contributions-username' => 'Adresa IPy ya zi nameyê karberi:',
 'sp-contributions-toponly' => 'Tenya rewizyonanê tewr peyniyan bimocne',
 'sp-contributions-submit' => 'Cı geyre',
 
@@ -2633,7 +2633,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blockip-title' => '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 IP yana namey karberi:',
+'ipadressorusername' => 'Adresa IPy ya zi nameyê karberi:',
 'ipbexpiry' => 'Qedyayış:',
 'ipbreason' => 'Sebeb:',
 'ipbreasonotherlist' => 'Sebebê bini',
@@ -2671,18 +2671,18 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipb-blocklist' => 'Blokî ke hama estê ey bivîne',
 'ipb-blocklist-contribs' => 'Ser $1 îştîrakî',
 'unblockip' => 'Hesabê karberî a bike',
-'unblockiptext' => 'eke şıma qayili ê yê ke verniyê IPadesê inan geriyayê akeri formê cêrıni dekerê.',
-'ipusubmit' => 'Ena blok wedarne',
+'unblockiptext' => 'Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.',
+'ipusubmit' => 'Enê kılitkerdışi wedare',
 'unblocked' => '[[User:$1|$1]] blok biyo',
 'unblocked-range' => "Blokey $1'i wederya",
 'unblocked-id' => 'Blokê $1î wedariyayo',
-'blocklist' => 'Karberê kılitbiyaey',
-'ipblocklist' => 'Karberê kılitbiyaey',
-'ipblocklist-legend' => 'Yew karberê blok biyaye bivîne',
-'blocklist-userblocks' => 'Wederneyanê hesaba bınımne',
-'blocklist-tempblocks' => 'Wederneyanê idaretan bınımne',
-'blocklist-addressblocks' => 'Nêverdışanê IP bınımne',
-'blocklist-rangeblocks' => 'Nêverdışanê gırda bınımne',
+'blocklist' => 'Karberê kılitbiyayey',
+'ipblocklist' => 'Karberê kılitbiyayey',
+'ipblocklist-legend' => 'Yew karberê kılitbiyayey bıvêne',
+'blocklist-userblocks' => 'Kılitkerdışê hesaban bınımne',
+'blocklist-tempblocks' => 'Kılitkerdışan mıweqet bınımne',
+'blocklist-addressblocks' => 'Tenya kılitkerdışanê IPy bınımne',
+'blocklist-rangeblocks' => 'Kılitkerdışanê rêzkiyan bınımne',
 'blocklist-timestamp' => 'İmzay demi',
 'blocklist-target' => 'Menzil',
 'blocklist-expiry' => 'Wahdey qedyayışi',
@@ -2699,7 +2699,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'createaccountblock' => 'Hesab viraştîş blok biyo',
 'emailblock' => 'e-mail blok biyo',
 'blocklist-nousertalk' => 'ti nieşken pele minaqaşe xo bivurne',
-'ipblocklist-empty' => 'Listeyê blokî veng o.',
+'ipblocklist-empty' => 'Lista kılitkerdışi venga.',
 'ipblocklist-no-results' => 'Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.',
 'blocklink' => 'kılit ke',
 'unblocklink' => 'bloqi hewad',
@@ -3220,8 +3220,8 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
 'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
 'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
-'months' => '{{PLURAL:$1|aşmi|$1 aşman}}',
-'years' => '{{PLURAL:$1|$1 ser|$1 seran}}',
+'months' => '{{PLURAL:$1|aşme|$1 aşmi}}',
+'years' => '{{PLURAL:$1|$1 serre|$1 serri}}',
 'ago' => 'Verdê $1',
 'just-now' => 'Hema newke',
 
@@ -3751,7 +3751,7 @@ $8',
 'monthsall' => 'pêro',
 'limitall' => 'pêro',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Adresê e-posta tesdiq ker',
 'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
 'confirmemail_text' => 'Qey gurweyayışê e-postayê wikiyi gani veror e-postayê şıma araşt bıbo.
index 76cae46..50478ae 100644 (file)
@@ -649,7 +649,7 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
 'loginlanguagelabel' => 'Rěc: $1',
 'suspicious-userlogout' => 'Twójo póžedanje za wótzjawjenim jo se wótpokazało, dokulaž zda se, až jo se pósłało pśez wobškóźony wobglědowak abo pufrowański proksy',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Njeznata zmólka w PHP-funkciji mail()',
 'user-mail-no-addy' => 'Jo se wopytało, e-mail bźez e-mailoweje adrese pósłaś',
 'user-mail-no-body' => 'Jo se wopytało, e-mail bźez teksta abo z pśekrotkim tekstom pósłaś',
@@ -1306,7 +1306,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
 'prefs-displaywatchlist' => 'Zwobraznjowańske opcije',
 'prefs-diffs' => 'Rozdźěle',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Zda se, až e-mailowa adresa jo płaśiwa',
 'email-address-validity-invalid' => 'Zapódaj płaśiwu e-mailowu adresu',
 
@@ -1890,6 +1890,12 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
 Maju bok za  bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
 
+'pageswithprop' => 'Boki z kakosću boka',
+'pageswithprop-legend' => 'Boki z kakosću boka',
+'pageswithprop-text' => 'Toś ten bok nalicyjo boki, kótarež wužywaju wěstu kakosć boka.',
+'pageswithprop-prop' => 'Mě kakosći:',
+'pageswithprop-submit' => 'Wótpósłaś',
+
 'doubleredirects' => 'Dwójne dalejpósrědnjenja',
 'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
 Kuž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.',
@@ -2078,7 +2084,7 @@ Jo nanejmjenjej głowna domena trěbna, na pśikład "*.org"<br />
 '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ś',
 
-# E-mail user
+# Email user
 '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ś',
@@ -3429,7 +3435,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 'monthsall' => 'wšykne',
 'limitall' => 'wšykne',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-mailowu adresu wobkšuśiś.',
 'confirmemail_noemail' => 'W swójich [[Special:Preferences|nastajenjach]] njejsy płaśecu e-mailowu adresu zapódał.',
 'confirmemail_text' => '{{SITENAME}} pomina, až wobkšuśijoš swóju e-mailowu adresu, nježlic až móžoš e-mailowe funkcije wužywaś. Tłocyš-lic na tłocatko, dostanjoš e-mailku, w kótarejž jo wótkaz z wobkšuśenskim gronidłom. Tłocenje na wótkaz wobkšuśijo, až twója e-mailowa adresa jo korektna.',
@@ -3830,4 +3836,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
 'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
 
+# Image rotation
+'rotate-comment' => 'Wobraz wó $1 {{PLURAL:$1|stopjeń|stopnja|stopnje|stopnjow}} ako špěra źo wobwjertnjony',
+
 );
index a0153f0..436c90a 100644 (file)
@@ -62,7 +62,7 @@ $messages = array(
 
 'underline-always' => 'Toririmo',
 'underline-never' => 'Kada',
-'underline-default' => 'Pogigihum pongoiso',
+'underline-default' => 'Kourasai pogigihum sandad',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Poyanan mongidit gaya pimato:',
@@ -147,8 +147,9 @@ $messages = array(
 'newwindow' => '(ukabai id liligaon wagu)',
 'cancel' => 'Kinsilo',
 'moredotdotdot' => 'Gumu...',
-'mypage' => 'Bolikonku',
-'mytalk' => 'Pibabarasanku',
+'morenotlisted' => 'Susuai poh ii awu nokosurat...',
+'mypage' => 'Bolikon',
+'mytalk' => 'Pogibabarasan',
 'anontalk' => 'Piboros montok diti nantadon IP',
 'navigation' => 'Popotunud',
 'and' => '&#32;om',
@@ -170,7 +171,7 @@ $messages = array(
 'vector-action-protect' => 'Tingoligai',
 'vector-action-undelete' => 'Kada pugaso',
 'vector-action-unprotect' => 'Alanai tingolig',
-'vector-simplesearch-preference' => 'Pasagao pogigihum ponontonudon pinoingkawas (Pongulit tuntuduk nopo)',
+'vector-simplesearch-preference' => 'Pasagao pogigihum bar noinsanangan (Pongulit tuntuduk nopo)',
 'vector-view-create' => 'Pomonsoi',
 'vector-view-edit' => 'Idito',
 'vector-view-history' => 'Intaai susuyan',
@@ -180,6 +181,7 @@ $messages = array(
 'namespaces' => 'Ponuratan ngaran',
 'variants' => 'Kopogisuaian',
 
+'navigation-heading' => 'Pipilion usuyon',
 'errorpagetitle' => 'Nosilopan',
 'returnto' => 'Gumuli hilo $1.',
 'tagline' => 'Mantad {{SITENAME}}',
@@ -391,7 +393,7 @@ Pongimuhatan: $2',
 'actionthrottled' => 'Momilos',
 'actionthrottledtext' => 'Pinapanau lumawan-singkarap, Nantaban ko do mingguli momonsoi miagal dilo id timpu do osikap, om nagampot nu noh gisom diti.
 Umbalan kawagu do katalib poh pipiro minit.',
-'protectedpagetext' => 'Bolikon diti notingoligan tu mangantob do pingiditan.',
+'protectedpagetext' => 'Bolikon diti notingoligan tu mangantob do pinsimbanan toi pingkukuroyon nopo.',
 'viewsourcetext' => 'Pasagaon ko do mongintong om mangadalin wowonod diti bolikon:',
 'viewyourtext' => "Milo nu do intangan om solinon ot wowonod '''niditannu''' id bolikon diti:",
 'protectedinterface' => 'Bolikon diti kiharo sinuratan pongurasan montok posusuang-suangon, om notingoligan do momiara mantad pomirumbakan.
@@ -426,6 +428,9 @@ Mongungulud di minongunsi pinopointalang do kointalangan diti: "$3".',
 
 Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.
 Birio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
+'welcomeuser' => 'Kotobian dongkorikatan, $1!',
+'welcomecreation-msg' => 'Nowonsoi noh akaunnu.
+Soroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].',
 'yourname' => 'Ngarandait:',
 'yourpassword' => 'Kaatalib:',
 'yourpasswordagain' => 'Mintaipo kaatalib:',
@@ -448,7 +453,7 @@ Birio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opu
 'gotaccount' => 'Kitakaun? $1',
 'gotaccountlink' => 'Sumuang log',
 'userlogin-resetlink' => 'Nolihuan ahal loginnu?',
-'createaccountmail' => 'Maya surat-i',
+'createaccountmail' => 'Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti',
 'createaccountreason' => 'Sabab:',
 'badretype' => 'Kaatalib pinosuang awu kopisangai.',
 'userexists' => 'Ngaranmoguno pinosuang noguno no.
@@ -523,9 +528,10 @@ Andado poh do toruhai pogulu do minsingumbal kawagu.',
 'loginlanguagelabel' => 'Woyoboros: $1',
 'suspicious-userlogout' => 'Awu naramit lumabus lognu tu pinaatod mantad pogigihum norumbak toi caching olon.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Awu nointutunan kinosilapan id don surat PHP () function',
 'user-mail-no-addy' => 'Mogumbal do papaatod surat-i tingaa o paatadan.',
+'user-mail-no-body' => 'Minogumbal koh do papaatod surat-i do ingaa suang toi nadalaan koniba.',
 
 # Change password dialog
 'resetpass' => 'Alanai kaatalib',
@@ -551,7 +557,12 @@ Naalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.',
 'passwordreset-text' => 'Gonopo poom diti do mangaramit tongosurat-i ponorou do nokomoi id akaun.',
 'passwordreset-legend' => 'Pudoliai kawagu kaatalib',
 'passwordreset-disabled' => 'Pomudolian kawagu do kaatalib kitaantob id wiki diti.',
+'passwordreset-pretext' => '{{PLURAL:$1||Posuango iso data id siriba}}',
 'passwordreset-username' => 'Ngarandait:',
+'passwordreset-domain' => 'Sumanganu:',
+'passwordreset-capture' => 'Intaai surat-i dii nowonsoi?',
+'passwordreset-capture-help' => 'Nung goritannu id kutak diti, surat-i (ii ki-kaa-talib daamot) mangan pokitanai montok dia om nogi porikoton montok momomoguno diti.',
+'passwordreset-email' => 'Porikatan surat-i:',
 'passwordreset-emailtitle' => 'Kointalangan takaun id {{SITENAME}}',
 'passwordreset-emailelement' => 'Ngaranmoguno: $1
 Kaatalib daamot: $2',
@@ -693,7 +704,7 @@ Bobolikon pinudali .css om .js momoguno do pimato tokoro, miagal pomitanan {{ns:
 'note' => "'''Pasoniba:'''",
 'previewnote' => "'''Soroho no do iti nopo nga kopongintangan toomod.'''
 Awu po moti nokogompi iri nopingalanannu!",
-'continue-editing' => 'Potilombuso do mongidit.',
+'continue-editing' => 'Ongoi doid pongiditan.',
 'previewconflict' => 'Miagal no diti pongitanan do tik id boogian kawas kutak pongiditan tik nung pilionnu do popogompi.',
 'session_fail_preview' => "'''Siou! Awu di dahai opongoh niditannu gisom no do natagakan data.'''
 Mangai umbalai kawagu.
@@ -939,6 +950,7 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
 'nextn-title' => 'Sumusuhut $1 {{PLURAL:$1|kootuson|tongokootuson}}',
 'shown-title' => 'Pokitono $1 {{PLURAL:$1|kootuson|tongokootuson}} monikid bolikon',
 'viewprevnext' => 'Intaai ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Pilion ihum-ihumon',
 'searchmenu-exists' => "'''Haro no bolikon pinungaranan do \"[[:\$1]]\" hiti id wiki.'''",
 'searchmenu-new' => "'''Pomonsoi do bolikon \"[[:\$1]]\"hiti id wiki!'''",
 'searchhelp-url' => 'Help:Susuang',
@@ -991,7 +1003,7 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 
 # Preferences page
 'preferences' => 'Pipilion',
-'mypreferences' => 'Komoisoonku',
+'mypreferences' => 'Pipilion',
 'prefs-edits' => 'Ginumu niditan:',
 'prefsnologin' => 'Amu nokolog sumuang',
 'changepassword' => 'Alanai kaatalib',
@@ -1006,6 +1018,15 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 'saveprefs' => 'Pogompio',
 'resetprefs' => 'Pugaso nalanan awu nogompi',
 'searchresultshead' => 'Ihumo',
+'servertime' => 'Timpu mamamalayan:',
+'guesstimezone' => 'Gunoo pinatantu do lalayagku',
+'timezoneregion-africa' => 'Aprika',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-antarctica' => 'Antartika',
+'timezoneregion-arctic' => 'Artik',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Karahatan Atlantik',
+'timezoneregion-australia' => 'Astaralia',
 'prefs-searchoptions' => 'Ihumo',
 'prefs-namespaces' => 'Ponuratan ngaran',
 'youremail' => 'Surat-i:',
@@ -1022,7 +1043,7 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 'prefs-displaywatchlist' => 'Pomilian pongitanan',
 'prefs-diffs' => 'Pisuaian',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Porikatan surat-i asaah',
 'email-address-validity-invalid' => 'Posuango porikatan surat-i di asaah',
 
@@ -1207,7 +1228,7 @@ Kointalangan dilo [$2 kointalangan pail] okito id siriba.',
 # Special:ListGroupRights
 'listgrouprights-members' => '(lis do kinoruhangan)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Surat-i momomoguno diti',
 
 # Watchlist
index 73f09ce..e07da4f 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 /**
- * Fallback language, used for all unspecified messages and behaviour. This
+ * Fallback language, used for all unspecified messages and behavior. This
  * is English by default, for all files other than this one.
  *
  * Do NOT set this to false in any other message file! Leave the line out to
@@ -188,7 +188,7 @@ $bookstoreList = array(
 
 /**
  * Magic words
- * Customisable syntax for wikitext and elsewhere.
+ * Customizable syntax for wikitext and elsewhere.
  *
  * IDs must be valid identifiers, they cannot contain hyphens.
  * CASE is 0 to match all case variants, 1 for case-sensitive
@@ -620,7 +620,7 @@ $messages = array(
 /*
 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 behaviour for
+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
 XHTML id it should only appear once and include characters that are legal
 XHTML id names.
@@ -660,10 +660,10 @@ XHTML id names.
 'tog-previewontop'            => 'Show preview before edit box',
 'tog-previewonfirst'          => 'Show preview on first edit',
 'tog-nocache'                 => 'Disable browser page caching',
-'tog-enotifwatchlistpages'    => 'E-mail me when a page or file on my watchlist is changed',
-'tog-enotifusertalkpages'     => 'E-mail me when my user talk page is changed',
-'tog-enotifminoredits'        => 'E-mail me also for minor edits of pages and files',
-'tog-enotifrevealaddr'        => 'Reveal my e-mail address in notification e-mails',
+'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)',
@@ -678,7 +678,7 @@ XHTML id names.
 '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 e-mails I send to other users',
+'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-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
@@ -1097,7 +1097,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'gotaccount'                 => 'Already have an account? $1.',
 'gotaccountlink'             => 'Log in',
 'userlogin-resetlink'        => 'Forgotten your login details?',
-'createaccountmail'          => 'Use a temporary random password and send it to the e-mail address specified below',
+'createaccountmail'          => 'Use a temporary random password and send it to the email address specified below',
 'createaccountreason'        => 'Reason:',
 'badretype'                  => 'The passwords you entered do not match.',
 'userexists'                 => 'Username entered already in use.
@@ -1131,7 +1131,7 @@ Please 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'             => 'E-mail new password',
+'mailmypassword'             => 'Email new password',
 'passwordremindertitle'      => 'New temporary password for {{SITENAME}}',
 'passwordremindertext'       => 'Someone (probably you, from IP address $1) requested a new
 password for {{SITENAME}} ($4). A temporary password for user
@@ -1142,13 +1142,13 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
 If someone else made this request, or if you have remembered your password,
 and you no longer wish to change it, you may ignore this message and
 continue using your old password.',
-'noemail'                    => 'There is no e-mail address recorded for user "$1".',
-'noemailcreate'              => 'You need to provide a valid e-mail address',
-'passwordsent'               => 'A new password has been sent to the e-mail address registered for "$1".
+'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".
 Please 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 e-mail has been sent to the nominated e-mail address.
-Before any other e-mail is sent to the account, you will have to follow the instructions in the e-mail, to confirm that the account is actually yours.',
+'eauthentsent'               => 'A confirmation email has been sent to the nominated email address.
+Before 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 reminder has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
 To prevent abuse, only one password reminder will be sent per {{PLURAL:$1|hour|$1 hours}}.',
 'loginstart'                 => '', # do not translate or duplicate this message to other languages
@@ -1160,19 +1160,19 @@ To prevent abuse, only one password reminder will be sent per {{PLURAL:$1|hour|$
 '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.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated'         => 'Your e-mail address was authenticated on $2 at $3.',
-'emailnotauthenticated'      => 'Your e-mail address is not yet authenticated.
-No e-mail will be sent for any of the following features.',
-'noemailprefs'               => 'Specify an e-mail address in your preferences for these features to work.',
-'emailconfirmlink'           => 'Confirm your e-mail address',
-'invalidemailaddress'        => 'The e-mail address cannot be accepted as it appears to have an invalid format.
+'emailauthenticated'         => 'Your email address was authenticated on $2 at $3.',
+'emailnotauthenticated'      => 'Your email address is not yet authenticated.
+No 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.
 Please enter a well-formatted address or empty that field.',
-'cannotchangeemail'          => 'Account e-mail addresses cannot be changed on this wiki.',
-'emaildisabled'              => 'This site cannot send e-mails.',
+'cannotchangeemail'          => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled'              => 'This site cannot send emails.',
 'accountcreated'             => 'Account created',
 'accountcreatedtext'         => 'The user account for $1 has been created.',
 'createaccount-title'        => 'Account creation for {{SITENAME}}',
-'createaccount-text'         => 'Someone created an account for your e-mail address on {{SITENAME}} ($4) named "$2", with password "$3".
+'createaccount-text'         => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
 You should log in and change your password now.
 
 You may ignore this message, if this account was created in error.',
@@ -1190,16 +1190,16 @@ Please wait before trying again.',
 * {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
 'suspicious-userlogout'      => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
 
-# E-mail sending
+# Email sending
 'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
 'php-mail-error'         => '$1', # do not translate or duplicate this message to other languages
 'php-mail-error-unknown' => "Unknown error in PHP's mail() function.",
-'user-mail-no-addy'      => 'Tried to send e-mail without an e-mail address.',
-'user-mail-no-body'      => 'Tried to send e-mail with an empty or unreasonably short body.',
+'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.',
 
 # Change password dialog
 'resetpass'                 => 'Change password',
-'resetpass_announce'        => 'You logged in with a temporary e-mailed code.
+'resetpass_announce'        => 'You logged in with a temporary emailed code.
 To finish logging in, you must set a new password here:',
 'resetpass_text'            => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
 'resetpass_header'          => 'Change account password',
@@ -1219,19 +1219,19 @@ You may have already successfully changed your password or requested a new tempo
 
 # Special:PasswordReset
 'passwordreset'                    => 'Reset password',
-'passwordreset-text'               => 'Complete this form to receive an e-mail reminder of your account details.',
+'passwordreset-text'               => 'Complete this form to receive an email reminder of your account details.',
 'passwordreset-legend'             => 'Reset password',
 'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
 'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
 'passwordreset-username'           => 'Username:',
 'passwordreset-domain'             => 'Domain:',
-'passwordreset-capture'            => 'View the resulting e-mail?',
-'passwordreset-capture-help'       => 'If you check this box, the e-mail (with the temporary password) will be shown to you as well as being sent to the user.',
-'passwordreset-email'              => 'E-mail address:',
+'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 reminder of your
 account details for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}
-associated with this e-mail address:
+associated with this email address:
 
 $2
 
@@ -1241,7 +1241,7 @@ request, or if you have remembered your original password, and you no longer
 wish to change it, you may ignore this message and continue using your old
 password.',
 'passwordreset-emailtext-user'     => 'User $1 on {{SITENAME}} requested a reminder of your account details for {{SITENAME}}
-($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this e-mail address:
+($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:
 
 $2
 
@@ -1252,21 +1252,21 @@ wish to change it, you may ignore this message and continue using your old
 password.',
 'passwordreset-emailelement'       => 'Username: $1
 Temporary password: $2',
-'passwordreset-emailsent'          => 'A reminder e-mail has been sent.',
-'passwordreset-emailsent-capture'  => 'A reminder e-mail has been sent, which is shown below.',
-'passwordreset-emailerror-capture' => 'A reminder e-mail was generated, which is shown below, but sending it to the user failed: $1',
+'passwordreset-emailsent'          => 'A reminder email has been sent.',
+'passwordreset-emailsent-capture'  => 'A reminder email has been sent, which is shown below.',
+'passwordreset-emailerror-capture' => 'A reminder email was generated, which is shown below, but sending it to the user failed: $1',
 
 # Special:ChangeEmail
-'changeemail'          => 'Change e-mail address',
+'changeemail'          => 'Change email address',
 'changeemail-summary'  => '', # do not translate or duplicate this message to other languages
-'changeemail-header'   => 'Change account e-mail address',
-'changeemail-text'     => 'Complete this form to change your e-mail address. You will need to enter your password to confirm this change.',
+'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 e-mail address:',
-'changeemail-newemail' => 'New e-mail address:',
+'changeemail-oldemail' => 'Current email address:',
+'changeemail-newemail' => 'New email address:',
 'changeemail-none'     => '(none)',
 'changeemail-password' => 'Your {{SITENAME}} password:',
-'changeemail-submit'   => 'Change e-mail',
+'changeemail-submit'   => 'Change email',
 'changeemail-cancel'   => 'Cancel',
 
 # Edit page toolbar
@@ -1320,7 +1320,7 @@ The reason given is ''$2''.
 * Intended blockee: $7
 
 You can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.
-You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
+You 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.
 Your current IP address is $3, and the block ID is #$5.
 Please 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.
@@ -1334,21 +1334,21 @@ The reason given is:
 
 You may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.
 
-Note that you may not use the "e-mail this user" feature unless you have a valid e-mail address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
+Note 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.
 
 Your current IP address is $3, and the block ID is #$5.
 Please include all above details in any queries you make.',
 'blockednoreason'                  => 'no reason given',
 'whitelistedittext'                => 'You have to $1 to edit pages.',
-'confirmedittext'                  => 'You must confirm your e-mail address before editing pages.
-Please set and validate your e-mail address through your [[Special:Preferences|user preferences]].',
+'confirmedittext'                  => 'You must confirm your email address before editing pages.
+Please 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.
 It may have been moved or deleted while you were viewing the page.',
 'loginreqtitle'                    => 'Login required',
 'loginreqlink'                     => 'log in',
 'loginreqpagetext'                 => 'You must $1 to view other pages.',
-'accmailtitle'                     => 'Password sent.',
+'accmailtitle'                     => 'Password sent',
 'accmailtext'                      => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2.
 
 The password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
@@ -1358,10 +1358,11 @@ To create the page, start typing in the box below (see the [[{{MediaWiki:Helppag
 If you are here by mistake, click your browser's '''back''' button.",
 'newarticletextanon'               => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages
 'talkpagetext'                     => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages
-'anontalkpagetext'                 => "----''This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.
+'anontalkpagetext'                 => "----
+''This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.''
 We therefore have to use the numerical IP address to identify him/her.
 Such an IP address can be shared by several users.
-If 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.''",
+If 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.
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
@@ -1773,7 +1774,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'showingresults'                   => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.",
 'showingresultsnum'                => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.",
 'showingresultsheader'             => "{{PLURAL:$5|Result '''$1''' of '''$3'''|Results '''$1 - $2''' of '''$3'''}} for '''$4'''",
-'nonefound'                        => "'''Note''': Only some namespaces are searched by default.
+'nonefound'                        => "'''Note:''' Only some namespaces are searched by default.
 Try prefixing your query with ''all:'' to search all content (including talk pages, templates, etc), or use the desired namespace as prefix.",
 'search-nonefound'                 => 'There were no results matching the query.',
 'powersearch'                      => 'Advanced search',
@@ -1840,9 +1841,9 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'prefs-watchlist-token'         => 'Watchlist token:',
 'prefs-misc'                    => 'Misc',
 'prefs-resetpass'               => 'Change password',
-'prefs-changeemail'             => 'Change e-mail address',
-'prefs-setemail'                => 'Set an e-mail address',
-'prefs-email'                   => 'E-mail options',
+'prefs-changeemail'             => 'Change email address',
+'prefs-setemail'                => 'Set an email address',
+'prefs-email'                   => 'Email options',
 'prefs-rendering'               => 'Appearance',
 'saveprefs'                     => 'Save',
 'resetprefs'                    => 'Clear unsaved changes',
@@ -1880,7 +1881,7 @@ Here's a randomly-generated value you can use: $1",
 'timezoneregion-europe'         => 'Europe',
 'timezoneregion-indian'         => 'Indian Ocean',
 'timezoneregion-pacific'        => 'Pacific Ocean',
-'allowemail'                    => 'Enable e-mail from other users',
+'allowemail'                    => 'Enable email from other users',
 'prefs-searchoptions'           => 'Search',
 'prefs-namespaces'              => 'Namespaces',
 'defaultns'                     => 'Otherwise search in these namespaces:',
@@ -1891,9 +1892,9 @@ Here's a randomly-generated value you can use: $1",
 '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.
 This cannot be undone.',
-'prefs-emailconfirm-label'      => 'E-mail confirmation:',
+'prefs-emailconfirm-label'      => 'Email confirmation:',
 'prefs-textboxsize'             => 'Size of editing window',
-'youremail'                     => 'E-mail:',
+'youremail'                     => 'Email:',
 'username'                      => '{{GENDER:$1|Username}}:',
 'uid'                           => '{{GENDER:$1|User}} ID:',
 'prefs-memberingroups'          => '{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:',
@@ -1916,13 +1917,13 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'gender-female'                 => 'Female',
 'prefs-help-gender'             => 'Optional: Used for gender-correct addressing by the software.
 This information will be public.',
-'email'                         => 'E-mail',
+'email'                         => 'Email',
 'prefs-help-realname'           => 'Real name is optional.
 If you choose to provide it, this will be used for giving you attribution for your work.',
-'prefs-help-email'              => 'E-mail 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 e-mail through a link on your user or talk page.
-Your e-mail address is not revealed when other users contact you.',
-'prefs-help-email-required'     => 'E-mail address is required.',
+'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.
+Your 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',
@@ -1938,9 +1939,9 @@ Your e-mail address is not revealed when other users contact you.',
 'prefs-displaywatchlist'        => 'Display options',
 'prefs-diffs'                   => 'Diffs',
 
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid'   => 'E-mail address appears valid',
-'email-address-validity-invalid' => 'Enter a valid e-mail address',
+# User preference: email validation using jQuery
+'email-address-validity-valid'   => 'Email address appears valid',
+'email-address-validity-invalid' => 'Enter a valid email address',
 
 # User rights
 'userrights'                     => 'User rights management',
@@ -2025,7 +2026,7 @@ Your e-mail address is not revealed when other users contact you.',
 '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 e-mail',
+'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',
@@ -2050,8 +2051,8 @@ Your e-mail address is not revealed when other users contact you.',
 '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 e-mail to other users',
-'right-passwordreset'         => 'View password reset e-mails',
+'right-sendemail'             => 'Send email to other users',
+'right-passwordreset'         => 'View password reset emails',
 
 # Special:Log/newusers
 'newuserlogpage'     => 'User creation log',
@@ -2096,7 +2097,7 @@ Your e-mail address is not revealed when other users contact you.',
 '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 e-mails',
+'action-sendemail'            => 'send emails',
 
 # Recent changes
 'nchanges'                          => '$1 {{PLURAL:$1|change|changes}}',
@@ -2810,39 +2811,39 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
 'listgrouprights-addgroup-self-all'    => 'Add all groups to own account',
 'listgrouprights-removegroup-self-all' => 'Remove all groups from own account',
 
-# E-mail user
+# Email user
 'mailnologin'              => 'No send address',
-'mailnologintext'          => 'You must be [[Special:UserLogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.',
-'emailuser'                => 'E-mail this user',
-'emailuser-title-target'   => 'E-mail this {{GENDER:$1|user}}',
-'emailuser-title-notarget' => 'E-mail user',
+'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'        => '', # do not translate or duplicate this message to other languages
-'emailpage'                => 'E-mail user',
-'emailpagetext'            => 'You can use the form below to send an e-mail message to this {{GENDER:$1|user}}.
-The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
+'emailpage'                => 'Email user',
+'emailpagetext'            => 'You can use the form below to send an email message to this {{GENDER:$1|user}}.
+The 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.',
 'usermailererror'          => 'Mail object returned error:',
-'defemailsubject'          => '{{SITENAME}} e-mail from user "$1"',
-'usermaildisabled'         => 'User e-mail disabled',
-'usermaildisabledtext'     => 'You cannot send e-mail to other users on this wiki',
-'noemailtitle'             => 'No e-mail address',
-'noemailtext'              => 'This user has not specified a valid e-mail address.',
-'nowikiemailtitle'         => 'No e-mail allowed',
-'nowikiemailtext'          => 'This user has chosen not to receive e-mail from other users.',
+'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.',
+'nowikiemailtitle'         => 'No email allowed',
+'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 e-mail to another {{SITENAME}} user',
+'email-legend'             => 'Send an email to another {{SITENAME}} user',
 'emailfrom'                => 'From:',
 'emailto'                  => 'To:',
 'emailsubject'             => 'Subject:',
 'emailmessage'             => 'Message:',
 'emailsend'                => 'Send',
-'emailccme'                => 'E-mail me a copy of my message.',
+'emailccme'                => 'Email me a copy of my message.',
 'emailccsubject'           => 'Copy of your message to $1: $2',
-'emailsent'                => 'E-mail sent',
-'emailsenttext'            => 'Your e-mail message has been sent.',
-'emailuserfooter'          => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
+'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}}.',
 
 # User Messenger
 'usermessage-summary'  => 'Leaving system message.',
@@ -2871,7 +2872,7 @@ Future changes to this page and its associated talk page will be listed there.',
 'notvisiblerev'        => 'The last revision by a different user has been deleted',
 'watchnochange'        => 'None of your watched items were edited in the time period displayed.',
 'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlheader-enotif'      => '* E-mail notification is enabled.',
+'wlheader-enotif'      => '* Email notification is enabled.',
 'wlheader-showupdated' => "* Pages that have been changed since you last visited them are shown in '''bold'''",
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
@@ -2917,7 +2918,7 @@ There will be no other notifications in case of further activity unless you visi
                         Your friendly {{SITENAME}} notification system
 
 --
-To change your e-mail notification settings, visit
+To change your email notification settings, visit
 {{canonicalurl:{{#special:Preferences}}}}
 
 To change your watchlist settings, visit
@@ -3198,12 +3199,12 @@ Fill in a specific reason below (for example, citing particular pages that were
 ** Removing content from pages
 ** Spamming links to external sites
 ** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
+** Intimidating behavior/harassment
 ** Abusing multiple accounts
 ** Unacceptable username',
 'ipb-hardblock'                   => 'Prevent logged-in users from editing from this IP address',
 'ipbcreateaccount'                => 'Prevent account creation',
-'ipbemailban'                     => 'Prevent user from sending e-mail',
+'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:',
@@ -3229,9 +3230,9 @@ See the [[Special:BlockList|block list]] to review blocks.',
 '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',
+'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',
@@ -3254,7 +3255,7 @@ See the [[Special:BlockList|block list]] to review blocks.',
 'anononlyblock'                   => 'anon. only',
 'noautoblockblock'                => 'autoblock disabled',
 'createaccountblock'              => 'account creation disabled',
-'emailblock'                      => 'e-mail 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.',
@@ -3262,7 +3263,7 @@ See the [[Special:BlockList|block list]] to review blocks.',
 'unblocklink'                     => 'unblock',
 'change-blocklink'                => 'change block',
 'contribslink'                    => 'contribs',
-'emaillink'                       => 'send e-mail',
+'emaillink'                       => 'send email',
 'autoblocker'                     => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
 The reason given for $1\'s block is "\'\'$2\'\'"',
 'blocklogpage'                    => 'Block log',
@@ -3279,7 +3280,7 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
 'block-log-flags-anononly'        => 'anonymous users only',
 'block-log-flags-nocreate'        => 'account creation disabled',
 'block-log-flags-noautoblock'     => 'autoblock disabled',
-'block-log-flags-noemail'         => 'e-mail 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',
@@ -3463,7 +3464,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
 Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB'     => "This page cannot be used because '''\$wgUseDatabaseMessages''' has been disabled.",
 'allmessages-filter-legend'     => 'Filter',
-'allmessages-filter'            => 'Filter by customisation state:',
+'allmessages-filter'            => 'Filter by customization state:',
 'allmessages-filter-unmodified' => 'Unmodified',
 'allmessages-filter-all'        => 'All',
 'allmessages-filter-modified'   => 'Modified',
@@ -3669,7 +3670,7 @@ You can view its source',
 '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 e-mail to 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',
@@ -3854,7 +3855,7 @@ $1',
 'nextdiff'     => 'Newer edit →',
 
 # Media information
-'mediawarning'                => "'''Warning''': This file type may contain malicious code.
+'mediawarning'                => "'''Warning:''' This file type may contain malicious code.
 By executing it, your system may be compromised.",
 'imagemaxsize'                => "Image size limit:<br />''(for file description pages)''",
 'thumbsize'                   => 'Thumbnail size:',
@@ -4411,7 +4412,7 @@ $8', # only translate this message to other languages if you have to change it
 'exif-iimcategory-evn' => 'Environment',
 'exif-iimcategory-hth' => 'Health',
 'exif-iimcategory-hum' => 'Human interest',
-'exif-iimcategory-lab' => 'Labour',
+'exif-iimcategory-lab' => 'Labor',
 'exif-iimcategory-lif' => 'Lifestyle and leisure',
 'exif-iimcategory-pol' => 'Politics',
 'exif-iimcategory-rel' => 'Religion and belief',
@@ -4436,75 +4437,75 @@ $8', # only translate this message to other languages if you have to change it
 'monthsall'     => 'all',
 'limitall'      => 'all',
 
-# E-mail address confirmation
-'confirmemail'              => 'Confirm e-mail address',
-'confirmemail_noemail'      => 'You do not have a valid e-mail address set in your [[Special:Preferences|user preferences]].',
-'confirmemail_text'         => '{{SITENAME}} requires that you validate your e-mail address before using e-mail features.
+# Email address confirmation
+'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.
 Activate the button below to send a confirmation mail to your address.
 The mail will include a link containing a code;
-load the link in your browser to confirm that your e-mail address is valid.',
-'confirmemail_pending'      => 'A confirmation code has already been e-mailed to you;
+load the link in your browser to confirm that your email address is valid.',
+'confirmemail_pending'      => 'A confirmation code has already been emailed to you;
 if 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 e-mail sent.',
-'confirmemail_oncreate'     => 'A confirmation code was sent to your e-mail address.
-This code is not required to log in, but you will need to provide it before enabling any e-mail-based features in the wiki.',
+'confirmemail_sent'         => 'Confirmation email sent.',
+'confirmemail_oncreate'     => 'A confirmation code was sent to your email address.
+This 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.
-Please check your e-mail address for invalid characters.
+Please check your email address for invalid characters.
 
 Mailer returned: $1',
 'confirmemail_invalid'      => 'Invalid confirmation code.
 The code may have expired.',
-'confirmemail_needlogin'    => 'You need to $1 to confirm your e-mail address.',
-'confirmemail_success'      => 'Your e-mail address has been confirmed.
+'confirmemail_needlogin'    => 'You need to $1 to confirm your email address.',
+'confirmemail_success'      => 'Your email address has been confirmed.
 You may now [[Special:UserLogin|log in]] and enjoy the wiki.',
-'confirmemail_loggedin'     => 'Your e-mail address has now been confirmed.',
+'confirmemail_loggedin'     => 'Your email address has now been confirmed.',
 'confirmemail_error'        => 'Something went wrong saving your confirmation.',
-'confirmemail_subject'      => '{{SITENAME}} e-mail address confirmation',
+'confirmemail_subject'      => '{{SITENAME}} email address confirmation',
 'confirmemail_body'         => 'Someone, probably you, from IP address $1,
-has registered an account "$2" with this e-mail address on {{SITENAME}}.
+has registered an account "$2" with this email address on {{SITENAME}}.
 
 To confirm that this account really does belong to you and activate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
 
 $3
 
 If you did *not* register the account, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
 
 $5
 
 This confirmation code will expire at $4.',
 'confirmemail_body_changed' => 'Someone, probably you, from IP address $1,
-has changed the e-mail address of the account "$2" to this address on {{SITENAME}}.
+has changed the email address of the account "$2" to this address on {{SITENAME}}.
 
 To confirm that this account really does belong to you and reactivate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
 
 $3
 
 If the account does *not* belong to you, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
 
 $5
 
 This confirmation code will expire at $4.',
 'confirmemail_body_set'     => 'Someone, probably you, from IP address $1,
-has set the e-mail address of the account "$2" to this address on {{SITENAME}}.
+has set the email address of the account "$2" to this address on {{SITENAME}}.
 
 To confirm that this account really does belong to you and reactivate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
 
 $3
 
 If the account does *not* belong to you, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
 
 $5
 
 This confirmation code will expire at $4.',
-'confirmemail_invalidated'  => 'E-mail address confirmation canceled',
-'invalidateemail'           => 'Cancel e-mail confirmation',
+'confirmemail_invalidated'  => 'Email address confirmation canceled',
+'invalidateemail'           => 'Cancel email confirmation',
 
 # Scary transclusion
 'scarytranscludedisabled'          => '[Interwiki transcluding is disabled]',
@@ -4513,7 +4514,7 @@ This confirmation code will expire at $4.',
 'scarytranscludetoolong'           => '[URL is too long]',
 
 # Delete conflict
-'deletedwhileediting'      => "'''Warning''': This page was deleted after you started editing!",
+'deletedwhileediting'      => "'''Warning:''' 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:
 : ''$2''
 Please confirm that you really want to recreate this page.",
@@ -4605,15 +4606,15 @@ Please confirm that you really want to recreate this page.",
 'size-yottabytes' => '$1 YB', # only translate this message to other languages if you have to change it
 
 # Bitrate units
-'bitrate-bits'      => '$1bps', # only translate this message to other languages if you have to change it
-'bitrate-kilobits'  => '$1kbps', # only translate this message to other languages if you have to change it
-'bitrate-megabits'  => '$1Mbps', # only translate this message to other languages if you have to change it
-'bitrate-gigabits'  => '$1Gbps', # only translate this message to other languages if you have to change it
-'bitrate-terabits'  => '$1Tbps', # only translate this message to other languages if you have to change it
-'bitrate-petabits'  => '$1Pbps', # only translate this message to other languages if you have to change it
-'bitrate-exabits'   => '$1Ebps', # only translate this message to other languages if you have to change it
-'bitrate-zetabits'  => '$1Zbps', # only translate this message to other languages if you have to change it
-'bitrate-yottabits' => '$1Ybps', # only translate this message to other languages if you have to change it
+'bitrate-bits'      => '$1 bps', # only translate this message to other languages if you have to change it
+'bitrate-kilobits'  => '$1 kbps', # only translate this message to other languages if you have to change it
+'bitrate-megabits'  => '$1 Mbps', # only translate this message to other languages if you have to change it
+'bitrate-gigabits'  => '$1 Gbps', # only translate this message to other languages if you have to change it
+'bitrate-terabits'  => '$1 Tbps', # only translate this message to other languages if you have to change it
+'bitrate-petabits'  => '$1 Pbps', # only translate this message to other languages if you have to change it
+'bitrate-exabits'   => '$1 Ebps', # only translate this message to other languages if you have to change it
+'bitrate-zetabits'  => '$1 Zbps', # only translate this message to other languages if you have to change it
+'bitrate-yottabits' => '$1 Ybps', # only translate this message to other languages if you have to change it
 
 # Live preview
 'livepreview-loading' => 'Loading...',
@@ -4896,7 +4897,7 @@ This site is experiencing technical difficulties.',
 'logentry-newusers-newusers'          => 'User account $1 was created',
 'logentry-newusers-create'            => 'User account $1 was created',
 'logentry-newusers-create2'           => 'User account $3 was created by $1',
-'logentry-newusers-byemail'           => 'User account $3 was created by $1 and password was sent by e-mail',
+'logentry-newusers-byemail'           => 'User account $3 was created by $1 and password was sent by email',
 'logentry-newusers-autocreate'        => 'User account $1 was created automatically',
 'logentry-rights-rights'              => '$1 changed group membership for $3 from $4 to $5',
 'logentry-rights-rights-legacy'       => '$1 changed group membership for $3',
@@ -5001,4 +5002,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+#Rotation
+'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
+
 );
index a0f8627..9afacc1 100644 (file)
@@ -15,6 +15,7 @@
  * @author ArnoLagrange
  * @author Blahma
  * @author Castelobranco
+ * @author Eliovir
  * @author Iketsi
  * @author Jens Liebenau
  * @author Kaganer
@@ -819,7 +820,7 @@ Bonvolu ĝisatendi antaŭ retrovi.',
 'loginlanguagelabel' => 'Lingvo: $1',
 'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiganta proksima servilo.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
 'user-mail-no-addy' => 'Provis sendi retpoŝton sen retpoŝtadreso.',
 
@@ -1504,7 +1505,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'prefs-displaywatchlist' => 'Montraj opcioj',
 'prefs-diffs' => 'Diferencoj',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ŝajnas ke la retpoŝtadreso estas valida',
 'email-address-validity-invalid' => 'Tajpu validan retpoŝtadreson',
 
@@ -1685,7 +1686,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'hist' => 'historio',
 'hide' => 'Kaŝi',
 'show' => 'Montri',
-'minoreditletter' => 'E',
+'minoreditletter' => 'e',
 'newpageletter' => 'N',
 'boteditletter' => 'R',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]',
@@ -2083,6 +2084,9 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 Ili devus anstataŭe alligi la ĝustan temon.<br />
 Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop-prop' => 'Nomo de la atributo:',
+'pageswithprop-submit' => 'Ek',
+
 'doubleredirects' => 'Duoblaj alidirektadoj',
 'doubleredirectstext' => 'Ĉi tiu paĝo montras paĝojn kiuj alidirektas al aliaj alidirektiloj.
 Ĉiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu ĝenerale montras la "veran" celpaĝon, kiu celu la unuan alidirektadon.
@@ -2275,7 +2279,7 @@ Estas [[{{MediaWiki:Listgrouprights-helppage}}|aldona informo]] pri individuaj r
 'listgrouprights-addgroup-self-all' => 'Povas aldoni ĉiujn grupojn al propra konto',
 'listgrouprights-removegroup-self-all' => 'Povas forigi ĉiujn grupojn de propra konto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Neniu alsendota adreso',
 'mailnologintext' => 'Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoŝtadreson en viaj [[Special:Preferences|preferoj]] por retpoŝti al aliaj uzantoj.',
 'emailuser' => 'Retpoŝti ĉi tiun uzanton',
@@ -3675,7 +3679,7 @@ Aliaj estos kaŝitaj defaŭlte.
 'monthsall' => 'ĉiuj',
 'limitall' => 'ĉiuj',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Konfirmi retadreson',
 'confirmemail_noemail' => 'Vi ne havas validan retpoŝtan adreson notitan en viaj [[Special:Preferences|Preferoj]].',
 'confirmemail_text' => 'Ĉi tiu vikio postulas ke vi validigu vian retadreson antaŭ ol uzadi la retmesaĝpreferojn. Bonvolu alklaki la suban butonon por sendi konfirmesaĝon al via adreso. La mesaĝo entenos ligilon kun kodo; bonvolu alŝuti la ligilon en vian foliumilon por konfirmi ke via retadreso validas.',
index 42bd97b..b8d1fc9 100644 (file)
@@ -658,7 +658,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Página',
-'nstab-user' => 'Usuario',
+'nstab-user' => 'Página de usuario',
 'nstab-media' => 'Media',
 'nstab-special' => 'Página especial',
 'nstab-project' => 'Página del proyecto',
@@ -741,7 +741,7 @@ Consulta: $2',
 '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.
-Para agregar o cambiar las traducciones para todos los wikis, por favor use [//translatewiki.net/translatewiki.net], el proyecto de localización de MediaWiki.',
+Para 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. 
 Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. 
 Para añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
@@ -867,7 +867,7 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 '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é.',
 
-# E-mail sending
+# Email sending
 '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.',
@@ -1552,7 +1552,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'prefs-displaywatchlist' => 'Opciones de visualización',
 'prefs-diffs' => 'Diferencias',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
 'email-address-validity-invalid' => 'Introduce una dirección de correo válida',
 
@@ -2335,7 +2335,7 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
 'listgrouprights-addgroup-self-all' => 'Agregar todos los grupos a tu propia cuenta',
 'listgrouprights-removegroup-self-all' => 'Eliminar todos los grupos de tu propia cuenta',
 
-# E-mail user
+# Email user
 '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}}',
@@ -2366,7 +2366,7 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'emailccsubject' => 'Copia de tu mensaje a $1: $2',
 'emailsent' => 'Correo electrónico enviado',
 'emailsenttext' => 'Se ha enviado tu mensaje de correo electrónico.',
-'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar correo electrónico a este usuario» en {{SITENAME}}.',
+'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar un correo electrónico a este usuario» en {{SITENAME}}.',
 
 # User Messenger
 'usermessage-summary' => 'Dejando un mensaje de sistema.',
@@ -3738,7 +3738,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'monthsall' => 'todos',
 'limitall' => 'Todos',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar dirección de correo electrónico',
 'confirmemail_noemail' => 'No tienes una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]].',
 'confirmemail_text' => '{{SITENAME}} requiere la validación de tu dirección de correo antes de usarlo. Pulsa el botón de abajo para enviar la confirmación.
index d914a18..094e966 100644 (file)
@@ -434,7 +434,7 @@ $messages = array(
 'qbbrowse' => 'Sirvi',
 'qbedit' => 'Redigeeri',
 'qbpageoptions' => 'Lehekülje suvandid',
-'qbmyoptions' => 'Minu suvandid',
+'qbmyoptions' => 'Minu leheküljed',
 'qbspecialpages' => 'Erileheküljed',
 'faq' => 'KKK',
 'faqpage' => 'Project:KKK',
@@ -523,7 +523,7 @@ $1',
 'aboutsite' => '{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed',
 'aboutpage' => 'Project:Tiitelandmed',
 'copyright' => 'Kogu tekst on kasutatav litsentsi $1 tingimustel.',
-'copyrightpage' => '{{ns:project}}:Autoriõigused',
+'copyrightpage' => '{{ns:project}}:Autoriõigus',
 'currentevents' => 'Sündmused',
 'currentevents-url' => 'Project:Sündmused',
 'disclaimers' => 'Hoiatused',
@@ -787,7 +787,7 @@ Palun pea nüüd pisut vahet.',
 'loginlanguagelabel' => 'Keel: $1',
 'suspicious-userlogout' => 'Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
 'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
 
@@ -1458,7 +1458,7 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'prefs-displaywatchlist' => 'Kuvasätted',
 'prefs-diffs' => 'Erinevused',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sobiv e-posti aadress',
 'email-address-validity-invalid' => 'Sisesta sobiv e-posti aadress.',
 
@@ -2027,6 +2027,12 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
 Võimalik, et sellised lingid peaks viitama sobivamatele lehekülgedele.
 Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab sõnum [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Leheatribuudiga leheküljed',
+'pageswithprop-legend' => 'Leheatribuudiga leheküljed',
+'pageswithprop-text' => 'Sellel leheküljel on loetletud mõnd leheatribuuti kasutavad leheküljed.',
+'pageswithprop-prop' => 'Atribuudi nimi:',
+'pageswithprop-submit' => 'Mine',
+
 'doubleredirects' => 'Kahekordsed ümbersuunamised',
 'doubleredirectstext' => 'Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.
 Igal 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.
@@ -2218,7 +2224,7 @@ Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata proto
 'listgrouprights-addgroup-self-all' => 'Oma konto kõigisse rühmadesse lisada',
 'listgrouprights-removegroup-self-all' => 'Eemaldada ennast kõigist rühmadest',
 
-# E-mail user
+# Email user
 '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',
@@ -2283,7 +2289,7 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
 'iteminvalidname' => "Probleem üksusega '$1'. Selle nimes on viga.",
 'wlnote' => "Allpool on {{PLURAL:$1|viimane muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|tunni|'''$2''' tunni}} jooksul seisuga $3, $4.",
 'wlshowlast' => 'Näita viimast $1 tundi $2 päeva. $3',
-'watchlist-options' => 'Jälgimisloendi võimalused',
+'watchlist-options' => 'Jälgimisloendi seaded',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Jälgimine...',
@@ -2348,7 +2354,7 @@ Tagasiside ja abi:
 'confirmdeletetext' => 'Sa oled andmebaasist kustutamas lehekülge koos kogu tema ajalooga.
 Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et sinu tegevus on kooskõlas siinse [[{{MediaWiki:Policy-url}}|sisekorraga]].',
 'actioncomplete' => 'Toiming sooritatud',
-'actionfailed' => 'Tegevus ebaõnnestus',
+'actionfailed' => 'Toiming ebaõnnestus',
 'deletedtext' => '"$1" on kustutatud. Kustutatud leheküljed on ära toodud eraldi loendis ($2).',
 'dellogpage' => 'Kustutamislogi',
 'dellogpagetext' => 'Allpool on esitatud nimekiri viimastest kustutamistest.
@@ -2831,7 +2837,7 @@ Viimasel juhul saab kasutada ka linki, näiteks lehekülje "[[{{MediaWiki:Mainpa
 # Namespace 8 related
 'allmessages' => 'Kõik süsteemi sõnumid',
 'allmessagesname' => 'Nimi',
-'allmessagesdefault' => 'Vaikimisi tekst',
+'allmessagesdefault' => 'Vaiketekst',
 'allmessagescurrent' => 'Praegune tekst',
 'allmessagestext' => 'See on loend kõikidest olemasolevatest süsteemisõnumitest MediaWiki nimeruumis.
 Kui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [//www.mediawiki.org/wiki/Localisation MediaWiki lokaliseerimine] ja [//translatewiki.net translatewiki.net].',
@@ -2932,9 +2938,9 @@ Palun ürita uuesti.',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sinu kasutajaleht',
 'tooltip-pt-anonuserpage' => 'Sinu IP-aadressi kasutajalehekülg',
-'tooltip-pt-mytalk' => 'Minu aruteluleht',
+'tooltip-pt-mytalk' => 'Sinu arutelulehekülg',
 'tooltip-pt-anontalk' => 'Arutelu sellelt IP-aadressilt tehtud muudatuste kohta',
-'tooltip-pt-preferences' => 'Minu eelistused',
+'tooltip-pt-preferences' => 'Sinu eelistused',
 'tooltip-pt-watchlist' => 'Lehekülgede loend, mida jälgid muudatuste osas',
 'tooltip-pt-mycontris' => 'Sinu kaastööde loend',
 'tooltip-pt-login' => 'Me julgustame teid sisse logima, kuid see pole kohustuslik.',
@@ -2950,7 +2956,7 @@ Saad vaadata selle lähteteksti.',
 'tooltip-ca-unprotect' => 'Muuda selle lehekülje kaitset',
 'tooltip-ca-delete' => 'Kustuta see lehekülg',
 'tooltip-ca-undelete' => 'Taasta enne lehekülje kustutamist tehtud muudatused',
-'tooltip-ca-move' => 'Teisalda see lehekülg teise nime alla.',
+'tooltip-ca-move' => 'Teisalda see lehekülg',
 'tooltip-ca-watch' => 'Lisa see lehekülg oma jälgimisloendisse',
 'tooltip-ca-unwatch' => 'Eemalda see lehekülg oma jälgimisloendist',
 'tooltip-search' => 'Otsi vikist',
@@ -3164,6 +3170,8 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
 'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
 'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
 'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'months' => '{{PLURAL:$1|Üks kuu|$1 kuud}}',
+'years' => '{{PLURAL:$1|Üks aasta|$1 aastat}}',
 'ago' => '$1 tagasi',
 'just-now' => 'just nüüd',
 
@@ -3570,7 +3578,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'monthsall' => 'kõik',
 'limitall' => 'iga',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-posti aadressi kinnitamine',
 'confirmemail_noemail' => 'Sul pole [[Special:Preferences|eelistuste leheküljel]] e-posti aadressi määranud.',
 'confirmemail_text' => 'Enne kui saad e-postiga seotud teenuseid kasutada, pead oma e-posti aadressi õigsust kinnitama. Allpool olevat nuppu klõpsates saadetakse sulle e-posti teel kinnituskood. Aadressi kinnitamiseks klõpsa e-kirjas olevat linki.',
@@ -3935,6 +3943,7 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-ok-but-empty' => 'Sisetõrge: Server ei vasta.',
 'api-error-overwrite' => 'Olemasolevate failide ülekirjutamine pole lubatud.',
 'api-error-stashfailed' => 'Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.',
+'api-error-publishfailed' => 'Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.',
 'api-error-timeout' => 'Server ei vastanud oodatud aja sees.',
 'api-error-unclassified' => 'Ilmnes teadmata tõrge.',
 'api-error-unknown-code' => 'Teadmata tõrge: "$1"',
@@ -3955,4 +3964,7 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'duration-centuries' => '$1 {{PLURAL:$1|sajandi}}',
 'duration-millennia' => '$1 {{PLURAL:$1|aastatuhande}}',
 
+# Image rotation
+'rotate-comment' => 'Pilti pööratud $1 {{PLURAL:$1|kraad|kraadi}} päripäeva',
+
 );
index e7fbd65..70329a1 100644 (file)
@@ -244,9 +244,9 @@ $messages = array(
 'hidden-category-category' => 'Kategoria ezkutuak',
 'category-subcat-count' => '{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}',
 'category-subcat-count-limited' => 'Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.',
-'category-article-count' => '{{PLURAL:$2|Kategoria honek honako orrialdea baino ez du.|Honako {{PLURAL:$1|orrialdea kategoria honetan dago|$1 orrialdeak kategoria hauetan daude}}, guztira dauden $2 (e)tik.}}',
+'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}. Guztira $2 orri dira kategoria honetan.}}',
 'category-article-count-limited' => 'Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago.|$1 orri hauek kategoria honetan daude.}}',
-'category-file-count' => '{{PLURAL:$2|Kategoria honek fitxategi hau baino ez du.|Honako {{PLURAL:$1|fitxategia kategoria honetan dago|$1 fitxategiak kategoria honetan daude}} guztira dauden $2 (e)tik.}}',
+'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}. Guztira $2 fitxategi dira kategoria honetan.}}',
 'category-file-count-limited' => 'Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago.|$1 fitxategiak kategoria honetan daude.}}',
 'listingcontinuesabbrev' => 'jarr.',
 'index-category' => 'Indexatutako orrialdeak',
@@ -310,10 +310,10 @@ $messages = array(
 'view' => 'Ikusi',
 'edit' => 'Aldatu',
 'create' => 'Sortu',
-'editthispage' => 'Orrialde hau aldatu',
+'editthispage' => 'Orri hau aldatu',
 'create-this-page' => 'Orrialde hau sortu',
 'delete' => 'Ezabatu',
-'deletethispage' => 'Orrialde hau ezabatu',
+'deletethispage' => 'Ezabatu orri hau',
 'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
 'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
 'protect' => 'Babestu',
@@ -625,7 +625,7 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
 '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.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHPren mail() funtzioan arazo ezezagun bat egon da.',
 
 # Change password dialog
@@ -665,8 +665,8 @@ Behin-behineko pasahitza: $2',
 'changeemail-cancel' => 'Utzi',
 
 # Edit page toolbar
-'bold_sample' => 'Testu beltza',
-'bold_tip' => 'Testu beltza',
+'bold_sample' => 'Letra lodiko testua',
+'bold_tip' => 'Letra lodiko testua',
 'italic_sample' => 'Testu etzana',
 'italic_tip' => 'Testu etzana',
 'link_sample' => 'Loturaren izenburua',
@@ -805,12 +805,12 @@ Orrialdea gordetzeko erabakitzen duzun unean goiko koadroko edukia '''bakarrik''
 'nonunicodebrowser' => "'''OHARRA: Zure nabigatzailea ez dator Unicode arauarekin bat. Artikuluak modu seguruan aldatu ahal izateko beste sistema bat gaitu da: ASCII ez diren karaktereak kode hamaseitar bezala agertuko dira aldaketa koadroan.'''",
 'editingold' => "'''KONTUZ: Artikulu honen bertsio zahar bat aldatzen ari zara. Gorde egiten baduzu, azkenengo aldaketa baino lehenagoko aldakuntzak, ezabatuak izango dira.'''",
 'yourdiff' => 'Ezberdintasunak',
-'copyrightwarning' => "Kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak $2 baldintzapean argitaratzen direla (ikus $1 informazio gehiagorako). Zure testua banatzeko baldintza hauekin ados ez bazaude, ez ezazu bidali.<br />
-Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara.
-'''EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!'''",
-'copyrightwarning2' => "Mesedez, kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak besteek aldatu edo ezabatu ditzaketela. Ez baduzu besteek aldaketak egitea nahi, ez ezazu bidali.<br />
-Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara (ikus $1 informazio gehiagorako).
-'''EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!'''",
+'copyrightwarning' => "Kontuan izan ezazu {{SITENAME}} webgunean egindako ekarpen guztiak $2 lizentziaren pean argitaratzen direla (xehetasunetarako, ikus $1). Zuk idatzitakoa libreki aldatua eta banatua izatea nahi ez baduzu, ez ezazu hemen jarri.<br />
+Era berean, hitzematen ari zara hau zuk zeuk idatzia dela, edo jabari publikotik nahiz askea den beste ituri batetik kopiatu duzula.
+'''Ez erabili copyright eskubideek babestutako lanik, baimenik gabe!'''",
+'copyrightwarning2' => "Mesedez, kontuan izan ezazu {{SITENAME}} webgunean egindako ekarpen guztiak beste erabiltzaileek aldatu edo ezabatu ditzaketela. Zuk idatzitakoa libreki aldatua izatea nahi ez baduzu, ez ezazu hemen jarri.<br />
+Era berean, hitzematen ari zara hau zuk zeuk idatzia dela, edo jabari publikotik nahiz askea den beste ituri batetik kopiatu duzula (xehetasunetarako, ikus $1).
+'''Ez erabili copyright eskubideek babestutako lanik, baimenik gabe!'''",
 'longpageerror' => "'''Errorea: Bidali duzun testuak {{PLURAL:$1|kilobyte 1eko|$1 kilobyteko}} luzera du, eta {{PLURAL:$2|kilobyte 1eko|$2 kilobyteko}} maximoa baino luzeagoa da.'''
 Ezin da gorde.",
 'readonlywarning' => "'''Oharra: Datu-basea blokeatu egin da mantenu lanak burutzeko, beraz ezingo dituzu orain zure aldaketak gorde.'''
@@ -837,7 +837,7 @@ Azken erregistroko sarrera ematen da azpian erreferentzia gisa:",
 'sectioneditnotsupported-text' => 'Ezin dira atalak aldatu orrialde honetan.',
 'permissionserrors' => 'Baimen erroreak',
 'permissionserrorstext' => 'Ez duzu hori egiteko baimenik, hurrengo {{PLURAL:$1|arrazoia dela eta|arrazoiak direla eta}}:',
-'permissionserrorstext-withaction' => 'Ez duzu $2 egiteko eskumenik, honako {{PLURAL:$1|arrazoia dela eta:|arrazoiak direla eta:}}',
+'permissionserrorstext-withaction' => 'Ezin duzu $2, ondorengo {{PLURAL:$1|arrazoi hau dela eta:|arrazoi hauek direla eta:}}',
 'recreate-moveddeleted-warn' => "'''Oharra: Lehenago ezabatutako orri bat berriz sortzen ari zara.'''
 
 Pentsatu ea orri hau editatzen jarraitzeak zentzurik baduen.
@@ -879,7 +879,7 @@ Eztabaidak aipatu gabe utzi dira.',
 Mesedez beheko alderaketa egiaztatu, egin nahi duzuna hori dela frogatzeko, eta ondoren azpiko aldaketak gorde, aldaketa desegiten amaitzeko.',
 'undo-failure' => 'Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.',
 'undo-norev' => 'Aldaketa ezin da desegin ez delako existitzen edo ezabatu zutelako.',
-'undo-summary' => '[[Special:Contributions/$2|$2(r)en]] $1 berrikuspena desegin da ([[User talk:$2|Eztabaida]])',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|eztabaida]]) wikilariaren $1 berrikuspena desegin da',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ezin izan da kontua sortu',
@@ -1004,10 +1004,10 @@ Ezin duzu atzitu.',
 'revdelete-concurrent-change' => 'Errorea, $1 $2 data duen elementua aldatzean: badirudi haren egoera aldatu duela nor edo nork, zu aldatzen saiatzen ari zinela.
 Begira itzazu erregistroak.',
 'revdelete-reason-dropdown' => '*Ezabatzeko ohiko arrazoiak
-** Egile eskubideen urraketa
+** Egile eskubideak urratzea
 ** Informazio pertsonal edo iruzkin desegokia
 ** Lankide izen desegokia
-** Iraingarria izan daitekeen informazioa',
+** Kalumnia edo iraintzat jo daiteke',
 'revdelete-otherreason' => 'Bestelako arrazoia:',
 'revdelete-reasonotherlist' => 'Beste arrazoi bat',
 'revdelete-edit-reasonlist' => 'Ezabaketa arrazoiak aldatu',
@@ -1240,7 +1240,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'prefs-displaywatchlist' => 'Aukerak erakutsi',
 'prefs-diffs' => 'Ezberdintasunak',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-posta helbidea zuzena dela dirudi',
 'email-address-validity-invalid' => 'E-posta helbide zuzena idatzi',
 
@@ -1360,13 +1360,13 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'orrialde hau irakurri',
-'action-edit' => 'orrialde hau aldatu',
+'action-edit' => 'orri hau aldatu',
 'action-createpage' => 'orrialdeak sortu',
 'action-createtalk' => 'eztabaida orrialdeak sortu',
 'action-createaccount' => 'lankide hau sortu',
 'action-minoredit' => 'aldaketa hau txiki gisa markatu',
-'action-move' => 'orrialde hau mugitu',
-'action-move-subpages' => 'orrialde hau eta bere azpiorrialdeak mugitu',
+'action-move' => 'orri hau mugitu',
+'action-move-subpages' => 'orri hau eta haren azpiorriak mugitu',
 'action-move-rootuserpages' => 'mugitu lankidearen oinarri orrialdeak',
 'action-movefile' => 'fitxategi hau mugitu',
 'action-upload' => 'fitxategi hau igo',
@@ -1398,7 +1398,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'nchanges' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}',
 'recentchanges' => 'Aldaketa berriak',
 'recentchanges-legend' => 'Azken aldaketen aukerak',
-'recentchanges-summary' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
+'recentchanges-summary' => 'Orri honetan ikuska ditzakezu wiki honetan egindako azken aldaketak.',
 'recentchanges-feed-description' => 'Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.',
 'recentchanges-label-newpage' => 'Aldaketa honek orrialde berri bat sortu du',
 'recentchanges-label-minor' => 'Hau aldaketa txikia da',
@@ -1789,17 +1789,17 @@ Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspag
 'listusers-editsonly' => 'Aldaketak egin dituzten erabiltzaileak soilik erakutsi',
 'listusers-creationsort' => 'Sorrera dataren arabera sailkatu',
 'usereditcount' => '{{PLURAL:$1|aldaketa $1|$1 aldaketa}}',
-'usercreated' => '$2-(e)tan $1-(a)n {{GENDER:$3|sortua}},',
+'usercreated' => '{{GENDER:$3|Sortze data}}: $1, $2',
 'newpages' => 'Orrialde berriak',
 'newpages-username' => 'Erabiltzaile izena:',
 'ancientpages' => 'Orrialde zaharrenak',
 'move' => 'Mugitu',
-'movethispage' => 'Orrialde hau mugitu',
+'movethispage' => 'Orri hau mugitu',
 'unusedimagestext' => 'Ondorengo fitxategiak existizen dira baina ez daude inongo orrietatik lotuta.
 Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan dezaketela irudira, eta kasu horretan ez lirateke hemengo zerrendetan azalduko.',
 'unusedcategoriestext' => 'Hurrengo kategoria orrialde guztiak datu-basean existitzen dira, baina ez du inongo orrialde edo kategoriak erabiltzen.',
 'notargettitle' => 'Helburu orrialderik ez',
-'notargettext' => 'Ez duzu eragiketa hau burutzeko helburu orrialde edo erabiltzaile bat zehaztu.',
+'notargettext' => 'Ez duzu zehaztu eragiketa hau zein orri edo erabiltzaileri egin behar zaion.',
 'nopagetitle' => 'Ez dago horrelako helburu orrialderik',
 'nopagetext' => 'Zuk ezarri duzun helburuko orrialdea ez da existitzen.',
 'pager-newer-n' => '{{PLURAL:$1|berriago den 1|berriagoak diren $1}}',
@@ -1870,7 +1870,7 @@ Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// h
 'linksearch-error' => 'Komodinak izenaren hasieran bakarrik agertu beharko lirateke.',
 
 # Special:ListUsers
-'listusersfrom' => 'Hemendik aurrerako erabiltzaileak bistaratu:',
+'listusersfrom' => 'Honela hasten diren erabiltzaileak bistaratu:',
 'listusers-submit' => 'Erakutsi',
 'listusers-noresult' => 'Ez da erabiltzailerik aurkitu.',
 'listusers-blocked' => '(blokeatua)',
@@ -1900,7 +1900,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'listgrouprights-addgroup-self-all' => 'Talde guztiak norbere kontura gehitu',
 'listgrouprights-removegroup-self-all' => 'Talde guztiak norbere kontutik ezabatu',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Bidalketa helbiderik ez',
 'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
 'emailuser' => 'Erabiltzaile honi e-posta bidali',
@@ -2273,7 +2273,9 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.',
 'blocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist-legend' => 'Blokeatutako erabiltzaile bat bilatu',
+'blocklist-timestamp' => 'Eguna eta ordua',
 'blocklist-target' => 'Helburua',
+'blocklist-by' => 'Blokeoa ezarri duen administratzailea',
 'blocklist-reason' => 'Arrazoia',
 'ipblocklist-submit' => 'Bilatu',
 'ipblocklist-localblock' => 'Tokiko blokeoa',
@@ -2298,7 +2300,7 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.',
 Blokeo erregistroa ematen da azpian erreferentziarako:',
 'blocklog-showsuppresslog' => 'Lankide hau aurretik blokeatua eta ezkutatua izan da.
 Erregistroa ematen da azpian erreferentziarako:',
-'blocklogentry' => '"[[$1]]" wikilariari blokeoa ezarri zaio. Blokeoaldia: $2 $3',
+'blocklogentry' => 'wikilariak [[$1]] erabiltzailea blokeatu du. Blokeoaldia: $2 $3',
 'reblock-logentry' => '[[$1]] wikilariari blokeoaldia aldatu diogu. Blokeoaldi berria: $2 $3',
 'blocklogtext' => 'Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau. 
 Automatikoki blokeatutako IP helbideak ez dira zerrendatzen. 
@@ -3118,7 +3120,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'monthsall' => 'guztiak',
 'limitall' => 'guztiak',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-posta helbidea egiaztatu',
 'confirmemail_noemail' => 'Ez daukazu e-posta helbiderik zehaztuta zure [[Special:Preferences|hobespenetan]].',
 'confirmemail_text' => 'Wiki honetan zure e-posta helbidea egiaztatzea beharrezkoa da e-postarekin zerikusia duten ezaugarriak erabili aurretik. Beheko botoia jo zure helbidera egiaztapen mezu bat bidaltzeko. Mezuan kode bat duen lotura bat joango da atxikita; lotura hori zure nabigatzailean ireki ezazu e-posta helbidea egiaztatzeko.',
@@ -3353,7 +3355,9 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'htmlform-selectorother-other' => 'Beste bat',
 
 # New logging system
-'logentry-delete-delete' => '$1 wikilariak $3 orria ezabatu du',
+'logentry-delete-delete' => '$1 wikilariak «$3» orria ezabatu du',
+'logentry-delete-event' => '$1 wikilariak ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
+'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
 'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
index 41654e5..423d9db 100644 (file)
@@ -586,7 +586,7 @@ $messages = array(
 'vector-action-protect' => 'محافظت',
 'vector-action-undelete' => 'احیا',
 'vector-action-unprotect' => 'تغییر سطح حفاظت',
-'vector-simplesearch-preference' => 'فعال کردن جستجوی ساده (فقط در پوستهٔ برداری)',
+'vector-simplesearch-preference' => 'فعال کردن نوار جستجوی ساده‌شده (فقط در پوستهٔ برداری)',
 'vector-view-create' => 'ایجاد',
 'vector-view-edit' => 'ویرایش',
 'vector-view-history' => 'نمایش تاریخچه',
@@ -949,7 +949,7 @@ $2',
 'loginlanguagelabel' => 'زبان: $1',
 'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
 'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
 'user-mail-no-body' => 'تلاش برای فرستادن پست‌الکترونیک بی‌دلیل کوتاه یا خالی',
@@ -1643,7 +1643,7 @@ $1",
 'prefs-displaywatchlist' => 'گزینه‌های نمایش',
 'prefs-diffs' => 'تفاوت‌ها',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
 'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
 
@@ -2238,6 +2238,12 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 این صفحه‌ها شاید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
 یک صفحه هنگامی صفحهٔ ابهام‌زدایی در نظر گرفته می‌شود که در آن از الگویی که به [[MediaWiki:Disambiguationspage]] پیوند دارد استفاده شده باشد.",
 
+'pageswithprop' => 'صفحه‌های دارای خاصیت صفحه',
+'pageswithprop-legend' => 'صفحه‌های دارای خاصیت صفحه',
+'pageswithprop-text' => 'این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.',
+'pageswithprop-prop' => 'نام خاصیت:',
+'pageswithprop-submit' => 'برو',
+
 'doubleredirects' => 'تغییرمسیرهای دوتایی',
 'doubleredirectstext' => 'این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.
 هر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.
@@ -2429,7 +2435,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listgrouprights-addgroup-self-all' => 'می‌تواند حساب خود را به تمام گروه‌ها اضافه کند',
 'listgrouprights-removegroup-self-all' => 'می‌تواند حساب خود را از تمام گروه‌ها حذف کند',
 
-# E-mail user
+# Email user
 'mailnologin' => 'نشانی‌ای از فرستنده موجود نیست',
 'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
 'emailuser' => 'فرستادن نامه به این کاربر',
@@ -2638,7 +2644,7 @@ $PAGEINTRO $NEWPAGE
 شما می‌توانید سطح محافظت این صفحه را تغییر بدهید اما این کار تاثیری بر محافظت آبشاری صفحه نخواهد گذاشت.',
 'protect-default' => 'همهٔ کاربرها',
 'protect-fallback' => 'فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود',
-'protect-level-autoconfirmed' => 'فقط به کاربرهای تائیدشده اجازه بده',
+'protect-level-autoconfirmed' => 'اجازه فقط برای به کاربرهای تائیدشده',
 'protect-level-sysop' => 'فقط مدیران',
 'protect-summary-cascade' => 'آبشاری',
 'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
@@ -3822,7 +3828,7 @@ $1',
 'monthsall' => 'همهٔ ماه‌ها',
 'limitall' => 'همه',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'تأیید نشانی رایانامه',
 'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکرده‌اید.',
 'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
@@ -4285,4 +4291,7 @@ $5
 'duration-centuries' => '$1 قرن',
 'duration-millennia' => '{{PLURAL:$1|هزار سال |$1 هزار سال}}',
 
+# Image rotation
+'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
+
 );
index 314959c..745aca1 100644 (file)
@@ -798,7 +798,7 @@ Odota ennen kuin yrität uudelleen.',
 'loginlanguagelabel' => 'Kieli: $1',
 'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
 'user-mail-no-addy' => 'Yritit lähettää sähköpostia ilman sähköpostiosoitetta.',
 'user-mail-no-body' => 'Sähköpostin sisältö ei ole tarpeeksi pitkä.',
@@ -1457,7 +1457,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'prefs-displaywatchlist' => 'Näyttöasetukset',
 'prefs-diffs' => 'Erot',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
 'email-address-validity-invalid' => 'Virheellinen sähköpostiosoite',
 
@@ -2035,6 +2035,12 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
 Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
 Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-legend' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-text' => 'Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.',
+'pageswithprop-prop' => 'Ominaisuuden nimi',
+'pageswithprop-submit' => 'Siirry',
+
 'doubleredirects' => 'Kaksinkertaiset ohjaukset',
 'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
 Jokaisella 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.
@@ -2226,7 +2232,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'listgrouprights-addgroup-self-all' => 'Voi lisätä itsensä kaikkiin ryhmiin',
 'listgrouprights-removegroup-self-all' => 'Voi poistaa itsensä kaikista ryhmistä',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Lähettäjän osoite puuttuu',
 'mailnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
 'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
@@ -3594,7 +3600,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 'monthsall' => 'kaikki',
 'limitall' => 'kaikki',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Varmenna sähköpostiosoite',
 'confirmemail_noemail' => 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
 'confirmemail_text' => 'Tämä wiki vaatii sähköpostiosoitteen varmentamisen, ennen kuin voit käyttää sähköpostitoimintoja. Lähetä alla olevasta painikkeesta varmennusviesti osoitteeseesi. Viesti sisältää linkin, jonka avaamalla varmennat sähköpostiosoitteesi.',
index f2dd97f..228d04c 100644 (file)
@@ -60,6 +60,7 @@
  * @author McDutchie
  * @author Meithal
  * @author Moyg
+ * @author Nicolas NALLET
  * @author Nicolas Raoul
  * @author Nnemo
  * @author Od1n
@@ -888,7 +889,7 @@ Veuillez attendre avant d'essayer à nouveau.",
 'loginlanguagelabel' => 'Langue : $1',
 'suspicious-userlogout' => "Votre demande de déconnexion a été refusée car il semble qu'elle a été envoyée par un navigateur cassé ou la mise en cache d'un proxy.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
 'user-mail-no-addy' => "Tenté d'envoyer un courriel sans adresse de courriel",
 'user-mail-no-body' => "Essai d'envoi d'un courriel avec un corps vide ou déraisonnablement court.",
@@ -1473,7 +1474,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'prefs-edit-boxsize' => 'Taille de la fenêtre de modification.',
 'rows' => 'Rangées :',
 'columns' => 'Colonnes :',
-'searchresultshead' => 'Recherches',
+'searchresultshead' => 'Filtrer avec cette valeur',
 'resultsperpage' => 'Nombre de réponses par page :',
 'stub-threshold' => 'Limite supérieure pour les <a href="#" class="stub">liens vers les ébauches</a> (octets) :',
 'stub-threshold-disabled' => 'Désactivé',
@@ -1554,7 +1555,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'prefs-displaywatchlist' => "Options d'affichage",
 'prefs-diffs' => 'Différences',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Semble valide',
 'email-address-validity-invalid' => 'Une adresse valide est nécessaire !',
 
@@ -2151,6 +2152,12 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
 Elles devraient plutôt pointer vers le bon article.<br />
 Une page est considérée comme une page d'homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Pages avec une propriété de page',
+'pageswithprop-legend' => 'Pages avec une propriété de page',
+'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
+'pageswithprop-prop' => 'Nom de la propriété:',
+'pageswithprop-submit' => 'Aller',
+
 'doubleredirects' => 'Doubles redirections',
 'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
 Chaque 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.
@@ -2342,7 +2349,7 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 'listgrouprights-addgroup-self-all' => "Peut s'ajouter tous les groupes à son propre compte",
 'listgrouprights-removegroup-self-all' => 'Peut se retirer tous les groupes de son propre compte',
 
-# E-mail user
+# Email user
 'mailnologin' => "Pas d'adresse d'expéditeur",
 'mailnologintext' => "Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d'autres utilisateurs.",
 'emailuser' => 'Lui envoyer un courriel',
@@ -3751,7 +3758,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'monthsall' => 'tous',
 'limitall' => 'tous',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Confirmer l'adresse de courriel",
 'confirmemail_noemail' => "Vous n'avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].",
 'confirmemail_text' => 'Ce wiki nécessite la vérification de votre adresse de courriel avant de pouvoir utiliser toute fonction de messagerie.
@@ -4234,4 +4241,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'duration-centuries' => '$1 siècle{{PLURAL:$1||s}}',
 'duration-millennia' => '$1 millénaire{{PLURAL:$1||s}}',
 
+# Image rotation
+'rotate-comment' => 'Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d’une montre',
+
 );
index 0cfc7d4..45934b2 100644 (file)
@@ -315,13 +315,13 @@ $messages = array(
 'tog-hidepatrolled' => 'Cachiér los changements gouardâs dedens los dèrriérs changements',
 'tog-newpageshidepatrolled' => 'Cachiér les pâges gouardâyes entre-mié la lista de les pâges novèles',
 'tog-extendwatchlist' => 'Ètendre la lista de siuvu por montrar tôs los changements et pas ren que los ples novéls',
-'tog-usenewrc' => 'Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de siuvu (il at fôta de JavaScript)',
+'tog-usenewrc' => 'Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de siuvu (at fôta de JavaScript)',
 'tog-numberheadings' => 'Numerotar ôtomaticament los titros de sèccion',
-'tog-showtoolbar' => 'Montrar la bârra d’outils de changement (il at fôta de JavaScript)',
-'tog-editondblclick' => 'Changiér des pâges sur doblo-clic (il at fôta de JavaScript)',
+'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-editsection' => 'Activar lo changement de sèccions avouéc los lims « [changiér] »',
-'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (il at fôta de JavaScript)',
-'tog-showtoc' => 'Montrar la trâbla de les matiéres (por les pâges qu’ont més de 3 sèccions)',
+'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (at fôta de JavaScript)',
+'tog-showtoc' => 'Montrar la trâbla de les matiéres (por les pâges qu’ant més de 3 sèccions)',
 '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',
@@ -338,10 +338,10 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
 'tog-oldsig' => 'Signatura ègzistenta :',
 'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, il at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, il at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
+'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
+'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
 'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
-'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (il at fôta de JavaScript) (èxpèrimentâl)',
+'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
 'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
 'tog-watchlisthideown' => 'Cachiér los mins changements dedens la lista de siuvu',
 'tog-watchlisthidebots' => 'Cachiér los changements fêts per des robots dedens la lista de siuvu',
@@ -628,25 +628,25 @@ Na lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPag
 
 # General errors
 'error' => 'Fôta',
-'databaseerror' => 'Fôta de la bâsa de donâs',
-'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
+'databaseerror' => 'Fôta de la bâsa de balyês',
+'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
 Cen pôt endicar na cofierie dedens la programeria.
-La dèrriére demanda trètâye per la bâsa de donâs ére :
+La dèrriére demanda trètâye per la bâsa de balyês ére :
 <blockquote><code>$1</code></blockquote>
 dês la fonccion « <code>$2</code> ».
-La bâsa de donâs at retornâ la fôta « <samp>$3 : $4</samp> ».',
-'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
-La dèrriére demanda trètâye per la bâsa de donâs ére :
+La bâsa de balyês at retornâ la fôta « <samp>$3 : $4</samp> ».',
+'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
+La dèrriére demanda trètâye per la bâsa de balyês ére :
 « $1 »
 dês la fonccion « $2 ».
-La bâsa de donâs at retornâ la fôta « $3 : $4 ».',
+La bâsa de balyês at retornâ la fôta « $3 : $4 ».',
 'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
-'readonly' => 'Bâsa de donâs vèrrolyêe',
-'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués n’èstimacion de la sina durâ',
-'readonlytext' => 'Ora la bâsa de donâs est vèrrolyêe por les entrâs novèles et los ôtros changements, de sûr por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
+'readonly' => 'Bâsa de balyês vèrrolyêe',
+'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués un’èstimacion de la sina durâ',
+'readonlytext' => 'Ora la bâsa de balyês est vèrrolyêe por les entrâs novèles et los ôtros changements, de sûr por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
 
 L’administrator que l’at vèrrolyê at balyê cet’èxplicacion : $1',
-'missing-article' => 'La bâsa de donâs at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, apelâye « $1 » $2.
+'missing-article' => 'La bâsa de balyês at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, apelâye « $1 » $2.
 
 En g·ènèral cen arreve en siuvent un lim d’una dif d’un historico dèpassâ(ye) de vers na pâge qu’est étâye suprimâye.
 
@@ -654,7 +654,7 @@ S’o est pas lo câs, pôt étre na cofierie dedens la programeria.
 Se vos plét, signalâd-la a un [[Special:ListUsers/sysop|administrator]] sen oubliar de lui endicar l’URL du lim.',
 'missingarticle-rev' => '(numerô de vèrsion : $1)',
 'missingarticle-diff' => '(dif : $1, $2)',
-'readonly_lag' => 'La bâsa de donâ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.',
+'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.',
@@ -676,10 +676,10 @@ Nion’èxplicacion est étâye balyêe.',
 'badtitle' => 'Crouyo titro',
 'badtitletext' => 'Lo titro de la pâge demandâye est pas justo, vouedo ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.
 Contint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.',
-'perfcached' => 'Cetes donâs sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
-'perfcachedts' => 'Cetes donâs sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
-'querypage-no-updates' => 'Ora les mises a jorn por ceta pâge sont dèsactivâyes.
-Les donâs ique seront pas betâyes a jorn.',
+'perfcached' => 'Cetes balyês sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'perfcachedts' => 'Cetes balyês sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'querypage-no-updates' => 'Ora les mêses a jorn por ceta pâge sont dèsactivâyes.
+Les balyês ique seront pas betâyes a jorn.',
 'wrong_wfQuery_params' => 'Paramètros fôx dessus wfQuery()<br />
 Fonccion : $1<br />
 Demanda : $2',
@@ -691,7 +691,7 @@ Se vos plét, tornâd èprovar dens un tôrn.',
 'protectedpagetext' => 'Ceta pâge est étâye protègiêe por empachiér son changement ou ben d’ôtres accions.',
 'viewsourcetext' => 'Vos pouede vêre et copiyér lo tèxto sôrsa de ceta pâge :',
 'viewyourtext' => "Vos pouede vêre et copiyér lo tèxto sôrsa de '''voutros changements''' a ceta pâge :",
-'protectedinterface' => 'Cela pâge-que balye de tèxto d’entèrface por la programeria sur ceti vouiqui, et el est vêr protègiêe por èvitar los abus.
+'protectedinterface' => 'Cela pâge-que balye de tèxto d’entèrface por la programeria sur ceti vouiqui et est vêr protègiêe por èvitar los abus.
 Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.',
 'editinginterface' => "'''Atencion :''' vos éte aprés changiér na pâge empleyêe por fâre lo tèxto d’entèrface de la programeria.
 Los changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de ceti vouiqui.
@@ -733,7 +733,7 @@ Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SI
 'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
 'yourdomainname' => 'Voutron domêno :',
 'password-change-forbidden' => 'Vos pouede pas changiér los contresegnos sur ceti vouiqui.',
-'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de donâs d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
+'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
 'login' => 'Branchement',
 'nav-login-createaccount' => 'Sè branchiér / fâre un compto',
 'loginprompt' => "Vos dête activar los tèmouens (''cookies'') por vos branchiér a {{SITENAME}}.",
@@ -783,7 +783,7 @@ Se vos plét, tornâd èprovar.',
 'passwordremindertitle' => 'Contresegno temporèro novél por {{SITENAME}}',
 'passwordremindertext' => 'Yon (probâblament vos, dês l’adrèce IP $1) at demandâ un contresegno
 novél por {{SITENAME}} ($4). Un contresegno temporèro est étâ fêt por
-l’utilisator « $2 » et il est « $3 ». S’o ére voutra entencion, vos vos devréd
+l’utilisator « $2 » et est « $3 ». S’o ére voutron entencion, vos vos devréd
 branchiér et pués chouèsir un contresegno novél.
 Voutron contresegno temporèro èxpirerat dens {{PLURAL:$5|un jorn|$5 jorns}}.
 
@@ -791,7 +791,7 @@ Se cela demanda vint pas de vos ou ben que vos vos éte rapelâ
 de voutron contresegno et que vos souhètâd pas més lo changiér, vos
 pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.',
 'noemail' => 'Nion’adrèce èlèctronica est étâye encartâye por l’utilisator « $1 ».',
-'noemailcreate' => 'Vos dête balyér n’adrèce èlèctronica justa',
+'noemailcreate' => 'Vos dête balyér un’adrèce èlèctronica justa',
 'passwordsent' => 'Un contresegno novél est étâ mandâ a l’adrèce èlèctronica de l’utilisator « $1 ».
 Se vos plét, tornâd-vos branchiér aprés l’avêr reçu.',
 'blocked-mailpassword' => 'Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.',
@@ -800,15 +800,15 @@ Devant qu’un ôtro mèssâjo seye mandâ a ceti compto, vos devréd siuvre les
 'throttled-mailpassword' => 'Un mèssâjo de sovegnence de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
 Por èvitar los abus, ren que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
 'mailerror' => 'Fôta pendent l’èxpèdicion du mèssâjo : $1',
-'acct_creation_throttle_hit' => 'Des visitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ont fêt $1 compto{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.
+'acct_creation_throttle_hit' => 'Des visitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ant fêt $1 compto{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.
 Du côp los visitors qu’emplèyont cel’adrèce IP pôvont fâre gins de compto por lo moment.',
 'emailauthenticated' => 'Voutron adrèce èlèctronica est étâye ôtentifiâye lo $2 a $3.',
 'emailnotauthenticated' => 'Voutron adrèce èlèctronica est p’oncor ôtentifiâye.
 Nion mèssâjo serat mandâ por châcuna de cetes fonccionalitâts.',
-'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
+'noemailprefs' => 'Spècifiâd un’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
 'emailconfirmlink' => 'Confirmâd voutron adrèce èlèctronica',
 'invalidemailaddress' => 'Cet’adrèce èlèctronica pôt pas étre accèptâye, semble avêr un format pas justo.
-Se vos plét, buchiéd n’adrèce bien formatâye ou ben lèssiéd cél champ vouedo.',
+Se vos plét, buchiéd un’adrèce bien formatâye ou ben lèssiéd cél champ vouedo.',
 'cannotchangeemail' => 'Les adrèces èlèctroniques des comptos pôvont pas étre changiêes sur ceti vouiqui.',
 'emaildisabled' => 'Ceti seto pôt pas mandar des mèssâjos.',
 'accountcreated' => 'Compto fêt',
@@ -823,12 +823,12 @@ Ignorâd ceti mèssâjo se cél compto est étâ fêt per fôta.',
 Se vos plét, atende devant que tornar èprovar.',
 'login-abort-generic' => 'Voutra tentativa de branchement at pas reussi - Anulâye',
 'loginlanguagelabel' => 'Lengoua : $1',
-'suspicious-userlogout' => 'Voutra demanda de dèbranchement est étâye refusâye, semble qu’el est étâye mandâye per un navigator câsso ou ben la misa en cacho d’un proxi.',
+'suspicious-userlogout' => 'Voutra demanda de dèbranchement est étâye refusâye, semble qu’el est étâye mandâye per un navigator câsso ou ben la mêsa en cacho d’un proxi.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Fôta encognua dens la fonccion mail() de PHP.',
-'user-mail-no-addy' => 'Il at èprovâ de mandar un mèssâjo sen adrèce èlèctronica.',
-'user-mail-no-body' => 'Il at èprovâ de mandar un mèssâjo avouéc un côrp vouedo ou ben dèrêsonâblament côrt.',
+'user-mail-no-addy' => 'Èprôva de mandar un mèssâjo sen adrèce èlèctronica.',
+'user-mail-no-body' => 'Èprôva de mandar un mèssâjo avouéc un côrp vouedo ou ben dèrêsonâblament côrt.',
 
 # Change password dialog
 'resetpass' => 'Changiér lo contresegno',
@@ -851,11 +851,11 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
 'resetpass-temp-password' => 'Contresegno temporèro :',
 
 # Special:PasswordReset
-'passwordreset' => 'Remisa a zérô du contresegno',
+'passwordreset' => 'Remês’a zérô du contresegno',
 'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de sovegnence des dètalys de voutron compto.',
-'passwordreset-legend' => 'Remetre a zérô lo contresegno',
-'passwordreset-disabled' => 'La remisa a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de donâs ce-desot}}',
+'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
+'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
+'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
 'passwordreset-username' => 'Nom d’utilisator :',
 'passwordreset-domain' => 'Domêno :',
 'passwordreset-capture' => 'Est-o que vos voléd vêre lo mèssâjo que rèsulte ?',
@@ -965,7 +965,7 @@ La rêson balyêe est :
 
 Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
 
-Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » du muens que vos èyâd n’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas étâ blocâ de l’empleyér.
+Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » du muens que vos èyâd un’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas étâ blocâ de l’empleyér.
 
 Voutron adrèce IP d’ora est $3, et l’identifient de blocâjo est $5.
 Se vos plét, entrebetâd tôs los dètalys ce-dessus dedens na demanda la quinta que seye que vos faréd.",
@@ -989,8 +989,8 @@ Por fâre cela pâge, buchiéd voutron tèxto dedens la bouèta ce-desot (vêde
 Se vos éte arrevâ{{GENDER:||ye|(ye)}} ice per fôta, clicâd sur lo boton '''Devant''' de voutron navigator.",
 'anontalkpagetext' => "----''O est la pâge de discussion d’un utilisator anonimo qu’at p’oncor fêt un compto ou ben que nen emplèye pas.
 Por cen nos devens empleyér la sin’adrèce IP numerica por lo recognetre.
-N’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.
-Se vos éte {{GENDER:|un utilisator|n’utilisatrice|un utilisator}} anonim{{GENDER:|o|a|o}} et pués se vos constatâd que des comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un compto]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.''",
+Un’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.
+Se vos éte {{GENDER:|un utilisator|un’utilisatrice|un utilisator}} anonim{{GENDER:|o|a|o}} et pués se vos constatâd que des comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un compto]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.''",
 'noarticletext' => 'Ora y at gins de tèxto dedens cela pâge.
 Vos pouede [[Special:Search/{{PAGENAME}}|fâre na rechèrche sur cél titro]] dedens les ôtres pâges,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechèrchiér dedens los jornals liyês]
@@ -1000,7 +1000,7 @@ Vos pouede [[Special:Search/{{PAGENAME}}|fâre na rechèrche sur cél titro]] de
 'missing-revision' => 'La vèrsion numerô $1 de la pâge apelâye « {{PAGENAME}} » ègziste pas.
 
 En g·ènèral cen arreve en siuvent un lim d’un historico dèpassâ de vers na pâge qu’est étâye suprimâye.
-Vos pouede trovar més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].',
+Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].',
 'userpage-userdoesnotexist' => 'Lo compto utilisator « $1 » est pas encartâ.
 Se vos plét, controlâd que vos voléd fâre / changiér cela pâge.',
 'userpage-userdoesnotexist-view' => 'Lo compto utilisator « $1 » est pas encartâ.',
@@ -1041,7 +1041,7 @@ Se cen tôrne pas reussir, [[Special:UserLogout|dèbranchiéd-vos]] et pués tor
 'token_suffix_mismatch' => "'''Voutron changement est pas étâ accèptâ, voutron cliant at mècllâ los caractèros de ponctuacion dedens lo jeton de changement.'''
 Lo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.
 Des côps ceti problèmo arreve quand vos empleyéd un sèrviço de proxi Vouèbe anonimo qu’est pas de sûr.",
-'edit_form_incomplete' => "'''Quârques parties du formulèro de changement ont pas avengiê lo sèrvior ; controlâd que voutros changements sont entiérs et pués tornâd èprovar.'''",
+'edit_form_incomplete' => "'''Quârques parties du formulèro de changement ant pas avengiê lo sèrvior ; controlâd que voutros changements sont entiérs et pués tornâd èprovar.'''",
 'editing' => 'Changement de $1',
 'creating' => 'Crèacion de $1',
 'editingsection' => 'Changement de $1 (sèccion)',
@@ -1069,15 +1069,15 @@ Vos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’é
 '''Empleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !'''",
 'longpageerror' => "'''Fôta : lo tèxto que vos éd mandâ fât {{PLURAL:$1|un Kio|$1 Kio}}, cen que dèpâsse la limita fixâye a {{PLURAL:$2|un Kio|$2 Kio}}.'''
 Pôt pas étre encartâ.",
-'readonlywarning' => "'''Atencion : la bâsa de donâs est étâye vèrrolyêe por mantegnence, vos porréd vêr pas encartar voutros changements d’abôrd.'''
+'readonlywarning' => "'''Atencion : la bâsa de balyês est étâye vèrrolyêe por mantegnence, vos porréd vêr pas encartar voutros changements d’abôrd.'''
 Vos pouede copiyér et côlar voutron tèxto dedens un fichiér tèxto et pués l’encartar por ples târd.
 
-L’administrator qu’at vèrrolyê la bâsa de donâs at balyê cet’èxplicacion : $1",
-'protectedpagewarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que solament los utilisators qu’ont lo statut d’administrator la pouessont changiér.'''
+L’administrator qu’at vèrrolyê la bâsa de balyês at balyê cet’èxplicacion : $1",
+'protectedpagewarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér.'''
 Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
 'semiprotectedpagewarning' => "'''Nota :''' ceta pâge est étâye protègiêe de façon que solament los utilisators encartâs la pouessont changiér.
 Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
-'cascadeprotectedwarning' => "'''Atencion :''' cela pâge-que est étâye protègiêe de façon que solament los utilisators qu’ont lo statut d’administrator la pouessont changiér, perce qu’el est entrebetâye dedens {{PLURAL:$1|ceta pâge protègiêe|cetes pâges protègiêes}} avouéc la « protèccion en cascâda » activâye :",
+'cascadeprotectedwarning' => "'''Atencion :''' cela pâge-que est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér, perce qu’el est entrebetâye dedens {{PLURAL:$1|ceta pâge protègiêe|cetes pâges protègiêes}} avouéc la « protèccion en cascâda » activâye :",
 'titleprotectedwarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que des [[Special:ListGroupRights|drêts spècificos]] sont nècèssèros por la povêr fâre.'''
 Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
 'templatesused' => '{{PLURAL:$1|Modèlo empleyê|Modèlos empleyês}} per ceta pâge :',
@@ -1112,7 +1112,7 @@ Semble que seye étâye suprimâye.',
 È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',
-'invalid-content-data' => 'Donâs du contegnu pas justes',
+'invalid-content-data' => 'Balyês du contegnu pas justes',
 'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
 
 # Content models
@@ -1169,7 +1169,7 @@ La rêson balyêe per $3 ére ''$2''.",
 'cur' => 'd’ora',
 'next' => 'aprés',
 'last' => 'devant',
-'page_first' => 'Premiére',
+'page_first' => 'premiére',
 'page_last' => 'dèrriére',
 'histlegend' => "Chouèx de difs : pouentâd les câses de les vèrsions a comparar et pués apoyéd dessus « Entrâ » ou ben lo boton d’avâl.<br />
 Lègenda : '''({{int:cur}})''' = difèrence avouéc la vèrsion d’ora, '''({{int:last}})''' = difèrence avouéc la vèrsion devant, '''{{int:minoreditletter}}''' = petiôt changement.",
@@ -1186,7 +1186,7 @@ Lègenda : '''({{int:cur}})''' = difèrence avouéc la vèrsion d’ora, '''({{i
 'history-feed-item-nocomment' => '$1 lo $3 a $4',
 'history-feed-empty' => 'La pâge demandâye ègziste pas.
 Pôt-étre el est étâye suprimâye du vouiqui ou ben renomâye.
-Èprovâd de [[Special:Search|rechèrchiér sur lo vouiqui]] por trovar des pâges novèles que vont avouéc.',
+Èprovâd de [[Special:Search|rechèrchiér sur lo vouiqui]] por trovar des pâges novèles que vant avouéc.',
 
 # Revision deletion
 'rev-deleted-comment' => '(rèsumâ de changement enlevâ)',
@@ -1194,30 +1194,30 @@ Pôt-étre el est étâye suprimâye du vouiqui ou ben renomâye.
 'rev-deleted-event' => '(accion du jornal enlevâye)',
 'rev-deleted-user-contribs' => '[nom d’utilisator ou ben adrèce IP enlevâ(ye) - changement cachiê sur les contribucions]',
 'rev-deleted-text-permission' => "Ceta vèrsion de la pâge est étâye '''suprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
 'rev-deleted-text-unhide' => "Ceta vèrsion de la pâge est étâye '''suprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].
 Vos pouede adés [$1 vêre cela vèrsion] se vos o voléd.",
 'rev-suppressed-text-unhide' => "Ceta vèrsion de la pâge est étâye '''rèprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].
 Vos pouede adés [$1 vêre cela vèrsion] se vos o voléd.",
 'rev-deleted-text-view' => "Ceta vèrsion de la pâge est étâye '''suprimâye'''.
-Vos la pouede vêre ; y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
+Vos la pouede vêre ; y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
 'rev-suppressed-text-view' => "Ceta vèrsion de la pâge est étâye '''rèprimâye'''.
-Vos la pouede vêre ; y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].",
+Vos la pouede vêre ; y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].",
 'rev-deleted-no-diff' => "Vos pouede pas vêre ceta dif perce que yona de les vèrsions est étâye '''suprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
 'rev-suppressed-no-diff' => "Vos pouede pas vêre ceta dif, yona de les vèrsions est étâye '''suprimâye'''.",
 'rev-deleted-unhide-diff' => "Yona de les vèrsions de ceta dif est étâye '''suprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].
 Vos pouede adés [$1 vêre cela dif] se vos o voléd.",
 'rev-suppressed-unhide-diff' => "Yona de les vèrsions de ceta dif est étâye '''rèprimâye'''.
-Y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].
+Y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].
 Vos pouede adés [$1 vêre cela dif] se vos o voléd.",
 'rev-deleted-diff-view' => "Yona de les vèrsions de ceta dif est étâye '''suprimâye'''.
-Vos pouede vêre ceta dif ; y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
+Vos pouede vêre ceta dif ; y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].",
 'rev-suppressed-diff-view' => "Yona de les vèrsions de ceta dif est étâye '''rèprimâye'''.
-Vos pouede vêre ceta dif ; y pôt avêr més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].",
+Vos pouede vêre ceta dif ; y pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de les rèprèssions].",
 'rev-delundel' => 'montrar / cachiér',
 'rev-showdeleted' => 'montrar',
 'revisiondelete' => 'Suprimar / refâre des vèrsions',
@@ -1233,12 +1233,12 @@ fonccion, la vèrsion spècifiâye ègziste pas ou ben vos èprovâd de cachiér
 'revdelete-show-file-submit' => 'Ouè',
 'revdelete-selected' => "'''{{PLURAL:$2|Vèrsion chouèsia|Vèrsions chouèsies}} de [[:$1]] :'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Èvènement du jornal chouèsi|Èvènements du jornal chouèsis}} :'''",
-'revdelete-text' => "'''Les vèrsions et los èvènements suprimâ(ye)s aparètront adés dedens l’historico de la pâge et pués dedens los jornals, mas quârques parties de lor contegnu seront inaccèssibles u publico.'''
+'revdelete-text' => "'''Les vèrsions et los èvènements suprimâ(ye)s aparètront adés dedens l’historico de la pâge et pués sur los jornals, mas quârques parties de lor contegnu seront inaccèssibles u publico.'''
 Los ôtros administrators de {{SITENAME}} porront tojorn arrevar u contegnu cachiê et lo refâre per cela mém’entèrface, du muens que des rèstriccions de ples seyont pas dèfenies.",
 'revdelete-confirm' => 'Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].',
 'revdelete-suppress-text' => "La rèprèssion dêt étre empleyêe '''ren que''' dens cetos câs :
 * Enformacions que pôvont étre difamatouères
-* Enformacions a sè que vont pas avouéc
+* Enformacions a sè que vant pas avouéc
 *: ''adrèces et numerôs de tèlèfono, numerôs de sècuritât sociâla, et tot cen que vat avouéc''",
 'revdelete-legend' => 'Dèfenir des rèstriccions de visibilitât',
 'revdelete-hide-text' => 'Cachiér lo tèxto de la vèrsion',
@@ -1246,11 +1246,11 @@ Los ôtros administrators de {{SITENAME}} porront tojorn arrevar u contegnu cach
 'revdelete-hide-name' => 'Cachiér l’accion et la ciba',
 'revdelete-hide-comment' => 'Cachiér lo rèsumâ de changement',
 'revdelete-hide-user' => 'Cachiér lo nom d’utilisator / l’adrèce IP du contributor',
-'revdelete-hide-restricted' => 'Rèprimar celes donâs ux administrators et pués ux ôtros',
+'revdelete-hide-restricted' => 'Rèprimar celes balyês ux administrators et pués ux ôtros',
 'revdelete-radio-same' => '(pas changiér)',
 'revdelete-radio-set' => 'Ouè',
 'revdelete-radio-unset' => 'Nan',
-'revdelete-suppress' => 'Rèprimar celes donâs ux administrators et pués ux ôtros',
+'revdelete-suppress' => 'Rèprimar celes balyês ux administrators et pués ux ôtros',
 'revdelete-unsuppress' => 'Enlevar les rèstriccions sur les vèrsions refêtes',
 'revdelete-log' => 'Rêson :',
 'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la vèrsion chouèsia|les vèrsions chouèsies}}',
@@ -1271,14 +1271,14 @@ Pôt pas étre cachiêe.',
 Vos y éd pas accès.',
 'revdelete-modify-no-access' => 'Fôta en changient la piéce datâye du $1 a $2 : el est marcâye coment « rètrenta ».
 Vos y éd pas accès.',
-'revdelete-modify-missing' => 'Fôta en changient la piéce avouéc l’identifient $1 : el est manquenta dedens la bâsa de donâs !',
+'revdelete-modify-missing' => 'Fôta en changient la piéce avouéc l’identifient $1 : el est manquenta dedens la bâsa de balyês !',
 'revdelete-no-change' => "'''Atencion :''' la piéce datâye du $1 a $2 at ja la configuracion de visibilitât demandâye.",
 'revdelete-concurrent-change' => 'Fôta en changient la piéce datâye du $1 a $2 : lo sin statut semble étre étâ changiê per un ôtro justo que vos èprovâvâd d’o changiér.
 Se vos plét, controlâd los jornals.',
 'revdelete-only-restricted' => 'Fôta en cachient la piéce datâye du $1 a $2 : vos pouede pas rèprimar celes piéces de la vua ux administrators sen chouèsir avouéc des ôtros chouèx de visibilitât.',
 'revdelete-reason-dropdown' => '*Rêsons corentes de suprèssion
 ** Violacion du drêt d’ôtor
-** Comentèros ou ben enformacions a sè que vont pas avouéc
+** Comentèros ou ben enformacions a sè que vant pas avouéc
 ** Nom d’utilisator que vat pas avouéc
 ** Enformacions que pôvont étre difamatouères',
 'revdelete-otherreason' => 'Ôtra rêson / rêson de ples :',
@@ -1288,7 +1288,7 @@ Se vos plét, controlâd los jornals.',
 
 # Suppression log
 'suppressionlog' => 'Jornal de les suprèssions',
-'suppressionlogtext' => 'Vê-que na lista de les suprèssions et des blocâjos qu’ont de contegnu cachiê ux administrators.
+'suppressionlogtext' => 'Vê-que na lista de les suprèssions et des blocâjos qu’ant de contegnu cachiê ux administrators.
 Vêde la [[Special:BlockList|lista des blocâjos]] por la lista des banissements et des blocâjos que sont ora actifs.',
 
 # History merging
@@ -1301,7 +1301,7 @@ Assurâd-vos que cél changement consèrverat la continuitât de l’historico d
 'mergehistory-list' => 'Historico des changements que pôvont étre fusionâs',
 'mergehistory-merge' => 'Cetes vèrsions de [[:$1]] pôvont étre fusionâyes dedens [[:$2]].
 Empleyéd la colona de botons de chouèx por fusionar ren que les vèrsions fêtes du comencement tant qu’a la dâta spècifiâye.
-Notâd que l’usâjo des lims de navigacion remetrat a zérô cela colona.',
+Notâd que l’usâjo des lims de navigacion rebeterat a zérô cela colona.',
 'mergehistory-go' => 'Montrar los changements que pôvont étre fusionâs',
 'mergehistory-submit' => 'Fusionar les vèrsions',
 'mergehistory-empty' => 'Niona vèrsion pôt étre fusionâye.',
@@ -1336,13 +1336,13 @@ Notâd que l’usâjo des lims de navigacion remetrat a zérô cela colona.',
 'difference-missing-revision' => '{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.
 
 En g·ènèral cen arreve en siuvent un lim d’una dif dèpassâye de vers na pâge qu’est étâye suprimâye.
-Vos pouede trovar més de dètalys dedens lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].',
+Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de les suprèssions].',
 
 # Search results
 'searchresults' => 'Rèsultats de la rechèrche',
 'searchresults-title' => 'Rèsultats de la rechèrche por « $1 »',
 'searchresulttext' => 'Por més d’enformacions sur la rechèrche dedens {{SITENAME}}, vêde [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Vos éd rechèrchiê « '''[[:$1]]''' » ([[Special:Prefixindex/$1|totes les pâges que començont per « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|totes les pâges qu’ont un lim de vers « $1 »]])",
+'searchsubtitle' => "Vos éd rechèrchiê « '''[[:$1]]''' » ([[Special:Prefixindex/$1|totes les pâges que començont per « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|totes les pâges qu’ant un lim de vers « $1 »]])",
 'searchsubtitleinvalid' => "Vos éd rechèrchiê « '''$1''' »",
 'toomanymatches' => 'Un mouél de corrèspondances est étâ retornâ, se vos plét èprovâd na rechèrche difèrenta',
 'titlematches' => 'Corrèspondances dedens los titros de les pâges',
@@ -1406,10 +1406,10 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 # Quickbar
 'qbsettings' => 'Bârra rapida',
 'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fixa gôche',
-'qbsettings-fixedright' => 'Fixa drêta',
-'qbsettings-floatingleft' => 'Fllotenta gôche',
-'qbsettings-floatingright' => 'Fllotenta drêta',
+'qbsettings-fixedleft' => 'Fixa gôche',
+'qbsettings-fixedright' => 'Fixa drêta',
+'qbsettings-floatingleft' => 'Fllotenta gôche',
+'qbsettings-floatingright' => 'Fllotenta drêta',
 'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
 
 # Preferences page
@@ -1437,7 +1437,7 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 'prefs-misc' => 'De totes sôrtes',
 'prefs-resetpass' => 'Changiér lo contresegno',
 'prefs-changeemail' => 'Changiér l’adrèce èlèctronica',
-'prefs-setemail' => 'Dèfenir n’adrèce èlèctronica',
+'prefs-setemail' => 'Dèfenir un’adrèce èlèctronica',
 'prefs-email' => 'Chouèx de mèssageria èlèctronica',
 'prefs-rendering' => 'Aparence',
 'saveprefs' => 'Encartar',
@@ -1460,7 +1460,7 @@ Tôs celos que cognessont cela cllâf porront liére voutra lista de siuvu, chou
 Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
 'savedprefs' => 'Voutres prèferences sont étâyes encartâyes.',
 'timezonelegend' => 'Fus horèro :',
-'localtime' => 'Hora locala :',
+'localtime' => 'Hora locâla :',
 'timezoneuseserverdefault' => 'Empleyér la valor du vouiqui per dèfôt ($1)',
 'timezoneuseoffset' => 'Ôtro (spècifiar lo dècalâjo)',
 'timezoneoffset' => 'Dècalâjo horèro¹ :',
@@ -1511,10 +1511,11 @@ Dêt pas dèpassar $1 caractèro{{PLURAL:$1||s}}.',
 'prefs-help-gender' => 'U chouèx : empleyê por acordar en sèxo los mèssâjos de la programeria.
 Cel’enformacion serat publica.',
 'email' => 'Mèssageria èlèctronica',
-'prefs-help-realname' => 'U chouèx : se vos lo balyéd, serat empleyê por vos atribuar voutres ôvres.',
-'prefs-help-email' => 'U chouèx : mas el est nècèssèra por remetre a zérô voutron contresegno, se vos vegnévâd a l’oubliar.',
+'prefs-help-realname' => 'L’endicacion du veré nom est u chouèx.
+Se vos chouèsésséd de lo balyér, serat empleyê por vos atribuar voutres ôvres.',
+'prefs-help-email' => 'L’endicacion de l’adrèce èlèctronica est u chouèx, mas el est nècèssèra por rebetar a zérô voutron contresegno, se vos vegnévâd a l’oubliar.',
 'prefs-help-email-others' => 'Vos porriâd asse-ben chouèsir de lèssiér los ôtros sè veriér vers vos per mèssageria èlèctronica avouéc un lim sur voutra pâge utilisator ou ben de discussion sen que seye nècèssèro de rèvèlar voutron identitât.',
-'prefs-help-email-required' => 'N’adrèce èlèctronica est nècèssèra.',
+'prefs-help-email-required' => 'Un’adrèce èlèctronica est nècèssèra.',
 'prefs-info' => 'Enformacions de bâsa',
 'prefs-i18n' => 'Entèrnacionalisacion',
 'prefs-signature' => 'Signatura',
@@ -1530,9 +1531,9 @@ Cel’enformacion serat publica.',
 'prefs-displaywatchlist' => 'Chouèx de vua',
 'prefs-diffs' => 'Difèrences',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'L’adrèce èlèctronica semble justa',
-'email-address-validity-invalid' => 'Buchiéd n’adrèce èlèctronica justa',
+'email-address-validity-invalid' => 'Buchiéd un’adrèce èlèctronica justa',
 
 # User rights
 'userrights' => 'Administracion des drêts d’utilisator',
@@ -1550,7 +1551,7 @@ Cel’enformacion serat publica.',
 * Na petiôt’ètêla (*) endique que vos pouede pas enlevar cela tropa setout que vos l’éd apondua ou ben l’una l’ôtra.',
 'userrights-reason' => 'Rêson :',
 'userrights-no-interwiki' => 'Vos éd pas la pèrmission de changiér des drêts d’utilisator dessus d’ôtros vouiquis.',
-'userrights-nodatabase' => 'La bâsa de donâs « $1 » ègziste pas ou ben el est pas locala.',
+'userrights-nodatabase' => 'La bâsa de balyês « $1 » ègziste pas ou ben est pas locâla.',
 'userrights-nologin' => 'Vos vos dête [[Special:UserLogin|branchiér]] avouéc un compto d’administrator por balyér des drêts d’utilisator.',
 'userrights-notallowed' => 'Voutron compto at pas la pèrmission de balyér ou ben enlevar des drêts d’utilisator.',
 'userrights-changeable-col' => 'Les tropes que vos pouede changiér',
@@ -1596,16 +1597,16 @@ Cel’enformacion serat publica.',
 'right-reupload' => 'Ècllafar un fichiér ègzistent',
 'right-reupload-own' => 'Ècllafar un fichiér ègzistent tèlèchargiê per sè-mémo',
 'right-reupload-shared' => 'Ècllafar localament un fichiér present sur un dèpôt de fichiérs mèdia partagiê',
-'right-upload_by_url' => 'Tèlèchargiér un fichiér dês n’URL',
+'right-upload_by_url' => 'Tèlèchargiér un fichiér dês un’URL',
 'right-purge' => 'Purgiér lo cacho du seto d’una pâge sen confirmacion',
 'right-autoconfirmed' => 'Changiér les pâges mié-protègiêes',
 'right-bot' => 'Étre trètâ coment na mètoda ôtomatisâye',
-'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand font un petiôt changement sur la pâge de discussion d’un utilisator',
+'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand fant un petiôt changement sur la pâge de discussion d’un utilisator',
 'right-apihighlimits' => 'Empleyér des limites ples hôtes dedens les demandes API',
 'right-writeapi' => 'Empleyér l’API d’ècritura',
 'right-delete' => 'Suprimar des pâges',
-'right-bigdelete' => 'Suprimar des pâges qu’ont un grôs historico',
-'right-deletelogentry' => 'Suprimar et refâre n’entrâ spècifica du jornal',
+'right-bigdelete' => 'Suprimar des pâges qu’ant un grôs historico',
+'right-deletelogentry' => 'Suprimar et refâre un’entrâ spècifica du jornal',
 'right-deleterevision' => 'Suprimar et refâre na vèrsion spècifica d’una pâge',
 'right-deletedhistory' => 'Vêre les entrâs suprimâyes de l’historico sen lor tèxto',
 'right-deletedtext' => 'Vêre lo tèxto suprimâ et los changements entre les vèrsions suprimâyes',
@@ -1637,10 +1638,10 @@ Cel’enformacion serat publica.',
 'right-mergehistory' => 'Fusionar los historicos de les pâges',
 'right-userrights' => 'Changiér tôs los drêts d’un utilisator',
 'right-userrights-interwiki' => 'Changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
-'right-siteadmin' => 'Vèrrolyér et dèvèrrolyér la bâsa de donâs',
+'right-siteadmin' => 'Vèrrolyér et dèvèrrolyér la bâsa de balyês',
 'right-override-export-depth' => 'Èxportar les pâges avouéc les pâges liyêes tant qu’a na provondior de 5 nivéls',
 'right-sendemail' => 'Mandar un mèssâjo ux ôtros utilisators',
-'right-passwordreset' => 'Vêre los mèssâjos de remisa a zérô des contresegnos',
+'right-passwordreset' => 'Vêre los mèssâjos de remês’a zérô des contresegnos',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Jornal de les crèacions d’utilisators',
@@ -1664,7 +1665,7 @@ Cel’enformacion serat publica.',
 'action-upload' => 'tèlèchargiér cél fichiér',
 'action-reupload' => 'ècllafar cél fichiér ègzistent',
 'action-reupload-shared' => 'ècllafar localament cél fichiér present sur un dèpôt partagiê',
-'action-upload_by_url' => 'tèlèchargiér cél fichiér dês n’URL',
+'action-upload_by_url' => 'tèlèchargiér cél fichiér dês un’URL',
 'action-writeapi' => 'empleyér l’API d’ècritura',
 'action-delete' => 'suprimar cela pâge',
 'action-deleterevision' => 'suprimar cela vèrsion',
@@ -1684,7 +1685,7 @@ Cel’enformacion serat publica.',
 'action-mergehistory' => 'fusionar l’historico de cela pâge',
 'action-userrights' => 'changiér tôs los drêts d’utilisator',
 'action-userrights-interwiki' => 'changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
-'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de donâs',
+'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de balyês',
 'action-sendemail' => 'mandar des mèssâjos',
 
 # Recent changes
@@ -1719,7 +1720,7 @@ Cel’enformacion serat publica.',
 'rc_categories_any' => 'Totes',
 'rc-change-size-new' => '$1 octèt{{PLURAL:$1||s}} aprés changement',
 'newsectionsummary' => '/* $1 */ novèla sèccion',
-'rc-enhanced-expand' => 'Montrar los dètalys (il at fôta de JavaScript)',
+'rc-enhanced-expand' => 'Montrar los dètalys (at fôta de JavaScript)',
 'rc-enhanced-hide' => 'Cachiér los dètalys',
 'rc-old-title' => 'fêta avouéc lo titro originâl « $1 »',
 
@@ -1741,18 +1742,18 @@ Les pâges de voutra [[Special:Watchlist|lista de siuvu]] sont en '''grâs'''.",
 'upload-tryagain' => 'Mandar la dèscripcion du fichiér changiê',
 'uploadnologin' => 'Pas branchiê(ye)',
 'uploadnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê(ye)]] por povêr tèlèchargiér des fichiérs.',
-'upload_directory_missing' => 'Lo rèpèrtouèro de tèlèchargement ($1) est manquent et il at pas possu étre fêt per lo sèrvior Vouèbe.',
+'upload_directory_missing' => 'Lo rèpèrtouèro de tèlèchargement ($1) est manquent et at pas possu étre fêt per lo sèrvior Vouèbe.',
 'upload_directory_read_only' => 'Lo rèpèrtouèro de tèlèchargement ($1) est pas accèssiblo en ècritura dês lo sèrvior Vouèbe.',
 'uploaderror' => 'Fôta pendent lo tèlèchargement',
 'upload-recreate-warning' => "'''Atencion : un fichiér avouéc cél nom est étâ suprimâ ou ben dèplaciê.'''
 
 Por comoditât, lo jornal de les suprèssions et des dèplacements de cela pâge est balyê ce-desot :",
 'uploadtext' => "Empleyéd lo formulèro ce-desot por tèlèchargiér des fichiérs.
-Por vêre ou ben rechèrchiér des fichiérs tèlèchargiês dês devant, vêde la [[Special:FileList|lista des fichiérs tèlèchargiês]]. Los (re-)tèlèchargements sont asse-ben encartâs dedens lo [[Special:Log/upload|jornal des tèlèchargements]], et les suprèssions dedens lo [[Special:Log/delete|jornal de les suprèssions]].
+Por vêre ou ben rechèrchiér des fichiérs tèlèchargiês dês devant, vêde la [[Special:FileList|lista des fichiérs tèlèchargiês]]. Los (re-)tèlèchargements sont asse-ben encartâs sur lo [[Special:Log/upload|jornal des tèlèchargements]], et les suprèssions sur lo [[Special:Log/delete|jornal de les suprèssions]].
 
 Por entrebetar un fichiér dedens na pâge, empleyéd un lim de yona de cetes fôrmes :
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.jpg]]</nowiki></code>''' por empleyér la vèrsion en plêna largior du fichiér
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.png|200px|thumb|left|tèxto dèscriptif]]</nowiki></code>''' por empleyér na figura de 200 pixèls de lârjo dedens na bouèta gôche avouéc « tèxto dèscriptif » coment dèscripcion
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.png|200px|thumb|left|tèxto dèscriptif]]</nowiki></code>''' por empleyér na figura de 200 pixèls de lârjo dedens na bouèta gôche avouéc « tèxto dèscriptif » coment dèscripcion
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichiér.ogg]]</nowiki></code>''' por liyér tot drêt vers lo fichiér sen lo fâre vêre",
 'upload-permitted' => 'Tipos de fichiérs ôtorisâs : $1.',
 'upload-preferred' => 'Tipos de fichiérs prèferâs : $1.',
@@ -1788,7 +1789,7 @@ Se vos plét, renomâd-lo et pués tornâd-lo tèlèchargiér.',
 'filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
 'filetype-banned' => 'Cél tipo de fichiér est dèfendu.',
 'verification-error' => 'Cél fichiér pâsse pas lo contrôlo des fichiérs.',
-'hookaborted' => 'Lo changement que vos éd èprovâ de fâre est étâ anulâ per n’èxtension.',
+'hookaborted' => 'Lo changement que vos éd èprovâ de fâre est étâ anulâ per un’èxtension.',
 'illegal-filename' => 'Lo nom du fichiér est pas ôtorisâ.',
 'overwrite' => 'Ècllafar un fichiér ègzistent est pas ôtorisâ.',
 'unknown-error' => 'Na fôta encognua est arrevâ.',
@@ -1811,12 +1812,12 @@ Por o fâre, vos la devréd changiér a la man.
 * Nom du fichiér a tèlèchargiér : <strong>[[:$1]]</strong>
 * Nom du fichiér ègzistent : <strong>[[:$2]]</strong>
 Se vos plét, chouèsésséd-nen un ôtro.',
-'fileexists-thumbnail-yes' => "Lo fichiér semble étre n’émâge en talye rèduita ''(figura)''.
+'fileexists-thumbnail-yes' => "Lo fichiér semble étre un’émâge en talye rèduita ''(figura)''.
 [[$1|thumb]]
 Se vos plét, controlâd lo fichiér <strong>[[:$1]]</strong>.
 Se lo fichiér controlâ est la mém’émâge avouéc la talye originâla, y at pas fôta de tèlèchargiér na figura.",
 'file-thumbnail-no' => "Lo nom du fichiér comence per <strong>$1</strong>.
-Semble étre n’émâge en talye rèduita ''(figura)''.
+Semble étre un’émâge en talye rèduita ''(figura)''.
 Se vos éd cel’émâge en plêna rèsolucion, tèlèchargiéd-la, ôtrament changiéd lo sin nom, se vos plét.",
 'fileexists-forbidden' => 'Un fichiér avouéc cél nom ègziste ja et pôt pas étre ècllafâ.
 Se vos voléd adés tèlèchargiér voutron fichiér, se vos plét tornâd arriér et pués empleyéd un novél nom.
@@ -1900,7 +1901,7 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
 'backend-fail-notsame' => 'Un fichiér pas pariér ègziste ja a « $1 ».',
 'backend-fail-invalidpath' => '« $1 » est pas un chemin de stocâjo justo.',
 'backend-fail-delete' => 'Y at pas moyen de suprimar lo fichiér « $1 ».',
-'backend-fail-describe' => 'Y at pas moyen de changiér les mètadonâs du fichiér « $1 ».',
+'backend-fail-describe' => 'Y at pas moyen de changiér les mètabalyês du fichiér « $1 ».',
 'backend-fail-alreadyexists' => 'Lo fichiér « $1 » ègziste ja.',
 'backend-fail-store' => 'Y at pas moyen de stocar lo fichiér « $1 » dedens « $2 ».',
 'backend-fail-copy' => 'Y at pas moyen de copiyér lo fichiér « $1 » vers « $2 ».',
@@ -1920,8 +1921,8 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
 'backend-fail-usable' => 'Y at pas moyen de liére d’ècrire lo fichiér « $1 » a côsa de pèrmissions ensufisentes ou ben de rèpèrtouèros / conteniors manquents.',
 
 # File journal errors
-'filejournal-fail-dbconnect' => 'Y at pas moyen de sè branchiér a la bâsa de donâs du jornal por lo sistèmo de stocâjo « $1 ».',
-'filejournal-fail-dbquery' => 'Y at pas moyen de betar a jorn la bâsa de donâs du jornal por lo sistèmo de stocâjo « $1 ».',
+'filejournal-fail-dbconnect' => 'Y at pas moyen de sè branchiér a la bâsa de balyês du jornal por lo sistèmo de stocâjo « $1 ».',
+'filejournal-fail-dbquery' => 'Y at pas moyen de betar a jorn la bâsa de balyês du jornal por lo sistèmo de stocâjo « $1 ».',
 
 # Lock manager
 'lockmanager-notlocked' => 'Y at pas moyen de dèvèrrolyér « $1 » ; il est pas vèrrolyê.',
@@ -1930,8 +1931,8 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
 'lockmanager-fail-acquirelock' => 'Y at pas moyen d’avêr lo vèrroly por « $1 ».',
 'lockmanager-fail-openlock' => 'Y at pas moyen d’uvrir lo fichiér de vèrroly por « $1 ».',
 'lockmanager-fail-releaselock' => 'Y at pas moyen de relâchiér lo vèrroly por « $1 ».',
-'lockmanager-fail-db-bucket' => 'Y at pas moyen de sè veriér vers prod de bâses de donâs de vèrroly dedens la sèlye $1.',
-'lockmanager-fail-db-release' => 'Y at pas moyen de relâchiér los vèrrolys sur la bâsa de donâs $1.',
+'lockmanager-fail-db-bucket' => 'Y at pas moyen de sè veriér vers prod de bâses de balyês de vèrroly dedens la sèlye $1.',
+'lockmanager-fail-db-release' => 'Y at pas moyen de relâchiér los vèrrolys sur la bâsa de balyês $1.',
 'lockmanager-fail-svr-acquire' => 'Y at pas moyen d’avêr des vèrrolys sur lo sèrvior $1.',
 'lockmanager-fail-svr-release' => 'Y at pas moyen de relâchiér los vèrrolys sur lo sèrvior $1.',
 
@@ -1948,7 +1949,7 @@ Pôt pas étre controlâ coment fôt por la sècuritât.',
 'uploadstash-summary' => 'Ceta pâge balye accès ux fichiérs que sont tèlèchargiês ou ben en côrs de tèlèchargement, mas sont p’oncor publeyês dedens lo vouiqui. Celos fichiérs sont p’oncor visiblos, solament por l’utilisator que los at tèlèchargiês.',
 'uploadstash-clear' => 'Èfaciér los fichiérs en cacho',
 'uploadstash-nofiles' => 'Vos éd gins de fichiér en cacho.',
-'uploadstash-badtoken' => 'L’ègzécucion de cel’accion at pas reussi, pôt-étre perce que voutros identifients de changement ont èxpirâ. Tornâd èprovar.',
+'uploadstash-badtoken' => 'L’ègzécucion de cel’accion at pas reussi, pôt-étre perce que voutros identifients de changement ant èxpirâ. Tornâd èprovar.',
 'uploadstash-errclear' => 'L’èfacement des fichiérs at pas reussi.',
 'uploadstash-refresh' => 'Rafrèchir la lista des fichiérs',
 'invalid-chunk-offset' => 'Dèplacement de bocon pas justo',
@@ -1989,13 +1990,13 @@ Se vos plét, tornâd controlar que l’URL est justa et pués que lo seto est e
 'upload-curl-error28' => 'Dèlê dèpassâ pendent lo tèlèchargement',
 'upload-curl-error28-text' => 'Lo seto at tardâ bien a rèpondre.
 Se vos plét, controlâd que lo seto est en legne, atende un pou et pués tornâd èprovar.
-Vos pouede asse-ben èprovar a n’hora de muendra afluence.',
+Vos pouede asse-ben èprovar a un’hora de muendra afluence.',
 
 'license' => 'Licence :',
 'license-header' => 'Licence',
 'nolicense' => 'Pas yona chouèsia',
 'license-nopreview' => '(Apèrçu pas disponiblo)',
-'upload_source_url' => ' (n’URL justa et accèssibla publicament)',
+'upload_source_url' => ' (un’URL justa et accèssibla publicament)',
 'upload_source_file' => ' (un fichiér sur voutron ordenator)',
 
 # Special:ListFiles
@@ -2063,7 +2064,7 @@ Pôt-étre vos voléd changiér la dèscripcion sur la sina [$2 pâge de dèscri
 'filerevert-defaultcomment' => 'Rèvocâ a la vèrsion du $1 a $2',
 'filerevert-submit' => 'Rèvocar',
 'filerevert-success' => "'''[[Media:$1|$1]]''' est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
-'filerevert-badversion' => 'Y at gins de vèrsion locala devant de cél fichiér avouéc l’horodatâjo balyê.',
+'filerevert-badversion' => 'Y at gins de vèrsion locâla devant de cél fichiér avouéc l’horodatâjo balyê.',
 
 # File deletion
 'filedelete' => 'Suprimar $1',
@@ -2130,15 +2131,21 @@ Oubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devan
 'statistics-views-peredit' => 'Vues per changement',
 'statistics-users' => '[[Special:ListUsers|Utilisators]] encartâs',
 'statistics-users-active' => 'Utilisators actifs',
-'statistics-users-active-desc' => 'Utilisators qu’ont fêt por lo muens n’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
+'statistics-users-active-desc' => 'Utilisators qu’ant fêt por lo muens un’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
 'statistics-mostpopular' => 'Pâges les ples vues',
 
-'disambiguations' => 'Pâges qu’ont des lims de vers des pâges d’homonimia',
+'disambiguations' => 'Pâges qu’ant des lims de vers des pâges d’homonimia',
 'disambiguationspage' => 'Template:Homonimia',
-'disambiguations-text' => "Cetes pâges ont por lo muens un lim de vers na '''pâge d’homonimia'''.
+'disambiguations-text' => "Cetes pâges ant por lo muens un lim de vers na '''pâge d’homonimia'''.
 Devriant pletout pouentar vers na pâge que vat avouéc.<br />
 Na pâge est trètâye coment na pâge d’homonimia s’emplèye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pâges avouéc na propriètât de pâge',
+'pageswithprop-legend' => 'Pâges avouéc na propriètât de pâge',
+'pageswithprop-text' => 'Ceta pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.',
+'pageswithprop-prop' => 'Nom de la propriètât :',
+'pageswithprop-submit' => 'Alar trovar',
+
 'doubleredirects' => 'Redirèccions dobles',
 'doubleredirectstext' => 'Ceta pâge liste les pâges que redirijont vers d’ôtres pâges de redirèccion.
 Châque renche contint des lims de vers la premiére et la seconda redirèccion, et pués la ciba de la seconda redirèccion, cen que balye habituèlament la « veré » pâge ciba, de vers laquinta la premiére redirèccion devrêt pouentar.
@@ -2154,7 +2161,7 @@ Ora redirige vers [[$2]].',
 'brokenredirects-delete' => 'suprimar',
 
 'withoutinterwiki' => 'Pâges sen lims entèrlengoues',
-'withoutinterwiki-summary' => 'Cetes pâges ont gins de lim de vers d’ôtres lengoues.',
+'withoutinterwiki-summary' => 'Cetes pâges ant gins de lim de vers d’ôtres lengoues.',
 'withoutinterwiki-legend' => 'Prèfixo',
 'withoutinterwiki-submit' => 'Montrar',
 
@@ -2219,7 +2226,7 @@ Ora redirige vers [[$2]].',
 'move' => 'Dèplaciér',
 'movethispage' => 'Dèplaciér ceta pâge',
 'unusedimagestext' => 'Cetos fichiérs ègzistont, mas sont pas entrebetâs dedens niona pâge.
-Se vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc n’URL drêta, donc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.',
+Se vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc un’URL drêta, donc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.',
 'unusedcategoriestext' => 'Cetes catègories ègzistont, mas nion’ôtra pâge niona catègorie les emplèye.',
 'notargettitle' => 'Niona ciba',
 'notargettext' => 'Vos éd pas spècifiâ na pâge un utilisator ciba sur laquinta / loquint vos souhètâd fâre cel’accion.',
@@ -2244,8 +2251,8 @@ Se vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers u
 'log' => 'Jornals',
 'all-logs-page' => 'Tôs los jornals publicos',
 'alllogstext' => 'Vua combinâye de tôs los jornals disponiblos dessus {{SITENAME}}.
-Vos pouede rètrendre la vua en chouèséssent un tipo de jornal, lo nom d’utilisator (sensiblo a la câssa) la pâge regardâye (sensibla la câssa avouéc).',
-'logempty' => 'Niona piéce que corrèspond dedens lo jornal.',
+Vos pouede rètrendre la vua en chouèséssent un tipo de jornal, lo nom d’utilisator (sensiblo a la câssa) la pâge regardâye (sensibla la câssa avouéc).',
+'logempty' => 'Niona piéce que corrèspond sur lo jornal.',
 'log-title-wildcard' => 'Chèrchiér entre-mié los titros que començont per cél tèxto',
 'showhideselectedlogentries' => 'Montrar / cachiér les entrâs de jornal chouèsies',
 
@@ -2263,7 +2270,7 @@ Vos pouede rètrendre la vua en chouèséssent un tipo de jornal, lo nom d’uti
 'allpagesnext' => 'Aprés',
 'allpagessubmit' => 'Listar',
 'allpagesprefix' => 'Fâre vêre les pâges que començont per lo prèfixo :',
-'allpagesbadtitle' => 'Lo titro de la pâge balyêe est pas justo ou ben il at un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.
+'allpagesbadtitle' => 'Lo titro de la pâge balyêe est pas justo ou ben contint un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.
 Contint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.',
 'allpages-bad-ns' => '{{SITENAME}} at gins d’èspâço de noms « $1 ».',
 'allpages-hide-redirects' => 'Cachiér les redirèccions',
@@ -2293,7 +2300,7 @@ Vêde asse-ben les [[Special:WantedCategories|catègories demandâyes]].',
 'linksearch-ns' => 'Èspâço de noms :',
 'linksearch-ok' => 'Rechèrchiér',
 'linksearch-text' => 'Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.
-Ils ont fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />
+Ils ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />
 {{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : <code>$1</code> (http:// per dèfôt se nion protocolo est spècifiâ).',
 'linksearch-line' => '$1 est liyê dês $2',
 'linksearch-error' => 'Los caractèros j·oquères pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.',
@@ -2306,7 +2313,7 @@ Ils ont fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *
 
 # Special:ActiveUsers
 'activeusers' => 'Lista des utilisators actifs',
-'activeusers-intro' => 'O est na lista des utilisators qu’ont ègzèrciê n’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
+'activeusers-intro' => 'O est na lista des utilisators qu’ant ègzèrciê un’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
 'activeusers-count' => '$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}',
 'activeusers-from' => 'Fâre vêre los utilisators dês :',
 'activeusers-hidebots' => 'Cachiér los robots',
@@ -2332,9 +2339,9 @@ Y pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] su
 'listgrouprights-addgroup-self-all' => 'Sè pôt apondre totes les tropes a son prôpro compto',
 'listgrouprights-removegroup-self-all' => 'Sè pôt enlevar totes les tropes de son prôpro compto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nion’adrèce d’èxpèdior',
-'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr spècifiâ n’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
+'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr spècifiâ un’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
 'emailuser' => 'Lui mandar un mèssâjo',
 'emailuser-title-target' => 'Mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}',
 'emailuser-title-notarget' => 'Mandar un mèssâjo a l’utilisator',
@@ -2346,7 +2353,7 @@ L’adrèce èlèctronica que vos éd buchiêe dens voutres [[Special:Preference
 'usermaildisabled' => 'L’èxpèdicion de mèssâjos entre utilisators est dèsactivâye',
 'usermaildisabledtext' => 'Vos pouede pas mandar de mèssâjos a d’ôtros utilisators sur ceti vouiqui',
 'noemailtitle' => 'Nion’adrèce èlèctronica',
-'noemailtext' => 'Cet’utilisator at pas spècifiâ n’adrèce èlèctronica justa.',
+'noemailtext' => 'Cet’utilisator at pas spècifiâ un’adrèce èlèctronica justa.',
 'nowikiemailtitle' => 'Niona mèssageria èlèctronica ôtorisâye',
 'nowikiemailtext' => 'Cél utilisator at chouèsi de pas recêvre de mèssâjos de la pârt d’ôtros utilisators.',
 'emailnotarget' => 'Nom d’utilisator du dèstinatèro pas ègzistent pas justo.',
@@ -2366,7 +2373,7 @@ L’adrèce èlèctronica que vos éd buchiêe dens voutres [[Special:Preference
 'emailuserfooter' => 'Ceti mèssâjo est étâ mandâ per « $1 » a « $2 » per la fonccion « Lui mandar un mèssâjo » de {{SITENAME}}.',
 
 # User Messenger
-'usermessage-summary' => 'Il at lèssiê un mèssâjo sistèmo.',
+'usermessage-summary' => 'At lèssiê un mèssâjo sistèmo.',
 'usermessage-editor' => 'Mèssagiér du sistèmo',
 'usermessage-template' => 'MediaWiki:MèssâjoUtilisator',
 
@@ -2432,7 +2439,7 @@ Veriéd-vos vers lo contributor :
 mèl. : $PAGEEDITOR_EMAIL
 vouiqui : $PAGEEDITOR_WIKI
 
-Y arat gins d’ôtra notificacion en câs de changements a vegnir, a muens que vos visitâd cela pâge. Vos pouede asse-ben tornar inicialisar los segnalements de notificacion por totes les pâges de voutra lista de survelyence.
+Y 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.
 
 Voutron sistèmo de notificacion de {{SITENAME}}
 
@@ -2440,10 +2447,10 @@ Voutron sistèmo de notificacion de {{SITENAME}}
 Por changiér la configuracion de notificacion per mèssageria èlèctronica, visitâd
 {{canonicalurl:{{#special:Preferences}}}}
 
-Por changiér la configuracion de voutra lista de survelyence, visitâd
+Por changiér la configuracion de voutra lista de siuvu, visitâd
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Por suprimar la pâge de voutra lista de survelyence, visitâd
+Por suprimar la pâge de voutra lista de siuvu, visitâd
 $UNWATCHURL
 
 Avis et assistance de ples :
@@ -2454,21 +2461,21 @@ Avis et assistance de ples :
 # Delete
 'deletepage' => 'Suprimar la pâge',
 'confirm' => 'Confirmar',
-'excontent' => 'contegnéve « $1 »',
-'excontentauthor' => 'contegnéve « $1 » (et son solèt contributor ére « [[Special:Contributions/$2|$2]] »)',
-'exbeforeblank' => 'contegnéve devant blanchiment « $1 »',
+'excontent' => 'lo contegnu ére : « $1 »',
+'excontentauthor' => 'lo contegnu ére : « $1 » (et lo solèt contributor ére « [[Special:Contributions/$2|$2]] »)',
+'exbeforeblank' => 'lo contegnu devant blanchiment ére : « $1 »',
 'exblank' => 'la pâge ére voueda',
 'delete-confirm' => 'Suprimar « $1 »',
 'delete-legend' => 'Suprimar',
-'historywarning' => "'''Atencion :''' la pâge que vos éte prèst a suprimar at un historico que contint a pou prés $1 {{PLURAL:$1|vèrsion|vèrsions}} :",
-'confirmdeletetext' => 'Vos éte prèst a suprimar una pâge ou ben un fichiér et pués tot son historico.
-Volyéd confirmar qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos féte cen en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].',
+'historywarning' => "'''Atencion :''' la pâge que vos éte prèst a suprimar at un historico avouéc a pou prés $1 vèrsion{{PLURAL:$1||s}} :",
+'confirmdeletetext' => 'Vos éte prèst a suprimar na pâge et pués tot lo sin historico.
+Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].',
 'actioncomplete' => 'Accion fêta',
-'actionfailed' => 'L’accion at pas reussia',
-'deletedtext' => '« $1 » at étâ suprimâ.
-Vêde lo $2 por una lista de les novèles suprèssions.',
+'actionfailed' => 'L’accion at pas reussi',
+'deletedtext' => '« $1 » est étâye suprimâye.
+Vêde lo $2 por na lista de les novèles suprèssions.',
 'dellogpage' => 'Jornal de les suprèssions',
-'dellogpagetext' => 'Vê-que la lista de les suprèssions les ples novèles.',
+'dellogpagetext' => 'Vê-que na lista de les suprèssions les ples novèles.',
 'deletionlog' => 'jornal de les suprèssions',
 'reverted' => 'Vèrsion devant rètablia',
 'deletecomment' => 'Rêson :',
@@ -2479,10 +2486,10 @@ Vêde lo $2 por una lista de les novèles suprèssions.',
 ** Violacion du drêt d’ôtor
 ** Vandalismo',
 'delete-edit-reasonlist' => 'Changiér les rêsons de suprèssion',
-'delete-toobig' => 'Ceta pâge at un historico important, dèpassent $1 vèrsion{{PLURAL:$1||s}}.
-La suprèssion de tâles pâges at étâ limitâ por èvitar des pèrturbacions emprèvues de {{SITENAME}}.',
-'delete-warning-toobig' => 'Ceta pâge at un historico important, dèpassent $1 vèrsion{{PLURAL:$1||s}}.
-La suprimar pôt troblar lo fonccionement de la bâsa de balyês de {{SITENAME}} ;
+'delete-toobig' => 'Ceta pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.
+La suprèssion de pâges d’ense est étâye rètrenta por prèvegnir des pèrturbacions emprèvues de {{SITENAME}}.',
+'delete-warning-toobig' => 'Ceta pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.
+La suprimar pôt troblar la mârche de la bâsa de balyês de {{SITENAME}} ;
 a fâre avouéc prudence.',
 
 # Rollback
@@ -2491,63 +2498,65 @@ a fâre avouéc prudence.',
 'rollbacklink' => 'rèvocar',
 'rollbacklinkcount' => 'rèvocar $1 changement{{PLURAL:$1||s}}',
 'rollbacklinkcount-morethan' => 'rèvocar més de $1 changement{{PLURAL:$1||s}}',
-'rollbackfailed' => 'La rèvocacion at pas reussia',
-'cantrollback' => 'Empossiblo de rèvocar lo changement ;
+'rollbackfailed' => 'La rèvocacion at pas reussi',
+'cantrollback' => 'Y at pas moyen de rèvocar lo changement ;
 lo dèrriér contributor est lo solèt ôtor de ceta pâge.',
-'alreadyrolled' => 'Empossiblo de rèvocar lo dèrriér changement de la pâge « [[:$1]] » fêt per [[User:$2|$2]] ([[User talk:$2|Discutar]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
-quârqu’un d’ôtro at ja changiê ou ben rèvocâ la pâge.
+'alreadyrolled' => 'Y at pas moyen de rèvocar lo dèrriér changement de la pâge « [[:$1]] » fêt per [[User:$2|$2]] ([[User talk:$2|discutar]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
+un ôtro at ja changiê ou ben rèvocâ la pâge.
 
-Lo dèrriér changement de la pâge at étâ fêt per [[User:$3|$3]] ([[User talk:$3|Discutar]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Lo dèrriér changement de la pâge est étâ fêt per [[User:$3|$3]] ([[User talk:$3|discutar]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Lo rèsumâ de changement ére : « ''$1'' ».",
-'revertpage' => 'Rèvocacion des changements a [[Special:Contributions/$2|$2]] ([[User talk:$2|Discutar]]) de vers la dèrriére vèrsion a [[User:$1|$1]]',
-'revertpage-nouser' => 'Rèvocacion des changements per (nom d’usanciér suprimâ) a la dèrriére vèrsion per [[User:$1|$1]]',
-'rollback-success' => 'Rèvocacion des changements fêts per $1 ;
-rètablissement de la dèrriére vèrsion per $2.',
+'revertpage' => 'Rèvocacion des changements de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]]) de vers la dèrriére vèrsion de [[User:$1|$1]]',
+'revertpage-nouser' => 'Rèvocacion des changements de (nom d’utilisator enlevâ) de vers la dèrriére vèrsion de [[User:$1|$1]]',
+'rollback-success' => 'Rèvocacion des changements de $1 ;
+rèstoracion de la dèrriére vèrsion de $2.',
 
 # Edit tokens
-'sessionfailure-title' => 'Èrror de sèance',
+'sessionfailure-title' => 'Falyita de sèance',
 'sessionfailure' => 'Voutra sèance de branchement semble avêr des problèmos ;
-cela accion at étâ anulâ en prèvencion d’un piratâjo de sèance.
-Volyéd clicar dessus « Devant », rechargiér la pâge de yô que vos vegnéd, et pués tornar èprovar.',
+cel’accion est étâye anulâye en prèvencion d’un piratâjo de sèance.
+Se vos plét, clicâd dessus « Devant », rechargiéd la pâge de yô que vos vegnéd et pués tornâd èprovar.',
 
 # Protect
 'protectlogpage' => 'Jornal de les protèccions',
-'protectlogtext' => 'Vê-que na lista des changements de protèccion de les pâges.
-Vêde la [[Special:ProtectedPages|lista de les pâges protègiêyes]] por la lista de les protèccions que sont ora actives.',
+'protectlogtext' => 'Vê-que na lista des changements de les protèccions de pâges.
+Vêde la [[Special:ProtectedPages|lista de les pâges protègiêes]] por la lista de les protèccions que sont ora actives.',
 'protectedarticle' => 'at protègiê « [[$1]] »',
 'modifiedarticleprotection' => 'at changiê lo nivél de protèccion de « [[$1]] »',
 'unprotectedarticle' => 'at enlevâ la protèccion de « [[$1]] »',
-'movedarticleprotection' => 'at dèplaciê los paramètres de protèccion dês « [[$2]] » vers « [[$1]] »',
-'protect-title' => 'Changiér lo nivél de protèccion por « $1 »',
+'movedarticleprotection' => 'at dèplaciê la configuracion de protèccion dês « [[$2]] » vers « [[$1]] »',
+'protect-title' => 'Changiér lo nivél de protèccion de « $1 »',
 'protect-title-notallowed' => 'Vêre lo nivél de protèccion de « $1 »',
-'prot_1movedto2' => 'at renomâ [[$1]] en [[$2]]',
+'prot_1movedto2' => 'at dèplaciê [[$1]] vers [[$2]]',
 'protect-badnamespace-title' => 'Èspâço de noms pas protèjâblo',
-'protect-badnamespace-text' => 'Les pâges dens ceti èspâço de noms pôvont pas étre protègiês.',
+'protect-badnamespace-text' => 'Les pâges dedens cet’èspâço de noms pôvont pas étre protègiêes.',
+'protect-norestrictiontypes-text' => 'Cela pâge pôt pas étre protègiêe, y at gins de tipo de rèstriccion disponiblo.',
+'protect-norestrictiontypes-title' => 'Pâge pas protèjâbla',
 'protect-legend' => 'Confirmar la protèccion',
 'protectcomment' => 'Rêson :',
 'protectexpiry' => 'Dâta d’èxpiracion :',
-'protect_expiry_invalid' => 'La dâta d’èxpiracion est envalida.',
-'protect_expiry_old' => 'La dâta d’èxpiracion est ja passâ.',
+'protect_expiry_invalid' => 'La dâta d’èxpiracion est pas justa.',
+'protect_expiry_old' => 'La dâta d’èxpiracion est ja passâye.',
 'protect-unchain-permissions' => 'Dèvèrrolyér adés més de chouèx de protèccion',
-'protect-text' => "Vos pouede vêre et changiér lo nivél de protèccion de la pâge '''$1'''.",
-'protect-locked-blocked' => "Vos pouede pas changiér los nivéls de protèccion tant que vos éte blocâ.
+'protect-text' => "Ique vos pouede vêre et changiér lo nivél de protèccion de la pâge '''$1'''.",
+'protect-locked-blocked' => "Vos pouede pas changiér los nivéls de protèccion tant que vos éte blocâ{{GENDER:||ye|(ye)}}.
 Vê-que la configuracion d’ora de la pâge '''$1''' :",
-'protect-locked-dblock' => "Los nivéls de protèccion pôvont pas étre changiês perce que la bâsa de balyês est vèrrolyê.
+'protect-locked-dblock' => "Los nivéls de protèccion pôvont pas étre changiês, la bâsa de balyês est vèrrolyêe.
 Vê-que la configuracion d’ora de la pâge '''$1''' :",
-'protect-locked-access' => "Vos avéd pas los drêts nècèssèros por changiér los nivéls de protèccion de pâges.
+'protect-locked-access' => "Voutron compto at pas los drêts nècèssèros por changiér los nivéls de protèccion de pâges.
 Vê-que la configuracion d’ora de la pâge '''$1''' :",
-'protect-cascadeon' => 'Ora, ceta pâge est protègiê perce qu’el est encllua dens {{PLURAL:$1|ceta pâge|cetes pâges}}, {{PLURAL:$1|qu’at étâ protègiê|qu’ont étâ protègiês}} avouéc lo chouèx « Protèccion en cascâda » activâ.
-Vos pouede changiér lo nivél de protèccion de ceta pâge sen que cen afècte la protèccion en cascâda.',
-'protect-default' => 'Ôtorisar tôs los usanciérs',
-'protect-fallback' => 'At fôta de la pèrmission « $1 »',
-'protect-level-autoconfirmed' => 'Blocar los novéls usanciérs et los usanciérs pas encartâs',
-'protect-level-sysop' => 'Solament los administrators',
+'protect-cascadeon' => 'Ora cela pâge-que est protègiêe, el est entrebetâye dedens {{PLURAL:$1|ceta pâge qu’est étâye protègiêe|cetes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ.
+Vos pouede changiér lo nivél de protèccion de cela pâge sen que cen afècte la protèccion en cascâda.',
+'protect-default' => 'Ôtorisar tôs los utilisators',
+'protect-fallback' => 'Ôtorisar ren que los utilisators avouéc lo drêt « $1 »',
+'protect-level-autoconfirmed' => 'Ôtorisar ren que los utilisators ôtoconfirmâs',
+'protect-level-sysop' => 'Ôtorisar ren que los administrators',
 'protect-summary-cascade' => 'protèccion en cascâda',
-'protect-expiring' => 'èxpire lo $1 (UTC)',
+'protect-expiring' => 'èxpire lo $2 a $3 (UTC)',
 'protect-expiring-local' => 'èxpire lo $1',
 'protect-expiry-indefinite' => 'sen fin',
-'protect-cascade' => 'Protège asse-ben les pâges encllues dens ceta (protèccion en cascâda).',
-'protect-cantedit' => 'Vos pouede pas changiér los nivéls de protèccion de ceta pâge perce que vos avéd pas la pèrmission de la changiér.',
+'protect-cascade' => 'Protègiér les pâges entrebetâyes dedens ceta (protèccion en cascâda)',
+'protect-cantedit' => 'Vos pouede pas changiér los nivéls de protèccion de ceta pâge, vos éd pas la pèrmission de la changiér.',
 'protect-othertime' => 'Ôtra dâta d’èxpiracion :',
 'protect-othertime-op' => 'ôtra dâta d’èxpiracion',
 'protect-existing-expiry' => 'Dâta d’èxpiracion ègzistenta : $2 a $3',
@@ -2562,25 +2571,25 @@ Vos pouede changiér lo nivél de protèccion de ceta pâge sen que cen afècte
 'protect-expiry-options' => '1 hora:1 hour,1 jorn:1 day,1 semana:1 week,2 semanes:2 weeks,1 mês:1 month,3 mês:3 months,6 mês:6 months,1 an:1 year,sen fin:infinite',
 'restriction-type' => 'Pèrmission :',
 'restriction-level' => 'Nivél de rèstriccion :',
-'minimum-size' => 'Talye la ples petiôta',
-'maximum-size' => 'Talye la ples granta :',
+'minimum-size' => 'Talye minimon',
+'maximum-size' => 'Talye maximon :',
 'pagesize' => '(octèts)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Changiér',
-'restriction-move' => 'Renomar',
+'restriction-move' => 'Dèplaciér',
 'restriction-create' => 'Fâre',
 'restriction-upload' => 'Tèlèchargiér',
 
 # Restriction levels
-'restriction-level-sysop' => 'Protèccion complèta',
-'restriction-level-autoconfirmed' => 'Mié-protèccion',
-'restriction-level-all' => 'Tôs los nivéls',
+'restriction-level-sysop' => 'protèccion complèta',
+'restriction-level-autoconfirmed' => 'mié-protèccion',
+'restriction-level-all' => 'tôs los nivéls',
 
 # Undelete
 'undelete' => 'Vêre les pâges suprimâyes',
 'undeletepage' => 'Vêre et refâre des pâges suprimâyes',
-'undeletepagetitle' => "'''Ceta lista contint des vèrsions suprimâs de [[:$1|$1]].'''",
+'undeletepagetitle' => "'''Ceta lista contint des vèrsions suprimâyes de [[:$1|$1]].'''",
 'viewdeletedpage' => 'Vêre les pâges suprimâyes',
 'undeletepagetext' => '{{PLURAL:$1|Ceta pâge at étâ suprimâ et sè trove|Cetes pâges ont étâ suprimâs et sè trovont}} dens les arch·ives, de yô que pô{{PLURAL:$1||von}}t adés étre refêt{{PLURAL:$1|a|es}}.
 Les arch·ives pôvont étre èfaciês règuliérement.',
@@ -2754,7 +2763,7 @@ Vêde la [[Special:BlockList|lista des blocâjos]] por revêre los blocâjos.',
 'blocklist-params' => 'Paramètres de blocâjo',
 'blocklist-reason' => 'Rêson',
 'ipblocklist-submit' => 'Rechèrchiér',
-'ipblocklist-localblock' => 'Blocâjo local',
+'ipblocklist-localblock' => 'Blocâjo locâl',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Ôtro blocâjo|Ôtros blocâjos}}',
 'infiniteblock' => 'sen fin',
 'expiringblock' => 'èxpire lo $1 a $2',
@@ -3735,7 +3744,7 @@ Los ôtros champs seront cachiês per dèfôt.
 'monthsall' => 'tôs',
 'limitall' => 'tôs',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar l’adrèce èlèctronica',
 'confirmemail_noemail' => 'Vos éd pas dèfeni una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]].',
 'confirmemail_text' => '{{SITENAME}} at fôta du contrôlo de voutra adrèce èlèctronica devant que povêr utilisar tota fonccion de mèssageria.
index 4d0846f..24cbbea 100644 (file)
@@ -527,7 +527,7 @@ Wees sü gödj än täif, bit dü wider ferseechst.',
 'loginlanguagelabel' => 'Spräke: $1',
 'suspicious-userlogout' => 'Dan Oufmäldönjfrååge wörd ferwaigred, deer ja fermouslik foon en defäkte browser unti en cache-proxy sånd wörd.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
 'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
 'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
@@ -1053,7 +1053,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-interwiki-default' => '$1 resultoote:',
 'search-interwiki-more' => '(widere)',
 'search-relatedarticle' => 'früne',
-'mwsuggest-disable' => 'forsliike per Ajax deaktiviire',
+'mwsuggest-disable' => "Föörslacher för't sjüken deaktiwiare",
 'searcheverything-enable' => 'Onj ål noomerüme säke',
 'searchrelated' => 'früne',
 'searchall' => 'åle',
@@ -1195,7 +1195,7 @@ Do san jo ual iinstelangen wech.',
 'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
 'prefs-diffs' => 'Ferskeel',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
 'email-address-validity-invalid' => 'Du en echt E-Mail-adres uun.',
 
@@ -1448,7 +1448,7 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(lasmoote-list)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-mail tu dideere brüker',
 
 # Watchlist
index ce0e3da..07775cb 100644 (file)
@@ -49,7 +49,7 @@ $messages = array(
 'tog-editsection' => 'Cuir am comas deasachadh earainn le ceanglaichean [deasaich]',
 'tog-editsectiononrightclick' => "Cuir an comas deasachadh earainn le briogadh deas air tiotal de dh'earrainn (feumaidh seo JavaScript)",
 'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
-'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|latha|latha|làithean|latha}})",
+'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",
@@ -145,19 +145,19 @@ $messages = array(
 'dec' => 'Dùbh',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
+'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
 'category_header' => 'Duilleagan sa roinn "$1"',
 'subcategories' => 'Fo-roinnean',
 'category-media-header' => 'Meadhanan sa roinn "$1"',
 'category-empty' => "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
-'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
+'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
 'hidden-category-category' => 'Roinnean falaichte',
-'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
-'category-subcat-count-limited' => 'Tha {{PLURAL:$1|am fo-roinn-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
-'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag| an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
-'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle| an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
+'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
+'category-subcat-count-limited' => 'Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
+'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
+'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
 'listingcontinuesabbrev' => 'leant.',
 'index-category' => "Duilleagan air a' chlàr-innse",
 'noindex-category' => "Duilleagan nach eil air a' chlàr-innse",
@@ -224,8 +224,8 @@ $messages = array(
 'create-this-page' => 'Cruthaich an duilleag seo',
 'delete' => 'Sguab às',
 'deletethispage' => 'Sguab às an duilleag seo',
-'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
-'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
+'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
 'protect' => 'Dìon',
 'protect_change' => 'mùth',
 'protectthispage' => 'Dìon an duilleag seo',
@@ -253,7 +253,7 @@ $messages = array(
 'redirectedfrom' => '(Air ath-sheòladh o $1)',
 'redirectpagesub' => 'Ath-sheòl an duilleag',
 'lastmodifiedat' => 'Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.',
-'viewcount' => 'Chaidh inntrigeadh a dhèanam dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turas|$1 turais|$1 turas}}.',
+'viewcount' => 'Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.',
 'protectedpage' => 'Duilleag fo dhìon',
 'jumpto' => 'Gearr leum gu:',
 'jumptonavigation' => 'seòladh',
@@ -300,10 +300,10 @@ Seall air [[Special:Version|duilleag an tionndaidh]].',
 'youhavenewmessages' => 'Tha $1 ($2) agad.',
 'newmessageslink' => 'teachdaireachdan ùra',
 'newmessagesdifflink' => 'mùthadh mu dheireadh',
-'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
+'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
 'youhavenewmessagesmanyusers' => 'Tha $1 agad o iomadh cleachdaiche ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
+'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
 'youhavenewmessagesmulti' => 'Tha teachdaireachdan ùra agad ann an $1',
 'editsection' => 'deasaich',
 'editold' => 'deasaich',
@@ -318,7 +318,7 @@ Seall air [[Special:Version|duilleag an tionndaidh]].',
 'collapsible-expand' => 'Leudaich',
 'thisisdeleted' => 'Seall no aisig $1?',
 'viewdeleted' => 'Seall $1?',
-'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
 'feedlinks' => 'Inbhir:',
 'feed-invalid' => "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
 'feed-unavailable' => 'Chan eil inbhirean co-bhanntachd ri fhaighinn',
@@ -402,8 +402,8 @@ Cha deach adhbhar a thoirt seachad.',
 'badtitle' => 'Droch thiotal',
 'badtitletext' => "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.
 Faodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
-'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
-'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùradhadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
 'querypage-no-updates' => 'Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.
 Cha dèid an dàta an-seo ùrachadh aig an àm seo.',
 'wrong_wfQuery_params' => 'Paramatairean mì-cheart airson wfQuery()<br />
@@ -452,7 +452,7 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
 'yourname' => 'Ainm-cleachdaiche:',
 'yourpassword' => 'Am facal-faire agad',
 'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
-'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|làithean}})",
+'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
 'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
 'yourdomainname' => 'An àrainn-lìn agad:',
 'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
@@ -501,15 +501,14 @@ Cuir sùil air an litreachadh.',
 Am feuch thu ris a-rithist?',
 'wrongpasswordempty' => 'Cha do chuir thu a-steach facal-faire.
 Feuch ris a-rithist.',
-'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
+'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
 'password-name-match' => "Chan fhaod am facal-faire 's an t-ainm-cleachdaiche agad a bhith co-ionnann.",
 'password-login-forbidden' => "Tha an t-ainm-cleachdaiche 's am facal-faire seo toirmisgte.",
 'mailmypassword' => "Cuir facal-faire ùr thugam air a' phost-dealain",
 'passwordremindertitle' => 'Facal-faire sealach ùr airson {{SITENAME}}',
-'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-fair ùr airson 
-{{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
+'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-faire ùr airson {{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
 Ma bha sin fa-near dhut, bidh agad ri clàradh a-steach agus facal-faire ùr a thaghadh
-an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha}}.
 
 Ma dh\'iarr cuideigin eile seo no ma chuimhnich thu am facal-faire agad \'s mur eil thu
 airson atharrachadh tuilleadh, \'s urrainn dhut an teachdaireachd seo a leigeil seachad
@@ -521,10 +520,10 @@ Clàraich a-steach a-rithist nuair a gheibh thu e.',
 'blocked-mailpassword' => "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
 'eauthentsent' => 'Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.
 Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an treòrachadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.',
-'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.
-Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
+'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.
+Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
 'mailerror' => "Mearachd a' cur post: $1",
-'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|chunntas|chunntas|chunntas|chunntas|cunntasan|cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
 'emailauthenticated' => 'Chaidh an seòladh puist-dhealain agad a dhearbhadh $2 aig $3.',
 'emailnotauthenticated' => 'Cha deach am post-d agad a dhearbhadh fhathast.
 Cha dèid post-d a chur airson gin dhe na feartan a leanas.',
@@ -548,7 +547,7 @@ Fuirich ort mus feuch thu ris a-rithist.",
 '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.",
 
-# E-mail sending
+# Email sending
 '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.',
@@ -584,17 +583,17 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
 'passwordreset-email' => 'Seòladh puist-d:',
 'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na cunntasan|na cunntasan|na cunntasan|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
 Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an dà chunntas-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
 Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
 'passwordreset-emailelement' => 'Ainm-cleachdaiche: $1
 Facal-faire sealach: $2',
@@ -781,7 +780,7 @@ Tha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn t
 Mur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />
 Ma dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />
 '''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
-'longpageerror' => "'''Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$1 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|}}).'''
+'longpageerror' => "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''
 Cha ghabh a shàbhaladh.",
 'readonlywarning' => "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''
 'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.
@@ -794,20 +793,20 @@ Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
 'cascadeprotectedwarning' => "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
 'titleprotectedwarning' => "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''
 Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid||teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
-'templatesusedpreview' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
-'templatesusedsection' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
+'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
+'templatesusedpreview' => "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
+'templatesusedsection' => "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
 'template-protected' => '(air a dhìon)',
 'template-semiprotected' => '(air a leth-dhìon)',
-'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
 'nocreatetext' => "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.
 'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
 'nocreate-loggedin' => 'Chan eil cead agad duilleagan ùra a chruthachadh.',
 'sectioneditnotsupported-title' => 'Chan eil taic ri deasachadh earrannan',
 'sectioneditnotsupported-text' => 'Chan eil taic ri deasachadh earrannan air an duilleag seo.',
 'permissionserrors' => "Meareachd leis a' chead",
-'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
-'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
+'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
+'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
 'recreate-moveddeleted-warn' => "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''
 
 Saoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.
@@ -872,7 +871,7 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
 'history-show-deleted' => 'Na chaidh sguabadh às a-mhàin',
 'histfirst' => 'As sine',
 'histlast' => 'As ùire',
-'historysize' => '({{PLURAL:$1|1 bhaidt|$1 bhaidht|$1 bhaidht|$1 bhaidht|$1 baidhtichean|$1 baidht}})',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
 'historyempty' => '(falamh)',
 
 # Revision feed
@@ -912,7 +911,7 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'lineno' => 'Loidhne $1:',
 'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
 'editundo' => 'neo-dhèan',
-'diff-multi' => '({{PLURAL:$1|Aon 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|aon chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi' => '({{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)',
 
 # Search results
 'searchresults' => 'Toraidhean rannsachaidh',
@@ -924,11 +923,11 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'titlematches' => "Tiotalan dhuilleagan a tha a' maidseadh",
 'notitlematches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
 'notextmatches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
-'prevn' => 'an {{PLURAL:$1|$1}} mu dheireadh',
+'prevn' => 'an {{PLURAL:$1|$1}} roimhe',
 'nextn' => 'an ath {{PLURAL:$1|$1}}',
-'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} roimhe',
-'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}}',
-'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|thoradh|toradh|toraidhean|toradh}} air gach duilleag',
+'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe',
+'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}',
+'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!'''",
@@ -943,8 +942,8 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 '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-size' => '$1 ({{PLURAL:$2|1 fhacal|$2 fhacal|1 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
-'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
+'search-result-size' => '$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
+'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
 'search-result-score' => 'Buntainneas: $1%',
 'search-redirect' => '(ag ath-sheòladh $1)',
 'search-section' => '(earrann $1)',
@@ -955,8 +954,8 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'search-relatedarticle' => 'Co-cheangailte',
 'searchrelated' => 'co-cheangailte',
 'searchall' => 'a h-uile',
-'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-'showingresultsnum' => "A' nochdadh '''$3''' {{PLURAL:$3|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'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'''",
 'nonefound' => "'''Aire''': Chan dèid ach cuid dhe na namespaces a lorg a ghnàth.
 Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèanamh am broinn na susbainte gu lèir (a' gabhail a-steach nan duilleagan conaltraidh, teamplaidean is msaa), no cleachd an namespace a bha thu ag iarraidh mar ro-leasachan.",
@@ -1013,7 +1012,7 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'default' => 'an roghainn bhunaiteach',
 'prefs-custom-css' => 'CSS gnàthaichte',
 'youremail' => 'Post-dealain:',
-'username' => 'Ainm-cleachdaiche:',
+'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
 'yourrealname' => "An dearbh ainm a th' ort:",
 'yourlanguage' => 'Cànan:',
 'yournick' => 'Earr-sgrìobhadh ùr:',
@@ -1056,7 +1055,7 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 'action-move' => 'gluais an duilleag seo',
 
 # Recent changes
-'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
+'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
 'recentchanges' => 'Mùthaidhean ùra',
 'recentchanges-legend' => 'Roghainnean nam mùthaidhean ùra',
 'recentchanges-summary' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.',
@@ -1065,7 +1064,7 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 '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',
-'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1  mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
+'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
 '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',
 'rcshowhideminor' => '$1 mùthaidhean beaga',
@@ -1130,7 +1129,7 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
 'filehist-dimensions' => 'Meud',
 'filehist-comment' => 'Beachd',
 'imagelinks' => 'Cleachdadh an fhaidhle',
-'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
 'nolinkstoimage' => "Chan eil duilleag sam bith a' ceangal an-seo.",
 'sharedupload' => 'Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.',
 'sharedupload-desc-here' => "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.
@@ -1155,9 +1154,9 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 'brokenredirects' => 'Ath-stiùireidhean briste',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|bhaidht|bhaidht|bhaidht|bhaidht|baidht|baidht}}',
-'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|bhall|bhall|buill|ball}}',
-'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|sealladh|shealladh|seallaidhean|sealladh}}',
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|buill|ball}}',
+'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}',
 'uncategorizedpages' => 'Duilleagan gun roinn-seòrsa',
 'uncategorizedcategories' => 'Roinnean-seòrsa gun roinn-seòrsa',
 'unusedimages' => 'Faidhlichean gun chleachdadh',
@@ -1170,8 +1169,8 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 'ancientpages' => 'Duilleagan as sìne',
 'move' => 'Gluais',
 'movethispage' => 'Gluais an duilleag seo',
-'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire|1 nas ùire|$1 nas ùire|$1 nas ùire|$1 nas ùire}}',
-'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine|1 nas sine|$1 nas sine|$1 nas sine|$1 nas sine}}',
+'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire}}',
+'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine}}',
 
 # Book sources
 'booksources' => "Tùsan a tha 'nan leabhraichean",
@@ -1194,18 +1193,18 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 
 # Special:Categories
 'categories' => 'Roinnean-seòrsa',
-'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|sna roinntean-seòrsa|san roinn-seòrsa}} a leanas.
+'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.
 Chan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].
 Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
 
 # Special:LinkSearch
-'linksearch' => 'Ceanglaichean dhan taobh a-muigh',
+'linksearch' => 'Lorg sna ceanglaichean dhan taobh a-muigh',
 'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
 
 # Special:ListGroupRights
 'listgrouprights-members' => '(liosta de bhuill)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Cuir post-dealain dhan chleachdaiche seo',
 'emailfrom' => 'O:',
 'emailto' => 'Gu:',
@@ -1218,18 +1217,18 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 'mywatchlist' => 'An clàr-faire',
 'watchlistfor2' => 'Do $1 $2',
 'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
-'addedwatchtext' => "Chaidh an duilleag \"[[:\$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].
-Nochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd agus nochdaidh an duilleag ann an litrichean '''troma''' ann an [[Special:RecentChanges|liosta nam mùthaidhean ùra]] gum bi e furasta ri fhaicinn.",
+'addedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a chur ri [[Special:Watchlist|do chlàr-faire]].
+Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.',
 'removedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].',
 'watch' => 'Cum sùil air',
 'watchthispage' => 'Cum sùil air an duilleag seo',
 'unwatch' => 'Na cum sùil tuilleadh',
 'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
-'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag||$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 do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
 '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|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
-'wlnote' => 'Seo $1 {{PLURAL:$1|mhùthadh mu dheireadh|mhùthadh mu dheireadh|na mùthaidhean mu dheireadh|mùthadh mu dheireadh}} anns na $2 {{PLURAL:$2|uair|uair|uairean|uair}} mu dheireadh.',
+'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
+'wlnote' => 'Seo {{PLURAL:$1|an $1 mhùthadh|$1 mhùthadh|na $1 mùthaidhean|$1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.',
 'wlshowlast' => 'Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3',
 'watchlist-options' => 'Roghainnean mo chlàir-faire',
 
@@ -1268,8 +1267,8 @@ Seall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoiri
 
 # Protect
 'protectlogpage' => 'Loga an dìon',
-'protectlogtext' => "Tha liosta na chaidh a dhìon 's a neo-dhìon gu h-ìosal.
-Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
+'protectlogtext' => 'Tha liosta na chaidh a dhìon gu h-ìosal.
+Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.',
 'protectedarticle' => '"[[$1]]" air a dhìon',
 'modifiedarticleprotection' => 'a dh\'atharraich an ìre dìon de "[[$1]]"',
 'unprotectedarticle' => 'a neo-dhìon "[[$1]]"',
@@ -1283,12 +1282,12 @@ Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson
 'protect-text' => "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
 'protect-locked-access' => "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.
 Seo roghainnean làithreach na duilleige '''$1''':",
-'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|san duilleag|sna duilleagan|san duilleag|sna duilleagan|san duilleag|sna duilleagan}} a leanas aig a bheil dìon easach air.
+'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1  duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.
 'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
 'protect-default' => 'Ceadaich a h-uile cleachdaiche',
-'protect-fallback' => 'Iarr cead "$1"',
-'protect-level-autoconfirmed' => 'Cuir bacadh air cleachdaichean ùra is feadhainn gun chlàrachadh',
-'protect-level-sysop' => 'Rianadairean a-mhàin',
+'protect-fallback' => 'Na ceadaich ach do chleachdaichean aig a bheil cead "$1"',
+'protect-level-autoconfirmed' => 'Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail',
+'protect-level-sysop' => 'Na ceadaich ach rianadairean',
 'protect-summary-cascade' => 'mar eas',
 'protect-expiring' => 'falbhaidh an ùine air $1 (UTC)',
 'protect-cascade' => "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
@@ -1297,7 +1296,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'restriction-level' => 'Ìre bacaidh:',
 
 # Undelete
-'undeleterevisions' => 'Chaidh $1 {{PLURAL:$1|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreacan|leth-bhreac}} a chur san tasg-lann',
+'undeleterevisions' => 'Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann',
 'undeletelink' => 'seall/aisig',
 'undeleteviewlink' => 'seall',
 
@@ -1334,8 +1333,8 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'isredirect' => 'duilleag ath-sheòlaidh',
 'istemplate' => 'transclusion',
 'isimage' => 'ceangal faidhle',
-'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe|roimhe|$1 roimhe|$1 roimhe|$1 roimhe}}',
-'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|an ath|an ath $1|an ath $1|an ath $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe}}',
+'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}',
 'whatlinkshere-links' => '← ceanglaichean',
 'whatlinkshere-hideredirs' => '$1 ath-sheòlaidhean',
 'whatlinkshere-hidetrans' => '$1 transclusions',
@@ -1350,8 +1349,8 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'ipboptions' => '2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite',
 'badipaddress' => "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
 'blockipsuccesssub' => "Shoirbhich leat leis a' bhacadh",
-'blockipsuccesstext' => "Tha [[Special:Contributions/$1|$1]] air a bhacadh.
-<br />Faic [[Special:BlockList|Liosta nan IP baicte]] na bacaidhean a dh'ath-sgrùdadh.",
+'blockipsuccesstext' => 'Chaidh [[Special:Contributions/$1|$1]] a bhacadh.
+<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.',
 'unblockip' => 'Neo-bhac an cleachdaiche',
 'ipusubmit' => 'Thoir air falbh am bacadh seo',
 'ipblocklist' => 'Cleachdaichean a chaidh a bhacadh',
@@ -1378,7 +1377,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'movepagetext' => "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.
 Bidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.
 'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.
-Mura dèan thu sin, dèan cinntach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
+Mura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
 'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.
 
 Thoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.
@@ -1386,7 +1385,7 @@ Thoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tio
 
 '''Rabhadh!'''
 Faodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;
-dèan cinntach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+dèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
 'movepagetalktext' => "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''
 *Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no
 *Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal
@@ -1486,11 +1485,11 @@ Tadhail air [//www.mediawiki.org/wiki/Localisation Ionadaileadh MediaWiki] is [/
 'tooltip-summary' => 'Cuir a-steach gearr-chunntas',
 
 # Attribution
-'anonymous' => '{{PLURAL:$1|Cleachdaiche|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean}} gun ainm o {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}',
 'siteuser' => 'cleachdaiche {{SITENAME}} $1',
 'othercontribs' => 'Stèidhichte air obair le $1.',
 'others' => 'eile',
-'siteusers' => '{{PLURAL:$2|chleachdaiche|chleachdaiche|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} {{SITENAME}} $1',
+'siteusers' => '{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1',
 
 # Browsing diffs
 'previousdiff' => '← Mùthadh nas sine',
index 040dc1c..85faf16 100644 (file)
@@ -545,7 +545,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Páxina',
-'nstab-user' => 'Páxina de {{GENDER:{{BASEPAGENAME}}|usuario|usuaria}}',
+'nstab-user' => 'Páxina de {{GENDER:{{#titleparts:{{BASEPAGENAME}}|1}}|usuario|usuaria}}',
 'nstab-media' => 'Páxina multimedia',
 'nstab-special' => 'Páxina especial',
 'nstab-project' => 'Páxina do proxecto',
@@ -764,7 +764,7 @@ Por favor, agarde antes de probar outra vez.',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
 'user-mail-no-addy' => 'Intentou enviar un correo sen enderezo de correo electrónico.',
 'user-mail-no-body' => 'Intentou enviar un correo baleiro ou cun corpo curto de máis.',
@@ -1454,7 +1454,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'prefs-displaywatchlist' => 'Opcións de visualización',
 'prefs-diffs' => 'Diferenzas',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'O enderezo de correo electrónico semella válido',
 'email-address-validity-invalid' => 'Escriba un enderezo de correo electrónico válido',
 
@@ -2057,6 +2057,12 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
 No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
 Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-legend' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-text' => 'Esta páxina lista aquelas páxinas que utilizan unha propiedade de páxina determinada.',
+'pageswithprop-prop' => 'Nome da propiedade:',
+'pageswithprop-submit' => 'Mostrar',
+
 'doubleredirects' => 'Redireccións dobres',
 'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
 Cada 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.
@@ -2248,7 +2254,7 @@ Se quere máis información acerca dos dereitos individuais, pode atopala [[{{Me
 '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',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Non existe enderezo para o envío',
 'mailnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.',
 'emailuser' => 'Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}',
@@ -3656,7 +3662,7 @@ Os demais agocharanse por omisión.
 'monthsall' => 'todos',
 'limitall' => 'todas',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar o enderezo de correo electrónico',
 'confirmemail_noemail' => 'Non ten rexistrado ningún enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias de usuario]].',
 'confirmemail_text' => '{{SITENAME}} require que lle dea validez ao seu enderezo de correo electrónico antes de utilizar as funcións relacionadas con el.
@@ -4067,4 +4073,7 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
 
+# Image rotation
+'rotate-comment' => 'Imaxe rotada $1 {{PLURAL:$1|grao|graos}} en sentido horario',
+
 );
index 6f0b4c5..e94c0db 100644 (file)
@@ -961,7 +961,7 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
 'listgrouprights-helppage' => 'Help:Kiartyn y phossan',
 'listgrouprights-members' => '(rolley olteynyn)',
 
-# E-mail user
+# Email user
 'emailuser' => "Cur post-L da'n ymmydeyr shoh",
 'emailfrom' => 'Veih:',
 'emailto' => 'Da:',
@@ -1154,7 +1154,7 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':",
 ** Removing content from pages
 ** Spamming links to external sites
 ** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
+** Intimidating behavior/harassment
 ** Abusing multiple accounts
 * Oyr elley
 ** Ennym ymmydeyryn neuchooie
index a62ba4f..5d9db96 100644 (file)
@@ -865,7 +865,7 @@ $2',
 'loginlanguagelabel' => 'שפה: $1',
 'suspicious-userlogout' => 'בקשתכם לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'שגיאה לא ידועה בפונקציה mail()‎ של PHP',
 'user-mail-no-addy' => 'ניסיון לשלוח דוא"ל ללא כתובת דוא"ל.',
 'user-mail-no-body' => 'ניסיון לשלוח דוא"ל עם תוכן ריק או קצר מאוד.',
@@ -1053,7 +1053,7 @@ $2
 '''הוא טרם נשמר!'''",
 'sitejspreview' => "'''זכרו שזו רק תצוגה מקדימה של קוד ה־JavaScript הזה.'''
 '''הוא טרם נשמר!'''",
-'userinvalidcssjstitle' => "'''אזהרה''': העיצוב \"\$1\" אינו קיים.
+'userinvalidcssjstitle' => "'''אזהרה:''' העיצוב \"\$1\" אינו קיים.
 דפי .css ו־.js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
 'updated' => '(מעודכן)',
 'note' => "'''הערה:'''",
@@ -1408,7 +1408,7 @@ $1",
 'showingresults' => "{{PLURAL:$1|מוצגת תוצאה '''אחת'''|מוצגות עד '''$1''' תוצאות}} החל ממספר '''$2''':",
 'showingresultsnum' => "{{PLURAL:$3|מוצגת תוצאה '''אחת'''|מוצגות '''$3''' תוצאות}} החל ממספר '''$2''':",
 'showingresultsheader' => "{{PLURAL:$5|תוצאה '''$1''' מתוך '''$3'''|תוצאות '''$1 - $2''' מתוך '''$3'''}} עבור '''$4'''",
-'nonefound' => "'''הערה''': כברירת מחדל, החיפוש מבוצע במספר מרחבי שם בלבד. באפשרותכם לכתוב '''all:''' לפני מונח החיפוש כדי לחפש בכל הדפים (כולל דפי שיחה, תבניות, ועוד), או לכתוב לפני מונח החיפוש את מרחב השם שאתם מעוניינים בו.",
+'nonefound' => "'''הערה:''' כברירת מחדל, החיפוש מבוצע במספר מרחבי שם בלבד. באפשרותכם לכתוב '''all:''' לפני מונח החיפוש כדי לחפש בכל הדפים (כולל דפי שיחה, תבניות, ועוד), או לכתוב לפני מונח החיפוש את מרחב השם שאתם מעוניינים בו.",
 'search-nonefound' => 'לא נמצאו תוצאות המתאימות לחיפוש.',
 'powersearch' => 'חיפוש מתקדם',
 'powersearch-legend' => 'חיפוש מתקדם',
@@ -1551,7 +1551,7 @@ $1",
 'prefs-displaywatchlist' => 'אפשרויות תצוגה',
 'prefs-diffs' => 'הבדלים בין גרסאות',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'כתובת הדואר האלקטרוני נראית תקינה',
 'email-address-validity-invalid' => 'יש להקליד כתובת דואר אלקטרוני תקינה',
 
@@ -2149,6 +2149,12 @@ $1',
 ייתכן שעליהם לקשר במקום זאת לדף מתאים יותר.<br />
 דף נחשב לדף פירושונים אם הוא משתמש בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'דפים עם מאפיין דף',
+'pageswithprop-legend' => 'דפים עם מאפיין דף',
+'pageswithprop-text' => 'בדף זה מופיעה רשימת דפים שמשתמשים במאפיין דף מסוים.',
+'pageswithprop-prop' => 'שם המאפיין:',
+'pageswithprop-submit' => 'הצגה',
+
 'doubleredirects' => 'הפניות כפולות',
 'doubleredirectstext' => 'בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.
 כל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה"אמיתי" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.
@@ -2341,7 +2347,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'הוספת כל הקבוצות לחשבון האישי',
 'listgrouprights-removegroup-self-all' => 'הסרת כל הקבוצות מהחשבון האישי',
 
-# E-mail user
+# Email user
 'mailnologin' => 'אין כתובת לשליחה',
 'mailnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר לעצמכם כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] שלכם כדי לשלוח דואר למשתמש אחר.',
 'emailuser' => 'שליחת דואר אלקטרוני למשתמש זה',
@@ -2739,7 +2745,7 @@ $1',
 'unblockiptext' => 'השתמשו בטופס שלהלן כדי להחזיר את הרשאות הכתיבה למשתמש או כתובת IP חסומים.',
 'ipusubmit' => 'שחרור חסימה',
 'unblocked' => 'המשתמש [[User:$1|$1]] שוחרר מחסימתו.',
-'unblocked-range' => '$1 שוחרר מחסימתו',
+'unblocked-range' => '$1 שוחרר מחסימתו.',
 'unblocked-id' => 'חסימה מספר $1 שוחררה.',
 'blocklist' => 'משתמשים חסומים',
 'ipblocklist' => 'משתמשים חסומים',
@@ -3751,7 +3757,7 @@ $1',
 'monthsall' => 'הכול',
 'limitall' => 'הכול',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'אימות כתובת דוא"ל',
 'confirmemail_noemail' => 'אין לכם כתובת דוא"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלכם.',
 'confirmemail_text' => 'אתר זה דורש שתאמתו את כתובת הדוא"ל שלכם לפני שתשתמשו בשירותי הדוא"ל. לחצו על הכפתור למטה כדי לשלוח דוא"ל עם קוד אימות לכתובת הדוא"ל שהזנתם. טענו את הקישור בדפדפן שלכם כדי לאשר שכתובת הדוא"ל תקפה.',
@@ -3816,7 +3822,7 @@ $5
 'scarytranscludetoolong' => '[כתובת ה־URL ארוכה מדי]',
 
 # Delete conflict
-'deletedwhileediting' => "'''אזהרה''': דף זה נמחק לאחר שהתחלתם לערוך!",
+'deletedwhileediting' => "'''אזהרה:''' דף זה נמחק לאחר שהתחלתם לערוך!",
 'confirmrecreate' => "הדף נמחק על ידי המשתמש [[User:$1|$1]] ([[User talk:$1|שיחה]]) לאחר שהתחלתם לערוך אותו, מסיבה זו:
 :'''$2'''
 אנא אשרו שאתם אכן רוצים ליצור מחדש את הדף.",
@@ -4214,4 +4220,7 @@ $5
 'duration-centuries' => '{{PLURAL:$1|מאה שנה|מאתיים שנה|$1 מאות שנים}}',
 'duration-millennia' => '{{PLURAL:$1|אלף שנה|אלפיים שנה|$1 אלפי שנים}}',
 
+# Image rotation
+'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה אחת|ב֫־$1 מעלות}} בכיוון השעון',
+
 );
index 63c8abb..7b38419 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Anjoeli9806
+ * @author Berniemack
  * @author Erythrii
  * @author Jose77
  * @author Kguirnela
@@ -65,7 +66,7 @@ $messages = array(
 
 'underline-always' => 'Pirmi',
 'underline-never' => 'Indi',
-'underline-default' => 'Human na nga iya sang brawser',
+'underline-default' => 'Gintakda sang browser ukon panit',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Ilisan ang laragway  sang font sa lugar:',
@@ -150,8 +151,9 @@ $messages = array(
 'newwindow' => '(gabukas sa bag-o nga bintana)',
 'cancel' => 'Kanselahon',
 'moredotdotdot' => 'Madamo pa...',
-'mypage' => 'Akon panid',
-'mytalk' => 'Akon paghisayranay',
+'morenotlisted' => 'Madamu pa ang wala nalista...',
+'mypage' => 'Akon Panid',
+'mytalk' => 'Paghisayranay',
 'anontalk' => 'Paghisayranay sang sining IP address',
 'navigation' => 'Nabigayson',
 'and' => '&#32;kag',
@@ -173,7 +175,7 @@ $messages = array(
 'vector-action-protect' => 'Pangapinan',
 'vector-action-undelete' => 'Dulaon ang pagpanas',
 'vector-action-unprotect' => 'Ilisan ang pagpangapin',
-'vector-simplesearch-preference' => 'Sugtan ang mas ginpamaayo nga suhestiyon sa pagpangita (Para sa vector nga panit lamang)',
+'vector-simplesearch-preference' => 'Sugdan ang mas ginpamaayo nga suhestiyon sa pagpangita (Para sa vector nga panit lamang)',
 'vector-view-create' => 'Himuon',
 'vector-view-edit' => 'Ilisan',
 'vector-view-history' => 'Lantawon ang kasaysayan',
@@ -183,6 +185,7 @@ $messages = array(
 'namespaces' => 'Ngalan-espasyo',
 'variants' => 'Mga nagkalain-lain',
 
+'navigation-heading' => 'Menu sang nabigasyon',
 'errorpagetitle' => 'Sala/Eror',
 'returnto' => 'Balik sa $1.',
 'tagline' => 'Halin sa {{SITENAME}}',
@@ -394,7 +397,7 @@ Pagpamangkot: $2',
 'actionthrottled' => 'Ang paghulag ginpunggan',
 'actionthrottledtext' => 'Bilang pagpangontra sa span, ginalimitahan ka sa pagbuhat sang sini nga paghulag sa tuman ka damo nga beses sa malip-ot nga tinion, kag naglapaw ka na sa sini nga patakaran.
 Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
-'protectedpagetext' => 'Ang ini nga panid ginpangapinan agod to mapunggan ang pag-ilis sini.',
+'protectedpagetext' => 'Ang ini nga panid ginprotektaran agud mapunggan ang pag-ilis sini.',
 'viewsourcetext' => 'Mahimo mo nga makita kag makopya ang ginhalinan sang sini nga panid:',
 'viewyourtext' => "Mahimo mo nga makita kag makopya ang ginhalinan sang '''imo mga pagbag-o''' sa sini nga panid:",
 'protectedinterface' => 'Ang ini nga panid nagahatag sang mga teksto sang interface para sa software, kag ginapangapinan agod indi maabuso.',
@@ -428,6 +431,9 @@ Ang administrador nga nag-kandado sini naghatag sang paathag nga: "$3".',
 
 Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man <span class='plainlinks'>[$1 magsulod liwat]</span> bilang amo sa gihapon ukon lain nga nga manug-gamit.
 Tandaan nga may mga panid nga mahimo ma-display sa gihapon nga daw nakasulod ka sa gihapon, hasta mapanas mo na ang tinago sang imo brawser.",
+'welcomeuser' => 'Malipayon nga pag-abot. $1!',
+'welcomecreation-msg' => 'Nahimo na ang imo nga account.
+Indi pagkalimtan ang pag-ilis sa imo nga [[Special:Preferences|{{SITENAME}} pagpasulabi]].',
 'yourname' => 'Ngalan sang Manog-gamit:',
 'yourpassword' => 'Kontra-senyas:',
 'yourpasswordagain' => 'Suliton ang kontra-senyas:',
@@ -529,9 +535,10 @@ Palihog maghulat anay bag-o tilawan liwat.',
 'loginlanguagelabel' => 'Hambalanon: $1',
 'suspicious-userlogout' => 'Ang imo pagpangabay nga mag-guha ginpungga bangud nga ini mahimo nga ginpadala sang guba nga brawser ukon sang proksy nga nagapang-tago.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Wala nahibaluan nga sala sa kapuslanan nga sulat() sang PHP.',
 'user-mail-no-addy' => 'Gintilawan nga magpadala sang e-mail biskan wala sang e-mail adres.',
+'user-mail-no-body' => 'Nakatilaw magpadala sang email nga waay unod ukon malip-ot katama ang unod sang mensahe.',
 
 # Change password dialog
 'resetpass' => 'Ilisan ang pasword',
@@ -597,6 +604,7 @@ Temporaryo nga pasword: $2',
 'changeemail-oldemail' => 'E-mail adres sa subong:',
 'changeemail-newemail' => 'Bag-o nga e-mail adres:',
 'changeemail-none' => '(wala)',
+'changeemail-password' => 'Ang imong {{SITENAME}} nga password:',
 'changeemail-submit' => 'Ilisan and E-mail',
 'changeemail-cancel' => 'Kanselahon',
 
@@ -693,7 +701,7 @@ Kon ikaw manuggamit nga wala makilal-i kag nabatyagan mo nga may mga komento nga
 Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga pahina]] sa iban man nga pahina,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs],
 o [{{fullurl:{{FULLPAGENAME}}|action=edit}} islan ini nga pahina]</span>.',
-'noarticletext-nopermission' => 'Wala subong sang teksto ang ini nga panid.
+'noarticletext-nopermission' => 'Wala subong sang teksto ang sini nga panid.
 Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga panid]] sa iban man nga panid,
 ukon <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs]</span>.',
 'missing-revision' => 'Ang ini nga pag-ilis nga #$1 sang panid nga ginhinanglan nga "{{PAGENAME}}" wala naga-eksister.
@@ -809,6 +817,15 @@ Ini nagapakita nga gindula na.',
 'edit-already-exists' => 'Indi mahimo ang bag-o nga panid.
 Naga-eksister na ini.',
 'defaultmessagetext' => 'Teksto sang mensahe nga wala pa ma-ilisan',
+'content-failed-to-parse' => 'Di matuman ang pag-parse $2 nga unod para sa $1 nga modelo: $3',
+'invalid-content-data' => 'May ara sala sa data.',
+'content-not-allowed-here' => '"$1" nga sulod indi pwede sa panid [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'tekstong wiki',
+'content-model-text' => 'tekstong ordinaryo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Pahibalo:''' Ang ini nga panid may yara sang madamo nga mahal nga pagtawag sang kapusalanan parser.
@@ -1104,7 +1121,7 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 
 # Preferences page
 'preferences' => 'Mga Ginabasehan',
-'mypreferences' => 'Akon pagpalabi',
+'mypreferences' => 'Mga Ginabasehan',
 'prefs-edits' => 'Numero sang mga gin-ilisan:',
 'prefsnologin' => 'Wala naka-sulod',
 'prefsnologintext' => 'Kinahanglan nga ikaw <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakasulod]</span> agod nga mabuhat ang pag-ilis sang mga ginapalabi.',
@@ -1206,39 +1223,193 @@ Kon imo ini luyag nga ihatag, ini gamiton sa paghatag sing pagkilala sa imo nga
 'prefs-help-email-others' => 'Mahimo mo man pilion nga ma-kontak ka sang iban paagi sa e-mail paagi sa isa ka link sa imo manuggamit ukon gina-hisayranay nga panid.
 Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'prefs-help-email-required' => 'Kinahanglan ang imo e-mail',
+'prefs-info' => 'Tig-una nga impormasyon',
+'prefs-i18n' => 'nternasyonalisasyon',
 'prefs-signature' => 'pirma',
+'prefs-dateformat' => 'Porma sang petsa ukon adlaw',
+'prefs-timeoffset' => 'Pagintsakto sa oras',
+'prefs-advancedediting' => 'Mas progresibo nga pilian',
+'prefs-advancedrc' => 'Mas progresibo nga pilian',
+'prefs-advancedrendering' => 'Mas progresibo nga pilian',
+'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',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Ang nasambit nga e-mail pwede batunon',
+'email-address-validity-invalid' => 'Magsulod sang isa ka mabaton nga e-mail address.',
+
+# User rights
+'userrights' => 'Tagdumala sang mga derecho sang mga tig-gamit',
+'userrights-lookup-user' => 'Tagdumalaon ang mga grupo sang tiggamit',
+'userrights-user-editname' => 'Mag-intra sang isa ka pangalan sang tiggamit:',
+'editusergroup' => 'Lainon ang mga grupo sang tiggamit',
+'editinguser' => "Guinabag-o ang kinamatarong sang naga-usar '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Lainon ang mga grupo sang tiggamit',
+'saveusergroups' => 'Luwason ang mga grupo sang tiggamit',
+'userrights-groupsmember' => 'Kaupod sang:',
+'userrights-groupsmember-auto' => 'Kaupod sang:',
+'userrights-groups-help' => 'Pwede nyo lainon ang mga grupo sang tiggamit sini sa:
+* Kahon nga may ara check nga nagasiling ang tiggamit amo nga kaupod sa grupo.
+* Kahot nga wala sing check nagasiling nga indi kaupod ang tiggamit sa grupo.
+* Ginaindikar sang * nga ginadilian na ang pagpanas sa grupo kon imo na ni nga gindugang, ukon ang suli sini.',
+'userrights-reason' => 'Rason:',
+'userrights-no-interwiki' => 'Wala ka permiso nga lainon ang layi sang tiggamit sa iban nga mga wiki.',
+'userrights-nodatabase' => 'Wala nagagwa ang datos $1 ukon indi ini lokal.',
+'userrights-nologin' => 'Kinahanglang [[Special:UserLogin|log in]] pinaagi sa isa account nga tagdumala para matagaan sang derecho sang tiggamit.',
+'userrights-notallowed' => 'Ang imo nga account waay sing permiso para magdugang ukon magpanas sang kinamatarong sang mga naga-usar.',
+'userrights-changeable-col' => 'Mga grupo nga pwede mong baguhon.',
+'userrights-unchangeable-col' => 'Mga grupo nga indi mo pwede baguhon.',
 
 # Groups
 'group' => 'Grupo:',
+'group-user' => 'Mga Naga-usar',
+'group-autoconfirmed' => 'Mga naga-usar nga awtomatikong guinkompirma',
+'group-bot' => 'Mga bot',
 'group-sysop' => 'Mga Administrador',
-
+'group-bureaucrat' => 'Mga byurokratiko',
+'group-all' => '(tanan)',
+
+'group-user-member' => '{{GENDER:$1|naga-usar}}',
+'group-autoconfirmed-member' => '{GENDER:$1|naga-usar nga awtomatikong nakompirma}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|tagdumala}}',
+'group-bureaucrat-member' => '{{GENDER:$1|byurokratiko}}',
+'group-suppress-member' => '{{GENDER:$1|oversight}}',
+
+'grouppage-user' => '{{ns:project}}:Mga Naga-usar',
+'grouppage-autoconfirmed' => '{{ns:project}}:Mga naga-usar nga awtomatikong nakompirma.',
+'grouppage-bot' => '{{ns:project}}:Bots',
 'grouppage-sysop' => '{{ns:project}}:Mga Administrador',
+'grouppage-bureaucrat' => '{{ns:project}}:Mga Byurokratiko',
 
 # Rights
 'right-read' => 'Basahan ang panid',
 'right-edit' => 'Ilisan ang panid',
+'right-createpage' => 'Maghimo sang mga panid (nga indi mga panid sang diskusyon)',
+'right-createtalk' => 'Maghimu sang mga panid para sa diskusyon.',
+'right-createaccount' => 'Maghimu sang bag-o nga mga accounts para sa mga naga-usar',
+'right-minoredit' => 'Markahan kon gamay ukon dyutay lang ang guinbag-o sa unod.',
+'right-move' => 'Saylohon ining panid:',
+'right-move-subpages' => 'Saylohon ang mga panid lakip sa mga panid nga kaupod sini',
+'right-move-rootuserpages' => 'Saylohon ang mga panid nga gingikanan.',
+'right-movefile' => 'Isaylo ang mga dokumento ukon files.',
+'right-suppressredirect' => 'Indi makahimu sang isa ka pagsaylo halin sa mga daan nga nalan kon ginasaylo na sa isa ka panid.',
+'right-upload' => 'Magkarga sang mga files',
+'right-reupload' => 'Islan ang mga naga-eksistar nga mga files.',
+'right-reupload-own' => 'Islan ang mga files nga ginkarga sang iya kaugalingon.',
+'right-reupload-shared' => 'Islan ang mga files sa ginabahin nga bulutangan sang midya sa lokal.',
+'right-upload_by_url' => 'Magkarga sang mga files ukon dokumento halin sa isa ka URL address.',
+'right-purge' => 'Limpyuha ang bulutangan sang site para sa isa ka panid nga waay sing kumpirmasyon',
+'right-autoconfirmed' => 'Islan ang mga panid nga ginprotektar dyutay.',
+'right-bot' => 'Mahimo nga isa ka proseso nga awtomatiko',
+'right-nominornewtalk' => 'Wala nga dyutay nga pagbag-o sa mga panid sang diskusyon para makasugod sang isa ka abiso nagasiling nga may bag-ong mensahe.',
+'right-apihighlimits' => 'Mag-usar sang mas mataas nga limitasyon para sa mga pamangkot sa API.',
+'right-writeapi' => 'Pag-usar sang ginsulat nga API',
+'right-delete' => 'Panason ang panid',
+'right-bigdelete' => 'Panason ang mga panid nga may daku nga maragtas',
+'right-deletelogentry' => 'Panason kag indi panason ang mga partikular nga mga log entries',
+'right-deleterevision' => 'Panason kag indi panason ang mga partikular nga mga pagbag-o sang mga panid.',
+'right-deletedhistory' => 'Tan-awa ang mga ginpanas nga mga entries nga waay kaupod nga teksto.',
+'right-deletedtext' => 'Tan-awa ang napanas nga mga teksto kag pagbag-o sa tunga sang duha ka rebisyon.',
+'right-browsearchive' => 'Pangitaa ang mga ginpanas nga mga panid',
+'right-undelete' => 'Buhion liwat ang isa ka panid.',
+'right-suppressrevision' => 'Liwaton kag ibalik ang mga pagbag-o nga gintago halin sa mga tagdumala.',
+'right-suppressionlog' => 'Tan-awon ang mga pribadong log.',
+'right-block' => 'Indi pasugtan ang iban nga mga naga-usar sa pagbag-o',
+'right-blockemail' => 'Indi pasugtan ang isa ka naga-usar para magpadala sang email.',
+'right-hideuser' => 'Indi pasugta ang ang isa ka naga-usar kag itago ini halin sa publiko.',
+'right-ipblock-exempt' => 'Indi pag-agihan ang mga indi ginpasugtan nga mga IP blocks, auto blocks kag range blocks.',
+'right-proxyunbannable' => 'Indi pagagihan ang mga awtomatiko nga pagharang sang mga proxies.',
+'right-unblockself' => 'Panason ang pagkaharang sa ila kaugalingon',
+'right-protect' => 'Islan ang grado sang proteksyon kag baguhon ang mga ginprotektar nga mga panid',
+'right-editprotected' => 'Baguhon ang mga panid nga ginprotekta (waay sing proteksyon nga de-grado)',
+'right-editinterface' => 'Baguhon ang user interface.',
+'right-editusercssjs' => 'Baguhon ang mga CSS kag Javascript nga files sang iban nga naga-usar.',
+'right-editusercss' => 'Baguhon ang mga CSS files sang iban nga naga-usar.',
+'right-edituserjs' => 'Baguhon ang mga Javascript files sang iban nga mga naga-usar.',
+'right-rollback' => 'Dasigay nga ibalik sa nahauna nga estado ang mga pagbag-o sang ulihi nga naga-usar nga nabag-o sa isa ka partikular nga panid.',
+'right-markbotedits' => 'Markahan ang mga rolled back nga mga ginbag-o bilang mga ginbag-o sang mga bot.',
+'right-noratelimit' => 'Indi maapektuhan sang mga limitasyon.',
+'right-import' => 'Mag-importe sang mga panid halin sa iban nga wikis',
+'right-importupload' => 'Mag-importe sang mga panid halin sa pagkarga sang files',
+'right-patrol' => 'Markahan bilang "ginabantayan" ang mga pagbag-o sang iban.',
+'right-autopatrol' => 'Awtomatikong markahan nga ginabantayan ang mga pagbag-o sa sarili.',
+'right-patrolmarks' => 'Tan-awa ang mga sining karon lamang nga mga ginbag-o kag markahan ini nga ginabantayan',
+'right-unwatchedpages' => 'Tan-awa ang listahan sang mga indi ginabantayan nga mga panid',
+'right-mergehistory' => 'Tingbon ang mga maragtas sang mga panid',
+'right-userrights' => 'Baguhon ang tanan nga kinamatarong sang mga naga-usar',
+'right-userrights-interwiki' => 'Bagohon ang kinamatarong sang mga naga-usar sa iban nga mga wiki.',
+'right-siteadmin' => 'Isira kag abrihan ang bulutangan sang mga impormasyon',
+'right-override-export-depth' => 'Ipagwa ang mga panid kaupod ang mga sugpon nga mga panid tubtub isa idalum nga 5.',
+'right-sendemail' => 'Magpadala sang email sa iban nga naga-usar',
+'right-passwordreset' => 'Tan-awa ang mga email sang password reset',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Naga-usar nga ginhimo log',
+'newuserlogpagetext' => 'Ini ang isa ka log sang mga ginhimo sang naga-usar',
 
 # User rights log
 'rightslog' => 'Karapatan sang naga-usar log',
+'rightslogtext' => 'Ini ang lista sang mga ginbag-o nga mga kinamatarong sang naga-usar.',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'Basahon ang ini nga panid',
 'action-edit' => 'islan ini nga pahina',
+'action-createpage' => 'Maghimo sang mga panid',
+'action-createtalk' => 'Maghimo sang mga panid sang mga diskusyon.',
+'action-createaccount' => 'Himuon ini sang account sang naga-gamit.',
+'action-minoredit' => 'Markahan ang sini nga pagbag-o nga dyutay ukon gamay lang',
+'action-move' => 'Isaylo ang sini nga panid',
+'action-move-subpages' => 'Isaylo ang sini nga panid, lakip na sa mga panid nga kaupod sini',
+'action-move-rootuserpages' => 'Isaylo ang mga panid nga guingikanan',
+'action-movefile' => 'Isaylo sini nga file',
+'action-upload' => 'Kargahon sini nga file',
+'action-reupload' => 'Lainon ang naga-eksistar na nga file',
+'action-reupload-shared' => 'Lainon ang mga file sa bulutangan nga ginabahin',
+'action-upload_by_url' => 'Ikarga sini nga file halin sa isa ka URL',
+'action-writeapi' => 'Pag-usar sang ginsulat nga API',
+'action-delete' => 'Panason ini nga pahina',
+'action-deleterevision' => 'Panason ang sini nga pagbag-o',
+'action-deletedhistory' => 'Tan-awon ang ginpanas nga maragtas sang sini nga panid',
+'action-browsearchive' => 'Pangitaa ang mga ginpanas nga mga panid',
+'action-undelete' => 'Indi panason ang sini nga panid',
+'action-suppressrevision' => 'Ireview kag ibalik ang mga gintago nga mga rebisyon',
+'action-suppressionlog' => 'Tan-awa ang sini nga pribado nga log.',
+'action-block' => 'Indi pasugtan ang iban nga mga naga-usar sa pagbag-o',
+'action-protect' => 'Baguhon ang nibel sang proteksyon para sa sini nga panid',
+'action-rollback' => 'Dasigay nga ibalik sa nahauna nga estado ang mga pagbag-o sang ulihi nga naga-usar nga nabag-o sa isa ka partikular nga panid.',
+'action-import' => 'Importehon ang sini nga panid halin sa iban nga wiki',
+'action-importupload' => 'Importehon ang sini nga panid halin sa ginkarga nga file',
+'action-patrol' => 'Markahan bilang "ginabantayan" ang mga pagbag-o sang iban.',
+'action-autopatrol' => 'Markahan bilang "ginabantayan" ang imo nga mga ginhimo nga pagbag-o',
+'action-mergehistory' => 'Tingbon ang mga maragtas sang mga panid',
+'action-userrights' => 'Baguhon ang tanan nga kinamatarong sang mga naga-usar',
+'action-userrights-interwiki' => 'Bagohon ang kinamatarong sang mga naga-usar sa iban nga mga wiki.',
+'action-siteadmin' => 'Isira kag abrihan ang bulutangan sang mga impormasyon',
+'action-sendemail' => 'Magpadala sang mga email',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|bag-ohon|mga ginbag-o}}',
 'recentchanges' => 'Mga Bag-o nga Inislan',
 'recentchanges-legend' => 'Mga pililian sa bag-o lang na himo',
+'recentchanges-summary' => 'La-uton ang pina gid ka bag-o nga nahimo sa may wiki sa ini nga feed',
 'recentchanges-feed-description' => 'La-uton ang pina gid ka bag-o nga nahimo sa may wiki sa ini nga feed.',
+'recentchanges-label-newpage' => 'Ang sini nga pagbag-o nakahimo sang bag-o nga panid',
 'recentchanges-label-minor' => 'Diotay ilis ini',
+'recentchanges-label-bot' => 'Ang sini nga pagbag-o ginubra sang isa ka bot',
+'recentchanges-label-unpatrolled' => 'Ang sini nga pagbag-o indi pa ginbantayan',
 'rcnote' => "Diri sa idalum {{PLURAL:$1|ay '''1''' na bag-o|sang nagligad '''$1''' mga nabag-o}} sa naligad {{PLURAL:$2|adlaw|'''$2''' adlaw}}, sang mga $5, $4.",
+'rcnotefrom' => "Yara sa idalum ang mga guinbag-o halin '''$2''' (tubtub '''$1''' ang ginpagwa).",
 'rclistfrom' => 'Ipakita ang bag-o lang nahimo halin sa $1',
 'rcshowhideminor' => '$1 menor nga mga inislan',
 'rcshowhidebots' => '$1 bots',
 'rcshowhideliu' => '$1 mga ga-usar nga naka sulod',
 'rcshowhideanons' => '$1 di nagpakilala nga mga ga-usar',
+'rcshowhidepatr' => '$1 ginabantyan nga pagbag-o',
 'rcshowhidemine' => '$1 akon mga inislan',
 'rclinks' => 'Ipakita ang nagligad $1 nga nabag-o lang sang $2 adlaw<br />$3',
 'diff' => 'diff',
@@ -1248,14 +1419,21 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'minoreditletter' => 'm',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
+'number_of_watching_users_pageview' => '[$1 ginabantayan {{PLURAL:$1|naga-usar|mga naga-usar}}]',
+'rc_categories' => 'Limitahan ang mga kategorya (ibulag lakip sang "|")',
+'rc_categories_any' => 'Bisan ano',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga bytes}} despues sang pagbag-o',
+'newsectionsummary' => '/* $1 */ bag-o nga seksyon',
 'rc-enhanced-expand' => 'Ipakita ang mga detalye (nagakilanlan sang JavaScript)',
 'rc-enhanced-hide' => 'Tagu-on ang mga detalye',
+'rc-old-title' => 'orihinal nga ginhimo bilang "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'May labot nga pag-ilis',
 'recentchangeslinked-feed' => 'May labot nga pag-ilis',
 'recentchangeslinked-toolbox' => 'May labot nga pag-ilis',
 'recentchangeslinked-title' => 'Mga ginlain nga kapareho kay "$1"',
+'recentchangeslinked-noresult' => 'Wala mga pagbag-o sa mga sugpon nga mga panid sa ginhatag nga tiempo.',
 'recentchangeslinked-summary' => "Ini ang mga lista sang mga bag-o lang gid nga nahimo nga mga pahina nga gintabid halin sa gin klaro nga pahina (o mga katapo sa mga kategorya nga gin klaro).
 Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'recentchangeslinked-page' => 'Ngalan ka Pahina:',
@@ -1264,10 +1442,46 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 # Upload
 'upload' => 'Uplod file',
 'uploadbtn' => 'Karga file',
+'reuploaddesc' => 'Kanselahon ang pag-karga kag magbalik sa porma sang pag-karga.',
+'upload-tryagain' => 'Ipasa ang ginlarawan nga ginbag-o nga file',
 'uploadnologin' => 'Wala naka-sulod',
+'uploadnologintext' => 'Kinahanglan [[Special:UserLogin|nakalagda]] para makarga ang mga files.',
+'upload_directory_missing' => 'Nadula ang direktoryo sang pag-karga ($1) kag indi na ini mahimo sang webserver.',
+'upload_directory_read_only' => 'Ang direktoryo sang pag-karga ($1) indi pwede masulat sang webserver.',
+'uploaderror' => 'May sala sa pag-karga',
+'upload-recreate-warning' => "'''Abiso: Ang isa ka file nga amo ang iya ngalan ginpanas na ukon ginsaylo'''
+
+Ang log sang pagpanas kag pagsaylo para sa sini nga panid ginahatag diri para sa imo nga kombinyensya.",
+'uploadtext' => "Usaron ang porma sa idalum para makakarga sang mga file. Para matan-aw ukon mapangita ang mga file nga ginkarga na, kadto sa:[Special:FileList|lista sang mga files nga ginkarga]], ang mga ginkarga liwat nakalista sa: [[Special:Log/upload|lista sang mga ginkarga]], ang mga ginpanas [[Special:Log/delete|lista sang mga ginpanas]].
+
+Para maupod ang isa ka file sa isa ka panid, usaron ang sini nga sugpon sa mga masunod nga mga porma:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para mausar ang bilog nga bersyon sang file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' para mausar ang isa ka 200 ka pixel nga mas pinalapad nga bersyon sa isa ka karton sa wala nga bahin lakip ang 'alt teksto' bilang paglarawan
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para direkta nga masugpunan ang file, bisan indi na ini ipagwa.",
+'upload-permitted' => 'Mga ginpasugtan nga mga tipo sang files: $1',
+'upload-preferred' => 'Mga mas gusto nga mga tipo sang mga file: $1',
+'upload-prohibited' => 'Mga ginadilian nga mga tipo sang mga files: $1',
+'uploadlog' => 'Lista sang mga ginkarga',
 'uploadlogpage' => 'Uplod log',
+'uploadlogpagetext' => 'Ara sa idalum ang listahan sang pinakaulihi nga mga ginkarnga nga mga files: [[Special:NewFiles|gallery of new files]] para sa mas biswal nga pagtan-aw.',
+'filename' => 'Ngalan sang file',
 'filedesc' => 'Kabilogan',
 'fileuploadsummary' => 'Kabilogan:',
+'filereuploadsummary' => 'Mga pagbag-o sang file:',
+'filestatus' => 'Ang estado sang copyright:',
+'filesource' => 'Guinghalinan:',
+'uploadedfiles' => 'Mga ginkarga nga file',
+'ignorewarning' => 'Indi pagsapaka ang abiso kag basta luwason lang ang file',
+'ignorewarnings' => 'Indi pagsapaka ang tanan nga mga abiso',
+'minlength1' => 'Kinahanglan may ara isa ka letra para sa ngalan sang file.',
+'illegalfilename' => 'Ang ngalan sang file "$1" may ara nga mga karakter nga ginadilian sa mga titulo sang mga panid. Palihug maghatag sang iban nga ngalan sa file kag kargahon ini liwat.',
+'filename-toolong' => 'Ang mga ngalan sang files indi pwede masubra sa 240 ka bytes.',
+'badfilename' => 'Ang ngalan sang file ginbag-o bilang "$1".',
+'filetype-mime-mismatch' => 'Ang sugpon sang file ".$1" indi nagaparehas sa na nabal-an nga tipo nga MIME sang file ($2).',
+'filetype-badmime' => 'Ginadilian ang pagkarga sang mga files nga may tipo nga MIME "$1"',
+'filetype-bad-ie-mime' => 'Indi makarga ang sini nga file tungod ang Internet Explorer gindetect ini bilang "$1", nga ginadilian kag isa ka potensyal nga file nga makahalit.',
+'filetype-unwanted-type' => "Isa ka indi gusto nga tipo sang file ang '''\".\$1\"'''
+Ang gusto nga {{PLURAL:\$3|tipo sang file amo|mga tipo sang file amo ang}} \$2.",
 'empty-file' => 'Ang dokumeto ginapadala mo wala unod.',
 'file-too-large' => 'Ang dokumeto ginapadala mo madako gid.',
 'filename-tooshort' => 'Ang ngalan sang dokumento malipot gid.',
@@ -1275,11 +1489,14 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'uploadedimage' => 'na-uplod "[[$1]]"',
 'watchthisupload' => 'Bantayan ining panid',
 
+'license' => 'Pagpanglisensya',
 'license-header' => 'Pagpanglisensya',
 
 # File description page
+'file-anchor-link' => 'File',
 'filehist' => 'Historya file',
 'filehist-help' => 'I-klik sa may petsa/oras para makita ang file sa ina nga oras.',
+'filehist-revert' => 'Ibalik',
 'filehist-current' => 'subong',
 'filehist-datetime' => 'Petsa/Oras',
 'filehist-thumb' => 'Thumbnail',
@@ -1287,9 +1504,11 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'filehist-user' => 'Naga-usar',
 'filehist-dimensions' => 'Mga Takus',
 'filehist-comment' => 'Komentar',
-'imagelinks' => 'File Tabid',
+'imagelinks' => 'Pagusar sang file',
 'linkstoimage' => 'Ang nagakasunod {{PLURAL:$1|pahina nga mga tabid|$1 mga pahina mga tabid}} sa sini nga file:',
+'nolinkstoimage' => 'Waay sing panid nga nakasugpon sa sini nga file.',
 'sharedupload' => 'Ini nga file gikan sa $1 kag pwede ma usar sang iban nga mga proyekto.',
+'sharedupload-desc-here' => 'Ang sini nga file amo halin sa $1 kag pwede ini mausar sa lain nga mga proyekto. Ang ginalarawan sang iya nga [$2 panid sang paglarawan sang file] amo ang ginpagwa sa idalum.',
 'uploadnewversion-linktext' => 'Uplod sang bag-o nga bersiyon sang sini nga file',
 
 # File deletion
@@ -1301,6 +1520,8 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 # Statistics
 'statistics' => 'Mga Statistik',
 
+'disambiguationspage' => 'Template:disambig',
+
 'brokenredirects-edit' => 'ilisan',
 'brokenredirects-delete' => 'panason',
 
@@ -1309,6 +1530,7 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'nmembers' => '$1 {{PLURAL:$1|membro|mga membro}}',
 'popularpages' => 'Ang panid nagakilala gid',
 'prefixindex' => 'Tanan nga mga pahina nga may-ara prefiks',
+'usercreated' => '{{GENDER:$3|Ginhimo}} sa $1 kag $2',
 'newpages' => 'Mga Bag-o nga Pahina',
 'newpages-username' => 'Ngalan sang Manog-gamit:',
 'move' => 'Saylohon',
@@ -1335,20 +1557,25 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'allpagesnext' => 'Dason',
 'allpagessubmit' => 'Sige',
 
+# Special:Categories
+'categories' => 'Mga kategorya',
+
 # Special:LinkSearch
 'linksearch' => 'Eksternal na mga tabid',
 'linksearch-ok' => 'Pangita-a',
+'linksearch-line' => '$1 amo nakasugpon sa $2',
 
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-members' => '(lista sang mga membro)',
 
-# E-mail user
+# Email user
 'emailuser' => 'I-email ini nga naga-usar',
 
 # Watchlist
-'watchlist' => 'Akon Ginabantayan',
-'mywatchlist' => 'Akon Ginabantayan',
+'watchlist' => 'Ginabantayan',
+'mywatchlist' => 'Ginabantayan',
+'watchlistfor2' => 'Para sa $1 $2',
 'watchnologin' => 'Wala naka-sulod',
 'addedwatchtext' => "Ang pahina \"[[:\$1]]\" ay nadugang sa imo [[Special:Watchlist|lista sang pagtan-aw]].
 Buwas-damlag nga pagbag-o sang pahina kag ang iya upod na hisayrany pahina ay ipagalista didto, kag ang pahina magapakita balang '''dukot''' sa may [[Special:RecentChanges|lista sang mga bag-o lang na-islan]] para mahapos lang ini kuhaon.",
@@ -1370,6 +1597,7 @@ Buwas-damlag nga pagbag-o sang pahina kag ang iya upod na hisayrany pahina ay ip
 'confirmdeletetext' => 'Ikaw ay magapanas sang pahina upod sang tanan niya nga historya.
 Palihog lang nga sigurado nga kinagusto mo ini nga himuon, nga na-intindihan mo ang resulta sang ginahimo mo, kag ang gina obra mo ga santo upod sa [[{{MediaWiki:Policy-url}}|polisiya]].',
 'actioncomplete' => 'Kompleto nga aksiyon',
+'actionfailed' => 'Indi madinalag-on ang paghulag',
 'deletedtext' => '"$1" ay nakakas na.
 Lantawa $2 para sa mga lista sang mga bag-o lang ginkakas.',
 'dellogpage' => 'Ginkakas na log',
@@ -1411,6 +1639,7 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 
 # Undelete
 'undeletelink' => 'tan-aw/ginbalik',
+'undeleteviewlink' => 'Tan-awa',
 'undelete-search-submit' => 'Pangita-a',
 
 # Namespace form on various pages
@@ -1419,9 +1648,9 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 'blanknamespace' => '(Mayor)',
 
 # Contributions
-'contributions' => 'Naga-usar nga mga kontribusyon',
+'contributions' => 'Mga kontribusyon sang {{GENDER:$1|naga-usar}}',
 'contributions-title' => 'Mga Kontribusyon sang Naga-Usar para $1',
-'mycontris' => 'Akon contribusyon',
+'mycontris' => 'Kontribusyon',
 'contribsub2' => 'Para $1 ($2)',
 'uctop' => '(ibabaw)',
 'month' => 'Halin sa bulan (kag sang timprano):',
@@ -1429,9 +1658,12 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 
 'sp-contributions-newbies' => 'Ipakita ang mga kontribusyon sang mga bag-o nga akawnts lamang',
 'sp-contributions-blocklog' => 'pugong log',
+'sp-contributions-uploads' => 'Mga ginkarga',
+'sp-contributions-logs' => 'Mga lista',
 'sp-contributions-talk' => 'Hisayranay',
 'sp-contributions-search' => 'Mangita para sa mga knotribusyon',
 'sp-contributions-username' => 'IP Adres ukon ngalan sang naga-user:',
+'sp-contributions-toponly' => 'Ipagwa lang ang mga ginbag-o nga mga ulihi nga rebisyon',
 'sp-contributions-submit' => 'Pangita-a',
 
 # What links here
@@ -1439,23 +1671,32 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 'whatlinkshere-title' => 'Mga pahina nga naga tabid sa $1',
 'whatlinkshere-page' => 'Pahina:',
 'linkshere' => "Ang mga sumunod nga pahina ay nagatabid sa '''[[:$1]]''':",
+'nolinkshere' => "Waay panid nga nakasugpon sa '''[[:$1]]'''.",
 'isredirect' => 'pahina sa ginadirekta liwat',
 'istemplate' => 'transklusyon',
-'isimage' => 'laragway tabid',
+'isimage' => 'Ang sugpon sang file',
 'whatlinkshere-prev' => '{{PLURAL:$1|antes|antes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|dasun|dasun $1}}',
 'whatlinkshere-links' => '← mga tabid',
 'whatlinkshere-hideredirs' => '$1 mga gin direkta liwat',
 'whatlinkshere-hidetrans' => '$1 mga transklusyon',
 'whatlinkshere-hidelinks' => '$1 mga tabid',
+'whatlinkshere-hideimages' => '$1 sugpon sang file',
 'whatlinkshere-filters' => 'Mga Sala-an',
 
 # Block/unblock
 'blockip' => 'i-Pugong ang naga-usar',
 'ipbreason' => 'Rason:',
+'ipbother' => 'Iban nga oras:',
 'ipboptions' => '2 oras:2 hours,1 adlaw:1 day,3 adlaw:3 days,1 semana:1 week,2 semana:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tu-ig:1 year,wala katapusan:infinite',
+'ipbotheroption' => 'lain',
+'ipbotherreason' => 'Iban ukon dugang nga rason:',
+'ipbhidename' => 'Itago ang ngalan sang tiggamit sa mga pagbag-o kag mga listahan.',
 'ipblocklist' => 'Napunggan nga mga manug-usar',
+'blocklist-rangeblocks' => 'Itago ang mga bloke sang ginasakupan',
+'blocklist-reason' => 'Rason:',
 'ipblocklist-submit' => 'Pangita-a',
+'emailblock' => 'Gintapna ang e-mail',
 'blocklink' => 'harang',
 'unblocklink' => 'di pagpugong',
 'change-blocklink' => 'pagbag-o sang pugong',
@@ -1465,6 +1706,12 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 'unblocklogentry' => 'di pagpugong $1',
 'block-log-flags-nocreate' => 'paghimo sang akawnt ay gin untat',
 
+# Developer tools
+'lockconfirm' => 'Huo, gusto ko gid isirado ang bulutangan sang impormasyon.',
+'unlockconfirm' => 'Huo, gusto ko gid abrihon ang bulutangan sang impormasyon.',
+'lockbtn' => 'Isira ang bulutangan sang impormasyon.',
+'unlockbtn' => 'Abrihon ang bulutangan sang impormasyon.',
+
 # Move page
 'move-page-legend' => 'Saylohon ining panid',
 'movepagetext' => "Sa pagamit sang lista sa idalum ay magahatag ini sang bag-o na ngalan, pagasaylohon niya ang tanan nga historya sa bag-o nga ngalan.
@@ -1504,20 +1751,45 @@ Palihog lang sang pagkombinar sa ila sang ensakto.'''",
 
 # Export
 'export' => 'Eksport sa mga pahina',
+'exporttext' => 'Pwede mo ipagwa ang isa ka teksto kag lainon ang maragtas sang isa ka partikular nga panid ukon grupo sang mga panid nga nakabutang sa XML. Pwede ini ipagwa sa iban nga wiki pinaagi sa MediaWiki [[Special:Import|pahinang angkat]].
+
+Para magwa ang mga panid, isulod ang titulo sa text box sa idalum, isa ka titulo tagsa kurit, kag pilion kon gusto mo ang subong nga bersyon ukon ang mga daan nga bersyon, kaupod ang mga panid sang maragtas, ukon ang subong nga bersyon kaupod ang impormasyon sang mga pinakaulihi nga guinbag-o.
+
+Sa ulihi nga kaso, pwede ka magusar sang isa ka sugpon, tulad sa [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para sa panid "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Ipagwa tanan nga mga panid',
 
 # Namespace 8 related
 'allmessages' => 'Mga mensahe sang sistema',
+'allmessagesname' => 'Ngalan',
+'allmessagesdefault' => 'Ang gindestino nga teksto',
 
 # Thumbnails
 'thumbnail-more' => 'Padaku-on',
+'thumbnail_error' => 'May ara sala sa paghimo sang thumbnail: $1',
+
+# Special:Import
+'import-options-wrong' => 'Sala {{PLURAL:$2|pili|mga pagpilian}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Ang ginhatag nga gingikanan nga panid indi mabaton ang iya nga titulo.',
+'import-rootpage-nosubpage' => 'Ang espasyo sang ngalan nga "$1" nga gingikanang panid indi ginapasugtan ang kaupod nga mga panid.',
+
+# Import log
+'importlogpage' => 'Listahan sang mga importe',
+'importlogpagetext' => 'Mga importeng administratibo sang mga panid nga may maragtas sang pagbag-o halin sa iban nga wiki.',
+
+# JavaScriptTest
+'javascripttest-pagetext-frameworks' => 'Palihug pilion ang isa sa mga masunod nga mga testing frameworks: $1',
+'javascripttest-pagetext-skins' => 'Pilion ang isa ka panit para magdalagan sa imo nga eksamin:',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ang imo kaugalingon nga pahina',
+'tooltip-pt-anonuserpage' => 'Ang panid sang tiggamit para sa IP address imo ginbag-o bilang',
 'tooltip-pt-mytalk' => 'Ang imo pahina sang paghisayranay',
+'tooltip-pt-anontalk' => 'Istorya kapin sa mga pagbag-o nga ginhimo sa ip address nga ini',
 'tooltip-pt-preferences' => 'Akon pagpalabi',
 'tooltip-pt-watchlist' => 'Ang lista sang mga pahina nga imo ginabantayan para bag-ohon',
 'tooltip-pt-mycontris' => 'Lista sang imo kontribusyon',
 'tooltip-pt-login' => 'Gina-abi-abi ikaw nga man magsulod paagi sa pag log-in, apang indi ini kinahanglan gid buhaton',
+'tooltip-pt-anonlogin' => 'Ginasuportahan ka nga magsulod, ugaling indi ini kinahanglan.',
 'tooltip-pt-logout' => 'Mag guha',
 'tooltip-ca-talk' => 'Paghisayranay nahanungod sini nga panid',
 'tooltip-ca-edit' => 'Puede nimo islan ang unod sang sini nga panid. Palihog gamit sang preview button antes permanentehon ang gin ilisan.',
@@ -1526,7 +1798,9 @@ Palihog lang sang pagkombinar sa ila sang ensakto.'''",
 Pwede mo matan-aw ang iya ginhalinan',
 'tooltip-ca-history' => 'Nagligad nga rebisyon sa sini nga pahina',
 'tooltip-ca-protect' => 'Protektahan ini nga pahina',
+'tooltip-ca-unprotect' => 'Ilisan ang pagpangapin sa sini nga panid',
 'tooltip-ca-delete' => 'Panason ini nga pahina',
+'tooltip-ca-undelete' => 'Ibalik ang mga paglain nga ginhimo sa panid nga ini antes nga ini ginpanas.',
 'tooltip-ca-move' => 'Saylohon ining panid',
 'tooltip-ca-watch' => 'I-dugang ini nga pahina sa imo listahan sang palangitaon',
 'tooltip-ca-unwatch' => 'Kuhaon ini nga pahina sa imo lista sang ginabantayan',
@@ -1553,10 +1827,13 @@ Pwede mo matan-aw ang iya ginhalinan',
 'tooltip-t-permalink' => 'Permanente nga tabid sa sini nga rebisyon sang pahina',
 'tooltip-ca-nstab-main' => 'Tan-awon ang unod sang pahina',
 'tooltip-ca-nstab-user' => 'Tan-awon ang pahina sang naga-usar',
+'tooltip-ca-nstab-media' => 'Tan-awon ang panid sang midya.',
 'tooltip-ca-nstab-special' => 'Espesyal ini nga pahina, indi mo ini ma islan sang iya kaugalingon nga pahina',
 'tooltip-ca-nstab-project' => 'Tan-awon ang pahina ka proyekto',
 'tooltip-ca-nstab-image' => 'Tan-awon ang pahina sang file',
+'tooltip-ca-nstab-mediawiki' => 'Tan-awon ang mensahe sang sistema',
 'tooltip-ca-nstab-template' => 'Tan-awon ang templeyt',
+'tooltip-ca-nstab-help' => 'Tan-awon ang panid sang bulig',
 'tooltip-ca-nstab-category' => 'Tan-awon ang pahina nga kategorya',
 'tooltip-minoredit' => 'Markahan ini bilang menor nga pag-ilis',
 'tooltip-save' => 'Permanentehon ang imo gin islan',
@@ -1564,11 +1841,23 @@ Pwede mo matan-aw ang iya ginhalinan',
 'tooltip-diff' => 'Ipakita ang mga bag-o nga nahimo mo sa teksto',
 'tooltip-compareselectedversions' => 'Lantawa ang ginalian sang duwa ka napilian nga rebisyon sa sini nga pahina',
 'tooltip-watch' => 'Idugang ini nga pahina sa imo lista nga ginabantayan',
+'tooltip-watchlistedit-normal-submit' => 'Pagpanason ang mga titulo',
+'tooltip-watchlistedit-raw-submit' => 'Iupdate ang listahan sang mga ginatan-aw.',
+'tooltip-recreate' => 'Liwat nga himuon ang panid bisan ini napanas na',
+'tooltip-upload' => 'Sugdan ang pagkarga',
 'tooltip-rollback' => '"Panumbalik" ginabalik ang (mga) na-islan sa sini nga pahina sa pinaka ulihi nga kontributor sa isa lang ka klik',
 'tooltip-undo' => '"Indi pag-obrahon" ginabalik ang gin-islan kag gabukas sa isaln form sa may prebyu mode.
 Gapasugot sa pagdugang sang rason sa kabilugan.',
+'tooltip-preferences-save' => 'kon pagpalabi',
 'tooltip-summary' => 'Maghatag sing diutay nga eksplikasyon',
 
+# Metadata
+'notacceptable' => 'Indi makahatag sang impormasyon ang serbidor sang wiki sa porma nga mabasahan sang imo nga kliyente.',
+
+# Attribution
+'anonymous' => 'Indi kilala {{PLURAL:$1|tagagamit|mga tagagamit}} sang {{SITENAME}}',
+'siteuser' => 'Tiggamit {{SITENAME}} sang $1',
+
 # Browsing diffs
 'previousdiff' => '← Mas daan nga na-islan',
 'nextdiff' => 'Mas bag-o nga gin-islan →',
@@ -1595,22 +1884,41 @@ Ano man nga pasunod nga tabid sa parehas nga linya ay ginasugtan bilang eksepsiy
 Kung ang ini nga file ginliwat halin sa orihinal nga porma, basi indi gina pakita ang naliwat nga file sang iban nga mga detalye.',
 'metadata-expand' => 'Ipakita ang mga dugang nga detalye',
 'metadata-collapse' => 'Tagu-on ang mga dugang nga detalye',
-'metadata-fields' => 'EXIF metadata fields nga nalista sa ini nga mensahe ay pagadal-on sa mga laragway nga gina pakita sa pahina kun ang metadata table ay narumpag.
+'metadata-fields' => 'Ang mga imahen sang EXIF metadata fields nga nalista sa ini nga mensahe ay pagadal-on sa mga laragway nga gina pakita sa pahina kun ang metadata table ay narumpag.
 Ang iban ay pagataguon sang default.
-* make
-* model
+* himo
+* modelo
 * datetimeoriginal
-* exposuretime
+* tyempo sang exposure
 * fnumber
 * isospeedratings
 * focallength
-* artist
+* artista
 * copyright
 * imagedescription
 * gpslatitude
 * gpslongitude
 * gpsaltitude',
 
+# EXIF tags
+'exif-lightsource' => 'Ginghalinan sang sanag',
+'exif-flash' => 'Igpat',
+'exif-subjectarea' => 'Subject area',
+'exif-flashenergy' => 'Kabaskug sang igpat',
+'exif-focalplaneyresolution' => 'Resolusyong Y sa focal plane',
+'exif-focalplaneresolutionunit' => 'Yunit sang resolusyon sang focal plane',
+'exif-subjectlocation' => 'Lokasyon sang tuyo',
+'exif-exposureindex' => 'Antas sang exposure',
+'exif-sensingmethod' => 'Pamaagi sang pagpabatyag',
+'exif-filesource' => 'Ginhalinan sang file',
+'exif-scenetype' => 'Tipo sang larawan',
+'exif-customrendered' => 'Ginaproseso ang ginpersonalisado nga imahen',
+'exif-exposuremode' => 'Tipo sang exposure',
+'exif-whitebalance' => 'Balanse sang kaputian',
+'exif-digitalzoomratio' => 'Antas sang digital zoom',
+'exif-focallengthin35mmfilm' => 'Laba sang pokus sang film nga 35 mm',
+'exif-scenecapturetype' => 'Tipo sang pag-kuha sang litrato',
+
 # External editor support
 'edit-externally' => 'Islan ini nga file gamit ang eksternal nga aplikasyon',
 'edit-externally-help' => '(Lantawa ang [//www.mediawiki.org/wiki/Manual:External_editors tudlo sa pag panugod] para sa mga dugang nga impormasyon)',
@@ -1631,6 +1939,9 @@ Ang iban ay pagataguon sang default.
 'watchlisttools-edit' => 'Tan-awon kag islan ang listahan nga ginalantaw',
 'watchlisttools-raw' => 'Islan ang hindi pa tapos na listahan sang nagalantaw',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Abiso:\'\'\' Ang default sort key nga "$2" ginabag-o sang nauna nga default sort key nga "$1".',
+
 # Special:Version
 'version-specialpages' => 'Pinasahi nga mga panid',
 
@@ -1640,6 +1951,19 @@ Ang iban ay pagataguon sang default.
 # Special:SpecialPages
 'specialpages' => 'Espesyal nga mga panid',
 
+# External image whitelist
+'external_image_whitelist' => ' #Pabay-an lang ang ini nga linya nga amu ni<pre>
+#Ibutang ang mga piraso sang mga regular nga expressions (amo lang nga parte nga yara sa tunga sang //) sa idalum
+#Ini ibagay sa mga URLs sang mga imahen (hotlinked ukon ginsugpon) sa gwa.
+#Ang mga nagakabagay nga mga imahen ini igapagwa, kon indi ang sugpon ukon link lang sang imahen ang igapagwa.
+#Mga linya nga nagasugod sa # tratuhon bilang komento.
+#Ini indi sensitibo sa kapitalisasyon
+
+#Ibutang ang tanan nga regex fragments sa babaw sang linya. Pabay-i lang ang linya nga amu ina</pre>',
+
+# Special:Tags
+'tag-filter' => 'Ginpangsala sa [[Special:Tags|marka]]:',
+
 # New logging system
 'revdelete-restricted' => 'ginapatuman nga pagbawal sa mga administrador',
 'revdelete-unrestricted' => 'ginkakas nga pagbawal sa mga administrador',
index 56dfd2c..88215c4 100644 (file)
@@ -811,7 +811,7 @@ Molimo Vas da pričekate prije nego što pokušate ponovo.',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Nepoznata pogreška u PHP-mail() funkciji',
 'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
 
@@ -1478,9 +1478,9 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'prefs-displaywatchlist' => 'Opcije prikaza',
 'prefs-diffs' => 'razl',
 
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'E-mail adresa se pokazuje ispravnom',
-'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
+'email-address-validity-invalid' => 'Unesite valjanu adresu e-pošte',
 
 # User rights
 'userrights' => 'Upravljanje suradničkim pravima',
@@ -2241,7 +2241,7 @@ Dodatne informacije o pojedinim pravim se mogu pronaći [[{{MediaWiki:Listgroupr
 'listgrouprights-addgroup-self-all' => 'Dodaj sve skupine vlastitom računu',
 'listgrouprights-removegroup-self-all' => 'Uklonite sve skupine iz vlastitog računa',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nema adrese pošiljaoca',
 'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
 i imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]
@@ -2663,7 +2663,7 @@ Pogledajte [[Special:BlockList|popis blokiranja]] za pregled blokiranih suradnik
 'anononlyblock' => 'samo IP adrese',
 'noautoblockblock' => 'blokiranje samoga sebe je onemogućeno',
 'createaccountblock' => 'blokirano stvaranje suradničkog računa',
-'emailblock' => 'e-mail je blokiran',
+'emailblock' => 'e-pošta je blokirana',
 'blocklist-nousertalk' => 'bez uređivanja vlastite stranice za razgovor',
 'ipblocklist-empty' => 'Popis blokiranja je prazan.',
 'ipblocklist-no-results' => 'Tražena IP adresa ili suradničko ime nije blokirano.',
@@ -2671,7 +2671,7 @@ Pogledajte [[Special:BlockList|popis blokiranja]] za pregled blokiranih suradnik
 'unblocklink' => 'deblokiraj',
 'change-blocklink' => 'promijeni blokiranje',
 'contribslink' => 'doprinosi',
-'emaillink' => 'pošalji e-mail',
+'emaillink' => 'pošalji e-poruku',
 'autoblocker' => 'Automatski ste blokirani jer je Vašu IP adresu nedavno koristio "[[User:$1|$1]]" koji je blokiran zbog: "$2".',
 'blocklogpage' => 'Evidencija blokiranja',
 'blocklog-showlog' => 'Ovaj suradnik je ranije blokiran.
@@ -3605,7 +3605,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'monthsall' => 'sve',
 'limitall' => 'sve',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potvrda e-mail adrese',
 'confirmemail_noemail' => 'Niste unijeli važeću e-mail adresu u Vaše [[Special:Preferences|suradničke postavke]].',
 'confirmemail_text' => 'U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.',
index c8b66e6..ae8984e 100644 (file)
@@ -647,7 +647,7 @@ Móžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutwori
 'loginlanguagelabel' => 'Rěč: $1',
 'suspicious-userlogout' => 'Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Njeznaty zmylk w PHP-funkciji mail()',
 'user-mail-no-addy' => 'Je so spytało e-mejl bjez e-mejloweje adresy słać.',
 'user-mail-no-body' => 'Je so spytało, e-mejl bjez teksta abo z překrótkim tekstom pósłać',
@@ -1308,7 +1308,7 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'prefs-displaywatchlist' => 'Zwobraznjenske opcije',
 'prefs-diffs' => 'Rozdźěle',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Zda so, zo e-mejlowa adresa je płaćiwa',
 'email-address-validity-invalid' => 'Zapodaj płaćiwu e-mejlowu adresu',
 
@@ -1894,6 +1894,12 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 'disambiguationspage' => 'Template:Wjacezmyslnosć',
 'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
 
+'pageswithprop' => 'Strony z kajkosću strony',
+'pageswithprop-legend' => 'Strony z kajkosću strony',
+'pageswithprop-text' => 'Tuta strona nalistuje strony, kotrež wěstu kajkosć strony wužiwaja.',
+'pageswithprop-prop' => 'Mjeno kajkosće:',
+'pageswithprop-submit' => 'Wotpósłać',
+
 'doubleredirects' => 'Dwójne daleposrědkowanja',
 'doubleredirectstext' => 'Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.
 Kóž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.',
@@ -2081,7 +2087,7 @@ Znajmjeńša hłowna domena je trěbna, na přikład "*.org".<br />
 '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ć',
 
-# E-mail user
+# Email user
 '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ć',
@@ -3425,7 +3431,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
 'monthsall' => 'wšě',
 'limitall' => 'wšě',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Emailowu adresu wobkrućić',
 'confirmemail_noemail' => 'Njejsy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] podał.',
 'confirmemail_text' => 'Tutón wiki žada, zo swoju e-mejlowu adresu wobkrućiš, prjedy hač e-mejlowe funkcije wužiješ. Zaktiwuzij tłóčatko deleka, zo by swojej adresy wobkrućensku mejlku pósłał. Mejlka zapřijmje wotkaz, kotryž kod wobsahuje; wočiń wotkaz we swojim wobhladowaku, zo by wobkrućił, zo twoja e-mejlowa adresa je płaćiwa.',
@@ -3822,4 +3828,7 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
 'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
 
+# Image rotation
+'rotate-comment' => 'Wobraz wo $1 {{PLURAL:$1|stopjeń|stopnjej|stopnje|stopnjow}} w směrje časnika wjerćany',
+
 );
index fdb1293..2cd7074 100644 (file)
@@ -815,7 +815,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
 'loginlanguagelabel' => 'Nyelv: $1',
 'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
 'user-mail-no-addy' => 'E-mail üzenetet próbáltál küldeni e-mail cím megadása nélkül.',
 'user-mail-no-body' => 'Üres vagy nagyon rövid email-t próbáltál küldeni.',
@@ -1481,7 +1481,7 @@ A műveletet nem lehet visszavonni.',
 'prefs-displaywatchlist' => 'Megjelenítési beállítások',
 'prefs-diffs' => 'Eltérések (diffek)',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Az e-mail cím érvényesnek tűnik',
 'email-address-validity-invalid' => 'Írj be egy érvényes e-mail címet',
 
@@ -2257,7 +2257,7 @@ Az egyes csoportokról további információt [[{{MediaWiki:Listgrouprights-help
 'listgrouprights-addgroup-self-all' => 'az összes csoportot hozzáadhatja a saját fiókjához',
 'listgrouprights-removegroup-self-all' => 'az összes csoporból eltávolíthatja a saját fiókját',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nincs feladó',
 'mailnologintext' => 'Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].',
 'emailuser' => 'E-mail küldése ezen szerkesztőnek',
@@ -3094,6 +3094,7 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'spambot_username' => 'MediaWiki spam kitakarítása',
 'spam_reverting' => 'Visszatérés a $1 lapra mutató hivatkozásokat nem tartalmazó utolsó változathoz',
 'spam_blanking' => 'Az összes változat tartalmazott a $1 lapra mutató hivatkozásokat, kiürítés',
+'spam_deleting' => 'Minden változat tartalmazott $1-re mutató hivatkozást, törlöm',
 
 # Info page
 'pageinfo-title' => 'Információk a(z) „$1” lapról',
@@ -3654,7 +3655,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 'monthsall' => 'mind',
 'limitall' => 'mind',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-mail cím megerősítése',
 'confirmemail_noemail' => 'Nincs érvényes e-mail cím megadva a [[Special:Preferences|beállításaidnál]].',
 'confirmemail_text' => 'Meg kell erősítened az e-mail címed, mielőtt használhatnád a(z) {{SITENAME}} levelezési rendszerét. Nyomd meg az alsó gombot, hogy kaphass egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot. Töltsd be a kódot a böngésződbe, hogy aktiválhasd az e-mail címedet.',
@@ -3722,6 +3723,7 @@ Ez a megerősítő e-mail $4-ig érvényes.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Wikiközi beillesztés le van tiltva]',
 'scarytranscludefailed' => '[$1 sablon letöltése sikertelen]',
+'scarytranscludefailed-httpstatus' => ' [Nem sikerült betölteni a(z) $1 sablont: HTTP $2]',
 'scarytranscludetoolong' => '[Az URL túl hosszú]',
 
 # Delete conflict
@@ -3977,8 +3979,8 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
 'logentry-newusers-byemail' => 'Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.',
 'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
-'logentry-rights-rights' => '$1 megváltoztatta $3 csoport tagságát erről: $4 erre: $5',
-'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoport tagságát',
+'logentry-rights-rights' => '$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5',
+'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoporttagságát',
 'logentry-rights-autopromote' => '$1 automatikusan előléptetve erről: $4 erre: $5',
 'rightsnone' => '(semmi)',
 
@@ -4054,4 +4056,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'duration-centuries' => '{{PLURAL:$1|egy|$1}} évszázad',
 'duration-millennia' => '{{PLURAL:$1|egy|$1}} évezred',
 
+# Image rotation
+'rotate-comment' => 'Elforgattam a képet $1 fokkal, az óramutató járásával megegyező irányban',
+
 );
index c26eab9..11cb3fd 100644 (file)
@@ -425,7 +425,7 @@ $messages = array(
 # Vector skin
 'vector-action-addsection' => 'Ավելացնել քննարկում',
 'vector-action-delete' => 'Ջնջել',
-'vector-action-move' => 'Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬',
+'vector-action-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸Õ­Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨',
 'vector-action-protect' => 'Պաշտպանել',
 'vector-action-undelete' => 'Վերականգնել',
 'vector-action-unprotect' => 'Հանել պաշտպանումից',
@@ -502,7 +502,7 @@ $1',
 'pool-errorunknown' => 'Անհայտ սխալ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{grammar:genitive|{{SITENAME}}}}ի մասին',
+'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
 'aboutpage' => 'Project:Էությունը',
 'copyright' => 'Կայքի բովանդակությունը գտնվում է «$1» արտոնագրի տակ։',
 'copyrightpage' => '{{ns:project}}:Հեղինակային իրավունքներ',
@@ -672,7 +672,7 @@ $2',
 'welcomecreation-msg' => 'Ձեր հաշիվն ստեղծված է։
 Չմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։',
 'yourname' => 'Մասնակցի անուն՝',
-'yourpassword' => 'Գաղտնաբառ.',
+'yourpassword' => 'Գաղտնաբառ՝',
 'yourpasswordagain' => 'Կրկնեք գաղտնաբառը',
 'remembermypassword' => 'Հիշել իմ մուտքագրված տվյալները այս համակարգչում ($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել ժամկետով)',
 'yourdomainname' => 'Ձեր դոմենը՝',
@@ -750,7 +750,7 @@ $2',
 Խնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։',
 'loginlanguagelabel' => 'Լեզու՝ $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
 'user-mail-no-addy' => 'Փորձվեց ուղարկել էլ․ նամակ առանց էլ․ հասցեի։',
 
@@ -1007,6 +1007,7 @@ $2',
 
 # Content models
 'content-model-wikitext' => 'վիքիտեքստ',
+'content-model-javascript' => 'ՋավաՍկրիպտ',
 
 # "Undo" feature
 'undo-success' => 'Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։',
@@ -1261,7 +1262,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'prefs-emailconfirm-label' => 'Էլ-փոստի վավերացում․',
 'prefs-textboxsize' => 'Խմբագրման պատուհանի չափը',
 'youremail' => 'Էլեկտրոնային փոստ.',
-'username' => 'Մասնակցի անուն.',
+'username' => '{{GENDER:$1|Մասնակցի անուն}}՝',
 'uid' => 'Մասնակցի իդենտիֆիկատոր.',
 'prefs-memberingroups' => 'Անդամակցության {{PLURAL:$1|խումբ|խմբեր}}.',
 'prefs-registration' => 'Գրանցման ամսաթիվը․',
@@ -1298,7 +1299,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'prefs-displaywatchlist' => 'Ցուցադրման ընտրանքներ',
 'prefs-diffs' => 'Տարբերություններ',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Էլ. հասցեն վավերական է',
 'email-address-validity-invalid' => 'Մուտքագրեք վավերական էլ. հասցե',
 
@@ -1622,6 +1623,8 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 Փոխարենը նրանք, հավանաբար, պետք է հղեն համապատասխան թեմային։<br />
 Էջը համարվում է երկիմաստության փարատման էջ, եթե այն պարունակում է [[MediaWiki:Disambiguationspage]] էջում ընդգրկված կաղապարներից որևէ մեկը։',
 
+'pageswithprop-submit' => 'Անցնել',
+
 'doubleredirects' => 'Կրկնակի վերահղումներ',
 'doubleredirectstext' => 'Այս էջում բերված են վերահղման էջերին վերահղող էջերը։ Յուրաքանչյուր տող պարունակում է հղումներ դեպի առաջին և երկրորդ վերահղումները, ինչպես նաև երկրորդ վերահղման նպատակային էջի առաջին տողը, որում սովորաբար նշված է էջի անվանումը, որին պետք է հղի նաև առաջին վերահղումը։',
 'double-redirect-fixed-move' => '«[[$1]]» էջը վերանվանված է և այժմ վերահղում է «[[$2]]» էջին։',
@@ -1644,7 +1647,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'ncategories' => '$1 {{PLURAL:$1|կատեգորիա|կատեգորիաներ}}',
 'ninterwikis' => '$1 {{PLURAL:$1|ինտերվիքի|ինտերվիքիներ}}',
 'nlinks' => '$1 {{PLURAL:$1|հղում|հղումներ}}',
-'nmembers' => '$1 {{PLURAL:$1|անդամ|անդամ}}',
+'nmembers' => '$1 {{PLURAL:$1|անդամ|անդամներ}}',
 'nrevisions' => '$1 {{PLURAL:$1|տարբերակ|տարբերակներ}}',
 'nviews' => '$1 {{PLURAL:$1|դիտում|դիտումներ}}',
 'nimagelinks' => 'օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}',
@@ -1760,7 +1763,7 @@ $1-ը հղվել է $2 ից',
 'listgrouprights-members' => '(անդամների ցանկ)',
 'listgrouprights-addgroup' => 'Ավելացնեել {{PLURAL:$2|խումբ|խմբեր}}՝  $1',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Ուղարկման հասցե չկա',
 'mailnologintext' => 'Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]] և ունենալ գործող էլ-փոստի հասցե ձեր [[Special:Preferences|նախընտրություններում]]՝ ուրիշ մասնակիցներին էլեկտրոնային նամակներ ուղարկելու համար։',
 'emailuser' => 'էլ-նամակ ուղարկել այս մասնակցին',
@@ -1958,9 +1961,9 @@ $NEWPAGE
 
 # Restrictions (nouns)
 'restriction-edit' => 'Խմբագրում',
-'restriction-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸Õ­Õ¸Ö\82Õ´',
+'restriction-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸Õ­Õ¥Õ¬',
 'restriction-create' => 'Ստեղծում',
-'restriction-upload' => 'Ô²Õ¥Õ¼Õ¶Õ¸Ö\82Õ´',
+'restriction-upload' => 'Ô²Õ¥Õ¼Õ¶Õ¥Õ¬',
 
 # Restriction levels
 'restriction-level-sysop' => 'լրիվ պաշտպանված',
@@ -2324,13 +2327,13 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-protect' => 'Պաշտպանել այս էջը',
 'tooltip-ca-delete' => 'Ջնջել այս էջը',
 'tooltip-ca-undelete' => 'Վերականգնել այս էջի խմբագրումները՝ կատարված ջնջումից առաջ',
-'tooltip-ca-move' => 'Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ էջը',
+'tooltip-ca-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸Õ­Õ¥Õ¬ Õ¡ÕµÕ½ էջը',
 'tooltip-ca-watch' => 'Ավելացնել այս էջը ձեր հսկողության ցանկին',
 'tooltip-ca-unwatch' => 'Հանել այս էջը ձեր հսկողության ցանկից',
 'tooltip-search' => 'Որոնել {{SITENAME}} կայքում',
 'tooltip-search-go' => 'Անցնել այս ճշգրիտ անվանումով էջին',
 'tooltip-search-fulltext' => 'Գտնել այս տեքստով էջերը',
-'tooltip-p-logo' => 'Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö\80 Õ§Õ»',
+'tooltip-p-logo' => 'Ô±ÕµÖ\81Õ¥Õ¬Õ¥Ö\84 Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö\80 Ô·Õ»Õ¨',
 'tooltip-n-mainpage' => 'Այցելեք Գլխավոր Էջը',
 'tooltip-n-mainpage-description' => 'Անցնել գլխավոր էջ',
 'tooltip-n-portal' => 'Նախագծի մասին, որտեղ գտնել ինչը, ինչով կարող եք օգնել',
@@ -2444,6 +2447,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'skinname-myskin' => 'ԻմՏեսք',
 'skinname-chick' => 'Ծիտ',
 'skinname-simple' => 'Պարզ',
+'skinname-modern' => 'Մոդերն',
+'skinname-vector' => 'Սովորական',
 
 # Patrolling
 'markaspatrolleddiff' => 'Նշել որպես ստուգված',
@@ -2480,6 +2485,7 @@ $1',
 'mediawarning' => "'''Զգուշացում'''. այս նիշքի տեսակը կարող է պարունակել վնասակար ծրագրային կոդ։ Այն կիրարկելը կարող է վտանգել ձեր համակարգը։",
 'imagemaxsize' => 'Պատկերի էջում պատկերի չափի սահմանափակում.',
 'thumbsize' => 'Պատկերների փոքրացված չափ.',
+'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 էջեր',
 'file-info' => 'նիշքի չափ՝ $1, MIME-տեսակ՝ $2',
 'file-info-size' => '$1 × $2 փիքսել, նիշքի չափը՝ $3, MIME-տեսակը՝ $4',
@@ -2547,6 +2553,8 @@ $1',
 'exif-componentsconfiguration-0' => 'գոյություն չունի',
 
 'exif-urgency-normal' => 'Նորմալ ($1)',
+'exif-urgency-low' => 'Թույլ ($1)',
+'exif-urgency-high' => 'Ուժեղ ($1)',
 
 # External editor support
 'edit-externally' => 'Խմբագրել այս նիշքը արտաքին խմբագրիչով',
@@ -2558,7 +2566,7 @@ $1',
 'monthsall' => 'բոլոր',
 'limitall' => 'բոլոր',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Էլ-հասցեի վավերացում',
 'confirmemail_noemail' => 'Դուք չեք նշել գործող էլ-հասցե ձեր [[Special:Preferences|նախընտրություններում]]։',
 'confirmemail_text' => 'Այս վիքիում անհրաժեշտ է վավերացնել էլ-հասցեն մինչև էլ-փոստի վրա հիմնված հնարավորությունների օգտագործելը։ Մատնահարեք ստորև կոճակին՝ ձեր հասցեին վավերացման նամակ ուղարկելու համար։ Ուղերձում կգտնեք վավերացման կոդով հղում, որին հետևելով կվավերացնեք ձեր էլ-հասցեն։',
index aafbd4c..2c71229 100644 (file)
@@ -166,7 +166,7 @@ $messages = array(
 'tog-previewonfirst' => 'Monstrar previsualisation al prime modification',
 'tog-nocache' => "Disactivar le ''cache'' de paginas in le navigator",
 'tog-enotifwatchlistpages' => 'Notificar me per e-mail quando un pagina o file in mi observatorio es modificate',
-'tog-enotifusertalkpages' => 'Notificar me via e-mail quando mi pagina de discussion es modificate',
+'tog-enotifusertalkpages' => 'Notificar me per e-mail quando mi pagina de discussion es modificate',
 'tog-enotifminoredits' => 'Notificar me etiam de modificationes minor de paginas e files',
 'tog-enotifrevealaddr' => 'Revelar mi adresse de e-mail in messages de notification',
 'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
@@ -628,16 +628,16 @@ e continuar a usar le contrasigno original.',
 'passwordsent' => 'Un nove contrasigno ha essite inviate al adresse de e-mail registrate pro "$1".
 Per favor aperi session de novo post reciper lo.',
 'blocked-mailpassword' => 'Tu adresse IP es blocate de facer modificationes, e pro impedir le abuso, le uso del function pro recuperar contrasignos es equalmente blocate.',
-'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail nominate.
-Ante que alcun altere e-mail se invia al conto, tu debera sequer le instructiones in le e-mail, pro confirmar que le conto es de facto tue.',
+'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail specificate.
+Pro poter reciper altere e-mail a iste conto, tu debe sequer le instructiones in iste e-mail pro confirmar que le conto es realmente tue.',
 'throttled-mailpassword' => 'Un rememoration del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
 Pro prevenir le abuso, solmente un rememoration de contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Error de inviar e-mail: $1',
 'acct_creation_throttle_hit' => 'Le visitatores de iste wiki usante tu adresse IP ha create {{PLURAL:$1|1 conto|$1 contos}} durante le ultime die, e isto es le maximo permittite in iste periodo de tempore.
 A causa de isto, le visitatores usante iste adresse IP non pote crear nove contos al momento.',
-'emailauthenticated' => 'Tu adresse de e-mail esseva authentificate le $2 a $3.',
-'emailnotauthenticated' => 'Tu adresse de e-mail non ha essite authentificate ancora.
-Nos non inviara e-mail pro alcun del sequente functiones.',
+'emailauthenticated' => 'Tu adresse de e-mail ha essite confirmate le $2 a $3.',
+'emailnotauthenticated' => 'Tu non ha ancora confirmate tu adresse de e-mail.
+Nulle e-mail essera inviate pro le sequente functiones.',
 'noemailprefs' => 'Es necessari specificar un adresse de e-mail in tu preferentias pro poter executar iste functiones.',
 'emailconfirmlink' => 'Confirmar tu adresse de e-mail',
 'invalidemailaddress' => 'Le adresse de e-mail ha un formato invalide e non pote esser acceptate.
@@ -658,7 +658,7 @@ Per favor attende ante de probar lo novemente.',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
 'user-mail-no-addy' => 'Tentava inviar e-mail sin adresse de e-mail.',
 'user-mail-no-body' => 'Tentava inviar e-mail con texto vacue o multo curte.',
@@ -1213,7 +1213,7 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-default' => 'Resultatos de $1:',
 'search-interwiki-more' => '(plus)',
 'search-relatedarticle' => 'Connexe',
-'mwsuggest-disable' => 'Disactivar suggestiones via AJAX',
+'mwsuggest-disable' => 'Disactivar suggestiones de recerca',
 'searcheverything-enable' => 'Cercar in tote le spatios de nomines',
 'searchrelated' => 'connexe',
 'searchall' => 'totes',
@@ -1270,7 +1270,7 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'prefs-misc' => 'Misc',
 'prefs-resetpass' => 'Cambiar contrasigno',
 'prefs-changeemail' => 'Cambiar e-mail',
-'prefs-setemail' => 'Definir un adresse de e-mail',
+'prefs-setemail' => 'Specificar un adresse de e-mail',
 'prefs-email' => 'Optiones de e-mail',
 'prefs-rendering' => 'Apparentia',
 'saveprefs' => 'Confirmar',
@@ -1346,7 +1346,7 @@ Illo debe haber minus de $1 {{PLURAL:$1|character|characteres}}.',
 Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contributiones.',
 'prefs-help-email' => 'Le adresse de e-mail es optional, ma es necessari pro le reinitialisation de tu contrasigno, in caso que tu lo oblida.',
 'prefs-help-email-others' => 'Tu pote etiam optar pro permitter que altere personas te contacta via tu pagina de usator o de discussion, sin necessitate de revelar tu identitate.',
-'prefs-help-email-required' => 'Le adresse de e-mail es requirite.',
+'prefs-help-email-required' => 'Un adresse de e-mail es obligatori.',
 'prefs-info' => 'Informationes de base',
 'prefs-i18n' => 'Internationalisation',
 'prefs-signature' => 'Signatura',
@@ -1362,7 +1362,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'prefs-displaywatchlist' => 'Optiones de presentation',
 'prefs-diffs' => 'Differentias',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sembla valide',
 'email-address-validity-invalid' => 'Un adresse valide es obligatori!',
 
@@ -1966,6 +1966,12 @@ Template:Disambiguation',
 Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
 Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Paginas con un proprietate de pagina',
+'pageswithprop-legend' => 'Paginas con un proprietate de pagina',
+'pageswithprop-text' => 'Iste pagina lista le paginas que usa un certe proprietate de pagina.',
+'pageswithprop-prop' => 'Nomine del proprietate:',
+'pageswithprop-submit' => 'Va',
+
 'doubleredirects' => 'Redirectiones duple',
 'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
 Cata 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.
@@ -2158,7 +2164,7 @@ Il pote haber [[{{MediaWiki:Listgrouprights-helppage}}|informationes additional]
 'listgrouprights-addgroup-self-all' => 'Pote adder tote le gruppos al proprie conto',
 'listgrouprights-removegroup-self-all' => 'Pote remover tote le gruppos del proprie conto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Necun adresse de invio',
 'mailnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]]
 e haber un adresse de e-mail valide in tu [[Special:Preferences|preferentias]]
@@ -2242,26 +2248,27 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
 'enotif_subject_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} per $2',
 'enotif_subject_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} per $2',
 'enotif_subject_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} per $2',
+'enotif_body_intro_deleted' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|delite}} le $PAGEEDITDATE per $2, vide $3.',
+'enotif_body_intro_created' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|create}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
 '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,
 
-
-Le pagina de {{SITENAME}} titulate $PAGETITLE ha essite $CHANGEDORCREATED le $PAGEEDITDATE per $PAGEEDITOR. Vide $PAGETITLE_URL pro le version actual.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Summario del redactor: $PAGESUMMARY $PAGEMINOREDIT
 
 Pro contactar le redactor:
-e-mail: $PAGEEDITOR_EMAIL
+mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Si tu non visita iste pagina, tu non recipera altere notificationes in caso de modificationes ulterior.
-Como alternativa tu pote reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
+Tu non recipera altere notificationes de activitate si tu non visita iste pagina. Tu pote anque reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
 
-             Le systema de notification de {{SITENAME}}, a tu servicio
+Le systema de notification de {{SITENAME}}, a tu servicio
 
 -- 
 Pro configurar le notification per e-mail, visita
@@ -2351,6 +2358,8 @@ Vide le [[Special:ProtectedPages|lista de paginas protegite]] pro le lista de pr
 'prot_1movedto2' => 'displaciava [[$1]] verso [[$2]]',
 'protect-badnamespace-title' => 'Spatio de nomines non protegibile',
 'protect-badnamespace-text' => 'Le paginas in iste spatio de nomines non pote esser protegite.',
+'protect-norestrictiontypes-text' => 'Iste pagina non pote esser protegite perque il non ha alcun typo de restriction disponibile.',
+'protect-norestrictiontypes-title' => 'Pagina non protegibile',
 'protect-legend' => 'Confirmar protection',
 'protectcomment' => 'Motivo:',
 'protectexpiry' => 'Expiration:',
@@ -2678,7 +2687,7 @@ Pro blocar o disblocar le base de datos, le servitor web debe poter scriber a is
 'move-page' => 'Renominar $1',
 'move-page-legend' => 'Renominar pagina',
 'movepagetext' => "Per medio del formulario hic infra tu pote renominar un pagina, transferente tote su historia al nove nomine.
-Le titulo anterior devenira un pagina de redirection verso le nove titulo.
+Le ancian titulo devenira un pagina de redirection verso le nove titulo.
 Tu pote actualisar automaticamente le redirectiones que puncta verso le titulo original.
 Si tu prefere non facer isto, non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
 Tu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.
@@ -2690,12 +2699,12 @@ Isto te lassa le possibilitate de restaurar le titulo original de un pagina si t
 Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
 per favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
 'movepagetext-noredirectfixer' => "Per medio del formulario infra tu pote renominar un pagina, transferente tote su historia al nove nomine.
-Le titulo anterior devenira un pagina de redirection verso le nove titulo.
-Assecura te de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
+Le ancian titulo devenira un pagina de redirection verso le nove titulo.
+Non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
 Tu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.
 
-Nota que le pagina '''non''' essera renominate si existe ja un pagina sub le nove titulo, salvo si illo es vacue o un redirection e non ha un historia de modificationes passate.
-Isto vole dicer que tu pote renominar un pagina retro a su titulo original si tu ha committite un error, ben que tu non pote superscriber un pagina existente.
+Nota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.
+Isto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.
 
 '''Attention!'''
 Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
@@ -2864,6 +2873,7 @@ Salveguarda lo in tu computator e incarga lo hic.',
 'import-error-interwiki' => 'Le pagina "$1" non es importate perque su nomine es reservate pro ligation externe (interwiki).',
 'import-error-special' => 'Le pagina "$1" non es importate perque illo pertine a un spatio de nomines special que non permitte paginas.',
 'import-error-invalid' => 'Le pagina "$1" non es importate perque su nomine es invalide.',
+'import-error-unserialize' => 'Le version $2 del pagina "$1" non pote esser disserialisate. Il ha essite reportate que iste version usa le modello de contento $3 serialisate como $4.',
 'import-options-wrong' => 'Mal {{PLURAL:$2|option|optiones}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Le pagina radice specificate es un titulo invalide.',
 'import-rootpage-nosubpage' => 'Le spatio de nomines "$1" del pagina radice non permitte subpaginas.',
@@ -3025,6 +3035,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-robot-noindex' => 'Non indexabile',
 'pageinfo-views' => 'Numero de visitas',
 'pageinfo-watchers' => 'Numero de observatores del pagina',
+'pageinfo-few-watchers' => 'Minus de $1 {{PLURAL:$1|observator|observatores}}',
 'pageinfo-redirects-name' => 'Redirectiones verso iste pagina',
 'pageinfo-subpages-name' => 'Subpaginas de iste pagina',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirectiones}}; $3 {{PLURAL:$3|non-redirection|non-redirectiones}})',
@@ -3039,6 +3050,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Paginas}} in que iste pagina es transcludite ($1)',
 'pageinfo-toolboxlink' => 'Information sur le pagina',
 'pageinfo-redirectsto' => 'Redirige a',
 'pageinfo-redirectsto-info' => 'info',
@@ -3047,6 +3059,10 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
 'pageinfo-protect-cascading-yes' => 'Si',
 'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
+'pageinfo-category-info' => 'Information de categoria',
+'pageinfo-category-pages' => 'Numero de paginas',
+'pageinfo-category-subcats' => 'Numero de subcategorias',
+'pageinfo-category-files' => 'Numero de files',
 
 # Skin names
 'skinname-standard' => 'Classic',
@@ -3103,6 +3119,7 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'file-nohires' => 'Non disponibile in resolution plus alte.',
 'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
 'svg-long-desc-animated' => 'File SVG animate, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
+'svg-long-error' => 'File SVG invalide: $1',
 'show-big-image' => 'Plen resolution',
 'show-big-image-preview' => ' Dimension de iste previsualisation: $1.',
 'show-big-image-other' => 'Altere {{PLURAL:$2|resolution|resolutiones}}: $1.',
@@ -3132,6 +3149,8 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
+'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
 'ago' => '$1 retro',
 'just-now' => 'Justo nunc',
 
@@ -3563,15 +3582,15 @@ Le alteres essera initialmente celate.
 'monthsall' => 'totes',
 'limitall' => 'totes',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar adresse de e-mail',
 'confirmemail_noemail' => 'Tu non ha configurate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]].',
 'confirmemail_text' => '{{SITENAME}} require que tu valida tu adresse de e-mail ante que tu usa functiones involvente e-mail.
 Activa le button infra pro inviar un message de confirmation a tu adresse.
 Le message includera un ligamine continente un codice;
 visita le ligamine in tu navigator pro confirmar que tu adresse de e-mail es valide.',
-'confirmemail_pending' => 'Un codice de confirmation ha ja essite inviate a te;
-si tu ha recentemente create tu conto, es recommendate attender le arrivata de illo durante alcun minutas ante de provar requestar un nove codice.',
+'confirmemail_pending' => 'Un codice de confirmation ha jam essite inviate a te per e-mail;
+si tu ha create tu conto recentemente, per favor attende alcun minutas que le message de confirmation arriva ante de requestar un nove codice.',
 'confirmemail_send' => 'Inviar un codice de confirmation',
 'confirmemail_sent' => 'Message de confirmation inviate.',
 'confirmemail_oncreate' => 'Un codice de confirmation ha essite inviate a tu adresse de e-mail.
@@ -3589,14 +3608,14 @@ Tu pote ora aperir un session e fruer te del wiki.',
 'confirmemail_error' => 'Un problema occurreva durante le salveguarda de tu confirmation.',
 'confirmemail_subject' => 'Confirmation del adresse de e-mail pro {{SITENAME}}',
 'confirmemail_body' => 'Un persona, probabilemente tu, usante le adresse IP $1,
-ha registrate un conto "$2" con iste adresse de e-mail in {{SITENAME}}.
+ha create un conto "$2" con iste adresse de e-mail in {{SITENAME}}.
 
-Pro confirmar que iste conto es de facto tue, e pro activar le functiones
+Pro confirmar que iste conto es realmente tue, e pro activar le functiones
 de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
 
 $3
 
-Si tu *non* ha registrate le conto, seque iste ligamine
+Si tu *non* ha create iste conto, seque le sequente ligamine
 pro cancellar le confirmation del adresse de e-mail:
 
 $5
@@ -3605,7 +3624,7 @@ Iste codice de confirmation expirara a $4.',
 'confirmemail_body_changed' => 'Un persona, probabilemente tu, usante le adresse IP $1,
 ha cambiate le adresse de e-mail del conto "$2" a iste adresse in {{SITENAME}}.
 
-Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+Pro confirmar que iste conto es realmente tue, e pro reactivar le functiones
 de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
 
 $3
@@ -3619,7 +3638,7 @@ Iste codice de confirmation expirara a $4.',
 'confirmemail_body_set' => 'Un persona, probabilemente tu, usante le adresse IP $1,
 ha specificate que iste adresse de e-mail pertine al conto "$2" in {{SITENAME}}.
 
-Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+Pro confirmar que iste conto es realmente tue, e pro activar le functiones
 de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
 
 $3
@@ -3794,7 +3813,7 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'specialpages-group-highuse' => 'Paginas multo usate',
 'specialpages-group-pages' => 'Listas de paginas',
 'specialpages-group-pagetools' => 'Instrumentos pro paginas',
-'specialpages-group-wiki' => 'Datos e instrumentos pro Wiki',
+'specialpages-group-wiki' => 'Datos e instrumentos',
 'specialpages-group-redirects' => 'Redirection de paginas special',
 'specialpages-group-spam' => 'Instrumentos antispam',
 
@@ -3891,6 +3910,7 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite create',
 'logentry-newusers-create' => 'Le conto de usator $1 ha essite create',
 'logentry-newusers-create2' => 'Le conto de usator $3 ha essite create per $1',
+'logentry-newusers-byemail' => 'Le conto de usator $3 ha essite create per $1 e le contrasigno ha essite inviate per e-mail',
 'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
 'logentry-rights-rights' => '$1 cambiava le appertinentia a gruppos pro $3 de $4 a $5',
 'logentry-rights-rights-legacy' => '$1 cambiava le appertinentia a gruppos pro $3',
@@ -3949,6 +3969,7 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'api-error-ok-but-empty' => 'Error interne: nulle responsa del servitor.',
 'api-error-overwrite' => 'Superscriber un file existente non es permittite.',
 'api-error-stashfailed' => 'Error interne: le servitor non poteva immagazinar le file temporari.',
+'api-error-publishfailed' => 'Error interne: le servitor non poteva publicar le file temporari.',
 'api-error-timeout' => 'Le servitor non ha respondite intra le tempore expectate.',
 'api-error-unclassified' => 'Un error incognite ha occurrite.',
 'api-error-unknown-code' => 'Error incognite: "$1"',
@@ -3969,4 +3990,7 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
 
+# Image rotation
+'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
+
 );
index 7df415a..b8f27d7 100644 (file)
@@ -837,7 +837,7 @@ Silakan menunggu sebelum mencoba lagi.',
 'loginlanguagelabel' => 'Bahasa: $1',
 'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
 'user-mail-no-addy' => 'Mencoba mengirimkan surel tanpa alamat surel.',
 'user-mail-no-body' => 'Mencoba untuk mengirim surel kosong atau terlalu pendek.',
@@ -1139,10 +1139,10 @@ Beberapa templat akan diabaikan.',
 'converter-manual-rule-error' => 'Kesalahan terdeteksi di aturan manual konversi bahasa',
 
 # "Undo" feature
-'undo-success' => 'Suntingan ini dapat dibatalkan. Tolong cek perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembatalan suntingan.',
-'undo-failure' => 'Suntingan ini tidak dapat dibatalkan karena konflik penyuntingan antara.',
-'undo-norev' => 'Suntingan ini tidak dapat dibatalkan karena halaman tidak ditemukan atau telah dihapuskan.',
-'undo-summary' => 'Membatalkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
+'undo-success' => 'Suntingan ini dapat dibalikkan. Silakan periksa perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembalikkan suntingan.',
+'undo-failure' => 'Suntingan ini tidak dapat dibalikkan karena konflik penyuntingan antara.',
+'undo-norev' => 'Suntingan ini tidak dapat dibalikkan karena halaman tidak ditemukan atau telah dihapuskan.',
+'undo-summary' => 'Membalikkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
@@ -1320,7 +1320,7 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
 'lineno' => 'Baris $1:',
 'compareselectedversions' => 'Bandingkan versi terpilih',
 'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
-'editundo' => 'batalkan',
+'editundo' => 'balikkan',
 'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh {{PLURAL:$2|satu|$2}} pengguna tak 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.
@@ -1519,7 +1519,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'prefs-displaywatchlist' => 'Pilihan tampilan',
 'prefs-diffs' => 'Beda',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat surel tampaknya sah',
 'email-address-validity-invalid' => 'Masukkan alamat surel yang sah',
 
@@ -1992,7 +1992,7 @@ Ketika disaring oleh pengguna, hanya vesi berkas terbaru dari berkas yang penggu
 'filehist-help' => 'Klik pada tanggal/waktu untuk melihat berkas ini pada saat tersebut.',
 'filehist-deleteall' => 'hapus semua',
 'filehist-deleteone' => 'hapus',
-'filehist-revert' => 'kembalikan',
+'filehist-revert' => 'batalkan',
 'filehist-current' => 'terkini',
 'filehist-datetime' => 'Tanggal/Waktu',
 'filehist-thumb' => 'Miniatur',
@@ -2031,13 +2031,13 @@ Mungkin Anda ingin menyunting keterangan pada [$2 halaman deskripsi berkas] di s
 'upload-disallowed-here' => 'Anda tidak bisa menimpa berkas ini.',
 
 # File reversion
-'filerevert' => 'Kembalikan $1',
-'filerevert-legend' => 'Kembalikan berkas',
-'filerevert-intro' => "Anda mengembalikan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
+'filerevert' => 'Batalkan $1',
+'filerevert-legend' => 'Batalkan berkas',
+'filerevert-intro' => "Anda membatalkan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
 'filerevert-comment' => 'Alasan:',
-'filerevert-defaultcomment' => 'Dikembalikan ke versi pada $2, $1',
-'filerevert-submit' => 'Kembalikan',
-'filerevert-success' => "'''[[Media:$1|$1]]''' telah dikembalikan ke versi [$4 pada $3, $2]",
+'filerevert-defaultcomment' => 'Dibatalkan ke versi pada $2, $1',
+'filerevert-submit' => 'Batalkan',
+'filerevert-success' => "'''[[Media:$1|$1]]''' telah dibatalkan ke versi [$4 pada $3, $2]",
 'filerevert-badversion' => 'Tidak ada versi lokal terdahulu dari berkas ini dengan stempel waktu yang dimaksud.',
 
 # File deletion
@@ -2113,6 +2113,12 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
 Halaman-halaman tersebut seharusnya berpaut ke topik-topik yang sesuai.<br />
 Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut menggunakan templat yang terhubung ke [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Halaman dengan halaman properti',
+'pageswithprop-legend' => 'Halaman dengan halaman properti',
+'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
+'pageswithprop-prop' => 'Nama properti:',
+'pageswithprop-submit' => 'Pergi',
+
 'doubleredirects' => 'Pengalihan ganda',
 'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
 Setiap 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.
@@ -2305,7 +2311,7 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listgrouprights-addgroup-self-all' => 'Dapat menambahkan semua grup ke akun sendiri',
 'listgrouprights-removegroup-self-all' => 'Menghapus semua kelompok dari akun sendiri',
 
-# E-mail user
+# Email user
 '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.',
 'emailuser' => 'Surel pengguna',
@@ -2442,7 +2448,7 @@ Umpan balik dan bantuan lebih lanjut:
 'dellogpage' => 'Log penghapusan',
 'dellogpagetext' => 'Di bawah ini adalah log penghapusan halaman. Semua waktu yang ditunjukkan adalah waktu server.',
 'deletionlog' => 'log penghapusan',
-'reverted' => 'Dikembalikan ke revisi sebelumnya',
+'reverted' => 'Dibatalkan ke revisi sebelumnya',
 'deletecomment' => 'Alasan:',
 'deleteotherreason' => 'Alasan lain/tambahan:',
 'deletereasonotherlist' => 'Alasan lain',
@@ -2463,16 +2469,16 @@ Menghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{S
 'rollbacklinkcount' => 'kembalikan $1 {{PLURAL:$1|suntingan|suntingan}}',
 'rollbacklinkcount-morethan' => 'kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}',
 'rollbackfailed' => 'Pengembalian gagal dilakukan',
-'cantrollback' => 'Tidak dapat mengembalikan suntingan;
+'cantrollback' => 'Tidak dapat membatalkan suntingan;
 kontributor terakhir adalah satu-satunya penulis halaman ini.',
 'alreadyrolled' => 'Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
 pengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.
 
 Suntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Komentar penyuntingan adalah: \"''\$1''\".",
-'revertpage' => '←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dikembalikan ke versi terakhir oleh [[User:$1|$1]]',
+'revertpage' => '←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]',
 'revertpage-nouser' => 'Pengembalian suntingan oleh (pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]',
-'rollback-success' => 'Pengembalian suntingan oleh $1; dikembalikan ke versi terakhir oleh $2.',
+'rollback-success' => 'Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Kegagalan sesi',
@@ -2859,7 +2865,7 @@ Dalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabung
 'movesubpagetext' => 'Halaman ini memiliki $1 {{PLURAL:$1|subhalaman|subhalaman}} seperti ditampilkan berikut.',
 'movenosubpage' => 'Halaman ini tak memiliki subhalaman.',
 'movereason' => 'Alasan:',
-'revertmove' => 'kembalikan',
+'revertmove' => 'batalkan',
 'delete_and_move' => 'Hapus dan pindahkan',
 'delete_and_move_text' => '==Penghapusan diperlukan==
 Halaman yang dituju, "[[:$1]]", telah mempunyai isi. Apakah Anda hendak menghapusnya untuk memberikan ruang bagi pemindahan?',
@@ -3072,8 +3078,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'tooltip-watchlistedit-raw-submit' => 'Perbarui daftar pantauan',
 'tooltip-recreate' => 'Buat ulang halaman walaupun sebenarnya telah dihapus',
 'tooltip-upload' => 'Mulai pemuatan',
-'tooltip-rollback' => 'Mengembalikan suntingan-suntingan di halaman ini ke kontributor terakhir dalam satu kali klik.',
-'tooltip-undo' => 'Mengembalikan revisi ini dan membuka kotak penyuntingan dengan mode pratayang. Alasan dapat ditambahkan di kotak ringkasan.',
+'tooltip-rollback' => '"Kembalikan" membatalkan suntingan-suntingan di halaman ini ke kontributor terakhir dalam satu kali klik.',
+'tooltip-undo' => '"Balikkan" membatalkan revisi ini dan membuka kotak penyuntingan dengan mode pratayang. Alasan dapat ditambahkan di kotak ringkasan.',
 'tooltip-preferences-save' => 'Simpan preferensi',
 'tooltip-summary' => 'Masukkan sebuah ringkasan pendek',
 
@@ -3133,7 +3139,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
 Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hitam.',
 'spamprotectionmatch' => 'Teks berikut ini memancing filter spam kami: $1',
 'spambot_username' => 'Pembersihan span MediaWiki',
-'spam_reverting' => 'Mengembalikan ke versi terakhir yang tak memiliki pranala ke $1',
+'spam_reverting' => 'Membatalkan ke versi terakhir yang tak memiliki pranala ke $1',
 'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, pengosongan',
 'spam_deleting' => 'Semua revisi yang memiliki pranala ke $1, penghapusan',
 
@@ -3782,7 +3788,7 @@ $8',
 'monthsall' => 'semua',
 'limitall' => 'semua',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Konfirmasi alamat surel',
 'confirmemail_noemail' => 'Anda tidak memberikan alamat surel yang sah di [[Special:Preferences|preferensi pengguna]] Anda.',
 'confirmemail_text' => '{{SITENAME}} mengharuskan Anda untuk melakukan konfirmasi atas alamat surel Anda sebelum fitur-fitur surel dapat digunakan.
@@ -4123,7 +4129,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'htmlform-int-toohigh' => 'Nilai yang Anda masukkan melebihi nilai maksimum $1',
 'htmlform-required' => 'Nilai ini diperlukan',
 'htmlform-submit' => 'Kirim',
-'htmlform-reset' => 'Batalkan perubahan',
+'htmlform-reset' => 'Balikkan perubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
 
 # SQLite database support
@@ -4239,4 +4245,7 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'duration-centuries' => '{{PLURAL:$1||}}$1 abad',
 'duration-millennia' => '{{PLURAL:$1||}}$1 milenium',
 
+# Image rotation
+'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
+
 );
index 51f3ea6..553bf8c 100644 (file)
@@ -553,7 +553,7 @@ Pangaasi nga agurayka sakbay nga agipadas manen.',
 'loginlanguagelabel' => 'Pagsasao: $1',
 'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar  ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP  () a pamay-an.',
 'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan.',
 'user-mail-no-body' => 'Nangpadaska a nangipatulod ti e-surat nga awan linaonna wenno ababa laeng a bagi.',
@@ -1259,7 +1259,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
 'prefs-diffs' => 'Sabali',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ti e-surat a pagtaengan ket kasla umiso',
 'email-address-validity-invalid' => 'Ikabil ti umiso nga e-surat a pagtaengan',
 
@@ -1851,6 +1851,12 @@ Laglagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkate
 Dagitoy ket embes a nasken a maisilpoda kadagiti maitutop a panid.<br />
 Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo manipud idiay [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-legend' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-text' => 'Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.',
+'pageswithprop-prop' => 'Nagan ti tagikua:',
+'pageswithprop-submit' => 'Inkan',
+
 'doubleredirects' => 'Dagiti namindua a naibaw-ing',
 'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
 Iti tunggal maysa nga aray ket adda nagyanna kadagiti panilpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti "pudno" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.
@@ -2042,7 +2048,7 @@ Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a m
 'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukodmo a pakabilangan',
 'listgrouprights-removegroup-self-all' => 'Ikkatem amin dagiti bunggoy ti bukod a pakabilangan',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Awan ti pagipatulodan a pagtaengan',
 'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga e-surat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti e-surat kadagiti sabsabali nga agar-aramat.',
 'emailuser' => 'E-suratan daytoy nga agar-aramat',
@@ -3411,7 +3417,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'monthsall' => 'amin',
 'limitall' => 'amin',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Pasingkedan ti e-surat a pagtaengam',
 'confirmemail_noemail' => 'Awan ti umisu nga e-surat a pagtaengam a naikabil idiay [[Special:Preferences|kaykayat ti agar-aramat]].',
 'confirmemail_text' => 'Ti {{SITNAME}} ket masapulna a pasingkedam ti e-surat a pagtaengam sakbay nga agusar ti -surat a langa.
@@ -3819,4 +3825,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
 
+# Image rotation
+'rotate-comment' => 'Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan',
+
 );
index 736b2ce..0e7e82d 100644 (file)
@@ -680,7 +680,7 @@ Vinsamlegast veldu þér annað.',
 {{SITENAME}} notar vefkökur til að skrá inn notendur.
 Þú hefur lokað fyrir vefkökur.
 Gjörðu svo vel og opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.',
-'nocookieslogin' => '{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim sem gerir það ókleyft að innskrá þig. Vinsamlegast virkjaðu móttöku kakna í vafranum þínum til að geta skráð þig inn.',
+'nocookieslogin' => '{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim. Vinsamlegast virkjaðu móttöku kakna í vafranum þínum til að geta skráð þig inn.',
 'nocookiesfornew' => 'Notenda aðgangurinn var ekki stofnaður, því ekki fannst uppruni beiðnarinnar.
 Gakktu úr skugga um að vefkökur séu virkar, endurhladdu þessari síðu og reyndu aftur.',
 'noname' => 'Þú hefur ekki tilgreint gilt notandanafn.',
@@ -740,7 +740,7 @@ Vinsamlegast reynið aftur síðar.',
 'loginlanguagelabel' => 'Tungumál: $1',
 'suspicious-userlogout' => 'Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
 'user-mail-no-addy' => 'Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.',
 'user-mail-no-body' => 'Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.',
@@ -877,14 +877,14 @@ Athugaðu að þú getur ekki notað „Senda þessum notanda tölvupóst“ að
 Núverandi vistfang þitt er $3, og bönnunarnúmerið er #$5.
 Vinsamlegast tilgreindu allt að ofanverðu í fyrirspurnum þínum.",
 'blockednoreason' => 'engin ástæða gefin',
-'whitelistedittext' => 'Þú þarft að $1 til að breyta síðum.',
+'whitelistedittext' => 'Þú þarft að $1 þig til að breyta síðum.',
 'confirmedittext' => 'Þú verður að staðfesta netfangið þitt áður en þú getur breytt síðum. Vinsamlegast stilltu og staðfestu netfangið þitt í gegnum [[Special:Preferences|stillingarnar]].',
 'nosuchsectiontitle' => 'Hluti ekki til',
 'nosuchsectiontext' => 'Þú reyndir að breyta hluta sem er ekki til.
 Hlutinn gæti hafa verið fluttur til eða hent á meðan þú varst að skoða síðuna.',
 'loginreqtitle' => 'Innskráningar krafist',
 'loginreqlink' => 'innskrá',
-'loginreqpagetext' => 'Þú þarft að $1 til að geta séð aðrar síður.',
+'loginreqpagetext' => 'Þú þarft að $1 þig til að geta séð aðrar síður.',
 'accmailtitle' => 'Lykilorð sent.',
 'accmailtext' => "Lykilorðið fyrir [[User talk:$1|$1]] hefur verið sent á $2.
 
@@ -1422,7 +1422,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'prefs-displaywatchlist' => 'Útlitsmöguleikar',
 'prefs-diffs' => 'Breytingar',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Netfang virðist vera virkt.',
 'email-address-validity-invalid' => 'Settu inn rétt netfang',
 
@@ -2203,7 +2203,7 @@ Leitin þarf að minnsta kosti að innihalda rótarlén, eins og "*.org"
 'listgrouprights-addgroup-self-all' => 'Bæta sjálfum sér í alla hópa',
 'listgrouprights-removegroup-self-all' => 'Fjarlægja sjálfan sig úr öllum hópum',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Ekkert netfang til að senda á',
 'mailnologintext' => 'Þú verður að vera [[Special:UserLogin|innskráð(ur)]] auk þess að hafa gilt netfang í [[Special:Preferences|stillingunum]] þínum til að senda tölvupóst til annara notenda.',
 'emailuser' => 'Senda þessum notanda tölvupóst',
@@ -2245,7 +2245,7 @@ Póstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]
 'mywatchlist' => 'Vaktlisti',
 'watchlistfor2' => 'Eftir $1 $2',
 'nowatchlist' => 'Vaktlistinn er tómur.',
-'watchlistanontext' => 'Vinsamlegast $1 til að skoða eða breyta vaktlistanum þínum.',
+'watchlistanontext' => 'Vinsamlegast $1ðu þig til að skoða eða breyta vaktlistanum þínum.',
 'watchnologin' => 'Óinnskráð(ur)',
 'watchnologintext' => 'Þú verður að vera [[Special:UserLogin|innskáð(ur)]] til að geta breytt vaktlistanum.',
 'addwatch' => 'Bæta á vaktlistann',
@@ -3548,7 +3548,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
 'monthsall' => 'allir',
 'limitall' => 'alla',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Staðfesta netfang',
 'confirmemail_noemail' => 'Þú hefur ekki gefið upp gilt netfang í [[Special:Preferences|notandastillingum]] þínum.',
 'confirmemail_text' => '{{SITENAME}} krefst þess að þú staðfestir netfangið þitt áður en að þú getur notað eiginleika tengt því. Smelltu á hnappinn að neðan til að fá staðfestingarpóst sendan á netfangið. Pósturinn mun innihalda tengil með kóða í sér; opnaðu tengilinn í vafranum til að staðfesta að netfangið sé rétt.',
@@ -3564,7 +3564,7 @@ Athugaðu hvort ógild tákn séu í netfanginu þínu.
 
 Póstþjónninn skilaði: $1',
 'confirmemail_invalid' => 'Ógildur staðfestingarkóði. Hann gæti verið útrunninn.',
-'confirmemail_needlogin' => 'Þú verður að $1 til að staðfesta netfangið þitt.',
+'confirmemail_needlogin' => 'Þú verður að $1 þig til að staðfesta netfangið þitt.',
 'confirmemail_success' => 'Netfang þitt hefur verið staðfest. Þú getur nú [[Special:UserLogin|skráð þig inn]] og vafrað um wiki-kerfið.',
 'confirmemail_loggedin' => 'Netfang þitt hefur verið staðfest.',
 'confirmemail_error' => 'Eitthvað fór úrskeiðis við vistun staðfestingarinnar.',
index cff4962..8b883bd 100644 (file)
@@ -784,7 +784,7 @@ Riprovare più tardi.',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.',
 
-# E-mail sending
+# Email sending
 '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.',
@@ -1443,7 +1443,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'prefs-displaywatchlist' => 'Opzioni di visualizzazione',
 'prefs-diffs' => 'Differenze',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "L'indirizzo e-mail sembra valido",
 'email-address-validity-invalid' => 'Inserisci un indirizzo e-mail valido',
 
@@ -2024,6 +2024,12 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 Esse potrebbero dover puntare a una pagina più appropriata.<br />
 Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pagine con una pagina di proprietà',
+'pageswithprop-legend' => 'Pagine con una pagina di proprietà',
+'pageswithprop-text' => 'Questa pagina elenca le pagine che utilizzano una particolare pagina di proprietà.',
+'pageswithprop-prop' => 'Nome proprietà:',
+'pageswithprop-submit' => 'Vai',
+
 'doubleredirects' => 'Redirect doppi',
 'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
 Ciascuna 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.
@@ -2215,7 +2221,7 @@ Potrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazio
 'listgrouprights-addgroup-self-all' => 'Può aggiungersi a tutti i gruppi',
 'listgrouprights-removegroup-self-all' => 'Può rimuoversi da tutti i gruppi',
 
-# E-mail user
+# Email user
 '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",
@@ -3590,7 +3596,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 'monthsall' => 'tutti',
 'limitall' => 'tutti',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Conferma indirizzo email',
 'confirmemail_noemail' => 'Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].',
 'confirmemail_text' => "{{SITENAME}} richiede la verifica dell'indirizzo e-mail prima di poter usare le relative funzioni. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
@@ -4002,4 +4008,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
 
+# Image rotation
+'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+
 );
index 0c5a42d..3b89696 100644 (file)
@@ -849,8 +849,8 @@ Cookieを有効にしていることを確認して、このページを再読
 このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
 'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
 'noemailcreate' => '有効なメールアドレスを入力する必要があります',
-'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスに送信しました。
\83¡ã\83¼ã\83«ã\82\92å\8f\97ã\81\91å\8f\96ã\81£たら、再度ログインしてください。',
+'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスにお送りしました。
\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\84たら、再度ログインしてください。',
 'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
 'eauthentsent' => '指定したメールアドレスに、アドレス確認のためのメールをお送りしました。
 メールに記載された手順に従って、このアカウントの所有者であることの確認が取れると、このアカウント宛のメールを受け取れるようになります。',
@@ -883,7 +883,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'loginlanguagelabel' => '言語: $1',
 'suspicious-userlogout' => '壊れたブラウザーまたはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHPのmail()関数での不明なエラーです。',
 'user-mail-no-addy' => 'メールアドレスなしでメールを送信しようとしました。',
 'user-mail-no-body' => '本文が空、またはあまりにも短いメールは送信できません。',
@@ -950,7 +950,7 @@ $2
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
-'changeemail-header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92変更',
+'changeemail-header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®変更',
 'changeemail-text' => 'このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。',
 'changeemail-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'changeemail-oldemail' => '現在のメールアドレス:',
@@ -1039,7 +1039,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'loginreqtitle' => 'ログインが必要',
 'loginreqlink' => 'ログイン',
 'loginreqpagetext' => '他のページを閲覧するには$1する必要があります。',
-'accmailtitle' => 'パスワードをお送りしました',
+'accmailtitle' => 'パスワードをお送りしました',
 'accmailtext' => "[[User talk:$1|$1]]のために無作為に生成したパスワードを、$2に送信しました。
 
 この新アカウントのパスワードは、ログインした際に''[[Special:ChangePassword|パスワード変更]]''ページで変更できます。",
@@ -1047,10 +1047,10 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'newarticletext' => "まだ存在しないページへのリンクをたどりました。
 このページを新規作成するには、ページの内容を以下のボックスに記入してください (詳しくは[[{{MediaWiki:Helppage}}|ヘルプページ]]を参照してください)。
 誤ってこのページにたどり着いた場合には、ブラウザーの'''戻る'''ボタンで前のページに戻ってください。",
-'anontalkpagetext' => "----''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。
-匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。
-IP アドレスは複数の利用者で共有されている場合があります。
-もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
+'anontalkpagetext' => "----
+''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。''
+
+匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。IP アドレスは複数の利用者で共有されている場合があります。もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられていると考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。",
 'noarticletext' => '現在このページには内容がありません。
 他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索]]、
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]、
@@ -1296,7 +1296,7 @@ $3が示した理由: ''$2''",
 追加の制限がかけられない限り、{{SITENAME}}の他の管理者は同じインターフェイスを使って非表示の内容の取得や復元ができます。",
 'revdelete-confirm' => 'この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。',
 'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
-* 名誉毀損の恐れのある記述
+* 名誉毀損のおそれがある記述
 * 非公開個人情報
 *: ''自宅の住所、電話番号、社会保障番号など''",
 'revdelete-legend' => '閲覧レベル制限を設定',
@@ -1446,7 +1446,7 @@ $1",
 'showingresults' => "'''$2''' 件目以降の最大 {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
 'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
 'showingresultsheader' => "「'''$4'''」の検索結果 {{PLURAL:$5|'''$3''' 件中の '''$1''' 件目|'''$3''' 件中の '''$1''' 件目から '''$2''' 件目}}",
-'nonefound' => "'''注意''': 既定では一部の名前空間のみを検索します。
+'nonefound' => "'''注意:''' 既定では一部の名前空間のみを検索します。
 ''all:''を前に付けると、すべて (トークページやテンプレートなどを含む) を対象にできます。検索する名前空間を前に付けることもできます。",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
@@ -1593,7 +1593,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'prefs-displaywatchlist' => '表示の設定',
 'prefs-diffs' => '差分',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'メールアドレスは有効のようです',
 'email-address-validity-invalid' => '有効なメールアドレスを入力してください',
 
@@ -2208,6 +2208,12 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 これらのリンクは、より適切なページへのリンクに変更する必要があります。<br />
 [[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
 
+'pageswithprop' => 'ページプロパティがあるページ',
+'pageswithprop-legend' => 'ページプロパティがあるページ',
+'pageswithprop-text' => 'このページでは、特定のページプロパティを持つページを列挙します。',
+'pageswithprop-prop' => 'プロパティ名:',
+'pageswithprop-submit' => '実行',
+
 'doubleredirects' => '二重転送',
 'doubleredirectstext' => 'このページでは、転送ページへの転送ページを列挙します。
 最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。
@@ -2400,10 +2406,10 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'listgrouprights-removegroup-all' => '全グループを除去可能',
 'listgrouprights-addgroup-self' => '自身のアカウントに{{PLURAL:$2|グループ}}を追加: $1',
 'listgrouprights-removegroup-self' => '自身のアカウントから{{PLURAL:$2|グループ}}を除去: $1',
-'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
-'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
+'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
+'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
 
-# E-mail user
+# Email user
 'mailnologin' => '送信アドレスがありません',
 'mailnologintext' => '他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。',
 'emailuser' => 'この利用者にメールを送信',
@@ -2810,9 +2816,9 @@ $1',
 'unblockip' => 'ブロックを解除',
 'unblockiptext' => '以下のフォームで利用者またはIPアドレスのブロックを解除できます。',
 'ipusubmit' => 'このブロックを解除',
-'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
-'unblocked-range' => '$1のブロックを解除しました',
-'unblocked-id' => 'ブロック$1を除去しました',
+'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
+'unblocked-range' => '$1のブロックを解除しました',
+'unblocked-id' => 'ブロック$1を除去しました',
 'blocklist' => 'ブロックされている利用者',
 'ipblocklist' => 'ブロックされている利用者',
 'ipblocklist-legend' => 'ブロックされている利用者の検索',
@@ -3097,7 +3103,7 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 ファイルの一部のみアップロードされました。',
 'importuploaderrortemp' => '取り込みファイルのアップロードに失敗しました。
 一時フォルダーがありません。',
-'import-parse-failure' => 'XMLの取り込み構文解析に失敗しました',
+'import-parse-failure' => 'XML取り込みの構文解析に失敗しました',
 'import-noarticle' => '取り込むページがありません!',
 'import-nonewrevisions' => 'すべての版は以前に取り込み済みです。',
 'xml-error-string' => '$1、$2 行の $3 文字目 ($4バイト目): $5',
@@ -3107,12 +3113,13 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'import-invalid-interwiki' => '指定されたウィキから取り込めませんでした。',
 'import-error-edit' => 'あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。',
 'import-error-create' => 'あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。',
-'import-error-interwiki' => '名前が外部リンク (interwiki) に予約されているため、ページ「$1」を取り込みませんでした。',
+'import-error-interwiki' => 'ページ名が外部リンク (ウィキ間リンク) に予約されているため、ページ「$1」を取り込みませんでした。',
 'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。',
 'import-error-invalid' => '名前が正しくないため、ページ「$1」を取り込みませんでした。',
+'import-error-unserialize' => 'ページ「$1」の版 $2 は直列化復元できませんでした。この版は $4 として直列化されたコンテンツモデル $3 を使用していると報告されています。',
 'import-options-wrong' => '間違った{{PLURAL:$2|オプション}}です: <nowiki>$1</nowiki>',
-'import-rootpage-invalid' => 'å\85¥å\8a\9bã\81\95ã\82\8cã\81\9fã\83«ã\83¼ã\83\88 ã\83\9aã\83¼ã\82¸ã\81®å\90\8då\89\8dã\81\8c無効です。',
-'import-rootpage-nosubpage' => 'ルート ページの名前空間「$1」では、下位ページが許可されていません。',
+'import-rootpage-invalid' => 'å\85¥å\8a\9bã\81\97ã\81\9fã\83«ã\83¼ã\83\88ã\83\9aã\83¼ã\82¸ã\81®å\90\8då\89\8dã\81¯無効です。',
+'import-rootpage-nosubpage' => 'ルートページの名前空間「$1」では、下位ページが許可されていません。',
 
 # Import log
 'importlogpage' => '取り込み記録',
@@ -3890,7 +3897,7 @@ Variants for Chinese language
 'monthsall' => 'すべて',
 'limitall' => 'すべて',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'メールアドレスの確認',
 'confirmemail_noemail' => '[[Special:Preferences|個人設定]]で有効なメールアドレスが指定されていません。',
 'confirmemail_text' => '{{SITENAME}}では、メール機能を使用する前にメールアドレスの検証が必要です。
@@ -3958,7 +3965,7 @@ $5
 
 この確認コードは $4 に期限切れになります。',
 'confirmemail_invalidated' => 'メールアドレスの確認が中止されました',
-'invalidateemail' => 'メールアドレスの認証中止',
+'invalidateemail' => 'メールアドレスの確認中止',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[ウィキ間の参照読み込みは無効になっています]',
@@ -3967,7 +3974,7 @@ $5
 'scarytranscludetoolong' => '[URLが長すぎます]',
 
 # Delete conflict
-'deletedwhileediting' => "'''警告''': このページが、編集開始後に削除されました!",
+'deletedwhileediting' => "'''警告:''' このページが、編集開始後に削除されました!",
 'confirmrecreate' => "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを以下の理由で削除しました:
 : ''$2''
 このままこのページを本当に再作成していいか確認してください。",
@@ -4377,4 +4384,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
 'duration-millennia' => '$1{{PLURAL:$1|,000 年}}',
 
+# Image rotation
+'rotate-comment' => '画像を時計回りに $1 {{PLURAL:$1|度}}回転',
+
 );
index 97bb77b..d012011 100644 (file)
@@ -686,7 +686,7 @@ $1 საათში.',
 'loginlanguagelabel' => 'ენა: $1',
 'suspicious-userlogout' => 'თქვენი მოთხოვნა გასვლის შესახებ გაუქმებულია, რადგანაც იგი გავს ქეშირებადი პროქსის ან არაკორექტული ბრაუზერის მოთხოვნას.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'ამოუცნობი შეცდომა PHP-ის mail() ფუნქციაში',
 'user-mail-no-addy' => 'ცდილობდა ელ-ფოსტის გაგზავნას ელ-ფოსტის მისამართის გარეშე.',
 'user-mail-no-body' => 'ცდილობდა ცარიელი ან უაზროდ მოკლე შინაარსის ელექტრონული წერილის გაგზავნას.',
@@ -1098,11 +1098,11 @@ $3 -ემ ამგვარი ახსნა : ''$2''",
 'revdelete-hide-name' => 'დამალეთ მოქმედება და მისი ობიექტი',
 'revdelete-hide-comment' => 'რედაქტირების კომენტარის დამალვა',
 'revdelete-hide-user' => 'რედაქტორის მომხ. სახელის/IP-ს დამალვა',
-'revdelete-hide-restricted' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\97á\83\90á\83\92á\83\90á\83\9cá\83\90á\83ª',
+'revdelete-hide-restricted' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\98á\83¡á\83¢á\83 á\83\90á\83¢á\83\9dá\83 á\83\97á\83\90á\83\92á\83\90á\83\9c',
 'revdelete-radio-same' => '(არ შეცვალოთ)',
 'revdelete-radio-set' => 'დიახ',
 'revdelete-radio-unset' => 'არა',
-'revdelete-suppress' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\97á\83\90á\83\92á\83\90á\83\9cá\83\90á\83ª',
+'revdelete-suppress' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\98á\83¡á\83¢á\83 á\83\90á\83¢á\83\9dá\83 á\83\97á\83\90á\83\92á\83\90á\83\9c',
 'revdelete-unsuppress' => 'მოხსენით შეზღუდვა ვერსიების აღდგენისგან',
 'revdelete-log' => 'მიზეზი:',
 'revdelete-submit' => '{{PLURAL:$1|არჩეული ვერსიის|არჩეული ვერსიების}} განხორციელება',
@@ -1376,7 +1376,7 @@ $1",
 'prefs-displaywatchlist' => 'გამოსახვის კონფიგურაციები',
 'prefs-diffs' => 'სხვაობა ვერსიებს შორის',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ელ-ფოსტის მისამართი სწორად გამოიყურება',
 'email-address-validity-invalid' => 'მიუთითეთ სწორი ელ-ფოსტის მისამართი',
 
@@ -1571,7 +1571,7 @@ $1",
 'newsectionsummary' => '/* $1 */ ახალი სექცია',
 'rc-enhanced-expand' => 'დამატებითი ინფორმაციის ჩვენება (მოითხოვს ჯავასკრიპტს)',
 'rc-enhanced-hide' => 'დამატებითი ინფორმაციის დამალვა',
-'rc-old-title' => 'თავდაპირველად შექმნილი როგორც "$1"',
+'rc-old-title' => 'თავდაპირველად შექმნილი როგორც „$1“',
 
 # Recent changes linked
 'recentchangeslinked' => 'დაკავშირებული ცვლილებები',
@@ -1961,6 +1961,9 @@ $1',
 ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
 გვერდი ითვლება მრავამნიშვნელოვნად, თუ მასში განთავსებულია თარგი, რომლის სახელიც მითითებულია გვერდზე [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-prop' => 'თვისების სახელი:',
+'pageswithprop-submit' => 'მიდი',
+
 'doubleredirects' => 'ორმაგი გადამისამართება',
 'doubleredirectstext' => 'ამ გვერდზე ჩამოთვლილია გვერდები, რომლებიც გადამისამართებულია სხვა გადამისამართების გვერდებზე.
 ყოველი მწკრივი შეიცავს ბმულებს პირველ და მეორე გადამისამართებაზე, აგრეთვე მეორე გადამისამართების ტექსტის პირველ სტრიქონს, რომელშიც ჩვეულებრივ მითითებულია რეალური „სამიზნე“ გვერდის სათაური. საჭიროა, რომ პირველი გადამისამართებაც უთითებდეს ამ გვერდზე.
@@ -2156,7 +2159,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.',
 'listgrouprights-removegroup-self-all' => 'შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.',
 
-# E-mail user
+# Email user
 'mailnologin' => 'გამგზავნი მისამართი არ არის მითითებული.',
 'mailnologintext' => 'თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.',
 'emailuser' => 'გაუგზავნეთ იმეილი ამ მომხმარებელს',
@@ -2600,7 +2603,7 @@ $1',
 'blocklog-showsuppresslog' => 'ეს მომხმარებლი უკვე დამალულია და დაბლოკილია.
 დაბლოკვათა ჟურნალი ქვემოთ მოყვანილია:',
 'blocklogentry' => 'დაიბლოკა [[$1]]. ბლოკირების ვადა $2 $3.',
-'reblock-logentry' => 'á\83¨á\83\94á\83\90á\83¡á\83¬á\83\9dá\83 á\83\90 á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\99á\83\9dá\83\9cá\83¤á\83\98á\83\92á\83£á\83 á\83\90á\83ªá\83\98á\83\90 [[$1]]-á\83¡á\83\97á\83\95á\83\98á\83¡, á\83\95á\83\90á\83\93á\83\90 á\83\92á\83\90á\83¡á\83\93á\83\98á\83¡ $2 $3',
+'reblock-logentry' => 'á\83¨á\83\94á\83\90á\83¡á\83¬á\83\9dá\83 á\83\90 á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\99á\83\9dá\83\9cá\83¤á\83\98á\83\92á\83£á\83 á\83\90á\83ªá\83\98á\83\90 [[$1]]-á\83¡á\83\97á\83\95á\83\98á\83¡, á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\95á\83\90á\83\93á\83\90á\83\90 $2 $3',
 'blocklogtext' => 'ეს არის მომხმარებლების დაბლოკვის და განბლოკვის ჟურნალი. 
 ავტომატურად დაბლოკილი IP მისამართები არაა ჩამოთვლილი. 
 იხილეთ [[Special:BlockList|ბლოკირებების სია]] მიმდინარე დაბლოკვებისთვის.',
@@ -3583,7 +3586,7 @@ $8',
 'monthsall' => 'ყველა',
 'limitall' => 'ყველა',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ელ. ფოსტის მისამართის დადასტურება',
 'confirmemail_noemail' => 'თქვენ არ გაქვს მითითებული მართებული ელმისამართი [[Special:Preferences|მომხმარებლის პარამეტრებში]].',
 'confirmemail_text' => '{{SITENAME}} ითხოვს თქვენი ელ. ფოსტის დადასტურებას, სანამ ელ.
index 6bb3162..b8a1b06 100644 (file)
@@ -856,7 +856,7 @@ HTML tags لوڑے.',",
 # Special:ListGroupRights
 'listgrouprights-members' => 'ممبارانن فھرست',
 
-# E-mail user
+# Email user
 'emailuser' => 'ممباروت بشلی کغاز انڅاوے',
 
 # Watchlist
index 0c50033..8208dd8 100644 (file)
@@ -428,7 +428,7 @@ Kerem kerê, deqêna oncia bıcerrebnê.",
 'protectedpagetext' => 'Na pele vurnaisu rê qapan biya.',
 'viewsourcetext' => 'Sıma şikinê çımê na pele bıvênê u kopya kerê:',
 'protectedinterface' => "Na pele ''software'' rê meqalunê caunê bırnau dana, u qapana ke suıstımalu rê engel bo.",
-'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
+'editinginterface' => "Teme:''' Sıma hawo jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
 Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
 Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
 'sqlhidden' => '(Persê SQLi nımıteo)',
@@ -1138,7 +1138,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'listgrouprights-addgroup-all' => 'Heme grubu ilawe ke',
 'listgrouprights-removegroup-all' => 'Heme grubu wedare',
 
-# E-mail user
+# Email user
 'emailuser' => 'Nê karberi rê e-poste bırusne',
 'emailpage' => 'Karberi rê e-poste bırusne',
 'emailfrom' => 'Kami ra:',
index 077d775..e5b8892 100644 (file)
@@ -263,18 +263,18 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖',
-'tog-justify' => 'á\9e\8fá\9f\86រឹម​កថាខណ្ឌ',
-'tog-hideminor' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
-'tog-hidepatrolled' => 'លាក់​កំណែប្រែ​ដែល​បាន​ល្បាត នៅ​ក្នុង​បំលាស់ប្ដូរ​ថ្មីៗ',
-'tog-newpageshidepatrolled' => 'លាក់​ទំព័រ​ដែល​បាន​ល្បាត ពី​បញ្ជី​ទំព័រ​ថ្មី',
-'tog-extendwatchlist' => 'á\9e\96á\9e\84á\9f\92á\9e\9aá\9e¸á\9e\80â\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bâ\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a á\9e\98á\9e·á\9e\93â\80\8bá\9e\98á\9f\82á\9e\93â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\82â\80\8bá\9e\94á\9f\86លាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ',
-'tog-usenewrc' => ' បំលាស់ប្ដូរជាក្រុមតាមទំព័រ ក្នុងបំលាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន (តម្រូវឲ្យមាន JavaScript)',
+'tog-justify' => 'á\9e\8fá\9e\98á\9f\92រឹម​កថាខណ្ឌ',
+'tog-hideminor' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85â\80\8bá\9e\96á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'tog-hidepatrolled' => 'លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពីបញ្ជីបន្លាស់ប្ដូរ​ថ្មីៗ',
+'tog-newpageshidepatrolled' => 'លាក់​ទំព័រ​ដែល​បាន​ល្បាតពី​បញ្ជី​ទំព័រ​ថ្មី',
+'tog-extendwatchlist' => 'á\9e\96á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\8fâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8b á\9e\98á\9e·á\9e\93â\80\8bá\9e\98á\9f\82á\9e\93â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\82â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ',
+'tog-usenewrc' => 'បន្លាស់ប្ដូរជាក្រុមតាមទំព័រ ក្នុងបន្លាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន (តម្រូវឲ្យមាន JavaScript)',
 'tog-numberheadings' => 'បង្ហាញលេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ',
 'tog-showtoolbar' => 'បង្ហាញ​របារឧបករណ៍កែប្រែ (តម្រូវអោយមាន JavaScript)',
 'tog-editondblclick' => 'កែប្រែទំព័រដោយចុចពីរដង​ជាប់គ្នា (តម្រូវអោយមាន JavaScript)',
-'tog-editsection' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b[កែប្រែ]',
-'tog-editsectiononrightclick' => 'អនុញ្ញាត​កែប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចស្តាំកណ្តុរ​លើ​ចំណងជើង​របស់វា (តម្រូវអោយមាន JavaScript)',
-'tog-showtoc' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\98á\9e¶á\9e\8fá\9e·á\9e\80á\9e¶ (á\9e\85á\9f\86á\9e\96á\9f\84á\9f\87ទំព័រ​ដែលមាន​ចំណងជើងរង​លើសពី៣)',
+'tog-editsection' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e¢á\9f\84á\9e\99á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9aá\9e\99á\9f\88á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b [កែប្រែ]',
+'tog-editsectiononrightclick' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fâ\80\8bá\9e¢á\9f\84á\9e\99á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bâ\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99 á\9e\8aá\9f\84á\9e\99â\80\8bá\9e\85á\9e»á\9e\85á\9e\9fá\9f\92á\9e\8fá\9e¶á\9f\86á\9e\80á\9e\8eá\9f\92á\9e\8fá\9e»á\9e\9aâ\80\8bá\9e\9bá\9e¾â\80\8bá\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e¶ (á\9e\8fá\9e\98á\9f\92á\9e\9aá\9e¼á\9e\9cá\9e¢á\9f\84á\9e\99á\9e\98á\9e¶á\9e\93 JavaScript)',
+'tog-showtoc' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\98á\9e¶á\9e\8fá\9e·á\9e\80á\9e¶ (á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bទំព័រ​ដែលមាន​ចំណងជើងរង​លើសពី៣)',
 'tog-rememberpassword' => 'ចងចាំ​ការកត់ឈ្មោះចូលរបស់ខ្ញុំ​លើកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយ៉ាងយូរ$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
 'tog-watchcreations' => 'បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំបង្កើត​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
 'tog-watchdefault' => 'បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
@@ -282,12 +282,12 @@ $messages = array(
 'tog-watchdeletion' => 'បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំលុបចោល​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
 'tog-minordefault' => "ចំណាំ​គ្រប់កំណែប្រែ​របស់ខ្ញុំ​ថាជា​'កំណែប្រែតិចតួច'",
 'tog-previewontop' => 'បង្ហាញ​ការមើលមុន​ពីលើ​ប្រអប់​កែប្រែ',
-'tog-previewonfirst' => 'បង្ហាញ​ការមើលមុន​ចំពោះ​កំណែប្រែ​ដំបូង',
+'tog-previewonfirst' => 'បង្ហាញ​ការមើលមុនសម្រាប់កំណែប្រែ​ដំបូងគេ',
 'tog-nocache' => 'មិនប្រើសតិភ្ជាប់​នៃ​ទំព័រ',
-'tog-enotifwatchlistpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរនៃទំព័រ​ណាមួយដែលមានក្នុងបញ្ជីតាមដានរបស់ខ្ញុំ',
-'tog-enotifusertalkpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ',
-'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​',
-'tog-enotifrevealaddr' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bâ\80\8bá\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\80á\9f\92á\9e\9aá\9e¾á\9e\93á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80â\80\8bá\9e\93á\9e¶á\9e\93á\9e',
+'tog-enotifwatchlistpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរនៃទំព័រ​ណាមួយដែលមានក្នុងបញ្ជីតាមដានរបស់ខ្ញុំ',
+'tog-enotifusertalkpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ',
+'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​',
+'tog-enotifrevealaddr' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bâ\80\8bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\80á\9f\92á\9e\9aá\9e¾á\9e\93á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80â\80\8b',
 'tog-shownumberswatching' => 'បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ',
 'tog-oldsig' => 'ហត្ថលេខាមានហើយ៖',
 'tog-fancysig' => 'ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)',
@@ -302,8 +302,8 @@ $messages = array(
 'tog-watchlisthideliu' => 'លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូលពីបញ្ជីតាមដាន',
 'tog-watchlisthideanons' => 'លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់អនាមិកពីបញ្ជីតាមដាន',
 'tog-watchlisthidepatrolled' => 'លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពី​បញ្ជីតាមដាន',
-'tog-ccmeonemails' => 'ផ្ញើច្បាប់ចម្លង​អ៊ីមែលដែលខ្ញុំផ្ញើទៅកាន់អ្នកប្រើប្រាស់ផ្សេងទៀតមកខ្ញុំផងដែរ',
-'tog-diffonly' => 'á\9e\80á\9e»á\9f\86á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9f\92á\9e\9bá\9e¹á\9e\98á\9e\9fá\9e¶á\9e\9aá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\85á\9e\96á\9e¸á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94á\9e\85á\9f\86á\9e\93ុចខុសគ្នា',
+'tog-ccmeonemails' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84â\80\8bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8fá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\81á\9f\92á\9e\9bá\9e½á\9e\93á\9e¯á\9e\84á\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9a',
+'tog-diffonly' => 'á\9e\80á\9e»á\9f\86á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9f\92á\9e\9bá\9e¹á\9e\98á\9e\9fá\9e¶á\9e\9aá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\85á\9e\96á\9e¸á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94á\9e\85á\9f\86á\9e\8eុចខុសគ្នា',
 'tog-showhiddencats' => 'បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់',
 'tog-norollbackdiff' => 'បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ',
 
@@ -312,7 +312,7 @@ $messages = array(
 'underline-default' => 'តាមលំនាំដើមនៃ​កម្មវិធី​រុករក​',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'កែសម្រួល​រចនាបទ​ពុម្ព​អក្សរ​សម្រាប់​តំបន់​',
+'editfont-style' => '​រចនាបថ​ពុម្ព​អក្សរ​ក្នុងប្រអប់កែប្រែ​៖',
 'editfont-default' => 'លំនាំដើមនៃ​កម្មវិធី​រុករក​',
 'editfont-monospace' => 'ពុម្ព​អក្សរ​ដែល​ដក​ឃ្លា​តែមួយ​',
 'editfont-sansserif' => 'ពុម្ពអក្សរ​​គ្មានកន្ទុយ (Sans-serif font)',
@@ -385,9 +385,9 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានឯកសារមួយដូចខាងក្រោម។|{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ក្នុងចំណោមឯកសារសរុប $2 ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។}}',
 'category-file-count-limited' => '{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។',
 'listingcontinuesabbrev' => 'បន្ត',
-'index-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾លិបិក្រម',
-'noindex-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾លិបិក្រម',
-'broken-file-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\81á\9e¼á\9e\85',
+'index-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93លិបិក្រម',
+'noindex-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93លិបិក្រម',
+'broken-file-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8aá\9e¶á\9e\85á\9f\8bá\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -525,7 +525,7 @@ $1',
 'retrievedfrom' => 'បានពី "$1"',
 'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
 'newmessageslink' => 'សារថ្មីៗ',
-'newmessagesdifflink' => 'á\9e\94á\9f\86លាស់ប្ដូរចុងក្រោយ',
+'newmessagesdifflink' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរចុងក្រោយ',
 'youhavenewmessagesfromusers' => 'អ្នកមាន $1 ទទួលបានពី {{PLURAL:$3|អ្នកប្រើប្រាស់ម្នាក់|អុ្នកប្រើប្រាស់ចំនួន $3 នាក់}} ($2)។',
 'youhavenewmessagesmanyusers' => 'អ្នកមាន $1 ទទួលបានពីអ្នកប្រើប្រាស់ជាច្រើន ($2)។',
 'newmessageslinkplural' => '{{PLURAL:$1|សារថ្មីមួយ|សារថ្មី}}',
@@ -553,8 +553,8 @@ $1',
 'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
 'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
 'red-link-title' => '$1 (ទំព័រនេះមិនទាន់​មាននៅឡើយទេ)',
-'sort-descending' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់ចុះ',
-'sort-ascending' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់ឡើង',
+'sort-descending' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់ចុះ',
+'sort-ascending' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់ឡើង',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'អត្ថបទ',
@@ -569,11 +569,11 @@ $1',
 'nstab-category' => 'ចំណាត់ថ្នាក់ក្រុម',
 
 # Main script and global functions
-'nosuchaction' => 'á\9e\98á\9e·á\9e\93មានសកម្មភាពបែបនេះទេ',
+'nosuchaction' => 'á\9e\82á\9f\92មានសកម្មភាពបែបនេះទេ',
 'nosuchactiontext' => 'សកម្មភាព​បានបង្ហាញដោយ URL មិន​ត្រឹមត្រូវ​។
 អ្នក​ប្រហែលជាបាន​វាយ URL ខុស បើ​មិន​ដូច្នេះ​ទេ​មាន​តែ​តំណភ្ជាប់​មិន​ត្រឹមត្រូវ​។
 នេះ​ក៏​អាច​បញ្ជាក់​ប្រាប់​ពី​កំហុស​នៅ​ក្នុង​ផ្នែកទន់​ប្រើដោយ {{SITENAME}} ។',
-'nosuchspecialpage' => 'á\9e\98á\9e·á\9e\93មានទំព័រពិសេសបែបនេះទេ',
+'nosuchspecialpage' => 'á\9e\82á\9f\92មានទំព័រពិសេសបែបនេះទេ',
 'nospecialpagetext' => '<strong>អ្នកបានស្នើរក​ទំព័រពិសេសមិនទាន់មាន។</strong>
 
 អ្នកអាចមើលបញ្ជី​នៃ​ទំព័រពិសេស​ៗនៅ [[Special:SpecialPages|{{int:specialpages}}]]។',
@@ -581,7 +581,7 @@ $1',
 # General errors
 'error' => 'មានបញ្ហា',
 'databaseerror' => 'មូលដ្ឋានទិន្នន័យមានបញ្ហា',
-'laggedslavemode' => "'''á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\90á\9e\8fá\9f\92á\9e\93á\9f\96''' á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87â\80\8bá\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\91á\9e»á\9e\80â\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97ទេ។",
+'laggedslavemode' => "'''á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\90á\9e\8fá\9f\92á\9e\93á\9f\96''' á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87â\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99ទេ។",
 'readonly' => 'មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោ',
 'enterlockreason' => 'សូមផ្ដល់ហេតុផលសម្រាប់ការជាប់សោ ព្រមទាំងកាលបរិច្ឆេទដោះសោវិញ',
 'readonlytext' => 'ពេលនេះ​មូលដ្ឋានទិន្នន័យ​កំពុងជាប់សោ ដើម្បីកុំឱ្យមាន​ការបញ្ចូល​ទិន្នន័យ​ថ្មីៗ​ឬ​ការកែប្រែ​ផ្សេងៗ។ នេះ​ប្រហែលគ្រាន់តែជាការ​ត្រួតពិនិត្យនិងថែទាំ​មូលដ្ឋានទិន្នន័យប្រចាំថ្ងៃ ដែលជាធម្មតាវានឹងវិលមកសភាពដើមវិញ​ក្នុងពេលឆាប់ៗ។
@@ -611,9 +611,9 @@ $1',
 'cannotdelete' => 'មិនអាច​លុបចោលទំព័រឬឯកសារដែលមានឈ្មោះ "$1"បានទេ។
 
 វាប្រហែលជាត្រូវបាន​នរណាម្នាក់ផ្សេងទៀតលុបចោលហើយ។',
-'cannotdelete-title' => 'មិនអាចលុបទំព័រ "$1"',
+'cannotdelete-title' => 'មិនអាចលុបទំព័រ "$1"​បានទេ',
 'badtitle' => 'ចំណងជើង​មិនល្អ',
-'badtitletext' => 'ចំណងជើងទំព័រដែលបានស្នើ គ្មានសុពលភាព, ទទេ, ឬ ចំណងជើងតំណភ្ជាប់អន្តរភាសាឬអន្តរវិគី មិនត្រឹមត្រូវ ។ ប្រហែលជាមានតួអក្សរមួយឬច្រើន ដែលជាតួអក្សរហាមប្រើ​ក្នុង​ចំណងជើង។',
+'badtitletext' => 'ចំណងជើងទំព័រដែលបានស្នើមិនអាចប្រើបាន គ្មានសរសេរអ្វី ឬមានចំណងជើងតំណភ្ជាប់អន្តរភាសាឬអន្តរវិគីមិនត្រឹមត្រូវ ។ វាក៏ប្រហែលជាមានតួអក្សរមួយឬច្រើន ដែលជាតួអក្សរហាមប្រើ​ក្នុង​ចំណងជើងផងដែរ។',
 'perfcached' => 'ទិន្នន័យទាំងនេះត្រូវបានដាក់ទៅសតិភ្ជាប់និងប្រហែលជាមិនទាន់សម័យ ។ ជាអតិបរមា {{PLURAL:$1|លទ្ធផលមួយ|លទ្ធផលចំនួន $1}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
 'perfcachedts' => 'ទិន្នន័យខាងក្រោមនេះត្រូវបានដាក់ក្នុងសតិភ្ជាប់ និង បានត្រូវបន្ទាន់សម័យចុងក្រោយនៅ $1។ ជាអតិបរមា {{PLURAL:$4|លទ្ធផលមួយ|លទ្ធផលចំនួន $4}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
 'querypage-no-updates' => 'ការបន្ទាន់សម័យសម្រាប់ទំព័រនេះគឺមិនអាចធ្វើទៅរួចទេនាពេលឥឡូវទេ។
@@ -630,7 +630,7 @@ $1',
 សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។',
 'protectedpagetext' => 'ទំព័រនេះបានត្រូវការពារមិនឱ្យកែប្រែ​ឬធ្វើសកម្មភាពផ្សេងទៀតលើវា។',
 'viewsourcetext' => 'អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ៖',
-'viewyourtext' => "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8b'''á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80'''á\9e\91á\9f\85កាន់ទំព័រនេះ៖",
+'viewyourtext' => "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8b'''á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80'''á\9e\98á\9e\80កាន់ទំព័រនេះ៖",
 'protectedinterface' => 'ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។
 ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។',
 'editinginterface' => "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិគីនេះ។ ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែ​សំរាប់វិគីទាំងអស់ សូបប្រើប្រាស់  [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] គម្រោង​បកប្រែរបស់មេឌាវិគី ។",
@@ -646,8 +646,10 @@ $2',
 'filereadonlyerror' => 'មិនអាចកែប្រែឯកសារ "$1" បានទេពីព្រោះថតឯកសារ "$2" ស្ថិតក្នុងម៉ូដសំរាប់តែអានប៉ុណ្ណោះ។
 
 អភិបាលដែលបានចាក់សោរវាបានផ្ដល់សេចក្ដីពន្យល់បែបនេះ៖ "$3"។',
+'invalidtitle-knownnamespace' => 'ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះ "$2" និងអត្ថបទ "$3"',
+'invalidtitle-unknownnamespace' => 'ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះមិនស្គាល់លេខ $1 និងអត្ថបទ "$2"',
 'exception-nologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
-'exception-nologin-text' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¬á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\93á\9f\81á\9f\87á\9e\8fá\9f\86រូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
+'exception-nologin-text' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¬á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\93á\9f\81á\9f\87á\9e\8fá\9e\98á\9f\92រូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
 
 # Virus scanner
 'virus-badscanner' => "ការ​កំណត់​រចនា​សម្ព័ន្ធ​មិន​ល្អ​៖ កម្មវិធី​ស្កេន​មេរោគមិន​ស្គាល់​៖ ''$1''",
@@ -664,17 +666,17 @@ $2',
 'welcomecreation-msg' => 'គណនីរបស់អ្នកត្រូវបានបង្កើតហើយ។
 កុំភ្លេចផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិត្ត{{SITENAME}}]]របស់អ្នក។',
 'yourname' => 'អត្តនាម៖',
-'yourpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់៖',
-'yourpasswordagain' => 'á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ម្តងទៀត៖',
+'yourpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់៖',
+'yourpasswordagain' => 'á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ម្តងទៀត៖',
 'remembermypassword' => 'ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
 'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយក៏ដោយ',
 'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
-'password-change-forbidden' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ក្នុងវិគីនេះទេ។',
+'password-change-forbidden' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ក្នុងវិគីនេះទេ។',
 'externaldberror' => 'មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាត់​​មូលដ្ឋាន​ទិន្នន័យ​ ឬ​អ្នក​មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​បន្ទាន់​សម័យ​គណនី​ខាង​ក្រៅ​របស់​អ្នក​។​
 ​',
 'login' => 'កត់ឈ្មោះចូល',
 'nav-login-createaccount' => 'កត់ឈ្មោះចូលឬបង្កើតគណនី',
-'loginprompt' => 'អ្នក​ត្រូវតែ​មាន​ខូគី ដើម្បី​អាច​កត់ឈ្មោះចូល​{{SITENAME}}។',
+'loginprompt' => 'á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\81á\9e¼á\9e\82á\9e¸ á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8b{{SITENAME}}á\9e\94á\9e¶á\9e\93á\9f\94',
 'userlogin' => 'កត់ឈ្មោះចូលឬបង្កើតគណនី',
 'userloginnocreate' => 'កត់ឈ្មោះចូល',
 'logout' => 'កត់ឈ្មោះចេញ',
@@ -685,10 +687,10 @@ $2',
 'createaccount' => 'បង្កើតគណនី',
 'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ  សូម'''$1'''។",
 'gotaccountlink' => 'កត់ឈ្មោះចូល',
-'userlogin-resetlink' => 'á\9e\8fá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86á\9e¢á\9e·á\9e\8fá\9e\9fá\9f\86រាប់កត់ឈ្មោះចូលហើយ?',
+'userlogin-resetlink' => 'á\9e\8fá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92á\9e¢á\9e·á\9e\8fá\9e\9fá\9e\98á\9f\92រាប់កត់ឈ្មោះចូលហើយ?',
 'createaccountmail' => 'ប្រើប្រាស់ពាក្យសំងាត់ព្រៀងបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលខាងក្រោម',
 'createaccountreason' => 'មូលហេតុ៖',
-'badretype' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93បញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
+'badretype' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
 'userexists' => 'អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។
 សូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។',
 'loginerror' => 'កំហុសនៃការកត់ឈ្មោះចូល',
@@ -716,34 +718,34 @@ $2',
 សូម​ពិនិត្យ​​អក្ខរាវិរុទ្ធ​របស់អ្នក ។',
 'nouserspecified' => 'អ្នកត្រូវតែ​ផ្ដល់អត្តនាម។',
 'login-userblocked' => 'អ្នកប្រើប្រាស់នេះស្ថិតក្រោមការហាមឃាត់។ មិនអនុញ្ញាតអោយកត់ឈ្មោះចូលទេ។',
-'wrongpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93បញ្ចូល​មិនត្រឹមត្រូវទេ។
+'wrongpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូល​មិនត្រឹមត្រូវទេ។
 
 សូមព្យាយាម​ម្តងទៀត។',
-'wrongpasswordempty' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93បញ្ចូលទេ។
+'wrongpasswordempty' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូលទេ។
 
 សូមព្យាយាម​ម្តងទៀត។',
-'passwordtooshort' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវ​មាន​យ៉ាងតិចណាស់​ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
-'password-name-match' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\96á\9e¸á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87របស់អ្នក។',
-'password-login-forbidden' => 'á\9e á\9e¶á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\98á\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\93á\9e·á\9e\84á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់នេះ។',
-'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី',
-'passwordremindertitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
-'passwordremindertext' => 'á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8b (á\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80, á\9e\96á\9e¸á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93 IP $1) á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b "$2" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\87á\9e¶ "$3"á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\85á\9f\81á\9e\8fá\9e\93á\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e á\9e¾á\9e\99á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី។
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​បណ្ដោះអាសន្ន​របស់​អ្នក នឹង​ត្រូវ​ផុតកំណត់​ក្នុង​រយៈពេល {{PLURAL:$5|មួយ​ថ្ងៃ|$5ថ្ងៃ}} ។
-
\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e\9aá\9e\8eá\9e¸á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 á\9e¬ á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\9cá\9e·á\9e\89 á\9e á\9e¾á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e\84á\9f\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\91á\9f\81á\9e\93á\9f\84á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកបន្តទៀត។',
+'passwordtooshort' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវ​មាន​យ៉ាងតិចណាស់​ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
+'password-name-match' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\96á\9e¸á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98របស់អ្នក។',
+'password-login-forbidden' => 'á\9e á\9e¶á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\98á\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\93á\9e·á\9e\84á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់នេះ។',
+'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី',
+'passwordremindertitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
+'passwordremindertext' => 'á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8b (á\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80, á\9e\96á\9e¸á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93 IP $1) á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b "$2" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\87á\9e¶ "$3"á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\85á\9f\81á\9e\8fá\9e\93á\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e á\9e¾á\9e\99á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី។
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​បណ្ដោះអាសន្ន​របស់​អ្នក នឹង​ត្រូវ​ផុតកំណត់​ក្នុង​រយៈពេល {{PLURAL:$5|មួយ​ថ្ងៃ|$5ថ្ងៃ}} ។
+
\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e\9aá\9e\8eá\9e¸á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 á\9e¬ á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\9cá\9e·á\9e\89 á\9e á\9e¾á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e\84á\9f\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\91á\9f\81á\9e\93á\9f\84á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកបន្តទៀត។',
 'noemail' => 'គ្មានអាសយដ្ឋានអ៊ីមែលណាមួយត្រូវបានកត់ត្រាទុកសម្រាប់អ្នកប្រើឈ្មោះ "$1" ទេ។',
 'noemailcreate' => 'អ្នកត្រូវតែផ្ដល់អាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ',
-'passwordsent' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​ថ្មី​ត្រូវ​បាន​ផ្ញើទៅ​អាសយដ្ឋាន​អ៊ីមែល​ដែល​បាន​ចុះបញ្ជី​សម្រាប់អ្នកប្រើឈ្មោះ "$1" ។
+'passwordsent' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​ថ្មី​ត្រូវ​បាន​ផ្ញើទៅ​អាសយដ្ឋាន​អ៊ីមែល​ដែល​បាន​ចុះបញ្ជី​សម្រាប់អ្នកប្រើឈ្មោះ "$1" ។
 
\9e\9fá\9e¼á\9e\98â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e\98á\9f\92á\9e\8fá\9e\84á\9e\91á\9f\80á\9e\8fâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸â\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9e\91á\9e½á\9e\9bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីនោះ។',
-'blocked-mailpassword' => 'á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9e\93á\9e·á\9e\84á\9e\98á\9e·á\9e\93á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម្បីបង្ការការបំពានទេ។',
-'eauthentsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\95á\9f\92á\9e\91á\9f\80á\9e\84á\9e\95á\9f\92á\9e\91á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87ហើយ។
\9e\9fá\9e¼á\9e\98â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e\98á\9f\92á\9e\8fá\9e\84á\9e\91á\9f\80á\9e\8fâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸â\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9e\91á\9e½á\9e\9bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីនោះ។',
+'blocked-mailpassword' => 'á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9e\93á\9e·á\9e\84á\9e\98á\9e·á\9e\93á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម្បីបង្ការការបំពានទេ។',
+'eauthentsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\95á\9f\92á\9e\91á\9f\80á\9e\84á\9e\95á\9f\92á\9e\91á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\8fá\9f\92á\9e\9aá\9eហើយ។
 
 មុននឹងមាន​អ៊ីមែលផ្សេងមួយទៀត​ត្រូវផ្ញើទៅ​គណនីនេះ អ្នកត្រូវតែ​ធ្វើតាមសេចក្តីណែនាំ​ក្នុងអ៊ីមែល​នោះ ដើម្បីបញ្ជាក់ថា​គណនីបច្ចុប្បន្ន​ពិតជា​របស់អ្នកពិតប្រាកដមែន។',
-'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
+'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
 
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
 'mailerror' => 'បញ្ហាក្នុងការផ្ញើអ៊ីមែល៖ $1',
 'acct_creation_throttle_hit' => 'អ្នកទស្សនា​វិគី​នេះ​ដោយ​ប្រើប្រាស់​អាសយដ្ឋានIPរបស់​អ្នក​ បានបង្កើត{{PLURAL:$1|គណនីមួយ|គណនីចំនួន$1}}នៅ​ថ្ងៃ​ចុងក្រោយ។ ចំនួននេះ​ជា​ចំនួន​អតិបរមារ​ដែល​ត្រូវ​បាន​អនុញ្ញាត​សម្រាប់​រយៈពេល​នេះ​។
 
@@ -756,7 +758,7 @@ $2',
 'emailconfirmlink' => 'ផ្ទៀងផ្ទាត់បញ្ជាក់អាសយដ្ឋានអ៊ីមែលរបស់អ្នក',
 'invalidemailaddress' => 'អាសយដ្ឋានអ៊ីមែល​នេះមិនអាចទទួលយកបានទេ​ដោយសារវាមានទម្រង់​​មិនត្រឹមត្រូវ។
 
\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\98á\9e½á\9e\99â\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\91á\9e\98á\9f\92á\9e\9aá\9e\84á\9f\8bâ\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9c á\9e¬á\9e\98á\9e½á\9e\99á\9e\80á\9f\8fá\9e\91á\9e»á\9e\80á\9e\9cá\9e¶á\9e\9bá\9e\93á\9f\84á\9f\87á\9e±á\9f\92á\9e\99នៅទំនេរ​​។',
\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\98á\9e½á\9e\99â\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\91á\9e\98á\9f\92á\9e\9aá\9e\84á\9f\8bâ\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9c á\9e¬á\9e\98á\9e½á\9e\99á\9e\80á\9f\8fá\9e\91á\9e»á\9e\80á\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¡á\9f\84á\9f\87á\9e\93á\9f\84á\9f\87នៅទំនេរ​​។',
 'cannotchangeemail' => 'អាសយដ្ឋានអ៊ីមែលរបស់គណនីមិនអាចប្ដូរបានទេនៅលើវិគីនេះ។',
 'emaildisabled' => 'វិបសៃថ៍នេះមិនអាចផ្ញើអ៊ីមែលបានទេ។',
 'accountcreated' => 'គណនីរបស់លោកអ្នកត្រូវបានបង្កើតហើយ',
@@ -768,47 +770,47 @@ $2',
 
 អ្នកអាចបំភ្លេចពីសារនេះ ប្រសិនបើ​គណនីនេះត្រូវបានបង្កើតដោយមានបញ្ហា។',
 'usernamehasherror' => 'អត្តនាមមិនអាចមានតួអក្សរដែលជាសញ្ញាបានទេ',
-'login-throttled' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេចច្រើនដងពេកហើយ។​
+'login-throttled' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេចច្រើនដងពេកហើយ។​
 
 សូមរងចាំមួយរយៈ មុនពេលសាកល្បងម្ដងទៀត។',
-'login-abort-generic' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
+'login-abort-generic' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
 'loginlanguagelabel' => 'ភាសា៖ $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន៍ mail() របស់ PHP',
 'user-mail-no-addy' => 'បានព្យាយាមផ្ញើអ៊ីមែលដោយមិនបានដាក់អាសដ្ឋានអ៊ីមែល។',
 
 # Change password dialog
-'resetpass' => 'â\80\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​',
-'resetpass_announce' => 'អ្នកបានកត់ឈ្មោះចូលដោយ​អក្សរកូដអ៊ីមែល​បណ្តោះអាសន្ន​មួយ​។
+'resetpass' => 'â\80\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​',
+'resetpass_announce' => 'អ្នកបានកត់ឈ្មោះចូលដោយ​អក្សរកូដ​បណ្តោះអាសន្ន​មួយដែលយើងខ្ញុំបានអ៊ីមែលទៅឱ្យ​។
 
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e\94á\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី​មួយនៅទីនេះ៖',
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e\94á\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី​មួយនៅទីនេះ៖',
 'resetpass_text' => '<!-- បន្ថែមឃ្លានៅទីនេះ -->',
-'resetpass_header' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​គណនី',
-'oldpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់៖',
-'newpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី៖',
-'retypenew' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី​ម្តងទៀត៖',
-'resetpass_submit' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់និង​កត់ឈ្មោះចូល',
-'resetpass_success' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ! ឥឡូវនេះកំពុងកត់ឈ្មោះចូល...',
-'resetpass_forbidden' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
+'resetpass_header' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​គណនី',
+'oldpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់៖',
+'newpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី៖',
+'retypenew' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី​ម្តងទៀត៖',
+'resetpass_submit' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់និង​កត់ឈ្មោះចូល',
+'resetpass_success' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ! ឥឡូវនេះកំពុងកត់ឈ្មោះចូល...',
+'resetpass_forbidden' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
 'resetpass-no-info' => 'អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។',
-'resetpass-submit-loggedin' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'resetpass-submit-loggedin' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
 'resetpass-submit-cancel' => 'បោះបង់',
 'resetpass-wrong-oldpass' => 'ពាក្យ​សម្ងាត់​បណ្ដោះ​អាសន្ន​ ឬ​បច្ចុប្បន្នមិន​ត្រឹមត្រូវ​។
 
\9e¢á\9f\92á\9e\93á\9e\80â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bâ\80\8bá\9e\87á\9e¶â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\9bá\9f\81á\9e\81â\80\8bá\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\8fá\9e\99 á\9e¬â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾â\80\8bá\9e\9fá\9e»á\9f\86â\80\8bá\9e\9bá\9f\81á\9e\81​សម្ងាត់​​បណ្ដោះ​អាសន្ន​​ថ្មី​មួយ​ហើយ។',
-'resetpass-temp-password' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្តោះអាសន្ន:',
\9e¢á\9f\92á\9e\93á\9e\80â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bâ\80\8bá\9e\87á\9e¶â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\99 á\9e¬â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾â\80\8bá\9e\9fá\9e»á\9f\86â\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99​សម្ងាត់​​បណ្ដោះ​អាសន្ន​​ថ្មី​មួយ​ហើយ។',
+'resetpass-temp-password' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្តោះអាសន្ន:',
 
 # Special:PasswordReset
-'passwordreset' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​សាឡើងវិញ',
+'passwordreset' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​សាឡើងវិញ',
 'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម',
-'passwordreset-disabled' => 'á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
+'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម',
+'passwordreset-disabled' => 'á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
 'passwordreset-username' => 'អត្តនាម៖',
 'passwordreset-domain' => 'ដូម៉ែន៖',
 'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
-'passwordreset-capture-help' => 'á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b (á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
+'passwordreset-capture-help' => 'á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b (á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
 'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
 'passwordreset-emailtitle' => 'ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំសារក្រើនរំលឹកពីព័ត៌មានពិស្ដារ
@@ -817,29 +819,29 @@ $2',
 
 $2
 
-{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\80á\9e»á\9f\86á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
+{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e¢á\9f\86á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
 'passwordreset-emailtext-user' => 'អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំសារក្រើនរំលឹកអំពីព័ត៌មានពិស្ដាររបស់គណនីរបស់អ្នកនៅក្នុង {{SITENAME}} ($4)។
  {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាស័យដ្ឋានអ៊ីមែលនេះ៖
 
 $2
 
-{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\80á\9e»á\9f\86á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
-'passwordreset-emailelement' => 'á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b៖ $1
\9e\9bá\9f\81á\9e\81សម្ងាត់បណ្ដោះអាសន្ន៖ $2',
-'passwordreset-emailsent' => 'á\9e¢á\9e¸á\9e»á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\98á\9e½á\9e\99បានផ្ញើទៅហើយ។',
+{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e¢á\9f\86á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
+'passwordreset-emailelement' => 'á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98៖ $1
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99សម្ងាត់បណ្ដោះអាសន្ន៖ $2',
+'passwordreset-emailsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cបានផ្ញើទៅហើយ។',
 'passwordreset-emailsent-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។',
 'passwordreset-emailerror-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់អ្នកប្រើប្រាស់មិនបានសំរេចទេ៖ $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
 'changeemail-header' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលសំរាប់គណនីនេះ',
-'changeemail-text' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\93á\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។',
+'changeemail-text' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\93á\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។',
 'changeemail-no-info' => 'អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។',
 'changeemail-oldemail' => 'អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖',
 'changeemail-newemail' => 'អាសយដ្ឋានអ៊ីមែលថ្មី៖',
@@ -877,14 +879,14 @@ $2
 'preview' => 'មើលជាមុន',
 'showpreview' => 'បង្ហាញ​ការមើលជាមុន',
 'showlivepreview' => 'មើលជាមុនដោយផ្ទាល់',
-'showdiff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9f\86លាស់ប្ដូរ',
+'showdiff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
 'anoneditwarning' => "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។",
 'anonpreviewwarning' => "''អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។''",
 'missingsummary' => "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។
 
 បើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
-'missingcommenttext' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\98á\9e½á\9e\99á\9e\9cá\9e·á\9e\85á\9e¶á\9e\9aនៅខាងក្រោម។',
-'missingcommentheader' => "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e·á\9e\85á\9e¶á\9e\9aនេះទេ។
+'missingcommenttext' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\98á\9e½á\9e\99នៅខាងក្រោម។',
+'missingcommentheader' => "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bនេះទេ។
 បើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
 'summary-preview' => 'ការមើលជាមុនរបស់ចំណារពន្យល់:',
 'subject-preview' => 'ការមើលជាមុនរបស់ប្រធានបទ/ចំណងជើង:',
@@ -934,10 +936,10 @@ $2
 'loginreqtitle' => 'តម្រូវអោយកត់ឈ្មោះចូល',
 'loginreqlink' => 'កត់ឈ្មោះចូល',
 'loginreqpagetext' => 'អ្នកត្រូវតែ$1ដើម្បីមើលទំព័រដទៃផ្សេងទៀត។',
-'accmailtitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវបានផ្ញើរួចហើយ។',
-'accmailtext' => "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់​ដែល​បាន​បង្កើត​ដោយ​ចៃដន្យ​សម្រាប់ [[User talk:$1|$1]] ត្រូវបានផ្ញើទៅ $2 ហើយ​។
+'accmailtitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវបានផ្ញើរួចហើយ។',
+'accmailtext' => "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់​ដែល​បាន​បង្កើត​ដោយ​ចៃដន្យ​សម្រាប់ [[User talk:$1|$1]] ត្រូវបានផ្ញើទៅ $2 ហើយ​។
 
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bâ\80\8bá\9e\82á\9e\8eá\9e\93á\9e¸â\80\8bá\9e\90á\9f\92á\9e\98á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9e¶á\9e\85â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\94á\9e¶á\9e\93á\9e\93á\9f\85â\80\8bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a ''[[Special:ChangePassword|á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់]]'' បន្ទាប់ពីកត់ឈ្មោះចូលហើយ​។",
\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bâ\80\8bá\9e\82á\9e\8eá\9e\93á\9e¸â\80\8bá\9e\90á\9f\92á\9e\98á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9e¶á\9e\85â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\94á\9e¶á\9e\93á\9e\93á\9f\85â\80\8bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a ''[[Special:ChangePassword|á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់]]'' បន្ទាប់ពីកត់ឈ្មោះចូលហើយ​។",
 'newarticle' => '(ថ្មី)',
 'newarticletext' => "អ្នកបានតាម​តំណភ្ជាប់​ទៅ​ទំព័រដែលមិនទាន់មាននៅឡើយ។
 ដើម្បីបង្កើតទំព័រនេះ សូមចាប់ផ្ដើមវាយ​ក្នុងប្រអប់ខាងក្រោម (សូមមើល [[{{MediaWiki:Helppage}}|ទំព័រ​ជំនួយ]] សម្រាប់​ព័ត៌មានបន្ថែម)។
@@ -977,7 +979,7 @@ $2
 'userinvalidcssjstitle' => "'''ប្រយ័ត្ន៖''' គ្មានសំបក \"\$1\"។ ចងចាំថា ទំព័រផ្ទាល់ខ្លួន .css និង .js ប្រើប្រាស់ ចំណងជើង ជាអក្សរតូច, ឧទាហរណ៍  {{ns:user}}:Foo/vector.css ត្រឹមត្រូវ, រីឯ {{ns:user}}:Foo/Vector.css មិនត្រឹមត្រូវ។",
 'updated' => '(បានបន្ទាន់សម័យ)',
 'note' => "'''ចំណាំ៖'''",
-'previewnote' => "'''á\9e\9fá\9e¼á\9e\98á\9e\85á\9e¶á\9f\86á\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9f\86លាស់ប្ដូរ​របស់អ្នកមិនទាន់បាន​រក្សាទុកទេ!'''",
+'previewnote' => "'''á\9e\9fá\9e¼á\9e\98á\9e\85á\9e¶á\9f\86á\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ​របស់អ្នកមិនទាន់បាន​រក្សាទុកទេ!'''",
 'continue-editing' => 'ទៅកាន់កន្លែងសំរាប់ធ្វើការកែប្រែ',
 'previewconflict' => 'ការមើលមុននេះយោងតាមអត្ថបទក្នុងប្រអប់កែប្រែខាងលើ។ ទំព័រអត្ថបទនឹងបង្ហាញចេញបែបនេះប្រសិនបើអ្នកជ្រើសរើសរក្សាទុក។',
 'session_fail_preview' => "'''សូមអភ័យទោស! យើងមិនអាចរក្សាទុកការកែប្រែរបស់អ្នកបានទេ ដោយសារបាត់ទិន្នន័យវេនការងារ។
@@ -1006,8 +1008,8 @@ $2
 'editingold' => "'''បម្រាម:អ្នកកំពុងតែកែកំណែប្រែដែលហួសសម័យរបស់ទំព័រនេះ។
 
 ប្រសិនបើអ្នករក្សាវាទុក កំណែប្រែពីមុនទាំងប៉ុន្មាននឹងត្រូវបាត់បង់។'''",
-'yourdiff' => 'á\9e\85á\9f\86á\9e\93ុចខុសគ្នា',
-'copyrightwarning' => "á\9e\9fá\9e¼á\9e\98á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bâ\80\8bá\9e\90á\9e¶ á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\9aá\9e½á\9e\98á\9e\85á\9f\86á\9e\8eá\9f\82á\9e\80â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\93á\9f\85á\9e\9bá\9e¾{{SITENAME}} á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9fá\9e\96á\9f\92á\9e\9cá\9e\95á\9f\92á\9e\9fá\9e¶á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9bá\9e·á\9e\81á\9e·á\9e\8fá\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8f $2 (á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\98á\9e¾á\9e\9b $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9f\86អិត) ។ បើអ្នកមិនចង់ឱ្យ​​ត្រូវបានអ្នកដទៃធ្វើការកែប្រែ ផ្សព្វផ្សាយបន្តសំណេរ​របស់អ្នកទេនោះ សូមអ្នកកុំដាក់​ស្នើវា​នៅទីនេះអី។<br />
+'yourdiff' => 'á\9e\85á\9f\86á\9e\8eុចខុសគ្នា',
+'copyrightwarning' => "á\9e\9fá\9e¼á\9e\98á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bâ\80\8bá\9e\90á\9e¶ á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\9aá\9e½á\9e\98á\9e\85á\9f\86á\9e\8eá\9f\82á\9e\80â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\93á\9f\85á\9e\9bá\9e¾{{SITENAME}} á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9fá\9e\96á\9f\92á\9e\9cá\9e\95á\9f\92á\9e\9fá\9e¶á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9bá\9e·á\9e\81á\9e·á\9e\8fá\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8f $2 (á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\98á\9e¾á\9e\9b $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9e\98á\9f\92អិត) ។ បើអ្នកមិនចង់ឱ្យ​​ត្រូវបានអ្នកដទៃធ្វើការកែប្រែ ផ្សព្វផ្សាយបន្តសំណេរ​របស់អ្នកទេនោះ សូមអ្នកកុំដាក់​ស្នើវា​នៅទីនេះអី។<br />
 អ្នកត្រូវសន្យាថា ​អ្នកសរសេរវា​ដោយខ្លួនអ្នក ឬបានចម្លងវា​ពី​កម្មសិទ្ធិសាធារណៈឬពីប្រភពសេរី ។
 '''មិនត្រូវ​ដាក់ស្នើ​ការងារមានជាប់កម្មសិទ្ឋិបញ្ញាដោយគ្មានការអនុញ្ញាតទេ!'''",
 'copyrightwarning2' => "សូមធ្វើការកត់សម្គាល់​ថា គ្រប់ការរួមចំណែក​ទៅ {{SITENAME}} អាច​ត្រូវបាន​កែប្រែ​ ផ្លាស់ប្ដូរ រឺលុបចោល ដោយអ្នករួមចំណែកដទៃទៀត។
@@ -1106,7 +1108,7 @@ $2
 'last' => 'ចុងក្រោយ',
 'page_first' => 'ដំបូង',
 'page_last' => 'ចុងក្រោយ',
-'histlegend' => "ជម្រើស៖ សូមគូសក្នុងកូនប្រអប់ពីមុខកំណែដែលអ្នកចង់ប្រៀបធៀប រួចចុចច្នុច enter ឬប៊ូតុងនៅខាងក្រោម។<br />
+'histlegend' => "ជម្រើស៖ សូមគូសក្នុងកូនប្រអប់ពីមុខកំណែដែលអ្នកចង់ប្រៀបធៀប រួចចុចច្នុច ENTER ឬប៊ូតុងនៅខាងក្រោម។<br />
 '''ពាក្យតំណាង'''៖(បច្ចុប្បន្ន) = ភាពខុសគ្នាជាមួយនឹងកំណែបច្ចុប្បន្ន, (ចុងក្រោយ) = ភាពខុសគ្នារវាងកំណែប្រែពីមុន, តិច = កំណែប្រែតិចតួច",
 'history-fieldset-title' => 'ស្វែងរកក្នុងប្រវត្តិ',
 'history-show-deleted' => 'តែទំព័រលុបចោលប៉ុណ្ណោះ',
@@ -1183,7 +1185,7 @@ $2
 'revdelete-unsuppress' => 'ដកចេញការដាក់កំហិតលើកំណែដែលបានស្តារឡើងវិញ',
 'revdelete-log' => 'មូលហេតុ៖',
 'revdelete-submit' => 'អនុវត្តទៅលើ{{PLURAL:$1|កំណែ|កំណែទាំងឡាយ}}ដែលបានជ្រើសយក',
-'revdelete-success' => "'''á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\82á\9f\86á\9e á\9e¾á\9e\89á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច។'''",
+'revdelete-success' => "'''á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\82á\9f\86á\9e á\9e¾á\9e\89á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច។'''",
 'revdelete-failure' => "'''មិន​អាចបន្ទាន់សម័យគំហើញនៃ​កំណែប្រែ​បាន​៖'''
 $1",
 'logdelete-success' => "'''បានកំណត់គំហើញកំណត់ហេតុដោយជោគជ័យ។'''",
@@ -1294,7 +1296,7 @@ $1",
 'searchprofile-project-tooltip' => 'ស្វែងរកក្នុង $1',
 'searchprofile-images-tooltip' => 'ស្វែងរកឯកសាររូបភាព',
 'searchprofile-everything-tooltip' => 'ស្វែងរកក្នុងខ្លឹមសារទាំងអស់(រួមបញ្ចូលទាំងទំព័រពិភាក្សា)',
-'searchprofile-advanced-tooltip' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91á\9e\80á\9f\86á\9e\93ត់ដោយអ្នកប្រើប្រាស់',
+'searchprofile-advanced-tooltip' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91á\9e\80á\9f\86á\9e\8eត់ដោយអ្នកប្រើប្រាស់',
 'search-result-size' => '$1({{PLURAL:$2|១ពាក្យ|$2ពាក្យ}})',
 'search-result-category-size' => '{{PLURAL:$1|សមាជិកម្នាក់|សមាជិក$1នាក់}} ({{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមរង១|$2 ចំណាត់ថ្នាក់ក្រុមរង}}, {{PLURAL:$3|1 ឯកសារ|$3 ឯកសារ}})',
 'search-result-score' => 'កម្រិតទាក់ទិន៖ $1%',
@@ -1305,7 +1307,7 @@ $1",
 'search-interwiki-default' => 'លទ្ធផលពី$1៖',
 'search-interwiki-more' => '(បន្ថែមទៀត)',
 'search-relatedarticle' => 'ទាក់ទិន',
-'mwsuggest-disable' => 'á\9e\98á\9e·á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9fá\9f\86á\9e\93ើAJAX',
+'mwsuggest-disable' => 'á\9e\98á\9e·á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9fá\9f\86á\9e\8eើAJAX',
 'searcheverything-enable' => 'ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់',
 'searchrelated' => 'ទាក់ទិន',
 'searchall' => 'ទាំងអស់',
@@ -1317,7 +1319,7 @@ $1",
 'search-nonefound' => 'មិនមានលទ្ធផលណាមួយ​ត្រូវគ្នានឹងសំណើសុំនេះទេ',
 'powersearch' => 'ស្វែងរកថ្នាក់ខ្ពស់',
 'powersearch-legend' => 'ស្វែងរកថ្នាក់ខ្ពស់',
-'powersearch-ns' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91៖',
+'powersearch-ns' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87៖',
 'powersearch-redir' => 'បញ្ជីការបញ្ជូនបន្ត',
 'powersearch-field' => 'ស្វែងរក',
 'powersearch-togglelabel' => 'គូសធីក៖',
@@ -1343,7 +1345,7 @@ $1",
 'prefs-edits' => 'ចំនួនកំណែប្រែ៖',
 'prefsnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
 'prefsnologintext' => 'អ្នកចាំបាច់ត្រូវតែ<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} កត់ឈ្មោះចូល]</span> ដើម្បីកំណត់ចំណង់ចំណូលចិត្តរបស់អ្នក។',
-'changepassword' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'changepassword' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
 'prefs-skin' => 'សំបក',
 'skin-preview' => 'មើលជាមុន',
 'datedefault' => 'គ្មានចំណូលចិត្ត',
@@ -1352,21 +1354,21 @@ $1",
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
 'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
 'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
 'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
 'prefs-watchlist-edits' => 'ចំនួនអតិបរមានៃបំលាស់ប្តូរត្រូវបង្ហាញក្នុងបញ្ជីតាមដានដែលបានពង្រីក៖',
 'prefs-watchlist-edits-max' => 'ចំនួនអតិបរមា៖ ១០០០',
 'prefs-misc' => 'ផ្សេងៗ',
-'prefs-resetpass' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'prefs-resetpass' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
 'prefs-changeemail' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
 'prefs-setemail' => 'ដាក់អាសយដ្ឋានអ៊ីមែលមួយ',
 'prefs-email' => '
 ជំរើសទាក់ទិននឹងអ៊ីមែល',
 'prefs-rendering' => 'ការរចនា',
 'saveprefs' => 'រក្សាទុក',
-'resetprefs' => 'á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\94á\9f\86លាស់ប្ដូរមិនបានរក្សាទុក',
+'resetprefs' => 'á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរមិនបានរក្សាទុក',
 'restoreprefs' => 'ស្ដារ​ការកំណត់​ទាំងអស់​ទៅ​លំនាំដើម',
 'prefs-editing' => 'កំណែប្រែ',
 'prefs-edit-boxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំព័រ។',
@@ -1376,7 +1378,7 @@ $1",
 'resultsperpage' => 'ចំនួនលទ្ធផលក្នុងមួយទំព័រ៖',
 'stub-threshold' => 'ទំហំអប្បបរមាសំរាប់ដាក់ជាទំរង់<a href="#" class="stub">តំណភ្ជាប់ទៅទំព័រកំប៉ិចកំប៉ុក</a> (គិតជាបៃ)៖',
 'stub-threshold-disabled' => 'មិនប្រើ',
-'recentchangesdays' => 'ចំនួនថ្ងៃបង្ហាញក្នុង ទំព័របំលាស់ប្តូរថ្មីៗ៖',
+'recentchangesdays' => 'ចំនួនថ្ងៃបង្ហាញក្នុងទំព័របន្លាស់ប្តូរថ្មីៗ៖',
 'recentchangesdays-max' => '(អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
 'recentchangescount' => 'ចំនួន​កំណែប្រែ​ដែល​ត្រូវ​បង្ហាញ​តាមលំនាំដើម:',
 'prefs-help-recentchangescount' => 'រាប់បញ្ចូលទាំងការកែប្រែនាពេលថ្មី ប្រវត្តិទំព័រនិងកំណត់ហេតុនានា។',
@@ -1432,7 +1434,7 @@ $1",
 'prefs-help-gender' => 'ដាក់ក៏បានមិនដាក់ក៏បាន៖ ប្រើសំរាប់អោយសូហ្វវែរហៅតាមភេទអោយបាមត្រឹមត្រូវ។ ព័ត៌មាននេះនឹងត្រូវបង្ហាញជាសាធារណៈ។',
 'email' => 'អ៊ីមែល',
 'prefs-help-realname' => 'អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។',
-'prefs-help-email' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8aá\9f\82á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9f\84á\9e\99á\9e\93á\9e¹á\9e\84á\9e\98á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\84á\9e\87á\9e\93á\9f\8dá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ ពេលដែលអ្នកភ្លេចវា។',
+'prefs-help-email' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8aá\9f\82á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9f\84á\9e\99á\9e\93á\9e¹á\9e\84á\9e\98á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\84á\9e\87á\9e\93á\9f\8dá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ ពេលដែលអ្នកភ្លេចវា។',
 'prefs-help-email-others' => 'អ្នកក៏អាចជ្រើសរើស​ការផ្ដល់លទ្ឋភាព​​ឱ្យអ្នកដទៃទាក់ទងអ្នក​តាមរយៈ​​ទំព័រអ្នកប្រើប្រាស់​​ឬទំព័រពិភាក្សារបស់អ្នក​​ដោយមិនចាំបាច់ឱ្យគេដឹងពីអត្តសញ្ញាណរបស់អ្នកផងដែរ។',
 'prefs-help-email-required' => 'អាសយដ្ឋានអ៊ីមែលត្រូវការជាចាំបាច់។',
 'prefs-info' => 'ព័ត៌មានផ្ទាល់​ខ្លួន',
@@ -1450,7 +1452,7 @@ $1",
 'prefs-displaywatchlist' => 'ជំរើសការបង្ហាញ',
 'prefs-diffs' => 'ភាពខុសគ្នា',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព',
 'email-address-validity-invalid' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាព',
 
@@ -1481,7 +1483,7 @@ $1",
 'group-user' => 'អ្នកប្រើប្រាស់',
 'group-autoconfirmed' => 'អ្នកប្រើប្រាស់ទទួលស្គាល់ដោយស្វ័យប្រវត្តិ',
 'group-bot' => 'រូបយន្ត',
-'group-sysop' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b',
+'group-sysop' => 'អភិបាល',
 'group-bureaucrat' => 'អ្នកការិយាល័យ',
 'group-suppress' => 'អធិការ',
 'group-all' => '(ទាំងអស់)',
@@ -1489,7 +1491,7 @@ $1",
 'group-user-member' => '{{GENDER:$1|អ្នកប្រើប្រាស់}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|អ្នកប្រើប្រាស់ទទួលស្គាល់ដោយស្វ័យប្រវត្តិ}}',
 'group-bot-member' => '{{GENDER:$1|រូបយន្ត}}',
-'group-sysop-member' => '{{GENDER:$1|á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b}}',
+'group-sysop-member' => '{{GENDER:$1|អភិបាល}}',
 'group-bureaucrat-member' => '{{GENDER:$1|អ្នកការិយាល័យ}}',
 'group-suppress-member' => '{{GENDER:$1|អធិការ}}',
 
@@ -1523,11 +1525,13 @@ $1",
 'right-writeapi' => 'ការប្រើប្រាស់ API សម្រាប់​សរសេរ',
 'right-delete' => 'លុបទំព័រចោល',
 'right-bigdelete' => 'លុបទំព័រទាំងឡាយដែលមានប្រវត្តិវែង',
+'right-deletelogentry' => 'លប់និងឈប់លុបកំណត់ហេតុច្បាស់លាស់ណាមួយ',
 'right-deleterevision' => 'លុប​និង​ឈប់​លុប​កំណែ​ប្រែ​ច្បាស់លាស់​នៃ​ទំព័រ​',
-'right-deletedhistory' => 'មើលកំនត់ត្រាប្រវត្តិដែលត្រូវបានលុបចោល ដោយគ្មានអត្ថបទភ្ជាប់របស់វា',
+'right-deletedhistory' => 'មើលកំណត់ត្រាប្រវត្តិដែលត្រូវបានលុបចោល ដោយគ្មានអត្ថបទភ្ជាប់របស់វា',
+'right-deletedtext' => 'មើលផ្នែកអត្ថបទដែលបានលប់និងបន្លាស់ប្ដូររវាងកំណែទាំងឡាយដែលបានលុបចោល',
 'right-browsearchive' => 'ស្វែងរកទំព័រដែលត្រូវបានលុបចោល',
 'right-undelete' => 'ឈប់លុបទំព័រមួយ',
-'right-suppressrevision' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99á\9e\93á\9e·á\9e\84á\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8b',
+'right-suppressrevision' => 'ពិនិត្យនិងស្ដារកំណែដែលអភិបាលបានលាក់',
 'right-suppressionlog' => 'មើលកំណត់ហេតុឯកជន',
 'right-block' => 'ហាមមិនឱ្យអ្នកប្រើប្រាស់ដទៃទៀតធ្វើការកែប្រែ',
 'right-blockemail' => 'ហាមឃាត់អ្នកប្រើប្រាស់ម្នាក់មិនអោយផ្ញើអ៊ីមែល',
@@ -1542,21 +1546,21 @@ $1",
 'right-editusercss' => 'កែប្រែឯកសារ CSS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
 'right-edituserjs' => 'កែប្រែឯកសារ JS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
 'right-rollback' => 'ត្រឡប់យ៉ាងរហ័សនូវកំណែប្រែទំព័រវិសេសណាមួយ​ដែលធ្វើឡើងដោយ​អ្នកប្រើប្រាស់ចុងក្រោយគេ។',
-'right-markbotedits' => 'á\9e\85á\9f\86á\9e\93á\9e¶á\9f\86á\9e\80á\9f\86á\9e\93á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89á\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\93ែប្រែដោយរូបយន្ត',
+'right-markbotedits' => 'á\9e\85á\9f\86á\9e\8eá\9e¶á\9f\86á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89á\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\8eែប្រែដោយរូបយន្ត',
 'right-noratelimit' => 'មិនទទួលរងឥទ្ធិពលពីការដាក់កំហិតណាទាំងអស់',
 'right-import' => 'នាំចូលទំព័រនានាពីវិគីផ្សេងៗទៀត',
 'right-importupload' => 'នាំចូលទំព័រនានាពីឯកសារដែលបានផ្ទុកឡើង',
 'right-patrol' => 'ចំណាំកំណែប្រែរបស់អ្នកដ៏ទៃថាជាកំណែប្រែបានល្បាត',
-'right-autopatrol' => 'á\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bá\9e\8aá\9f\84á\9e\99á\9e\9fá\9f\92á\9e\9cá\9f\90á\9e\99á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\93á\9e¼á\9e\9cá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\93ែប្រែបានល្បាត',
-'right-patrolmarks' => 'á\9e\98á\9e¾á\9e\80​កំណត់​សម្គាល់​ល្បាត​ដែល​ផ្លាស់​ប្តូរ​ថ្មី​ៗ​',
+'right-autopatrol' => 'á\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bá\9e\8aá\9f\84á\9e\99á\9e\9fá\9f\92á\9e\9cá\9f\90á\9e\99á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\93á\9e¼á\9e\9cá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\8eែប្រែបានល្បាត',
+'right-patrolmarks' => 'á\9e\98á\9e¾á\9e\9b​កំណត់​សម្គាល់​ល្បាត​ដែល​ផ្លាស់​ប្តូរ​ថ្មី​ៗ​',
 'right-unwatchedpages' => 'បង្ហាញបញ្ជីទំព័រនានាដែលមិនត្រូវបានមើល',
 'right-mergehistory' => 'ច្របាច់ប្រវត្តិរបស់ទំព័រនានាបញ្ចូលគ្នា',
-'right-userrights' => 'á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\93á\9f\83á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9eស់',
+'right-userrights' => 'á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e¢ស់',
 'right-userrights-interwiki' => 'កែប្រែសិទ្ធិអ្នកប្រើប្រាស់នៅលើវិគីផ្សេងៗទៀត',
 'right-siteadmin' => 'ចាក់សោនិងបើកសោមូលដ្ឋានទិន្នន័យ',
 'right-override-export-depth' => 'នាំចេញទំព័ររួមទាំងទំព័រដែលមានភ្ជាប់តំណភ្ជាប់​រហូតដល់លំដាប់ទី៥',
 'right-sendemail' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ',
-'right-passwordreset' => 'á\9e\98á\9e¾á\9e\9bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ឡើងវិញ',
+'right-passwordreset' => 'á\9e\98á\9e¾á\9e\9bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ឡើងវិញ',
 
 # Special:Log/newusers
 'newuserlogpage' => 'កំណត់ហេតុនៃការបង្កើតគណនី',
@@ -1603,8 +1607,8 @@ $1",
 'action-sendemail' => 'ផ្ញើអ៊ីមែល',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a\9e\94á\9f\86លាស់ប្ដូរ}}',
-'recentchanges' => 'á\9e\94á\9f\86លាស់ប្ដូរ​ថ្មីៗ',
+'nchanges' => '$1 {{PLURAL:$1|á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a\9e\94á\9e\93á\9f\92លាស់ប្ដូរ}}',
+'recentchanges' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ​ថ្មីៗ',
 'recentchanges-legend' => 'ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ',
 'recentchanges-summary' => 'តាមដានរាល់បំលាស់ប្ដូរថ្មីៗបំផុតចំពោះវិគីនៅលើទំព័រនេះ។',
 'recentchanges-feed-description' => 'តាមដាន​បន្លាស់ប្ដូរថ្មីៗ​បំផុត​នៃ​វិគី​នេះក្នុង​មតិព័ត៌មាន​នេះ​។',
@@ -1612,16 +1616,16 @@ $1",
 'recentchanges-label-minor' => 'នេះជាការកែប្រែតិចតួចមួយប៉ុណ្ណោះ',
 'recentchanges-label-bot' => 'ការកែប្រែនេះត្រូវបានធ្វើឡើងដោយរូបយន្ត',
 'recentchanges-label-unpatrolled' => 'ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ',
-'rcnote' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\87á\9e¶â\80\8b{{PLURAL:$1|á\9f¡á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|'''$1'''á\9e\94á\9f\86លាស់ប្ដូរ}}​ចុងក្រោយក្នុងរយៈពេល​{{PLURAL:$2|ថ្ងៃ|'''$2'''ថ្ងៃ}}​ចុងក្រោយគិតត្រឹម$5 $4 ។",
-'rcnotefrom' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9e¶á\9e\93á\9e¶á\9e\82á\9e·á\9e\8fá\9e\85á\9e¶á\9e\94á\9f\8bá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸ '''$2''' (á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e¢á\9e\8fá\9e·á\9e\94á\9e\9aá\9e\98á\9e¶ '''$1''' á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a)។",
-'rclistfrom' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
+'rcnote' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\87á\9e¶â\80\8b{{PLURAL:$1|á\9f¡á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|'''$1'''á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ}}​ចុងក្រោយក្នុងរយៈពេល​{{PLURAL:$2|ថ្ងៃ|'''$2'''ថ្ងៃ}}​ចុងក្រោយគិតត្រឹម$5 $4 ។",
+'rcnotefrom' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9e¶á\9e\93á\9e¶á\9e\82á\9e·á\9e\8fá\9e\85á\9e¶á\9e\94á\9f\8bá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸ '''$2''' (á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e¢á\9e\8fá\9e·á\9e\94á\9e\9aá\9e\98á\9e¶á\9e\85á\9f\86á\9e\93á\9e½á\9e\93 '''$1''')។",
+'rclistfrom' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
 'rcshowhideminor' => '$1កំណែប្រែ​តិចតួច',
 'rcshowhidebots' => '$1រូបយន្ត',
 'rcshowhideliu' => '$1អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូល',
 'rcshowhideanons' => '$1អ្នកប្រើប្រាស់អនាមិក',
 'rcshowhidepatr' => '$1កំណែប្រែដែលបានល្បាត',
 'rcshowhidemine' => '$1កំណែប្រែរបស់ខ្ញុំ',
-'rclinks' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9f\86លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3',
+'rclinks' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3',
 'diff' => 'ប្រៀបធៀប',
 'hist' => 'ប្រវត្តិ',
 'hide' => 'លាក់',
@@ -1633,7 +1637,7 @@ $1",
 'rc_categories' => 'កម្រិតទីតាំងចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា "|")',
 'rc_categories_any' => 'មួយណាក៏បាន',
 'rc-change-size' => '$1',
-'rc-change-size-new' => '$1 {{PLURAL:$1|á\9e\94á\9f\83\9e\94á\9f\83}} á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\94á\9f\86លាស់ប្ដូរ',
+'rc-change-size-new' => '$1 {{PLURAL:$1|á\9e\94á\9f\83\9e\94á\9f\83}} á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
 'newsectionsummary' => '/* $1 */ ផ្នែកថ្មី',
 'rc-enhanced-expand' => 'បង្ហាញព័ត៌មានលំអិត (តម្រូវអោយមាន JavaScript)',
 'rc-enhanced-hide' => 'លាក់ព័ត៌មានលំអិត',
@@ -1641,7 +1645,7 @@ $1",
 
 # Recent changes linked
 'recentchangeslinked' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
-'recentchangeslinked-feed' => 'á\9e\94á\9f\86លាស់ប្ដូរពាក់ព័ន្ធ',
+'recentchangeslinked-feed' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរពាក់ព័ន្ធ',
 'recentchangeslinked-toolbox' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
 'recentchangeslinked-title' => 'បន្លាស់ប្ដូរ​ទាក់ទងនឹង "$1"',
 'recentchangeslinked-noresult' => 'គ្មានបន្លាស់ប្ដូរ​លើទំព័រ​ដែលត្រូវបានតភ្ជាប់ ក្នុងថេរវេលា​ដែលត្រូវបានផ្តល់ឱ្យ ។',
@@ -1657,7 +1661,7 @@ $1",
 'uploadnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
 'uploadnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] ដើម្បីមានសិទ្ធិផ្ទុកឯកសារទាំងឡាយឡើង។',
 'upload_directory_missing' => 'ថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) បាត់ ហើយប្រព័ន្ធបំរើការមិនអាចបង្កើតវាបានទេ។',
-'upload_directory_read_only' => 'á\9e\94á\9f\92á\9e\9aá\9e\96á\9f\90á\9e\93á\9f\92á\9e\92á\9e\94á\9f\86រើការមិនអាចសរសេរចូលទៅក្នុងថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) ទេ។',
+'upload_directory_read_only' => 'á\9e\94á\9f\92á\9e\9aá\9e\96á\9f\90á\9e\93á\9f\92á\9e\92á\9e\94á\9e\98á\9f\92រើការមិនអាចសរសេរចូលទៅក្នុងថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) ទេ។',
 'uploaderror' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
 'upload-recreate-warning' => "''ប្រយ័ត្ន៖ ឯកសារដែលមានឈ្មោះដូចគ្នានេះត្រូវបានលុបចោលឬប្ដូរទីតាំង។'''
 
@@ -1682,16 +1686,16 @@ $1",
 'filename' => 'ឈ្មោះឯកសារ',
 'filedesc' => 'ចំណារពន្យល់',
 'fileuploadsummary' => 'ចំណារពន្យល់៖',
-'filereuploadsummary' => 'á\9e\94á\9f\86លាស់ប្ដូរ​ឯកសារ​៖',
+'filereuploadsummary' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ​ឯកសារ​៖',
 'filestatus' => 'ស្ថានភាពរក្សាសិទ្ធិ៖',
 'filesource' => 'ប្រភព',
 'uploadedfiles' => 'ឯកសារដែលត្រូវបានផ្ទុកឡើង',
-'ignorewarning' => 'មិនខ្វល់​ការព្រមាន ហើយរក្សាទុក​ឯកសារ​តែម្តង។',
-'ignorewarnings' => 'មិនខ្វល់​ការព្រមាន​ណាមួយ',
+'ignorewarning' => 'á\9e\98á\9e·á\9e\93á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bâ\80\8bá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93 á\9e á\9e¾á\9e\99á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\91á\9e»á\9e\80â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\8fá\9f\82á\9e\98á\9f\92á\9e\8fá\9e\84á\9f\94',
+'ignorewarnings' => 'á\9e\98á\9e·á\9e\93á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bâ\80\8bá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93â\80\8bá\9e\8eá\9e¶á\9e\98á\9e½á\9e\99',
 'minlength1' => 'ឈ្មោះឯកសារ​ត្រូវមាន​យ៉ាងតិច​១​អក្សរ។',
 'illegalfilename' => 'ឈ្មោះឯកសារ "$1" មាន​អក្សរ​ហាមឃាត់​​ក្នុងចំណងជើងទំព័រ។ សូម​ប្តូរឈ្មោះ​ឯកសារ ហើយ​ព្យាយាមផ្ទុកវា​ឡើង​ម្តងទៀត។',
 'filename-toolong' => 'ឈ្មោះឯកសារមិនអាចវែងជាង 240 បៃទេ។',
-'badfilename' => 'ឈ្មោះឯកសារ បានត្រូវប្តូរ ជា "$1" ។',
+'badfilename' => 'ឈ្មោះឯកសារត្រូវបានប្តូរជា "$1" ។',
 'filetype-mime-mismatch' => 'កន្ទុយរបស់ឯកសារ ".$1" មិនត្រូវគ្នានឹងប្រភេទ MIME របស់ឯកសារ ($2) ទេ។',
 'filetype-badmime' => 'ឯកសារ​ប្រភេទ MIME "$1" មិនត្រូវបាន​អនុញ្ញាត​ឱ្យផ្ទុកឡើង។',
 'filetype-bad-ie-mime' => 'មិនអាចផ្ទុកឯកសារនេះឡើងបានទេ ព្រោះInternet Explorerបានរកឃើញថាឯកសារនេះជា "$1" ដែលជាប្រភេទឯកសារហាមឃាត់និងមានគ្រោះថ្នាក់ខ្លាំង។',
@@ -1700,7 +1704,7 @@ $1",
 {{PLURAL:$3|ប្រភេទឯកសារ|ប្រភេទឯកសារ}}ដែលគេចង់បានគឺ $2។',
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ​}}។
 {{PLURAL:$3|ប្រភេទឯកសារ​|ប្រភេទឯកសារ​}}ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​គឺ $2 ។',
-'filetype-missing' => 'ឯកសារ មិនមានកន្ទុយ (ដូចជា ".jpg")។',
+'filetype-missing' => 'ឯកសារគ្មានកន្ទុយ (ដូចជា ".jpg")។',
 'empty-file' => 'ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។',
 'file-too-large' => 'ឯកសារដែលអ្នកបានដាក់ស្នើធំពេកហើយ។',
 'filename-tooshort' => 'ឈ្មោះឯកសារខ្លីពេកហើយ។',
@@ -1762,7 +1766,7 @@ $1",
 'uploadscripted' => 'ឯកសារនេះមានកូដHTMLឬស្គ្រីបដែលអាចអោយឧបករណ៍រាវរកវិបសាយមានការយល់ច្រលំ។',
 'uploadvirus' => 'ឯកសារមានមេរោគ!
 
\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8fá\9e¸á\9e\9bá\9f\86អិត៖ $1',
\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92អិត៖ $1',
 'uploadjava' => 'ឯកសារនេះជាប្រភេទ ZIP ដែលមានផ្ទុក Java .class។
 ការផ្ទុកឡើងឯកសារ Java ត្រូវបានហាមឃាត់ ព្រោះវាអាចធ្វើមានបញ្ហាក្នុងការឆ្លងកុងត្រូលសុវត្តិភាព។',
 'upload-source' => 'ឯកសារប្រភព',
@@ -1791,8 +1795,8 @@ JD # Jenoptik
 MGP # ម៉ាក Pentax
 PICT # ផ្សេង​ៗ​
   #</pre> <!-- leave this line exactly as it is -->',
-'upload-success-subj' => 'á\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e¡á\9e¾á\9e\84á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច',
-'upload-success-msg' => 'á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¡á\9e¾á\9e\84á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\96á\9e¸ [$2] á\9e\94á\9e¶á\9e\93á\9e\91á\9e\91á\9e½á\9e\9bá\9e\87á\9f\84á\9e\82á\9e\87á\9f\90យ។ អ្នកអាចរកវាបាននៅទៅនេះ៖ [[:{{ns:file}}:$1]]',
+'upload-success-subj' => 'á\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e¡á\9e¾á\9e\84á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច',
+'upload-success-msg' => 'á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¡á\9e¾á\9e\84á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\96á\9e¸ [$2] á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85á\9e á\9e¾យ។ អ្នកអាចរកវាបាននៅទៅនេះ៖ [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
 'upload-failure-msg' => 'មានបញ្ហាមួយជាមួយការផ្ទុកឡើងរបស់អ្នកពី [$2]៖
 
@@ -1805,14 +1809,14 @@ $1',
 'upload-file-error' => 'បញ្ហាផ្នែកខាងក្នុង',
 'upload-file-error-text' => 'បញ្ហាផ្នែកខាងក្នុងបានកើតឡើង​ នៅពេលព្យាយាមបង្កើតឯកសារបណ្ដោះអាសន្នមួយ​នៅក្នុងម៉ាស៊ីនបម្រើការ។
 
\9e\9fá\9e¼á\9e\98á\9e\91á\9f\86á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\91á\9f\86á\9e\93á\9e\84[[Special:ListUsers/sysop|á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b]]á\9f\94',
+សូមទំនាក់ទំនង[[Special:ListUsers/sysop|អភិបាល]]។',
 'upload-misc-error' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
 'upload-misc-error-text' => 'បញ្ហាដែលមិនស្គាល់មួយបានកើតឡើងនៅក្នុងកំឡុងពេលផ្ទុកឡើង។
 
 ចូរផ្ទៀងផ្ទាត់ថា URL គឺមានសុពលភាពហើយអាចដំណើរការ រួចហើយ​ព្យាយាមម្តងទៀត។
 
\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\93á\9f\85á\9e\8fá\9f\82á\9e\80á\9e¾á\9e\8fá\9e¡á\9e¾á\9e\84 á\9e\9fá\9e¼á\9e\98á\9e\91á\9f\86á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\91á\9f\86á\9e\93á\9e\84[[Special:ListUsers/sysop|អ្នកអភិបាល]]។',
-'upload-too-many-redirects' => 'URLá\9e\93á\9f\81á\9f\87á\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\93ភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ',
\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\93á\9f\85á\9e\8fá\9f\82á\9e\80á\9e¾á\9e\8fá\9e¡á\9e¾á\9e\84 á\9e\9fá\9e¼á\9e\98á\9e\91á\9e¶á\9e\80á\9f\8bá\9e\91á\9e\84á\9e\91á\9f\85[[Special:ListUsers/sysop|អ្នកអភិបាល]]។',
+'upload-too-many-redirects' => 'URLá\9e\93á\9f\81á\9f\87á\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\8eភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ',
 'upload-unknown-size' => 'មិនដឹងទំហំ',
 'upload-http-error' => 'មានកំហុសHTTPមួយបានកើតឡើង៖ $1',
 
@@ -1832,7 +1836,7 @@ $1',
 'backend-fail-maxsize' => 'មិនអាចសរសេរឯកសារ "$1" បានទេពីព្រោះវាមានទំហំធំជាង {{PLURAL:$2|មួយបៃ|$2 បៃ}}.',
 
 # Special:UploadStash
-'uploadstash-errclear' => 'á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\86á\9e¢á\9e¶á\9e\8fá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច។',
+'uploadstash-errclear' => 'á\9e\80á\9e¶á\9e\9aá\9e\9fá\9e\98á\9f\92á\9e¢á\9e¶á\9e\8fá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច។',
 'uploadstash-refresh' => 'ផ្ទុកបញ្ជីឯកសារឡើងវិញ',
 
 # img_auth script messages
@@ -1859,11 +1863,11 @@ $1',
 អ្នកគួរតែសាកល្បងនៅពេលដែលវិបសាយនេះមិនសូវរវល់។',
 
 'license' => 'អាជ្ញាប័ណ្ណ',
-'license-header' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\87á\9e​អាជ្ញាប័ណ្ណ',
+'license-header' => 'á\9e\80á\9e¶á\9e\9aá\9e\8aá\9e¶á\9e\80á\9f\8b​អាជ្ញាប័ណ្ណ',
 'nolicense' => 'គ្មាន',
 'license-nopreview' => '(មិនទាន់មានការបង្ហាញការមើលជាមុនទេ)',
-'upload_source_url' => ' (URL ត្រឹមត្រូវនិងបើកចំហជាសាធារណៈ)',
-'upload_source_file' => ' (ឯកសារក្នុងកុំព្យូទ័ររបស់អ្នក)',
+'upload_source_url' => '(URL ត្រឹមត្រូវនិងបើកចំហជាសាធារណៈ)',
+'upload_source_file' => '(ឯកសារក្នុងកុំព្យូទ័ររបស់អ្នក)',
 
 # Special:ListFiles
 'listfiles-summary' => 'ទំព័រពិសេស​នេះ​បង្ហាញ​គ្រប់​ឯកសារ​ដែល​បានផ្ទុកឡើង។
@@ -1897,7 +1901,7 @@ $1',
 'filehist-filesize' => 'ទំហំឯកសារ',
 'filehist-comment' => 'យោបល់',
 'filehist-missing' => 'ឯកសារបាត់បង់',
-'imagelinks' => 'á\9e\94á\9f\86á\9e\9aá\9e¾á\9e\94á\9f\86រាស់ឯកសារ',
+'imagelinks' => 'á\9e\94á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\94á\9e\98á\9f\92រាស់ឯកសារ',
 'linkstoimage' => '{{PLURAL:$1|ទំព័រ​|$1 ទំព័រ}} ខាងក្រោម​មានតំណភ្ជាប់មក​ឯកសារនេះ ៖',
 'linkstoimage-more' => 'មាន​​{{PLURAL:$1|តំណ​ភ្ជាប់ទំព័រ​}}ច្រើន​ជាង​ $1 មក​កាន់​ឯកសារ​នេះ​។
 បញ្ជី​នេះ​បង្ហាញ​អំពី​{{PLURAL:$1|តំណ​ភ្ជាប់ទំព័រដំបូង​​|តំណ​ភ្ជាប់ទំព័រ $1ដំបូង​}}មក​កាន់​ឯកសារ​នេះប៉ុណ្ណោះ​​។
@@ -1905,14 +1909,18 @@ $1',
 'nolinkstoimage' => 'គ្មានទំព័រណាមួយដែលតភ្ជាប់មកឯកសារនេះទេ។',
 'morelinkstoimage' => 'មើល [[Special:WhatLinksHere/$1|តំណភ្ជាប់បន្ថែមទៀត]] ដែលតភ្ជាប់មកកាន់ឯកសារនេះ។',
 'linkstoimage-redirect' => '$1 (ឯកសារបញ្ជូនបន្ត) $2',
-'duplicatesoffile' => '{{PLURAL:$1|file is a duplicate|$1 á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\87á\9e¶á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84}}á\9e\8aá\9e¼á\9e\85á\9e\8fá\9e\91á\9f\85â\80\8bá\9e\93á\9f\83â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8b ([[Special:FileDuplicateSearch/$2|á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9f\86អិត]])​៖',
+'duplicatesoffile' => '{{PLURAL:$1|file is a duplicate|$1 á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\87á\9e¶á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84}}á\9e\8aá\9e¼á\9e\85á\9e\8fá\9e\91á\9f\85â\80\8bá\9e\93á\9f\83â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8b ([[Special:FileDuplicateSearch/$2|á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9e\98á\9f\92អិត]])​៖',
 'sharedupload' => 'ឯកសារ​នេះ​​បាន​មក​ពី $1 និង​អាច​ត្រូវ​បាន​ប្រើប្រាស់​នៅ​គម្រោង​ដទៃ​ទៀត។',
 'sharedupload-desc-there' => 'ឯកសារ​នេះ​មក​ពី ​$1 និង​អាច​ត្រូវ​បាន​ប្រើប្រាស់​ដោយ​គម្រោង​ផ្សេង​ៗ​ដទៃ​ទៀត​។
 សូម​មើល​[ទំព័របរិយាយ​ឯកសារ​ $2] សម្រាប់​ព័ត៌មាន​បន្ថែម​។',
-'sharedupload-desc-here' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគំរោងដ៏ទៃទៀត។
-ការពណ៌នានៅលើ [$2 ទំព័រពណ៌នា]អំពីវា មានបង្ហាញខាងក្រោមនេះ។',
+'sharedupload-desc-here' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវា មានបង្ហាញខាងក្រោមនេះ។',
+'sharedupload-desc-edit' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ប្រហែលជាអ្នកចង់កែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
+'sharedupload-desc-create' => 'ឯកសារនេះមានប្រភពមកពី $1  និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ប្រហែលជាអ្នកកែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
 'filepage-nofile' => 'គ្មានឯកសារ​ដែលមានឈ្មោះនេះទេ។',
-'filepage-nofile-link' => 'គ្មានរូបភាពដែលមានឈ្មោះនេះទេ។ ប៉ុន្តែអ្នកអាច [$1 ផ្ទុក​វា​ឡើង​] ។',
+'filepage-nofile-link' => 'គ្មានរូបភាពដែលមានឈ្មោះនេះទេ។ ប៉ុន្តែអ្នកអាច[$1 ផ្ទុក​វា​ឡើង​] ។',
 'uploadnewversion-linktext' => 'ផ្ទុកឡើងមួយកំណែថ្មីនៃឯកសារនេះ',
 'shared-repo-from' => 'ពី $1',
 'shared-repo' => 'ឃ្លាំងរួម​',
@@ -1989,7 +1997,7 @@ $1',
 'statistics-edits' => 'ការកែប្រែទំព័រចាប់តាំងពី{{SITENAME}}ត្រូវបានដំឡើង',
 'statistics-edits-average' => 'កំណែប្រែជាមធ្យមក្នុងមួយទំព័រ',
 'statistics-views-total' => 'ចំនួនការចូលមើលសរុប',
-'statistics-views-total-desc' => 'á\9e\98á\9e·á\9e\93á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\80á\9e¶á\9e\9aá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93និងទំព័រពិសេសៗទេ',
+'statistics-views-total-desc' => 'á\9e\98á\9e·á\9e\93á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\80á\9e¶á\9e\9aá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\9aá\9e¼á\9e\94á\9e\9aá\9e¶á\9e\84និងទំព័រពិសេសៗទេ',
 'statistics-views-peredit' => 'ចំនួនការចូលមើលក្នុងមួយកំណែប្រែ',
 'statistics-users' => '[[Special:ListUsers|អ្នកប្រើប្រាស់]]ដែលបានចុះឈ្មោះ',
 'statistics-users-active' => 'អ្នកប្រើប្រាស់សកម្ម',
@@ -2073,7 +2081,7 @@ $1',
 'protectedtitlesempty' => 'មិន​មាន​ចំណងជើង​ណា​ដែល​ត្រូវ​បាន​ការពារ​ជាមួយនឹង​ប៉ារ៉ាម៉ែត​ទាំងនេះ​ទេ​នាពេលថ្មីៗនេះ។',
 'listusers' => 'បញ្ជីអ្នកប្រើប្រាស់',
 'listusers-editsonly' => 'បង្ហាញតែអ្នកប្រើប្រាស់ដែលបានកែប្រែអត្ថបទប៉ុណ្ណោះ',
-'listusers-creationsort' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់កាលបរិច្ឆេទបង្កើត',
+'listusers-creationsort' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់កាលបរិច្ឆេទបង្កើត',
 'usereditcount' => '$1 {{PLURAL:$1|កំណែប្រែ|កំណែប្រែ}}',
 'usercreated' => '{{GENDER:$3|បានបង្កើត}}នៅ$1  $2',
 'newpages' => 'ទំព័រថ្មីៗ',
@@ -2104,7 +2112,7 @@ $1',
 
 # Special:Log
 'specialloguserlabel' => 'អ្នកប្រព្រឹត្តិ៖',
-'speciallogtitlelabel' => 'á\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85 (á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e¢á\9e\8fá\9f\92á\9e\8fបទឬអត្តនាមអ្នកប្រើប្រាស់)៖',
+'speciallogtitlelabel' => 'á\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85 (á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e¢á\9e\8fá\9f\92á\9e\90បទឬអត្តនាមអ្នកប្រើប្រាស់)៖',
 'log' => 'កំណត់ហេតុ',
 'all-logs-page' => 'កំណត់ហេតុសាធារណៈទាំងអស់',
 'alllogstext' => 'ការបង្ហាញកំណត់ហេតុទាំងអស់របស់{{SITENAME}}។
@@ -2128,8 +2136,8 @@ $1',
 'allpagesnext' => 'បន្ទាប់',
 'allpagessubmit' => 'ទៅ',
 'allpagesprefix' => 'បង្ហាញទំព័រដែលចាប់ផ្ដើមដោយ ៖',
-'allpagesbadtitle' => 'ចំណងជើង​ទំព័រ​ដែល​ត្រូវ​បាន​ផ្តល់ឱ្យ​គឺ​គ្មាន​សុពលភាព​ឬក៏​មាន​បុព្វបទ​ដែល​មាន​អន្តរភាសា​ឬអ​ន្តរវីគី​។ ប្រហែលជា​វា​មាន​អក្សរ​មួយ​ឬ​ច្រើន ដែល​មិន​អាច​ត្រូវ​ប្រើ​នៅក្នុង​ចំណងជើង​។',
-'allpages-bad-ns' => '{{SITENAME}}á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91"$1"ទេ។',
+'allpagesbadtitle' => 'ចំណងជើង​ទំព័រ​ដែល​ត្រូវ​បាន​ផ្តល់ឱ្យ​គឺ​គ្មាន​សុពលភាព​ឬក៏​មាន​បុព្វបទ​ដែល​មាន​អន្តរភាសា​ឬអ​ន្តរវីគី​។ ប្រហែលជា​វា​មាន​អក្សរ​មួយ​ឬ​ច្រើន ដែលគេហាមមិនឱ្យប្រើ​នៅក្នុង​ចំណងជើង​។',
+'allpages-bad-ns' => '{{SITENAME}}á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87"$1"ទេ។',
 'allpages-hide-redirects' => 'លាក់ការបញ្ជូនបន្ត',
 
 # SpecialCachedPage
@@ -2162,7 +2170,7 @@ $1',
 # Special:ListUsers
 'listusersfrom' => 'បង្ហាញអ្នកប្រើប្រាស់ចាប់ផ្តើមពី៖',
 'listusers-submit' => 'បង្ហាញ',
-'listusers-noresult' => 'á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98នេះទេ។',
+'listusers-noresult' => 'á\9e\9aá\9e\80á\9e\98á\9e·á\9e\93á\9e\83á\9e¾á\9e\89á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bនេះទេ។',
 'listusers-blocked' => '(ស្ថិតក្រោមការហាមឃាត់)',
 
 # Special:ActiveUsers
@@ -2171,7 +2179,7 @@ $1',
 'activeusers-count' => '{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ',
 'activeusers-from' => 'បង្ហាញអត្តនាមផ្ដើមដោយ៖',
 'activeusers-hidebots' => 'លាក់រូបយន្ត',
-'activeusers-hidesysops' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b',
+'activeusers-hidesysops' => 'លាក់អភិបាល',
 'activeusers-noresult' => 'អ្នកប្រើប្រាស់​រកមិនឃើញ​។​',
 
 # Special:ListGroupRights
@@ -2192,8 +2200,8 @@ $1',
 'listgrouprights-addgroup-self-all' => 'បន្ថែម​ក្រុម​ទាំងអស់​ទៅ​គណនី​ផ្ទាល់ខ្លួន​',
 'listgrouprights-removegroup-self-all' => 'យក​ចេញ​​ក្រុម​ទាំងអស់​ពី​​គណនី​ផ្ទាល់ខ្លួន​',
 
-# E-mail user
-'mailnologin' => 'á\9e\98á\9e·á\9e\93មានអាសយដ្ឋានផ្ញើទេ',
+# Email user
+'mailnologin' => 'á\9e\82á\9f\92មានអាសយដ្ឋានផ្ញើទេ',
 'mailnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] និង មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀត។',
 'emailuser' => 'ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នេះ',
 'emailuser-title-target' => 'ផ្ញើសារទៅកាន់ {{GENDER:$1|អ្នកប្រើប្រាស់}} នេះ',
@@ -2209,7 +2217,7 @@ $1',
 'noemailtext' => 'អ្នកប្រើប្រាស់នេះមិនបានផ្ដល់អាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាពទេ។',
 'nowikiemailtitle' => 'មិនអនុញ្ញាតអោយប្រើអ៊ីមែល',
 'nowikiemailtext' => 'អ្នក​ប្រើប្រាស់​នេះ​បាន​ជ្រើសរើស​មិន​ទទួល​អ៊ីមែល​ពីអ្នកប្រើប្រាស់​ដទៃ​ទៀត​។',
-'emailnotarget' => 'á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\91á\9e\91á\9e½á\9e\9bá\9e\98á\9e·á\9e\93á\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e¬á\9e\87á\9e¶á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9f\94',
+'emailnotarget' => 'អត្តនាមអ្នកទទួលមិនត្រឹមត្រូវឬគ្មាន។',
 'emailtarget' => 'វាយបញ្ចូលអត្តនាមអ្នកទទួល',
 'emailusername' => 'អត្តនាម៖',
 'emailusernamesubmit' => 'ដាក់ស្នើ',
@@ -2232,7 +2240,7 @@ $1',
 # Watchlist
 'watchlist' => 'បញ្ជីតាមដាន',
 'mywatchlist' => 'បញ្ជីតាមដាន​',
-'watchlistfor2' => 'á\9e\9fá\9f\86រាប់ $1 $2',
+'watchlistfor2' => 'á\9e\9fá\9e\98á\9f\92រាប់ $1 $2',
 'nowatchlist' => 'គ្មានអ្វីនៅក្នុងបញ្ជីតាមដានរបស់អ្នកទេ។',
 'watchlistanontext' => 'សូម $1 ដើម្បី​មើល​ឬ​កែប្រែ​របស់​ក្នុង​បញ្ជីតាមដាន​របស់អ្នក។',
 'watchnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
@@ -2267,8 +2275,8 @@ $1',
 'enotif_mailer' => 'ភ្នាក់ងារផ្ញើអ៊ីមែលផ្ដល់ដំណឹងរបស់ {{SITENAME}}',
 'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
 'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
-'enotif_lastvisited' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9a á\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9b ចុងក្រោយ។',
-'enotif_lastdiff' => 'á\9e\9fá\9e¼á\9e\98á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99$1á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\98á\9e¾á\9e\9bá\9e\94á\9f\86លាស់ប្តូរនេះ។',
+'enotif_lastvisited' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bចុងក្រោយ។',
+'enotif_lastdiff' => 'á\9e\9fá\9e¼á\9e\98á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99$1á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្តូរនេះ។',
 'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
 'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
 
@@ -2319,8 +2327,8 @@ $UNWATCHURL
 'historywarning' => "'''ប្រយ័ត្ន​៖''' ទំព័រដែលអ្នកបំរុងនឹងលុប មានប្រវត្តិ​ចំនួនប្រហែល $1 {{PLURAL:$1|កំណែ|កំណែ}}៖",
 'confirmdeletetext' => 'អ្នកប្រុងនឹងលុបចោលទាំងស្រុង នូវទំព័រមួយដោយរួមបញ្ចូលទាំងប្រវត្តិកែប្រែរបស់វាផង។
 សូមអ្នកអះអាងថា អ្នកពិតជាមានចេតនាធ្វើបែបហ្នឹង និងថាអ្នកបានយល់ច្បាស់ពីផលវិបាកទាំងឡាយដែលអាចកើតមាន និង​សូមអះអាងថា អ្នកធ្វើស្របតាម [[{{MediaWiki:Policy-url}}|គោលការណ៍]]។',
-'actioncomplete' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\9aá\9e½á\9e\85á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\9fá\9f\92á\9e\90á\9e¶á\9e\96á\9e\9a',
-'actionfailed' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\94á\9e\9aá\9e¶á\9e\87á\9f\90á\9e\99',
+'actioncomplete' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85',
+'actionfailed' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85',
 'deletedtext' => '"$1"ត្រូវបានលុបចោលរួចហើយ។
 
 សូមមើល$2សំរាប់បញ្ជីនៃការលុបចោលនាពេលថ្មីៗ។',
@@ -2843,7 +2851,7 @@ $1',
 'tooltip-pt-mytalk' => 'ទំព័រពិភាក្សា​របស់អ្នក​',
 'tooltip-pt-anontalk' => 'ការពិភាក្សាអំពីកំណែប្រែដែល​ធ្វើ​ឡើង​ចេញ​ពីអាសយដ្ឋាន IP នេះ',
 'tooltip-pt-preferences' => 'ចំណង់ចំណូលចិត្ត',
-'tooltip-pt-watchlist' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸â\80\8bá\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\86á\9e\96á\9e»á\9e\84â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e½á\9e\8fá\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99â\80\8bá\9e\9aá\9e\80â\80\8bá\9e\94á\9f\86លាស់ប្ដូរ',
+'tooltip-pt-watchlist' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸â\80\8bá\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\86á\9e\96á\9e»á\9e\84â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e½á\9e\8fá\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99â\80\8bá\9e\9aá\9e\80â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
 'tooltip-pt-mycontris' => 'បញ្ជី​នៃ​ការរួមចំណែក​របស់​អ្នក',
 'tooltip-pt-login' => 'អ្នកត្រូវបានលើកទឹកចិត្តឱ្យកត់ឈ្មោះចូល។ ប៉ុន្តែនេះមិនមែនជាការបង្ខំទេ។',
 'tooltip-pt-anonlogin' => 'អ្នកត្រូវបានលើកទឹកចិត្តឱ្យកត់ឈ្មោះចូល មិនមែនជាការបង្ខំទេ។',
@@ -2851,7 +2859,7 @@ $1',
 'tooltip-ca-talk' => 'ការពិភាក្សា​អំពីទំព័រខ្លឹមសារ​នេះ',
 'tooltip-ca-edit' => "អ្នកអាច​កែប្រែ​ទំព័រ​នេះ ។ សូមប្រើប្រាស់​ប៊ូតុង 'បង្ហាញការមើលមុន' មុននឹង​រក្សាទុក​វា  ។",
 'tooltip-ca-addsection' => 'ចាប់​ផ្ដើមផ្នែកថ្មីមួយក្នុងទំព័រពិភាក្សានេះ',
-'tooltip-ca-viewsource' => 'ទំព័រ​នេះ​បានត្រូវការពារ ។ អ្នកអាច​មើល​អក្សរកូដ​របស់វា ។',
+'tooltip-ca-viewsource' => 'ទំព័រ​នេះ​បានត្រូវការពារ ។ អ្នកអាច​មើល​អក្សរកូដ​របស់វាបាន ។',
 'tooltip-ca-history' => 'កំណែកន្លងមករបស់ទំព័រនេះ ។',
 'tooltip-ca-protect' => 'ការពារ​ទំព័រនេះ',
 'tooltip-ca-unprotect' => 'ផ្លាស់ប្ដូរការការពារទំព័រនេះ',
@@ -2866,7 +2874,7 @@ $1',
 'tooltip-p-logo' => 'ទំព័រដើម',
 'tooltip-n-mainpage' => 'ចូលមើលទំព័រដើម',
 'tooltip-n-mainpage-description' => 'ចូលមើលទំព័រដើម',
-'tooltip-n-portal' => 'អំពីគម្រោង វិធីប្រើប្រាស់ និង ការស្វែងរកព័ត៌មាន',
+'tooltip-n-portal' => 'អំពីគម្រោង វិធីប្រើប្រាស់ និងការស្វែងរកព័ត៌មាន',
 'tooltip-n-currentevents' => 'រកមើលព័ត៌មានទាក់ទិននឹងព្រឹត្តិការណ៍បច្ចុប្បន្ន',
 'tooltip-n-recentchanges' => 'បញ្ជី​នៃ​បន្លាស់ប្ដូរថ្មីៗ​នៅក្នុងវិគីនេះ',
 'tooltip-n-randompage' => 'ផ្ទុក​ទំព័រចៃដន្យ​មួយទំព័រ',
@@ -2892,18 +2900,18 @@ $1',
 'tooltip-ca-nstab-help' => 'មើលទំព័រជំនួយ',
 'tooltip-ca-nstab-category' => 'មើល​ទំព័រ​ចំណាត់ថ្នាក់ក្រុម',
 'tooltip-minoredit' => "ចំណាំ​កំណែប្រែនេះ​ថាជា 'កំណែប្រែ​តិចតួច'",
-'tooltip-save' => 'á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\94á\9f\86លាស់ប្ដូររបស់អ្នកទុក',
-'tooltip-preview' => 'មើលមុន​បំលាស់ប្ដូរ​របស់អ្នក។ សូមប្រើប្រាស់​វា​មុននឹង​រក្សាទុក!',
-'tooltip-diff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bâ\80\8bá\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91á\9f\94',
+'tooltip-save' => 'á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\94á\9e\93á\9f\92លាស់ប្ដូររបស់អ្នកទុក',
+'tooltip-preview' => 'មើល​បន្លាស់ប្ដូរ​របស់អ្នកជាមុន។ សូមប្រើប្រាស់​វា​មុននឹង​រក្សាទុក!',
+'tooltip-diff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bâ\80\8bá\9e\9bá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91',
 'tooltip-compareselectedversions' => 'មើលភាពខុសគ្នា​រវាងកំណែ​ទាំង២របស់ទំព័រ​នេះ។',
 'tooltip-watch' => 'បន្ថែម​ទំព័រនេះ​ទៅ​បញ្ជីតាមដាន​របស់អ្នក',
 'tooltip-recreate' => 'បង្កើតទំព័រនេះឡើងវិញ ទោះបីជាវាបានត្រូវលុបចេញក៏ដោយ',
 'tooltip-upload' => 'ចាប់ផ្តើមផ្ទុកឡើងឯកសារ',
 'tooltip-rollback' => '"ត្រឡប់​"កំណែ​ប្រែ​ធ្វើឡើងដោយអ្នក​រួម​ចំណែក​ចុង​ក្រោយ​គេ ទៅកំណែប្រែមុននោះវិញ​ ដោយគ្រាន់​តែ​ចុច​មួយ​ច្នុចប៉ុណ្ណោះ​',
 'tooltip-undo' => '"មិន​ធ្វើ​វិញ"​ ត្រឡប់​កំណែ​នេះឡើង​វិញ​ និង​បើក​បែប​បទ​កែប្រែ​ក្នុង​ទម្រង់​មើល​ជាមុន​។
\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\98á\9e¼á\9e\9bâ\80\8bá\9e á\9f\81á\9e\8fá\9e»â\80\8bá\9e\93á\9f\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8aá\9e¸â\80\8bá\9e\9fá\9e\84á\9f\92á\9e\81á\9f\81á\9e\94​បាន។',
\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\98á\9e¼á\9e\9bâ\80\8bá\9e á\9f\81á\9e\8fá\9e»â\80\8bá\9e\93á\9f\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\85á\9f\86á\9e\8eá\9e¶á\9e\9aá\9e\96á\9e\93á\9f\92á\9e\99á\9e\9bá\9f\8b​បាន។',
 'tooltip-preferences-save' => 'រក្សាទុកចំណង់ចំណូលចិត្ត',
-'tooltip-summary' => 'á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bចំណារពន្យល់ថ្មីមួយ',
+'tooltip-summary' => 'á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aចំណារពន្យល់ថ្មីមួយ',
 
 # Stylesheets
 'common.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
@@ -3023,7 +3031,7 @@ $1',
 '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' => 'គ្មានភាពម៉ត់ ដែលខ្ពស់ជាង។',
+'file-nohires' => 'គ្មានភាពម៉ត់ខ្ពស់ជាងនេះទេ។',
 'svg-long-desc' => 'ឯកសារប្រភេទSVG  $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3',
 'svg-long-desc-animated' => 'ឯកសារជីវចល SVG, ជាធម្មតា $1 × $2 ភិចសែល, ទំហំឯកសារ: $3',
 'show-big-image' => 'រូបភាពពេញ',
@@ -3348,7 +3356,7 @@ $1',
 'monthsall' => 'ទាំងអស់',
 'limitall' => 'ទាំងអស់​',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'បញ្ជាក់ទទួលស្គាល់អាសយដ្ឋានអ៊ីមែល',
 'confirmemail_noemail' => 'អ្នកមិនមានអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ ដាក់នៅក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នកទេ។',
 'confirmemail_text' => '{{SITENAME}}តំរូវអោយអ្នកបញ្ជាក់សុពលភាពរបស់អាសយដ្ឋានអ៊ីមែលរបស់អ្នកមុននឹងអ្នកមានសិទ្ធប្រើមុខងារអ៊ីមែល។
@@ -3510,7 +3518,7 @@ $5
 'watchlistedit-raw-removed' => '{{PLURAL:$1|១ចំណងជើងបានត្រូវ|$1ចំណងជើងបានត្រូវ}}ដកចេញ៖',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'á\9e\98á\9e¾á\9e\9bá\9e\94á\9f\86លាស់ប្ដូរពាក់ព័ន្ធ',
+'watchlisttools-view' => 'á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរពាក់ព័ន្ធ',
 'watchlisttools-edit' => 'មើលនិងកែប្រែបញ្ជីតាមដាន',
 'watchlisttools-raw' => 'កែប្រែបញ្ជីតាមដានឆៅ',
 
index 8470efd..9de6252 100644 (file)
@@ -624,8 +624,8 @@ $1',
 'toc' => '목차',
 'showtoc' => '보이기',
 'hidetoc' => '숨기기',
-'collapsible-collapse' => 'ì\88¨ê¸°기',
-'collapsible-expand' => '보이기',
+'collapsible-collapse' => 'ì \91기',
+'collapsible-expand' => '펼치기',
 'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
 'viewdeleted' => '$1을 보겠습니까?',
 'restorelink' => '삭제된 편집 $1개',
@@ -860,7 +860,7 @@ $2',
 'loginlanguagelabel' => '언어: $1',
 'suspicious-userlogout' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
 'user-mail-no-addy' => '받는이의 이메일 주소가 없으면 이메일을 보낼 수 없습니다.',
 'user-mail-no-body' => '비어 있거나 지나치게 짧은 본문으로 이메일을 보내려고 했습니다.',
@@ -1559,7 +1559,7 @@ HTML 태그를 확인하세요.',
 'prefs-displaywatchlist' => '보이기 설정',
 'prefs-diffs' => '차이',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => '이메일 주소가 유효한 것으로 보입니다.',
 'email-address-validity-invalid' => '유효한 이메일 주소를 입력해주세요.',
 
@@ -2167,6 +2167,12 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 그 링크는 다른 적절한 문서로 연결할 필요가 있습니다.<br />
 [[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
 
+'pageswithprop' => '문서 속성으로 된 문서',
+'pageswithprop-legend' => '문서 속성으로 된 문서',
+'pageswithprop-text' => '이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.',
+'pageswithprop-prop' => '속성 이름:',
+'pageswithprop-submit' => '가기',
+
 'doubleredirects' => '이중 넘겨주기 목록',
 'doubleredirectstext' => '이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.
 매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 "실제" 문서인 두 번째 넘겨주기의 대상이 있습니다.
@@ -2360,7 +2366,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listgrouprights-addgroup-self-all' => '자신에게 모든 권한을 부여',
 'listgrouprights-removegroup-self-all' => '자신의 계정에서 모든 권한을 해제',
 
-# E-mail user
+# Email user
 'mailnologin' => '보낼 이메일 주소가 없음',
 'mailnologintext' => '다른 사용자에게 이메일을 보내려면 [[Special:UserLogin|로그인]]한 다음 [[Special:Preferences|사용자 환경 설정]]에서 자신의 이메일 주소를 저장해야 합니다.',
 'emailuser' => '이메일 보내기',
@@ -3796,7 +3802,7 @@ Variants for Chinese language
 'monthsall' => '모든 달',
 'limitall' => '모두',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => '이메일 주소 확인',
 'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]에 이메일을 설정하지 않았습니다.',
 'confirmemail_text' => '{{SITENAME}}에서는 이메일 기능을 사용하기 전에 이메일 인증을 받아야 합니다.
@@ -4178,7 +4184,7 @@ $5
 'api-error-invalid-file-key' => '내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.',
 'api-error-missingparam' => '내부 오류: 요청 중 매개변수가 누락되었습니다.',
 'api-error-missingresult' => '내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.',
-'api-error-mustbeloggedin' => '파일을 올리기 위해서는 로그인해야 합니다.',
+'api-error-mustbeloggedin' => '파일을 올리려면 로그인해야 합니다.',
 'api-error-mustbeposted' => '내부 오류: HTTP POST에 요청이 필요합니다.',
 'api-error-noimageinfo' => '파일 올리기는 성공했지만 서버가 파일에 대해 어떠한 정보도 주지 않았습니다.',
 'api-error-nomodule' => '내부 오류: 올리기 모듈이 설정되지 않았습니다.',
@@ -4206,4 +4212,7 @@ $5
 'duration-centuries' => '$1{{PLURAL:$1|세기}}',
 'duration-millennia' => '$1{{PLURAL:$1|천년}}',
 
+# Image rotation
+'rotate-comment' => '그림을 시계 방향으로 $1{{PLURAL:$1|도}}로 회전함',
+
 );
index bc23d07..574c201 100644 (file)
@@ -563,7 +563,7 @@ $2',
 'loginlanguagelabel' => 'Тил: $1',
 'suspicious-userlogout' => 'Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
 'user-mail-no-addy' => 'Бир e-mail адрес болмагъанлай e-mail иерге кюрешди',
 
@@ -1219,7 +1219,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'prefs-displaywatchlist' => 'Кёрюнюуню джарашдырыулары',
 'prefs-diffs' => 'Версияланы башхалыкълары',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail адрес тюзге ушайды',
 'email-address-validity-invalid' => 'Тюз e-mail адрес джазыгъыз!',
 
@@ -1944,7 +1944,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listgrouprights-addgroup-self-all' => 'Бютеу къауумланы кесини тергеу джазыууна къошаллыкъды',
 'listgrouprights-removegroup-self-all' => 'Кесини тергеу джазыуундан бютеу къауумланы къораталлыкъды',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Джиберирге адрес джокъду',
 'mailnologintext' => 'Башха къошулуучулагъа эл. почта джиберелир ючюн [[Special:UserLogin|системагъа кирирге]] керексиз эм [[Special:Preferences|джарашдырыуланы]] бетинде джараулу эл. почта адрес болургъа керекди.',
 'emailuser' => 'Къошулуучугъа письмо',
@@ -2734,6 +2734,7 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'markedaspatrollederror' => 'Сыналмаганды',
 'markedaspatrollederrortext' => 'Сыналгъан кибик белгилер ючюн версия белгилерге керексиз.',
 'markedaspatrollederror-noautopatrol' => 'Кесигизни тюрлендириулеригизни, сыналгъан кибик белгилерге эркинлигигиз джокъду.',
+'markedaspatrollednotify' => '«$1» бетдеги бу тюрлениу тинтиб къаралгъанча белгиленди.',
 
 # Patrol log
 'patrol-log-page' => 'Патруль этиуню журналы',
@@ -3207,7 +3208,7 @@ $1',
 'monthsall' => 'бютеу',
 'limitall' => 'бютеую',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Электорн адресни мюкюл эт',
 'confirmemail_noemail' => '[[Special:Preferences|джарашдырыулада]] тамамланнган, джараулу электрон адресигиз джокоъду.',
 'confirmemail_text' => 'Викини электрон почтасыны адреси бла хайырланыб башлауну аллы бла, аны мюкюл этериге керекди.
index 00fc62b..1b1a99d 100644 (file)
@@ -524,7 +524,7 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
 'usernamehasherror' => 'Divê karakterên xerab ji bo navê bikarhêner neyên bikaranîn',
 'loginlanguagelabel' => 'Ziman: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => 'Hewl da e-nameyekê bê navnîşana e-nameyê bişîne',
 
 # Change password dialog
@@ -566,7 +566,7 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 'bold_tip' => 'Nivîsa stûr',
 'italic_sample' => 'Nivîsa xwehr (îtalîk)',
 'italic_tip' => 'Nivîsa xwehr (îtalîk)',
-'link_sample' => 'Navê lînkê',
+'link_sample' => 'Sernavê girêdanê',
 'link_tip' => 'Girêdana navxweyî',
 'extlink_sample' => 'http://www.example.com navê lînkê',
 'extlink_tip' => 'Girêdana derve (http:// di destpêkê de ji bîr neke)',
@@ -945,7 +945,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'prefs-displaywatchlist' => 'Vebijarkan nîşan bide',
 'prefs-diffs' => 'Cudahî',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-name derbasdar e',
 'email-address-validity-invalid' => 'E-nameyeke derbasdar binivîse',
 
@@ -1366,7 +1366,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'listgrouprights-addgroup-all' => 'Hemû koman tevlî bike',
 'listgrouprights-removegroup-all' => 'Hemû koman jê bibe',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Navnîşanê neşîne',
 'mailnologintext' => 'Te gireke xwe [[Special:UserLogin|qeydbikê]] û adrêsa e-nameyan di [[Special:Preferences|tercihên xwe]] da nivîsandibe ji bo şandina e-nameyan ji bikarhênerên din ra.',
 'emailuser' => 'Ji bikarhêner re e-name bişîne',
@@ -1600,7 +1600,7 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'whatlinkshere-links' => '← girêdan',
 'whatlinkshere-hideredirs' => 'Beralîkirinan $1',
 'whatlinkshere-hidetrans' => 'Naverokan $1',
-'whatlinkshere-hidelinks' => 'Lînkan $1',
+'whatlinkshere-hidelinks' => 'Girêdanan $1',
 'whatlinkshere-hideimages' => '$1 lînkên wêneyan',
 'whatlinkshere-filters' => 'Parzûn',
 
@@ -2011,7 +2011,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'monthsall' => 'hemû',
 'limitall' => 'hemû',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Adrêsa e-nameyan nasbike',
 'confirmemail_noemail' => 'Te e-mail-adressê xwe di [[Special:Preferences|tercihên xwe da]] nenivîsandiye.',
 'confirmemail_success' => 'E-Mail adrêsa te hate naskirin. Tu niha dikarî xwe qeydbikê û kêfkê.',
index e7a1a67..578a019 100644 (file)
@@ -1437,7 +1437,7 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
 'listgrouprights-addgroup-self-all' => 'Addere omnes greges ad rationem propriam',
 'listgrouprights-removegroup-self-all' => 'Removere omnes greges ex ratione propria',
 
-# E-mail user
+# Email user
 'emailuser' => 'Litteras electronicas usori mittere',
 'emailpage' => 'Mittere litteras electronicas huic usori',
 'emailpagetext' => 'Forma subter nuntium ad usorem mittet.
@@ -2227,7 +2227,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'namespacesall' => 'omnia',
 'monthsall' => 'omnes',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Inscriptionem electronicam adfirmare',
 'confirmemail_noemail' => 'Non est tibi inscriptio electronica valida in [[Special:Preferences|tuis praeferentiis]] posita.',
 'confirmemail_text' => '{{SITENAME}} te postulat inscriptionem tuam electronicam adfirmare priusquam proprietatibus litterarum electronicarum fruaris. Imprime botonem subter ut nuntium adfirmationis tibi mittatur. Nuntio nexus inerit quod est scribendus in tuo navigatro interretiali ut validum adfirmes tuam inscriptionem electronicam.',
index e1080cf..e5ddc84 100644 (file)
@@ -254,49 +254,49 @@ $messages = array(
 'fri' => 'Vie',
 'sat' => 'Shab',
 'january' => 'Enero',
-'february' => 'Fevrero',
+'february' => 'Hevrero',
 'march' => 'Março',
-'april' => 'Abril',
+'april' => 'Avril',
 'may_long' => 'Mayo',
-'june' => 'Junio',
+'june' => 'Juño',
 'july' => 'Jullo',
 'august' => 'Agosto',
-'september' => 'Setembre',
-'october' => 'Ochůvre',
-'november' => 'Novembre',
-'december' => 'Diziembre',
+'september' => 'Setiembre',
+'october' => 'Ochòvre',
+'november' => 'Noviembre',
+'december' => 'Deziembre',
 'january-gen' => 'Enero',
-'february-gen' => 'Fevrero',
+'february-gen' => 'Hevrero',
 'march-gen' => 'Março',
-'april-gen' => 'Abril',
+'april-gen' => 'Avril',
 'may-gen' => 'Mayo',
-'june-gen' => 'Junio',
+'june-gen' => 'Juño',
 'july-gen' => 'Jullo',
 'august-gen' => 'Agosto',
-'september-gen' => 'Setembre',
-'october-gen' => 'Ochůvre',
-'november-gen' => 'Novembre',
-'december-gen' => 'Diziembre',
+'september-gen' => 'Setiembre',
+'october-gen' => 'Ochòvre',
+'november-gen' => 'Noviembre',
+'december-gen' => 'Deziembre',
 'jan' => 'Ene',
-'feb' => 'Fev',
+'feb' => 'Hev',
 'mar' => 'Mar',
-'apr' => 'Abr',
+'apr' => 'Avr',
 'may' => 'May',
-'jun' => 'Jun',
+'jun' => 'Juñ',
 'jul' => 'Jull',
 'aug' => 'Ago',
 'sep' => 'Set',
 'oct' => 'Och',
 'nov' => 'Nov',
-'dec' => 'Diz',
+'dec' => 'Dez',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Katēggoría|Katēggorías}}',
-'category_header' => 'Artícůlos en la katēggoría "$1"',
-'subcategories' => 'Sůkatēggorías',
-'category-media-header' => 'Arxivos de multimedya en la katēggoría "$1"',
+'pagecategories' => '{{PLURAL:$1|Kateggoría|Kateggorías}}',
+'category_header' => 'Artíkolos en la kateggoría "$1"',
+'subcategories' => 'Sòkateggorías',
+'category-media-header' => 'Arxivos de multimedya en la kateggoría "$1"',
 'category-empty' => "''Esta katēggoría oy día, no contiene ni artícůlos ni arxivos de multimedya''",
-'hidden-categories' => '{{PLURAL:$1|Katēggoría escondida|Katēggorías escondidas}}',
+'hidden-categories' => '{{PLURAL:$1|Kateggoría escondida|Kateggorías escondidas}}',
 'hidden-category-category' => 'Katēggorías escondidas',
 'category-subcat-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo una baxo-katēggoría:|Esta katēggoría contiene {{PLURAL:$1|esta baxo-katēggoría aquí abaxo|$1 baxo-katēggorías aquí abaxo}}, de un total de $2 baxo-katēggorías:}}',
 'category-subcat-count-limited' => 'Esta katēggoría contiene {{PLURAL:$1|la baxo-katēggoría venidera|$1 baxo-katēggorías venideras}}.',
@@ -315,7 +315,7 @@ $messages = array(
 'cancel' => 'Anular',
 'moredotdotdot' => 'Más...',
 'mypage' => 'Mi hoja',
-'mytalk' => 'La mi diskusyon',
+'mytalk' => 'Mi diskusyon',
 'anontalk' => 'Diskusyón para este adresso de IP',
 'navigation' => 'Navigación',
 'and' => '&#32;y',
@@ -338,14 +338,14 @@ $messages = array(
 'vector-action-undelete' => 'Traer atrás',
 'vector-action-unprotect' => 'No guardar',
 'vector-simplesearch-preference' => 'Aktivar consejos de búsqueda adelantada (sólo pelejo Vector)',
-'vector-view-create' => 'Crîar',
+'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Trocar',
-'vector-view-history' => 'Ver la storia',
+'vector-view-history' => 'Ver la istoria',
 'vector-view-view' => 'Meldar',
 'vector-view-viewsource' => 'Ver su manadero',
-'actions' => 'Acciones',
+'actions' => 'Aksiones',
 'namespaces' => 'Espacios de nombres',
-'variants' => 'Varyantes',
+'variants' => 'Formas diferentes',
 
 'errorpagetitle' => 'Yerro',
 'returnto' => 'Tornar a $1.',
@@ -356,14 +356,14 @@ $messages = array(
 'go' => 'Vate',
 'searcharticle' => 'Vate',
 'history' => 'La îstoria de la hoja',
-'history_short' => 'Îstoria',
+'history_short' => 'Istoria',
 'updatedmarker' => 'trocado desde mi visita de alcavo',
-'printableversion' => 'Versión apropiada para imprimir',
+'printableversion' => 'Forma apropiada para imprimir',
 'permalink' => 'Atamiento permanente',
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Trocar',
-'create' => 'Crîar',
+'create' => 'Criar',
 'editthispage' => 'Trocar esta hoja',
 'create-this-page' => 'Crîar esta hoja',
 'delete' => 'Efaçar',
@@ -379,12 +379,12 @@ $messages = array(
 'talkpage' => 'Diskutir la hoja',
 'talkpagelinktext' => 'Messaje',
 'specialpage' => 'Hoja Especial',
-'personaltools' => 'Aparatos personales',
+'personaltools' => 'Aparates personales',
 'postcomment' => 'Capítůlo muevo',
 'articlepage' => 'Ver el artícůlo de contenido',
 'talk' => 'Diskusyón',
 'views' => 'Vistas',
-'toolbox' => 'Cuadro de Aparatos',
+'toolbox' => 'Cuadro de aparates',
 'userpage' => 'Ver la hoja del usador',
 'projectpage' => 'Ver la hoja del projeto',
 'imagepage' => 'Ver la hoja de la dosya',
@@ -393,14 +393,14 @@ $messages = array(
 'viewhelppage' => 'Ver la hoja de ayudo',
 'categorypage' => 'Ver la hoja de la katēggoría',
 'viewtalkpage' => 'Ver la diskusyón',
-'otherlanguages' => 'En otras lînguas',
+'otherlanguages' => 'En otras linguas',
 'redirectedfrom' => '(Redirigido desde $1)',
 'redirectpagesub' => 'Hoja redirigida',
-'lastmodifiedat' => 'Esta hoja fue trocada por la última vez el $1, a las $2.',
+'lastmodifiedat' => 'Esta hoja fue trocada por la dal cavo vez el $1, a las $2.',
 'protectedpage' => 'Hoja guardada',
-'jumpto' => 'Salta á:',
+'jumpto' => 'Salta a:',
 'jumptonavigation' => 'navigación',
-'jumptosearch' => 'búsqueda',
+'jumptosearch' => 'búsquida',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Encima de la {{SITENAME}}',
@@ -410,22 +410,22 @@ $messages = array(
 'currentevents' => 'Novedades',
 'currentevents-url' => 'Project:Novedades',
 'disclaimers' => 'Refuso de responsabilitá',
-'disclaimerpage' => 'Project:Rēfuso de responsabilitá jeneral',
+'disclaimerpage' => 'Project:Refuso de responsabilitá jeneral',
 'edithelp' => '¿Cómo se la troca?',
 'edithelppage' => 'Help:Una hoja, ¿cómodo se la troca?',
 'helppage' => 'Help:Contènidos',
 'mainpage' => 'La Primera Hoja',
 'mainpage-description' => 'La Primera Hoja',
 'policy-url' => 'Project:Politikas',
-'portal' => 'Puertal de la komunitá',
-'portal-url' => 'Project:Puertal de la komunitá',
-'privacy' => 'Principio de particůlaridad',
-'privacypage' => 'Project:Principio de particůlaridad',
+'portal' => 'Portal de la komunitá',
+'portal-url' => 'Project:Portal de la komunitá',
+'privacy' => 'Principio de particòlaridad',
+'privacypage' => 'Project:Principio de particòlaridad',
 
 'badaccess' => 'Yerro de permissión',
 
 'ok' => 'DE ACORDDO',
-'retrievedfrom' => 'Tomado del addresso "$1"',
+'retrievedfrom' => 'Acòjido del adhresso "$1"',
 'youhavenewmessages' => 'Tienes $1 ($2).',
 'newmessageslink' => 'mesajes nuevos',
 'newmessagesdifflink' => 'el trocamiento de alcabo',
@@ -435,14 +435,14 @@ $messages = array(
 'viewsourceold' => 'Ver su manadero',
 'editlink' => 'trocar',
 'viewsourcelink' => 'ver su manadero',
-'editsectionhint' => 'Troca el capítůlo: $1',
+'editsectionhint' => 'Troca el kapítolo: $1',
 'toc' => 'Contènidos',
 'showtoc' => 'Amostrar',
 'hidetoc' => 'esconder',
 'thisisdeleted' => 'Ver o restorar $1?',
 'viewdeleted' => 'Desea ver $1?',
 'site-rss-feed' => 'Fuente de RSS de $1',
-'site-atom-feed' => 'Fuente de Atom de $1',
+'site-atom-feed' => 'Alimentela de Atom de $1',
 'page-rss-feed' => '"$1" Fuente RSS',
 'page-atom-feed' => '"$1" Subscripción Atom',
 'red-link-title' => '$1 (esta hoja no egziste)',
@@ -451,13 +451,13 @@ $messages = array(
 'nstab-main' => 'Hoja',
 'nstab-user' => 'Hoja de empleador',
 'nstab-media' => 'Hoja de Meddia',
-'nstab-special' => 'Hoja special',
+'nstab-special' => 'Hoja especial',
 'nstab-project' => 'Hoja del proyecto',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Messaj',
 'nstab-template' => 'Xablón',
 'nstab-help' => 'Ayudo',
-'nstab-category' => 'Katēggoría',
+'nstab-category' => 'Kateggoría',
 
 # Main script and global functions
 'nosuchspecialpage' => 'No ay tala hoja especial',
@@ -465,12 +465,12 @@ $messages = array(
 # General errors
 'error' => 'Yerro',
 'databaseerror' => 'Yerro de la Databasa',
-'missing-article' => 'La basa de dados no topó el teksto de una hoja llamada "$1" $2.
+'missing-article' => 'La basa de dados no topó el teksto de la hoja llamada "$1" $2.
 
-En lo más muńcho, esto se cavza de un "dif" anakróniko ou de un atamiento á la storia de una hoja que s\'efaçó.
+En lo mas muncho, esto se cavsa de un "dif" anakróniko ou de un atamiento a la istoria de una hoja que se efaçó.
 
 Si esto no es el cavso, puede ser que topates una chincha en el lojikal.
-Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y también ànota la URL.',
+Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y también anota la URL.',
 'missingarticle-rev' => '(nº. de revisión: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
@@ -485,7 +485,7 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 'yourpasswordagain' => 'Entra de muevo la parola',
 'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
 'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Crîar un cuento',
+'nav-login-createaccount' => 'Entrar / Criar un cuento',
 'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
 'userlogin' => 'Entrar / Registrarse',
 'logout' => 'Salir',
@@ -560,12 +560,12 @@ Tu adresso de IP va ser enrejjistrado en la istoria de la hoja.",
 'accmailtitle' => 'La kontrasenya ha sido embiada.',
 'accmailtext' => 'La kontrasenya para "$1" se ha embiado a $2.',
 'newarticle' => '(Nuevo)',
-'newarticletext' => 'Allegates a una hoja que daínda no egziste.
+'newarticletext' => 'Arrivates a una hoja que daínda no egziste.
 Para crear esta hoja, empeça a escribir en la caxa de abaxo. Mira [[{{MediaWiki:Helppage}}|la hoja de ayudo]] para saber más.
 Si venites aquí por yerro, torna a la hoja de antes.',
 'noarticletext' => 'En este momento no ay teksto en esta hoja.
-Puedes [[Special:Search/{{PAGENAME}}|buscar el títůlo de esta hoja]] en otras hojas,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rējistros relatados],
+Puedes [[Special:Search/{{PAGENAME}}|buscar el títolo de esta hoja]] en otras hojas,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relatados],
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
 'noarticletext-nopermission' => 'No ay teksto en esta oja.
 Puedes [[Special:Search/{{PAGENAME}}|bushkar este titolo de oja]] en otras pajinas,
@@ -605,7 +605,7 @@ Este o estos kampos no van ser amostrados",
 'viewpagelogs' => 'Ver los registros de esta hoja',
 'currentrev' => "Enderechamiento d'al cavo",
 'currentrev-asof' => 'Enderechamiento de alcavo á las $1',
-'revisionasof' => 'Enderechamiento á las $1',
+'revisionasof' => 'Enderechamiento a las $1',
 'revision-info' => 'Revision en data $1 por $2',
 'previousrevision' => '← Enderechamiento de antes',
 'nextrevision' => 'Rêvisión venidera →',
@@ -637,9 +637,9 @@ Leyenda: (act) = diferencias con la versión actual,
 'revdelete-radio-set' => 'Sí',
 'revdelete-radio-unset' => 'No',
 'revdelete-log' => 'Razón:',
-'revdel-restore' => 'troca la viźibilitá',
+'revdel-restore' => 'troca la visibilitá',
 'revdel-restore-deleted' => 'enderechamientos efaçados',
-'revdel-restore-visible' => 'enderechamientos viźivles',
+'revdel-restore-visible' => 'enderechamientos visivles',
 'pagehist' => 'La storia de la hoja',
 'revdelete-reasonotherlist' => 'Otra razón',
 
@@ -651,14 +651,14 @@ Leyenda: (act) = diferencias con la versión actual,
 
 # Diffs
 'history-title' => 'Istorya de trokamientos para «$1»',
-'lineno' => 'Shurá $1:',
+'lineno' => 'Liña $1:',
 'compareselectedversions' => 'Comparar versiones escogidas',
-'editundo' => 'deshaze',
+'editundo' => 'des-haze',
 'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
 
 # Search results
-'searchresults' => 'Resultados de la búsqueda',
-'searchresults-title' => 'Resultados de la búsqueda de «$1»',
+'searchresults' => 'Resultados de la búsquida',
+'searchresults-title' => 'Resultados de la búsquida de «$1»',
 'searchresulttext' => 'Para saber más encima de buscar en {{SITENAME}}, mira la [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Buscates \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|todas las hojas que empeçan con "$1"]] {{int:pipe-separator}} [[Special:WhatLinksHere/$1|todas las hojas que dan link a «$1»]])',
 'searchsubtitleinvalid' => "Buscates '''$1'''",
@@ -668,7 +668,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'nextn' => '{{PLURAL:$1|$1}} venideras',
 'prevn-title' => '$1 {{PLURAL:$1|resultado|resultados}} de antes',
 'nextn-title' => '$1 {{PLURAL:$1|resultado|resultados}} venideros',
-'shown-title' => 'Àmostrar $1 {{PLURAL:$1|resultado|resultados}} por hoja',
+'shown-title' => 'Amostrar $1 {{PLURAL:$1|resultado|resultados}} por hoja',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
 'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
@@ -686,8 +686,8 @@ Leyenda: (act) = diferencias con la versión actual,
 'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
 'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 basho-kateggoria|$2 basho-kateggoria}}, {{PLURAL:$3|1 dossia|$3 dossias}})',
 'search-redirect' => '(direksión desde $1)',
-'search-section' => '(capítůlo $1)',
-'search-suggest' => 'Quisites dezir: $1',
+'search-section' => '(kapítolo $1)',
+'search-suggest' => 'Quijites dezir: $1',
 'search-interwiki-caption' => 'Proyectos hermanos',
 'search-interwiki-default' => 'Los resultados de $1:',
 'search-interwiki-more' => '(más)',
@@ -782,7 +782,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'rcshowhidemine' => '$1 mis ediciones',
 'rclinks' => 'Ver los dal cabo $1 trocamientos en los dal cabo $2 días.<br />$3',
 'diff' => 'dif',
-'hist' => 'îst',
+'hist' => 'ist',
 'hide' => 'Esconder',
 'show' => 'Àmostrar',
 'minoreditletter' => 'ch',
@@ -818,7 +818,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 
 # File description page
 'file-anchor-link' => 'Archivo',
-'filehist' => 'La storia del dosya',
+'filehist' => 'La istoria de la dosya',
 'filehist-help' => 'Klika encima de una data/ora para vel el arxivo de esta data.',
 'filehist-revert' => 'aboltar',
 'filehist-current' => 'actual',
@@ -888,11 +888,11 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Special:ListGroupRights
 'listgrouprights-members' => '(ver los miembros de este grupo)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Embia e-mail a este usuario',
 
 # Watchlist
-'watchlist' => 'Mi lista de escogidas',
+'watchlist' => 'Lista de akavidamiento',
 'mywatchlist' => 'La mi lista de akavidamientos',
 'watchlistfor2' => 'Para $1 $2',
 'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
@@ -930,7 +930,7 @@ Mira $2 para un registro de los efassados nuevos.',
 ** Vandalismo',
 
 # Rollback
-'rollbacklink' => 'àbolta',
+'rollbacklink' => 'abolta',
 
 # Protect
 'protectlogpage' => 'Protecciones de las hojas',
@@ -968,7 +968,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 # Contributions
 'contributions' => 'Ajustamientos {{GENDER:$1|del usador|de la usadora}}',
 'contributions-title' => 'Ajustamientos {{GENDER:$1|del usuario|de la usuaria}} $1',
-'mycontris' => 'Mis ajustamientos',
+'mycontris' => 'Mis dados',
 'contribsub2' => '$1 ($2)',
 'uctop' => '(última modificación)',
 'month' => 'Desde el mes (i antes):',
@@ -985,7 +985,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'sp-contributions-submit' => 'Buscar',
 
 # What links here
-'whatlinkshere' => 'Atamientos á esta hoja',
+'whatlinkshere' => 'Atamientos a esta hoja',
 'whatlinkshere-title' => 'Hojas que dan link a "$1"',
 'whatlinkshere-page' => 'Hoja:',
 'linkshere' => "Las hojas venideras dan link a '''[[:$1]]''':",
@@ -1006,10 +1006,10 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'blockip' => 'Bloquear usuario',
 'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite',
 'ipblocklist' => 'Usadores bloqueados',
-'blocklink' => 'blokea',
-'unblocklink' => 'quita el bloqueo',
-'change-blocklink' => 'troca el blokeo',
-'contribslink' => 'Àjustamientos',
+'blocklink' => 'bloka',
+'unblocklink' => 'quita el bloko',
+'change-blocklink' => 'troca el bloko',
+'contribslink' => 'donos',
 'blocklogpage' => 'Bloqueos de usuarios',
 'blocklogentry' => 'bloqueó a [[$1]] $3 durante un tiempo de $2',
 'unblocklogentry' => 'desbloqueó a "$1"',
@@ -1047,7 +1047,7 @@ Si puede ser, escoge otro nombre.',
 'movetalk' => 'Renombrar la hoja de diskussión también, si es possible.',
 'movelogpage' => 'Registro de traslados',
 'movereason' => 'Razón:',
-'revertmove' => 'àbolta',
+'revertmove' => 'abolta',
 
 # Export
 'export' => 'Eksportar las hojas',
@@ -1068,41 +1068,41 @@ Si puede ser, escoge otro nombre.',
 'tooltip-pt-preferences' => 'Mis preferencias',
 'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
 'tooltip-pt-mycontris' => 'La lista de tus àjustamientos',
-'tooltip-pt-login' => "T'encorajamos d'entrar ma no sos obligado",
+'tooltip-pt-login' => 'Te encorajamos de entrar ma no estás obligado',
 'tooltip-pt-logout' => 'Salir',
-'tooltip-ca-talk' => 'Diskusyón encima del artícůlo de contènido',
-'tooltip-ca-edit' => 'Puedes trocar esta hoja. Y si puede ser, usa el botón de previsteo antes de enrejistrar la hoja',
+'tooltip-ca-talk' => 'Diskusyón encima del artíkolo',
+'tooltip-ca-edit' => 'Puedes trocar esta hoja. Te rogamos, antes de enrejistrarla, echa una ojada en kullaneando el botón de previsteo',
 'tooltip-ca-addsection' => 'Empeça una nueva sección',
 'tooltip-ca-viewsource' => 'Esta hoja está guardada.
 Puedes ver su manadero',
-'tooltip-ca-history' => "Enderechamientos passados d'esta hoja",
+'tooltip-ca-history' => 'Enderechamientos passados de esta hoja',
 'tooltip-ca-protect' => 'Guardar esta hoja',
 'tooltip-ca-delete' => 'Efassar esta hoja',
 'tooltip-ca-move' => 'Taxirea (renombra) esta hoja',
-'tooltip-ca-watch' => 'Àjustar esta hoja á tu lista de akavidamientos',
+'tooltip-ca-watch' => 'Ajustar esta hoja a tu lista de akavidamientos',
 'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escogidos',
 'tooltip-search' => 'Busca en {{SITENAME}}',
 'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
 'tooltip-search-fulltext' => 'Busca este teksto en las hojas',
-'tooltip-p-logo' => 'Visita la primera hoja',
-'tooltip-n-mainpage' => 'Visita la primera hoja',
-'tooltip-n-mainpage-description' => 'Visita la primera hoja',
+'tooltip-p-logo' => 'Vate a la primera hoja',
+'tooltip-n-mainpage' => 'Vate a la primera hoja',
+'tooltip-n-mainpage-description' => 'Vate a la primera hoja',
 'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ánde topar todo',
-'tooltip-n-currentevents' => 'Información encima de los acontècimientos de oy día',
-'tooltip-n-recentchanges' => 'La lista de los trocamientos freskos en el viki',
-'tooltip-n-randompage' => 'Carga una kualunke hoja asegún viene',
-'tooltip-n-help' => 'El lugar para âmbezarse',
-'tooltip-t-whatlinkshere' => 'Una lista de todas las hojas del viki que tienen atamientos con esta hoja',
-'tooltip-t-recentchangeslinked' => 'Los trocamientos freskos de las hojas que tienen atamiento con esta hoja',
+'tooltip-n-currentevents' => 'Jhaberes y acontècimientos de oy día',
+'tooltip-n-recentchanges' => 'Lista de los trocamientos muevos en el viki',
+'tooltip-n-randompage' => 'Carga una hoja por asardo',
+'tooltip-n-help' => 'Para saver mas',
+'tooltip-t-whatlinkshere' => 'La lista de todas las hojas del viki que se atan con esta hoja',
+'tooltip-t-recentchangeslinked' => 'Los trocamientos muevos en las hojas atadas con esta hoja',
 'tooltip-feed-rss' => 'Sindicación RSS de esta hoja',
 'tooltip-feed-atom' => "Fuente de Atom d'esta hoja",
 'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
 'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
-'tooltip-t-upload' => 'Suve dosyas por aquí',
-'tooltip-t-specialpages' => 'La lista de todas las hojas especiales',
-'tooltip-t-print' => "Versión apropiada para imprimir d'esta hoja",
-'tooltip-t-permalink' => "Atamiento permanente á est'enderechamiento de la hoja",
-'tooltip-ca-nstab-main' => 'Ve el artílo de contènido',
+'tooltip-t-upload' => 'Suve las dosyas por aquí',
+'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
+'tooltip-t-print' => 'Forma apropiada para imprimir esta hoja',
+'tooltip-t-permalink' => 'Atamiento permanente a este enderechamiento de la hoja',
+'tooltip-ca-nstab-main' => 'Ve el artíkolo de contènido',
 'tooltip-ca-nstab-user' => 'Ve la hoja de usuario',
 'tooltip-ca-nstab-special' => 'Esta es una hoja especial, la hoja ya no se puede trocar',
 'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
@@ -1115,8 +1115,8 @@ Puedes ver su manadero',
 'tooltip-diff' => 'Mostra los trocamientos que él/ella hizo en el texhto.',
 'tooltip-compareselectedversions' => 'Ve las diferencias entre las dos versiones escogidas de esta hoja.',
 'tooltip-watch' => 'Ajusta esta hoja a tu lista de escogidas',
-'tooltip-rollback' => '«Àbolta» àbolta todas los trocamientos del usador de alcavo, sólo en klikando una vez.',
-'tooltip-undo' => '«Deshaze» àbolta este trocamiento y la avre en el modo de previsteo. Permete àjustar una razón en el somaryo.',
+'tooltip-rollback' => '«Abolta» abolta todas los trocamientos del usador de alcavo, sólo en klikando una vez.',
+'tooltip-undo' => '«Deshaze» abolta este trocamiento y la avre en el modo de previsteo. Permete ajustar una razón en el somario.',
 'tooltip-summary' => 'Entrar un somaryo kurto',
 
 # Attribution
@@ -1133,11 +1133,11 @@ Puedes ver su manadero',
 'show-big-image' => 'Resolución original',
 
 # Bad image list
-'bad_image_list' => "El formato es ańsina:
+'bad_image_list' => 'El formato es ansina:
 
-Cale akavidar sólo elementos de lista (quere dezir: shurás/satires qu'empeçan con *).
-El primer atamiento de cada shurá deve de ser un atamiento á una dosya negra (á la dosya que se quere blokear).
-Los atamientos venideros que stan en la mesma shurá s'aprecian como eksepsiones, por eńxemplo, hojas ande la dosya se ve en la shurá.",
+Sólo elementos de lista (liñas empeçando con *) se toman en konsidherasyón.
+El primer atamiento de cada liña deve de atarse con una dosya negra (la dosya que se quere blokar).
+Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (yaani hojas ande la dosya puede aparecer encaxada en la liña)',
 
 # Metadata
 'metadata' => 'Metadatos',
@@ -1192,7 +1192,7 @@ Los otros campos se van a guardar por defecto.
 'namespacesall' => 'todos',
 'monthsall' => '(todos)',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Konfirmar direksion e-pósta',
 'confirmemail_send' => 'Embiar el kodigo de konfirmasion.',
 'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
index 9be20ea..3231768 100644 (file)
@@ -575,6 +575,9 @@ $2',
 'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
 'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
+'filereadonlyerror' => 'De Fichier "$1" konnt net geännert ginn well de Repertoire vun de Fichieren "$2" nëmme geliest däerf ginn.
+
+Den Administrateur den d\'Schreiwe gespaart huet, huet dës Erklärung uginn: "$3"',
 'invalidtitle-knownnamespace' => 'Net valabelen Titel mam Nummraum "$2" a mam Text "$3"',
 'invalidtitle-unknownnamespace' => 'Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text "$2"',
 'exception-nologin' => 'Net ageloggt',
@@ -688,7 +691,7 @@ Waart w.e.g. ier Dir et nach eng Kéier versicht.",
 'loginlanguagelabel' => 'Sprooch: $1',
 'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et esou ausgesäit wéi wann se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Fonctioun',
 'user-mail-no-addy' => 'Huet versicht eng Mail ouni Mailadress ze schécken',
 'user-mail-no-body' => 'Et gouf probéiert eng E-Mail ouni Text oder mat engem ze kuerzen Text ze schécken.',
@@ -1351,7 +1354,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'prefs-displaywatchlist' => 'Optioune vun deem wat gewise gëtt',
 'prefs-diffs' => 'Ënnerscheeder',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "D'E-Mailadress schéngt valabel ze sinn",
 'email-address-validity-invalid' => 'Gitt eng valabel e-Mailadress an',
 
@@ -1708,6 +1711,8 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-create' => 'De Fichier $1 konnt net geschriwwe ginn.',
 'backend-fail-maxsize' => 'De Fichier $1 konnt net geschriwwe gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
 'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
+'backend-fail-connect' => 'Keng Verbindung mam Backend vum Späicher "$1".',
+'backend-fail-internal' => 'Onbekannte Feeler am Backend vum Späicher: "$1"',
 
 # Lock manager
 'lockmanager-notlocked' => '"$1" konnt net fräigeschalt ginn; $1 ass net gespaart.',
@@ -1921,6 +1926,11 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
 Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
 
+'pageswithprop' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-legend' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
+'pageswithprop-submit' => 'Lass',
+
 'doubleredirects' => 'Duebel Viruleedungen',
 'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
 An 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.
@@ -2111,7 +2121,7 @@ Et ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] i
 'listgrouprights-addgroup-self-all' => 'däerf all Gruppe bäi säin eegene Benotzerkont derbäisetzen',
 'listgrouprights-removegroup-self-all' => 'Däerf all Gruppe vu sengem eegene Benotzerkont ewechhuelen',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Keng E-Mailadress',
 'mailnologintext' => 'Dir musst [[Special:UserLogin|ugemellt]] sinn an eng gëlteg E-Mail Adress an Äre [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.',
 'emailuser' => 'Dësem Benotzer eng E-Mail schécken',
@@ -3475,7 +3485,7 @@ Déi aner sinn am Standard verstoppt.
 'monthsall' => 'all',
 'limitall' => 'all',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-Mailadress confirméieren',
 'confirmemail_noemail' => 'Dir hutt keng gëlteg E-Mail-Adress an Äre [[Special:Preferences|Benotzerastellungen]] agedro.',
 'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst dir als éischt Är E-Mailadress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir esou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
index c878725..42a8b46 100644 (file)
@@ -11,6 +11,7 @@
  * @author Andrijko Z.
  * @author Aslan4ik
  * @author Cekli829
+ * @author Lezgia
  * @author MF-Warburg
  * @author Migraghvi
  * @author Namik
@@ -314,6 +315,7 @@ $messages = array(
 'actionthrottled' => 'Фадвилин сергьятар',
 
 # Virus scanner
+'virus-scanfailed' => 'Сканди гъалатl (кулег$1)',
 'virus-unknownscanner' => 'Малумтушир антивирус',
 
 # Login and logout pages
@@ -924,7 +926,7 @@ $messages = array(
 'listgrouprights-group' => 'КIеретI',
 'listgrouprights-members' => '(уьзвийрин сиягь)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Уртахдиз чар кхьихь',
 'emailusername' => 'Уртахдин тlвар:',
 'emailusernamesubmit' => 'Ракъурун',
index 9f64387..833d0ff 100644 (file)
@@ -213,13 +213,13 @@ $messages = array(
 'thursday' => '週四',
 'friday' => '週五',
 'saturday' => '週六',
-'sun' => '日',
-'mon' => '一',
-'tue' => '二',
-'wed' => '三',
-'thu' => 'å\91¨å\9b\9b',
-'fri' => '五',
-'sat' => 'å\91¨å\85­',
+'sun' => '日',
+'mon' => '一',
+'tue' => '二',
+'wed' => '三',
+'thu' => '四',
+'fri' => '五',
+'sat' => '六',
 'january' => '一月',
 'february' => '二月',
 'march' => '三月',
@@ -407,7 +407,7 @@ $1',
 
 'ok' => '可',
 'retrievedfrom' => '取自"$1"',
-'youhavenewmessages' => '子有$1($2)',
+'youhavenewmessages' => '有$1書至子書房也。($2)',
 'newmessageslink' => '新訊',
 'newmessagesdifflink' => '變更',
 'youhavenewmessagesfromusers' => '子有 $1 自 {{PLURAL:$3|another user|$3 簿戶也}} ($2)。',
@@ -597,7 +597,7 @@ $2',
 'loginlanguagelabel' => '語:$1',
 'suspicious-userlogout' => '爾欲無離也,可由壞瀏覽器或快枝代理呈送之。',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => '於 PHP mail() 參數現錯',
 
 # Change password dialog
@@ -813,8 +813,8 @@ $2',
 'last' => '前',
 'page_first' => '首',
 'page_last' => '末',
-'histlegend' => "辨ç\95°ï¼\9aæ\93\87äº\8cå­\94å¾\8c,按Enter、或點下鈕以辨之。<br />
-釋義:'''({{int:cur}})'''與今審辨;'''({{int:last}})'''與前審辨;'''{{int:minoreditletter}}''',校文",
+'histlegend' => "辨ç\95°ï¼\9aæ\97¢æ\93\87äº\8cå­\94,按Enter、或點下鈕以辨之。<br />
+釋義:'''({{int:cur}})'''與今審辨;'''({{int:last}})'''與前審辨;'''{{int:minoreditletter}}''',令校",
 'history-fieldset-title' => '誌覽',
 'history-show-deleted' => '只刪',
 'histfirst' => '初',
@@ -1129,7 +1129,7 @@ $1",
 'prefs-displaywatchlist' => '示項',
 'prefs-diffs' => '異',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => '電郵有效之',
 'email-address-validity-invalid' => '貢一效之電郵',
 
@@ -1293,7 +1293,7 @@ $1",
 'recentchanges-label-newpage' => '此纂開新頁',
 'recentchanges-label-minor' => '此乃細纂',
 'recentchanges-label-bot' => '此乃機纂',
-'recentchanges-label-unpatrolled' => 'æ­¤ä¹\83æ\9cªå·¡ä¹\8bçº\82',
+'recentchanges-label-unpatrolled' => 'æ\98¯çº\82æ\9cªå·¡',
 'rcnote' => "下為自$4$5起,'''$2'''日內'''$1'''近易也。",
 'rcnotefrom' => "下為自'''$2'''至'''$1'''之易也。",
 'rclistfrom' => '自$1起之易也',
@@ -1600,6 +1600,7 @@ $1',
 'statistics-mostpopular' => '燴炙',
 
 'disambiguations' => '釋義',
+'disambiguationspage' => 'Template:弭誤解',
 'disambiguations-text' => '頁下引[[MediaWiki:Disambiguationspage]]模,求釋義,宜正題之。',
 
 'doubleredirects' => '窮渡',
@@ -1768,7 +1769,7 @@ $1',
 'listgrouprights-addgroup-self-all' => '加自之全組',
 'listgrouprights-removegroup-self-all' => '除自之全組',
 
-# E-mail user
+# Email user
 'mailnologin' => '無驛',
 'mailnologintext' => '[[Special:UserLogin|登簿]]置郵,方可捎書。',
 'emailuser' => '捎君',
@@ -1871,7 +1872,7 @@ $NEWPAGE
 'historywarning' => '警示,此頁約有誌$1:',
 'confirmdeletetext' => '欲刪此物與誌,知後果、合[[{{MediaWiki:Policy-url}}]]後再為之。',
 'actioncomplete' => '成矣',
-'actionfailed' => 'æ\95\97ç\9f£',
+'actionfailed' => 'æ\9cªç«\9f',
 'deletedtext' => '"$1"刪矣,見誌刪於$2。',
 'dellogpage' => '誌刪',
 'dellogpagetext' => '近刪如下:',
@@ -2594,7 +2595,7 @@ $1',
 'monthsall' => '全',
 'limitall' => '全',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => '核郵驛',
 'confirmemail_noemail' => '[[Special:Preferences|簿註]]有驛。',
 'confirmemail_send' => '遣核符',
index fd1d848..f43f755 100644 (file)
@@ -717,7 +717,7 @@ Andraso kely ary andramo indray.",
 'loginlanguagelabel' => 'fiteny : $1',
 'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
 'user-mail-no-addy' => 'Nanandrana nandefa imailaka tsy misy adiresy imailaka.',
 
@@ -1370,7 +1370,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'prefs-displaywatchlist' => 'Safidin-tseho',
 'prefs-diffs' => 'Diff',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adiresy imailaka mameno fepetra',
 'email-address-validity-invalid' => 'Ilaina ny mametraka adiresy imailaka mameno fepetra',
 
@@ -2100,7 +2100,7 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 'listgrouprights-addgroup-self-all' => "Manampy ny vondrom-pikambana rehetra amin'ny kaontiny",
 'listgrouprights-removegroup-self-all' => "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
 
-# E-mail user
+# Email user
 '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',
@@ -3090,7 +3090,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'monthsall' => 'rehetra',
 'limitall' => 'rehetra',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Fanamarinana adiresy imailaka.',
 'confirmemail_noemail' => "Tsy nilaza adiresy imailaka azo ampiasaina ianao tao amin'ny [[Special:Preferences|safidinao]].",
 'confirmemail_text' => "
index 29a9ad8..e80541b 100644 (file)
@@ -27,9 +27,9 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Garih bawahi tautan:',
 'tog-justify' => 'Ratokan paragraf',
-'tog-hideminor' => 'Suruakkan suntingan ketek di parubahan tabaru',
-'tog-hidepatrolled' => 'Suruakkan suntingan nan lah dijago di parubahan tabaru',
-'tog-newpageshidepatrolled' => 'Suruakkan laman nan lah dijago dari dafta laman baru',
+'tog-hideminor' => 'Suruakan suntiangan ketek di parubahan tabaru',
+'tog-hidepatrolled' => 'Suruakan suntiangan nan lah dipatroli di parubahan tabaru',
+'tog-newpageshidepatrolled' => 'Suruakkan laman nan lah dipatroli dari dafta laman baru',
 'tog-extendwatchlist' => 'Kambangkan dafta pantau untuak malihek sado parubahan, indak nan baru se',
 'tog-usenewrc' => 'Gunokan tampilan parubahan tingkek lanjuik (paralu JavaScript)',
 'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
@@ -56,15 +56,15 @@ $messages = array(
 'tog-fancysig' => 'Jadikan tando tangan manjadi teks wiki (indak jo tautan otomatis)',
 'tog-externaleditor' => 'Gunokan editor dari lua sacaro bawaan (untuak nan ahli sajo, butuah pangaturan khusus di komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.])',
 'tog-externaldiff' => 'Gunokan diff eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
-'tog-showjumplinks' => 'Aktifkan tautan pambantu "langsuang ka"',
-'tog-uselivepreview' => 'Gunokan pratayang langsuang (JavaScript) (eksperimental)',
-'tog-forceeditsummary' => 'Ingekkan awak bilo kotak ringkasan suntiangan masih kosoang',
-'tog-watchlisthideown' => 'Suruakkan suntiangan surang di dafta pantau',
-'tog-watchlisthidebots' => 'Suruakkan suntiangan bot di dafta pantau',
-'tog-watchlisthideminor' => 'Suruakkan suntiangan ketek di dafta pantau',
-'tog-watchlisthideliu' => 'Suruakkan suntiangan pangguno masuak log di dafta pantau',
-'tog-watchlisthideanons' => 'Suruakkan suntiangan pangguno indak di kana di dafta pantau',
-'tog-watchlisthidepatrolled' => 'Suruakkan suntiangan tapatroli di dafta pantau',
+'tog-showjumplinks' => 'Aktifkan pautan bantuan "langsuang ka"',
+'tog-uselivepreview' => 'Gunoan pratonton langsuang (JavaScript) (eksperimental)',
+'tog-forceeditsummary' => 'Ingekan ambo bilo kotak ikhtisar suntiangan kosong',
+'tog-watchlisthideown' => 'Suruakan suntiangan surang di dafta pantau',
+'tog-watchlisthidebots' => 'Suruakan suntiangan bot di dafta pantau',
+'tog-watchlisthideminor' => 'Suruakan suntiangan ketek di dafta pantau',
+'tog-watchlisthideliu' => 'Suruakan suntiangan pangguno masuak log di dafta pantau',
+'tog-watchlisthideanons' => 'Suruakan suntiangan pangguno indak di kana di dafta pantau',
+'tog-watchlisthidepatrolled' => 'Suruakan suntiangan tapatroli di dafta pantau',
 'tog-ccmeonemails' => 'Kiriman Ambo salinan surel nan dikiriman ka urang lain',
 'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
 'tog-showhiddencats' => 'Tampilan kategori tasambunyi',
@@ -84,7 +84,7 @@ $messages = array(
 # Dates
 'sunday' => 'Akaik',
 'monday' => 'Sinayan',
-'tuesday' => 'Salaso',
+'tuesday' => 'Salasa',
 'wednesday' => "Raba'a",
 'thursday' => 'Kamih',
 'friday' => 'Jumaik',
@@ -179,16 +179,16 @@ $messages = array(
 'vector-action-delete' => 'Hapuih',
 'vector-action-move' => 'Pindahkan',
 'vector-action-protect' => 'Linduangkan',
-'vector-action-undelete' => 'Pambatalan panghapusan',
+'vector-action-undelete' => 'Pambatalan panghapuihan',
 'vector-action-unprotect' => 'Tuka palinduangan',
 'vector-simplesearch-preference' => 'Aktifkan kotak pancarian sadarano (hanyo kulik Vector)',
 'vector-view-create' => 'Buek',
 'vector-view-edit' => 'Suntiang',
-'vector-view-history' => 'Riwayaik lalu',
+'vector-view-history' => 'Riwayaik',
 'vector-view-view' => 'Baco',
 'vector-view-viewsource' => 'Caliak sumber',
 'actions' => 'Tindakan',
-'namespaces' => 'Ruang namo:',
+'namespaces' => 'Ruang namo',
 'variants' => 'Varian:',
 
 'navigation-heading' => 'Menu navigasi',
@@ -202,26 +202,26 @@ $messages = array(
 'searcharticle' => 'Tuju',
 'history' => 'Riwayaik laman',
 'history_short' => 'Riwayaik',
-'updatedmarker' => 'diubah sajak kunjuangan tarakhir ambo',
+'updatedmarker' => 'diubah samanjak kunjuangan tarakhia ambo',
 'printableversion' => 'Versi cetak',
 'permalink' => 'Pautan parmanen',
 'print' => 'Cetak',
-'view' => 'Tampilkan',
+'view' => 'Baco',
 'edit' => 'Suntiang',
 'create' => 'Buek',
 'editthispage' => 'Suntiang laman ko',
 'create-this-page' => 'Buek laman iko',
 'delete' => 'Hapuih',
-'deletethispage' => 'Hapuih laman iko',
-'undelete_short' => 'Batal hapuih $1 {{PLURAL:$1|suntiangan|suntiangan}}',
-'viewdeleted_short' => 'Liek {{PLURAL:$1|ciek suntiangan|$1 suntiangan}} nan dihapuih',
+'deletethispage' => 'Hapuih laman ko',
+'undelete_short' => 'Batal hapuih $1 {{PLURAL:$1|suntiangan}}',
+'viewdeleted_short' => 'Lihek {{PLURAL:$1|$1 suntiangan}} nan dihapuih',
 'protect' => 'Linduangkan',
 'protect_change' => 'ubah',
-'protectthispage' => 'Lindungi laman iko',
+'protectthispage' => 'Linduangi laman ko',
 'unprotect' => 'Tuka palinduangan',
 'unprotectthispage' => 'Tuka palindungan laman ko',
 'newpage' => 'Laman baru',
-'talkpage' => 'Musyawarahkan laman ko',
+'talkpage' => 'Rundiangkan laman ko',
 'talkpagelinktext' => 'maota',
 'specialpage' => 'Laman istimewa',
 'personaltools' => 'Pakakeh pribadi',
@@ -493,30 +493,30 @@ Cubo pariso baliak ejaan Sanak.',
 Jikok urang lain nan malakukan pamintaan iko, atau jikok Sanak alah mangingek kato sandi Sanak dan akan tetap manggunokan kato sandi tasabuik, sila abaikan pasan iko dan tatap gunokan kato sandi lamo Sanak.',
 'noemail' => 'Indak ado alamaik surel nan tacatat untuak pangguno "$1".',
 'noemailcreate' => 'Sanak paralu manyadiokan alamaik surel nan sah',
-'passwordsent' => 'Kato sandi baharu alah dikiriman ka alamaik surel nan didaftakan untuak "$1".
-Sila masuak log baliak sasudah manarimo surel tasabuik.',
+'passwordsent' => 'Kato sandi baru alah dikiriman ka alamaik surel nan didaftakan untuak "$1".
+Silakan masuak log baliak sasudah manarimo surel tasabuik.',
 'blocked-mailpassword' => 'Alamaik IP Sanak diblokir dari panyuntingan dan karanonyo indak diizinan manggunokan fungsi pangingek kato sandi untuak mancegah panyalahgunoan.',
-'eauthentsent' => 'Sabuah surel untuak konfirmasi alah dikirim ka alamaik surel.
-Sanak harus mangikuti instruksi di dalam surel tasabuik untuak malakukan konfirmasi bahawa alamaik tasabuik adolah batua kapunyoan Sanak. {{SITENAME}} indak akan mangaktifan fitur surel jikok langkah iko alun dilakuan.',
+'eauthentsent' => 'Surel untuak konfirmasi alah dikirim ka alamaik surel Sanak.
+Ikuti instruksi dalam surel tasabuik untuak malakuan konfirmasi jikok alamaik tasabuik adolah batua punyo Sanak. {{SITENAME}} indak akan mangaktifan fitur surel jikok langkah ko alun dilakuan.',
 'throttled-mailpassword' => 'Suatu pangingat kato sandi alah dikiriman dalam {{PLURAL:$1|jam|$1 jam}} tarakhir.
 Untuak manghindari panyalahgunoan, hanyo ciek kato sandi nan akan dikiriman satiok {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan dalam mangirimkan surel: $1',
 'acct_creation_throttle_hit' => 'Pangunjung wiki iko jo alamaik IP nan samo jo Sanak alah mambuek {{PLURAL:$1|1 akun|$1 akun}} dalam sahari tarakhir, hinggo jumlah maksimum nan diizinan.
 Karanonyo, pangunjuang jo alamaik IP iko indak dapek baliak mambuek akun lain untuak samantaro.',
 'emailauthenticated' => 'Alamaik surel Sanak lah dikonfirmasi pado $3, $2.',
-'emailnotauthenticated' => 'Alamaik surel Sanak alum dikonfirmasi. Sabalun dikonfirmasi Sanak ndak bisa manggunokan fitur surel.',
-'noemailprefs' => 'Sanak harus mamasukan alamaik surel di preferensi Sanak untuak dapek manggunokan fitur-fitur iko.',
-'emailconfirmlink' => 'Konfirmasikan alamaik surel Sanak',
-'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo karano formatnyo indak sasuai.
-Harap masuakan alamaik surel dalam format nan batua atau kosoangan isian tasabuik.',
-'cannotchangeemail' => 'Alamat e-mail sanak indak bisa diubah di wiki ko.',
-'emaildisabled' => 'Situs iko indak bisa mangirim e-mail.',
+'emailnotauthenticated' => 'Alamaik surel Sanak alun dikonfirmasi. Sabalun dikonfirmasi Sanak indak dapek manggunoan fitur surel.',
+'noemailprefs' => 'Sanak harus mamasukan alamaik surel di pangaturan Sanak untuak dapek manggunoan fitur-fitur ko.',
+'emailconfirmlink' => 'Konfirmasi alamaik surel Sanak',
+'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo dek formatnyo indak sasuai.
+Harap masuakan alamaik surel dalam format nan bana atau kosoangan isian tasabuik.',
+'cannotchangeemail' => 'Alamaik surel Sanak indak bisa diubah di wiki ko.',
+'emaildisabled' => 'Situs web ko indak dapek mangirim surel.',
 'accountcreated' => 'Akun dibuek',
 'accountcreatedtext' => 'Akun pangguno untuak $1 alah dibuek.',
 'createaccount-title' => 'Pambuekan akun untuak {{SITENAME}}',
 'createaccount-text' => 'Sasaurang alah mambuek sabuah akun untuak alamaik surel Sanak di {{SITENAME}} ($4) jo namo "$2" dan kato sandi "$3". Sanak dianjuakan untuak masuak log dan mangganti kato sandi Sanak kini.
 
-Sanak dapek maabaikan pasan iko jikok akun iko dibuek karano suatu kasalahan.',
+Sanak dapek mangacuahkan pasan ko jikok akun ko dibuek dek ado kasalahan.',
 'usernamehasherror' => 'Namo pangguno indak bisa mangandung tando paga',
 'login-throttled' => 'Sanak alah bakali-kali mancoba masuak log.
 Sila manunggu sabalun mancubo baliak.',
@@ -524,14 +524,14 @@ Sila manunggu sabalun mancubo baliak.',
 'loginlanguagelabel' => 'Baso: $1',
 'suspicious-userlogout' => 'Pamintaan Sanak untuak kalua log ditolak karano tampaknyo dikirim oleh panjalajah nan rusak atau proksi panyinggah.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Kasalahan nan indak dikana dalam fungsi mail() PHP',
-'user-mail-no-addy' => 'Mancubo mangirim e-mail tanpa alamat e-mail nan sah.',
+'user-mail-no-addy' => 'Mancubo mangirim surel tanpa alamaik surel nan sah.',
 'user-mail-no-body' => 'Mancubo kirim surel kosong atau pasan talalu pendek',
 
 # Change password dialog
 'resetpass' => 'Tuka kato sandi',
-'resetpass_announce' => 'Sanak alah masauk log jo kode samantaro nan dikirim malalui surel. Untuak malanjuikkan, Sanak harus mamasuakan kato sandi baru di siko:',
+'resetpass_announce' => 'Sanak alah masauk log jo kode samantaro nan dikirim malalui surel. Untuak malanjuikan, Sanak harus mamasuakan kato sandi baru di siko:',
 'resetpass_header' => 'Tuka kato sandi akun',
 'oldpassword' => 'Kato sandi lamo:',
 'newpassword' => 'Kato sandi baharu:',
@@ -549,35 +549,30 @@ Sanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sa
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Langkapi formulir iko untuak manarimo surel pangingek detail akun Sanak.',
+'passwordreset-text' => 'Lengkapi formulir ko untuak manarimo surel pangingek pado detil akun Sanak.',
 'passwordreset-legend' => 'Tuka baliak kato sandi',
 'passwordreset-disabled' => 'Panukaran baliak kato sandi alah dimatian di wiki iko.',
 'passwordreset-pretext' => '{{PLURAL:$1||Masuakan ciek data di bawah iko}}',
 'passwordreset-username' => 'Namo pangguno:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Caliak kaputusannyo?',
-'passwordreset-capture-help' => 'Kalau sanak meancek boks iko, e-mail (jo kato kunci samantaro) akan dicaliakkan ka sanak.',
+'passwordreset-capture-help' => 'Kalau sanak mancentang kotak ko, surel (jo kato sandi samantaro) akan nampak jo Sanak.',
 'passwordreset-email' => 'Alamaik surel:',
 'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek
-detail akun untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} barikuik
-takaik jo alamaik surel iko:
+detil akun untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel iko:
 
 $2
 
-{{PLURAL:$3|Sandi samantaro|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|sahari|$5 hari}}.
-Sanak harus masuak dan mamiliah sandi baharu kini. Jikok urang lain mambuek
-pamintaan iko atau jikok Sanak ingek sandi asali dan indak lai
-ingin maubahnyo, Sanak dapek mabaikan pasan iko dan taruih manggunoan sandi lamo.',
-'passwordreset-emailtext-user' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek detail akun untuak {{SITENAME}} ($4).
-{{PLURAL:$3|Akun|Akun-akun}} barikuik takaik jo alamaik surel iko:
+{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
+Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan sandi lamo.',
+'passwordreset-emailtext-user' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek detil akun untuak {{SITENAME}} ($4).
+{{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:
 
 $2
 
-{{PLURAL:$3|Sandi samantaro|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|sahari|$5 hari}}.
-Sanak harus masuak dan mamiliah sandi baharu kini. Jikok urang lain mambuek
-pamintaan iko atau jikok Sanak ingek sandi asali dan indak lai
-ingin maubahnyo, Sanak dapek maabaikan pasan iko dan taruih manggunokan sandi lamo.',
+{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
+Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan sandi lamo.',
 'passwordreset-emailelement' => 'Namo pangguno: $1
 Sandi samantaro: $2',
 'passwordreset-emailsent' => 'Surel pangingek alah dikiriman.',
@@ -585,8 +580,8 @@ Sandi samantaro: $2',
 'passwordreset-emailerror-capture' => 'Surel pangingek, nan ditampilkan di bawah, alah dibuek, tapi pengirimannyo gagal ka pangguno: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Tuka alamat e-mail.',
-'changeemail-header' => 'Ganti alamat e-mail.',
+'changeemail' => 'Tuka alamaik surel.',
+'changeemail-header' => 'Ganti alamaik surel.',
 'changeemail-text' => 'Isi formulir ko untuak mangganti alamat surel. Sanak harus mamasuakkan kato sandi untuak mayakinkan parubahan.',
 'changeemail-no-info' => 'Sanak harus masuak log untuak mangakses laman ko.',
 'changeemail-oldemail' => 'Alamat surel kini:',
@@ -611,7 +606,7 @@ Sandi samantaro: $2',
 'nowiki_tip' => 'Abaikan format wiki',
 'image_tip' => 'Cantumkan berkas',
 'media_tip' => 'Pautan berkas',
-'sig_tip' => 'Tandotangan sanak jo waktu',
+'sig_tip' => 'Tandotangan sanak jo wakatu',
 'hr_tip' => 'Garih mandata',
 
 # Edit pages
@@ -619,11 +614,11 @@ Sandi samantaro: $2',
 'subject' => 'Subjek/judul:',
 'minoredit' => 'Suntiangan ketek',
 'watchthis' => 'Pantau laman ko',
-'savearticle' => 'Simpan laman',
+'savearticle' => 'Simpan',
 'preview' => 'Caliak',
-'showpreview' => 'Caliak pratonton',
+'showpreview' => 'Pratonton',
 'showlivepreview' => 'Pratayang langsuang',
-'showdiff' => 'Caliak parubahan',
+'showdiff' => 'Parubahan',
 'anoneditwarning' => "'''Ingek:''' Sanak alun masuak log.
 Alamat 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.''",
@@ -680,9 +675,9 @@ Kato sandi untuak akun baharu iko dapek diubah di laman ''[[Special:ChangePasswo
 'newarticletext' => "Laman nan awak cari alun ado.
 Untuak mambuek laman tu, mulailah dangan manulih dalam kotak di bawah (caliak [[{{MediaWiki:Helppage}}|laman bantuan]] untuak informasi lanjuiknyo).
 Jikok awak indak sangajo sampai ka laman ko, klik tombol '''back''' pado panjalajah web awak.",
-'anontalkpagetext' => "----''Iko adolah laman pambicaraan saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
-Jadi, kami tapaso harus mamakai alamat IP nan basangkutan untuak maidentifikasikannyo.
-Jikok Sanak adolah saurang pangguno anonim dan marasa mandapekkan komentar-komentar nan indak relevan nan ditujuan langsung kapado Sanak, sila [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] untuak mahindari karancuan jo pangguno anonim lainnya di lain wakatu.''",
+'anontalkpagetext' => "----''Iko adolah laman rundiang saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
+Jadi, kami tapaso mamakai alamat IP nan takaik untuak mangenalinyo.
+Jikok Sanak adolah pangguno anonim dan maraso mandapek komentar nan indak lamak nan ditujuan langsung kapado Sanak, cubolah [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] guno manghindari karancuan jo pangguno anonim lainnyo.''",
 'noarticletext' => 'Kini ko indak ada teks di laman iko.
 Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
 'noarticletext-nopermission' => 'Kini ko indak ado teks dalam laman ko.
@@ -699,7 +694,7 @@ Entri log pamblokiran tabaru disadioan di bawah ko untuak referensi:',
 * '''Firefox / Safari:''' Tahan ''Shift'' sambia mangklik ''Reload'', atau takan ''Ctrl-F5'' atau ''Ctrl-R'' (''⌘-R'' di Mac)
 * '''Google Chrome:''' Takan ''Ctrl-Shift-R'' (''⌘-Shift-R'' di Mac)
 * '''Internet Explorer:''' Tahan ''Ctrl'' sambia mangklik ''Refresh'', atau takan ''Ctrl-F5''
-* '''Opera:''' Barasiahkan tembolok di ''Tools → Preferences''",
+* '''Opera:''' Barasiahkan singgahan di ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji CSS baharu Sanak sabalun manyimpannyo.",
 'userjsyoucanpreview' => "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji JS baharu Sanak sabalun manyimpannyo.",
 'usercsspreview' => "'''Ingeklah bahawa Sanak sadang manampilan pratayang dari CSS Sanak.
@@ -712,19 +707,19 @@ Pratayang iko alun disimpan!'''",
 'userinvalidcssjstitle' => "'''Paringatan:''' Kulik \"\$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dipabaharui)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingek ko hanyo pratonton'''
+'previewnote' => "'''Ingek iko hanyo pratonton'''
 Parubahan Sanak alun disimpan!",
 'continue-editing' => 'Pai ka area mangedit.',
 'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
 'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
 Sila cubo sakali lai.
 Jikok masih indak barhasil, cubolah [[Special:UserLogout|kalua log]] dan masuak log baliak.'''",
-'session_fail_preview_html' => "'''Kami indak dapek mamproses suntiangan Sanak karano hilangnyo data sesi.'''
+'session_fail_preview_html' => "'''Kami indak dapek mamproses suntiangan Sanak karano hilangnyo sesi data.'''
 
-''Karano {{SITENAME}} mangizinan panggunoan HTML mantah, pratayang alah disurukan sabagai pancagahan terhadap serangan JavaScript.''
+''Dek {{SITENAME}} mangizinan panggunoan HTML mantah, pratonton alah disuruakan sabagai pancagahan terhadok sarangan JavaScript.''
 
-'''Jikok iko marupokan upayo suntiangan nan sahih, sila cubo lai.
-Jikok masih tatap indak bahasil, cubolah [[Special:UserLogout|kalua log]] dan masuak baliak.'''",
+'''Jikok iko marupoan suntiangan nan sah, silakan cubo lai.
+Jikok masih jo indak barasil, cubolah [[Special:UserLogout|kalua log]] dan masuak baliak.'''",
 'token_suffix_mismatch' => "'''Suntiangan Sanak ditolak karano aplikasi klien Sanak maubah karakter tando baco pado suntiangan.'''
 Suntiangan tasabuik ditolak untuak mancegah kasalahan pado teks laman.
 Hal iko kadang tajadi jikok Sanak manggunokan layanan proxy anonim babasis web nan bamasalah.",
@@ -732,27 +727,27 @@ Hal iko kadang tajadi jikok Sanak manggunokan layanan proxy anonim babasis web n
 'editing' => 'Manyuntiang $1',
 'creating' => 'Mambuek $1',
 'editingsection' => 'Suntiang $1 (bagian)',
-'editingcomment' => 'Manyuntiang $1 (bahagian baharu)',
+'editingcomment' => 'Manyuntiang $1 (bagian baru)',
 'editconflict' => 'Konflik panyuntiangan: $1',
-'explainconflict' => "Urang lain alah manyuntiang laman iko sajak Sanak mulai manyuntiangnyo.
-Bagian ateh teks iko manganduang teks laman saat iko.
+'explainconflict' => "Urang lain lah manyuntiang laman ko sajak Sanak mulai manyuntiangnyo.
+Bagian ateh teks ko manganduang teks laman saat kini ko.
 Parubahan nan Sanak lakuan ditunjuakan pado bagian bawah teks.
-Sanak hanyo paralu magabungan parubahan Sanak jo teks nan alah ado.
-'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan apobilo Sanak manakan \"{{int:savearticle}}\".",
+Sanak hanyo paralu manggabungan parubahan Sanak jo teks nan lah ado.
+'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan jikok Sanak manakan \"{{int:savearticle}}\".",
 'yourtext' => 'Teks Sanak',
 'storedversion' => 'Versi tasimpan',
-'nonunicodebrowser' => "'''Paringatan: Panjalajah web Sanak indak mandukung unicode.'''
-Alah tadapek sabuah solusi agar Sanak dapek manyuntiang laman jo aman: karakter non-ASCII akan muncua dalam kotak edit sabagai kode heksadesimal.",
+'nonunicodebrowser' => "'''Paringatan: Panjalajah web Sanak indak mandukuang Unicode.'''
+Alah ado solusi bia Sanak dapek manyuntiang laman sacaro aman: karakter non-ASCII akan muncua dalam kotak suntiang sabagai kode heksadesimal.",
 'editingold' => "'''Paringatan:
-Sanak manyuntiang revisi lama suatu laman.
-Jikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi iko akan hilang.'''",
+Sanak manyuntiang revisi lamo suatu laman.
+Jikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi ko akan hilang.'''",
 'yourdiff' => 'Pambedoan',
 'copyrightwarning' => "Untuak diingek bahaso apo nan disumbang kapado {{SITENAME}} dianggap lah dilapeh di bawah $2 (caliak $1 untuak langkoknyo).
 Jikok awak indak ingin apo nan ditulih tu disuntiang dan disebaran, jan dikirim tulisan tu ka siko.<br />
 Awak musti bajanji juo bahaso iko adolah asia karya awak surang, atau disalin dari sumber miliak basamo atau sumber bebas lainnyo.
 '''Jan dikirim karya bahak cipta nan indak baizin!'''",
 'copyrightwarning2' => "Parhatikan bahawa sadoalah kontribusi terhadap {{SITENAME}} dapek disuntiang, diubah, atau dihapuih oleh panyumbang lainnyo. Jikok Sanak indak ingin tulisan Sanak disuntiang urang lain, jan kiriman ka siko.<br />Sanak jua bajanji bahawa iko adolah hasil karyo Sanak surang, atau disalin dari sumber miliak umum atau sumber bebas nan lain (liek $1 untuak informasi labiah lanjuik). '''JAN KIRIMAN KARYO NAN DILINDUNGI HAK CIPTA TANPA IJIN!'''",
-'longpageerror' => "'''KASALAHAN: Teks nan Sanak kiriman sagadang {{PLURAL:$1|kilobita|$1 kilobita}}, nan barati labiah gadang dari jumlah maksimum {{PLURAL:$2|kilobita|$2 kilobita}}. Teks indak dapek disimpan.'''",
+'longpageerror' => "'''Kasalahan: Teks nan Sanak kiriman sagadang {{PLURAL:$1|$1 kilobita}}, barati labiah gadang dari jumlah maksimum {{PLURAL:$2|$2 kilobita}}. Teks indak dapek disimpan.'''",
 'readonlywarning' => "'''PARINGATAN: Basis data sadang dikunci untuak pamaliharaan, sahinggo saat iko Sanak indak dapek manyimpan hasil suntiangan.''' 
 Sanak mungkin paralu manyalin teks suntiangan Sanak ko dan simpankan ka sabuah berkas teks guno mamuekannyo baliak kundian.
 
@@ -761,22 +756,22 @@ Panguruih nan mangunci basis data maagiahan panjalehan barikuik: $1",
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
 'semiprotectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno tadafta nan bisa manyuntiangnyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'cascadeprotectedwarning' => "'''PARINGATAN:''' Laman iko sadang dilinduangi sahinggo hanyo pangguno jo hak akses pangurus sajo nan dapek manyuntiangnyo karano disaratokan dalam {{PLURAL:$1|laman|laman-laman}} barikuik nan alah dilinduangi jo opsi 'palinduangan runtun':",
+'cascadeprotectedwarning' => "'''Paringatan:''' Laman ko sadang dilinduangi jadi hanyo pangguno jo hak akses panguruih sajo nan dapek manyuntiangnyo karano disaratoan dalam {{PLURAL:$1|laman}} nan alah dilinduangi jo palinduangan batingkek:",
 'titleprotectedwarning' => "'''Paringatan: Laman iko alah dilinduangi sahinggo diparaluan [[Special:ListGroupRights|hak khusus]] untuak mambueknyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'templatesused' => '{{PLURAL:$1|Templat}} yang digunoan di laman ko:',
-'templatesusedpreview' => '{{PLURAL:$1|Templat|Templat}} yang digunoan dalam pratonton ko:',
-'templatesusedsection' => '{{PLURAL:$1|Templat|Templat}} nan digunoan di bagian iko:',
+'templatesused' => '{{PLURAL:$1|Templat}} nan digunoan di laman ko:',
+'templatesusedpreview' => '{{PLURAL:$1|Templat}} nan digunoan dalam pratonton ko:',
+'templatesusedsection' => '{{PLURAL:$1|Templat}} nan digunoan di bagian ko:',
 'template-protected' => '(dilinduangi)',
-'template-semiprotected' => '(semi-perlindungan)',
+'template-semiprotected' => '(palinduangan semi)',
 'hiddencategories' => 'Laman ko marupokan kalompok dari {{PLURAL:$1|$1 kategori tapandam}}:',
-'nocreatetext' => '{{SITENAME}} alah mambatasi pambuekan laman-laman baharu.
-Sanak dapek baliak dan manyuntiang laman nan alah ado, atau sila [[Special:UserLogin|masuak log atau mambuek akun]].',
+'nocreatetext' => '{{SITENAME}} lah mambatasi pambuekan laman-laman baru.
+Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|masuak log - mambuek akun]].',
 'nocreate-loggedin' => 'Sanak ndak mampunyoi hak akses untuak mambuek laman baharu.',
 'sectioneditnotsupported-title' => 'Panyuntiangan bagian indak didukuang',
 'sectioneditnotsupported-text' => 'Panyuntiangan bagian indak didukuang di laman suntiang iko.',
 'permissionserrors' => 'Kasalahan Hak Akses',
-'permissionserrorstext' => 'Sanak ndak mampunyoi hak untuak malakuan hal itu karano {{PLURAL:$1|alasan|alasan-alasan}} barikuik:',
+'permissionserrorstext' => 'Sanak indak ado hak untuak malakuannyo dek {{PLURAL:$1|alasan}} barikuik:',
 'permissionserrorstext-withaction' => 'Awak indak punyo hak akses untuak $2, karano {{PLURAL:$1|alasan}} barikuik:',
 'recreate-moveddeleted-warn' => "'''Ingek: Sanak mambuek ulang suatu laman nan alah dihapuih.'''
 
@@ -970,8 +965,8 @@ Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME
 'showingresults' => "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
 'showingresultsnum' => "Di bawah ko dikaluaan {{PLURAL:$3|'''$3'''}} hasil mulai dari #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
-'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo yang dicari sacaro default.
-Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasuak laman ota, templat, dll), atau gunoan ruangnamo yang diinginkan sabagai awalan.",
+'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo nan dicari sacaro default.
+Cubo awali pamintaan Sanak tu jo ''sadonyo:'' untuak mancari kasado kandungan (tamasuak laman rundiang, templat, dll), atau gunoan ruangnamo nan diinginkan sabagai awalan.",
 'search-nonefound' => 'Indak ado hasil nan cocok sasuai jo parmintaan',
 'powersearch' => 'Pencarian lanjut',
 'powersearch-legend' => 'Pencarian lanjut',
@@ -981,11 +976,25 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 'powersearch-togglelabel' => 'Piliah:',
 'powersearch-toggleall' => 'Sadonyo',
 'powersearch-togglenone' => 'Dak ado',
+'search-external' => 'Pancarian lua',
+'searchdisabled' => 'Pancarian {{SITENAME}} dimatian.
+Sanak samantaro dapek mancari lewaik Google.
+Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
+
+# Quickbar
+'qbsettings' => 'Bar pinteh',
+'qbsettings-none' => 'Indak ado',
+'qbsettings-fixedleft' => 'Rato kiri',
+'qbsettings-fixedright' => 'Rato kanan',
+'qbsettings-floatingleft' => 'Mangambang di kiri',
+'qbsettings-floatingright' => 'Mangambang di kanan',
+'qbsettings-directionality' => 'Tetap, tagantuang pado skrip bahaso Sanak',
 
 # Preferences page
 'preferences' => 'Pangaturan',
 'mypreferences' => 'Pangaturan',
 'prefs-edits' => 'Jumlah suntiangan:',
+'prefsnologin' => 'Alun masuak log',
 'prefsnologintext' => 'Sanak musti <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} masuak log]</span> untuak mengeset pangaturan.',
 'changepassword' => 'Tuka kato sandi',
 'prefs-skin' => 'Kulik',
@@ -1080,8 +1089,8 @@ Jan labiah dari $1 {{PLURAL:$1|karakter}}.',
 'prefs-help-realname' => "Namo asli sifaiknyo opsional.
 Jiko' Angku manambahkannyo, namo asli Angku akan digunoan untuak mengenal hasil karaja Angku.",
 'prefs-help-email' => "Alamaik surel ko hanyolah tambahan, tapi paralu untuak ma-''reset'' kato sandi, bilo Sanak lupo kato sandi.",
-'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubungi jo surel malalui laman pangguno atau laman diskusi.
-Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
+'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubungi jo surel malalui laman pangguno atau laman rundiang.
+Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'prefs-help-email-required' => 'Alamaik surel wajib diisi.',
 'prefs-info' => 'Informasi dasar',
 'prefs-i18n' => 'Internasionalisasi',
@@ -1098,15 +1107,31 @@ Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
 'prefs-displaywatchlist' => 'Pilihan tampilan',
 'prefs-diffs' => 'Pabedoan',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamaik surel nampaknyo sah',
-'email-address-validity-invalid' => 'Masuakkan alamaik surel nan sah',
+'email-address-validity-invalid' => 'Masuakan alamaik surel nan sah',
 
 # User rights
 'userrights' => 'Manajemen hak pangguno',
 'userrights-lookup-user' => 'Mangatua kalompok pangguno',
-'userrights-user-editname' => 'Masuakkan namo pangguno:',
+'userrights-user-editname' => 'Masuakan namo pangguno:',
 'editusergroup' => 'Suntiang kalompok pangguno',
+'editinguser' => "Mangganti hak akses pangguno '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Suntiang kalompok pangguno',
+'saveusergroups' => 'Simpan kalompok pangguno',
+'userrights-groupsmember' => 'Anggota dari:',
+'userrights-groupsmember-auto' => 'Anggota implisit dari:',
+'userrights-groups-help' => 'Sanak dapek mangubah kalompok pangguno ko:
+* Kotak jo tando cek marupoan kalompok pangguno tasabuik
+* Kotak tanpa tando cek bararti pangguno ko bukan anggota kalompok tasabuik
+* Tando * manandoi Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, atau sabaliaknyo.',
+'userrights-reason' => 'Alasan:',
+'userrights-no-interwiki' => 'Sanak indak bahak untuak mangubah hak pangguno di wiki lain.',
+'userrights-nodatabase' => 'Basis data $1 indak ado atau bukan disiko.',
+'userrights-nologin' => 'Sanak musti [[Special:UserLogin|masuak log]] jo akun panguruih untuak dapek mangubah hak pangguno.',
+'userrights-notallowed' => 'Akun Sanak indak ado izin untuak manambah atau malapeh hak pangguno.',
+'userrights-changeable-col' => 'Kalompok nan dapek Sanak ubah',
+'userrights-unchangeable-col' => 'Kalompok nan indak dapek Sanak ubah',
 
 # Groups
 'group' => 'Kalompok:',
@@ -1119,17 +1144,38 @@ Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
 'group-all' => '(sadonyo)',
 
 'group-user-member' => '{{GENDER:$1|pangguno}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|pangguno takonfirmasi otomatis}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|panguruih}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrat}}',
+'group-suppress-member' => '{{GENDER:$1|pangawas}}',
 
 'grouppage-user' => '{{ns:project}}:Pangguno',
-'grouppage-sysop' => '{{ns:project}}:Pengurus',
+'grouppage-autoconfirmed' => '{{ns:project}}:Pangguno takonfirmasi otomatis',
+'grouppage-bot' => '{{ns:project}}:Bot',
+'grouppage-sysop' => '{{ns:project}}:Panguruih',
+'grouppage-bureaucrat' => '{{ns:project}}:Birokrat',
+'grouppage-suppress' => '{{ns:project}}:Pangawas',
 
 # Rights
+'right-read' => 'Mambaco laman',
+'right-edit' => 'Manyuntiang laman',
 'right-createpage' => 'Mambuek laman baru (nan bukan laman diskusi)',
 'right-createtalk' => 'Mambuek laman diskusi',
 'right-createaccount' => 'Mambuek akun baru',
+'right-minoredit' => 'Manandoi suntiangan ketek',
+'right-move' => 'Mamindahan laman',
+'right-move-subpages' => 'Mamindahan laman jo kasado sub laman',
+'right-move-rootuserpages' => 'Mamindahan laman pangguno',
+'right-movefile' => 'Mamindahan berkas',
+'right-suppressredirect' => 'Indak mambuek pangaliahan wakatu mamindahan laman',
+'right-upload' => 'Mamuek berkas',
+'right-reupload' => 'Manimpo berkas lamo',
+'right-reupload-own' => 'Manimpo berkas nan dimuek surang',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Log pangguno baru',
+'newuserlogpagetext' => 'Di bawah ko log pandaftaran pangguno baru',
 
 # User rights log
 'rightslog' => 'Log parubahan hak akses',
@@ -1164,8 +1210,8 @@ Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
 'rclinks' => 'Tunjuakkan $1 parubahan tabaru dalam $2 hari tarakhia<br />$3',
 'diff' => 'bedo',
 'hist' => 'sijarah',
-'hide' => 'Suruakkan',
-'show' => 'Tampilkan',
+'hide' => 'Suruakan',
+'show' => 'Tunjuakan',
 'minoreditletter' => 'k',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
@@ -1184,7 +1230,22 @@ Laman pado [[Special:Watchlist|dafta pantau Sanak]] ditandoi jo '''cetak taba'''
 
 # Upload
 'upload' => 'Muek berkas',
-'uploadlogpage' => 'Log unggah',
+'uploadbtn' => 'Mamuek berkas',
+'reuploaddesc' => 'Batal dan baliak ka formulir pamuatan',
+'uploadtext' => "Gunoan formulir di bawah untuak mangunggah berkas.
+Untuak manampilan atau mancari berkas nan sabalumnyo dimuek, gunoan [[Special:FileList|dafta berkas]]. Pangunggahan (ulang) tacatat dalam [[Special:Log/upload|log pangunggahan]], samantaro panghapuihan tacatat dalam [[Special:Log/delete|log panghapuihan]].
+
+Untuak manampilkan atau manyaratoan berkas pado suatu laman, gunoan salah satu format di bawah ko:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' untuak manampilan berkas dalam ukuran aslinyo
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuak manampilan berkas jo leba 200px dalam sabuah kotak di kiri laman jo 'teks alternatif' sabagai katarangan gambar
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sabagai pautan langsuang ka berkas nan dimaksud tanpa manampilan berkas tarsabuik di laman wiki",
+'upload-permitted' => 'Jenis berkas nan dipabuliahan: $1.',
+'upload-preferred' => 'Jenis berkas nan disaranan: $1.',
+'upload-prohibited' => 'Jenis berkas nan dilarang: $1.',
+'uploadlog' => 'log pangunggahan',
+'uploadlogpage' => 'Log pangunggahan',
+'uploadlogpagetext' => 'Barikuik adolah dafta unggahan berkas tabaru. 
+Lihek [[Special:NewFiles|galeri berkas baru]] untuak tampilan visual.',
 'filename' => 'Namo berkas',
 'filedesc' => 'Ikhtisar',
 'fileuploadsummary' => 'Ikhtisar:',
@@ -1208,11 +1269,31 @@ Koq berkas tu samemang marupoan gambar dalam ukuran aslinyo, Sanak indak paralu
 Nampaknyo berkas ko marupoan gambar jo ukuran dipaketek ''(miniatua)''.
 Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabuik. Koq indak, harap ubah namo berkas ko.",
 'uploadedimage' => 'muek "[[$1]]"',
+'upload-source' => 'Berkas sumber',
+'sourcefilename' => 'Namo berkas sumber:',
+'sourceurl' => 'URL sumber:',
+'destfilename' => 'Namo berkas tujuan:',
+'upload-maxfilesize' => 'Ukuran berkas maksimum: $1',
+'upload-description' => 'Katarangan berkas',
+'upload-options' => 'Opsi pangunggahan',
+'watchthisupload' => 'Pantau berkas ko',
 
 'license' => 'Lisensi:',
 'license-header' => 'Lisensi',
+'nolicense' => 'Indak ad nan dipiliah',
+'license-nopreview' => '(Pratonton indak tasadio)',
+'upload_source_url' => ' (suatu URL valid nan dapek diakses publik)',
+'upload_source_file' => ' (berkas nan di komputer Sanak)',
 
 # Special:ListFiles
+'listfiles-summary' => 'Laman istimewa ko manampilan kasado berkas nan alah diunggah.
+Katiko disariang dek pangguno, hanyo versi berkas tabaru dari berkas nan diunggah nan tampil.',
+'listfiles_search_for' => 'Cari namo berkas:',
+'imgfile' => 'berkas',
+'listfiles' => 'Dafta berkas',
+'listfiles_thumb' => 'Miniatur',
+'listfiles_date' => 'Tanggal',
+'listfiles_name' => 'Namo',
 'listfiles_user' => 'Pangguno',
 'listfiles_size' => 'Ukuran',
 'listfiles_description' => 'Katarangan',
@@ -1222,9 +1303,11 @@ Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabu
 'file-anchor-link' => 'Berkas',
 'filehist' => 'Riwayaik berkas',
 'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
-'filehist-revert' => 'baliakkan',
+'filehist-deleteall' => 'hapuih sadonyo',
+'filehist-deleteone' => 'hapuih',
+'filehist-revert' => 'baliakan',
 'filehist-current' => 'kini ko',
-'filehist-datetime' => 'Tanggal/Waktu',
+'filehist-datetime' => 'Tanggal/Wakatu',
 'filehist-thumb' => 'Miniatur',
 'filehist-thumbtext' => 'Miniatur untuak versi per $1',
 'filehist-nothumb' => 'Miniatur indak ado',
@@ -1236,10 +1319,31 @@ Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabu
 'imagelinks' => 'Panggunoan berkas',
 'linkstoimage' => 'Barikuik ko {{PLURAL:$1|$1 laman nan takaik}} jo berkas:',
 'nolinkstoimage' => 'Indak ado laman nan batauik ka berkas ko.',
+'morelinkstoimage' => 'Lihek [[Special:WhatLinksHere/$1|pautan baliak]] ka berkas ko.',
+'linkstoimage-redirect' => '$1 (pangaliahan berkas) $2',
 'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
 'sharedupload-desc-here' => 'Berkas ko dari $1, mungkin juo digunoan untuak proyek-proyek lain.
 Informasi dari [$2 laman katarangannyo] ado di bawah.',
+'filepage-nofile' => 'Indak ado berkas banomo iko.',
+'filepage-nofile-link' => 'Indak ado berkas banamo iko, tapi sanak dapek [$1 mamueknyo].',
 'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
+'shared-repo-from' => 'dari $1',
+'shared-repo' => 'repositori basamo',
+'upload-disallowed-here' => 'Sanak indak dapaek manimpo berkas ko.',
+
+# File reversion
+'filerevert' => 'Baliakan $1',
+'filerevert-legend' => 'Baliakan berkas',
+'filerevert-intro' => "Sanank ka mambaliakan berkas '''[[Media:$1|$1]]''' ka versi [$4 pado $3, $2].",
+'filerevert-comment' => 'Alasan:',
+'filerevert-defaultcomment' => 'Baliakan ka versi pado $2, $1',
+'filerevert-submit' => 'Baliakan',
+'filerevert-success' => "'''[[Media:$1|$1]]''' lah dibaliakan ka versi [$4 pado $3, $2]",
+'filerevert-badversion' => 'Indak ado versi lokal tadahulu dari berkas ko pado wakatu nan dituju.',
+
+# File deletion
+'filedelete' => 'Hapuih $1',
+'filedelete-legend' => 'Hapuih berkas',
 
 # Random page
 'randompage' => 'Laman sumbarang',
@@ -1270,6 +1374,8 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 
 'doubleredirects' => 'Pangaliahan ganda',
 
+'withoutinterwiki-submit' => 'Tunjuakan',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bita}}',
 'ncategories' => '$1 {{PLURAL:$1|kategori}}',
@@ -1288,6 +1394,8 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 'deadendpages' => 'Laman buntu',
 'deadendpagestext' => 'Laman-laman ko indak ad pautan ka laman lain di {{SITENAME}}.',
 'protectedpages' => 'Laman nan dilinduangi',
+'protectedpages-indef' => 'Untuak palinduangan salamonyo',
+'protectedpages-cascade' => 'Untuak palinduangan batingkek',
 'usereditcount' => '$1 {{PLURAL:$1|suntiangan}}',
 'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
 'newpages' => 'Laman baru',
@@ -1306,31 +1414,78 @@ Harap paratikan bahwa situs web lain mungkin ado tautan ka suatu berkas jo URL l
 'booksources-go' => 'Tuju',
 
 # Special:Log
+'specialloguserlabel' => 'Pangguno:',
+'speciallogtitlelabel' => 'Target (judul atau pangguno):',
 'log' => 'Log',
+'all-logs-page' => 'Sado log publik',
+'alllogstext' => 'Gabungan kasado log nan ado di {{SITENAME}}.
+Sanak dapek mamiliah jenis log nan ado, namo pangguno (bedoan huruf ketek/gadang), atau judul laman (bedoan huruf ketek/gadang).',
+'logempty' => 'Indak basobok entri log nan sasuai.',
+'log-title-wildcard' => 'Cari judul nan diawali jo teks ko',
+'showhideselectedlogentries' => 'Tunjuakan/Suruakan entri log tapiliah',
 
 # Special:AllPages
 'allpages' => 'Kasado laman',
 'alphaindexline' => '$1 sampai $2',
+'nextpage' => 'Laman salanjuiknyo ($1)',
 'prevpage' => 'Laman sabalunnyo ($1)',
-'allpagesfrom' => 'Tampilkan laman mulai dari:',
-'allpagesto' => 'Tampilkan laman hinggo:',
-'allarticles' => 'Semua laman',
+'allpagesfrom' => 'Tunjuakan laman mulai dari:',
+'allpagesto' => 'Tunjuakan laman sampai:',
+'allarticles' => 'Kasado laman',
+'allinnamespace' => 'Kasado laman (ruang namo $1)',
+'allnotinnamespace' => 'Kasado laman (bukan ruang namo $1)',
+'allpagesprev' => 'Sabalun',
+'allpagesnext' => 'Lanjuik',
 'allpagessubmit' => 'Tuju',
+'allpagesprefix' => 'Tunjuakan laman jo awalan:',
+'allpages-bad-ns' => '{{SITENAME}} indak ado ruang namo "$1".',
+'allpages-hide-redirects' => 'Suruakan pangaliahan',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Caliak versi baru.',
 
 # Special:Categories
 'categories' => 'Kategori',
 'categoriespagetext' => '{{PLURAL:$1|Isi kategori}} ko ado laman atau media.
 [[Special:UnusedCategories|Kategori nan indak tapakai]] indak nampak di siko.
 Lihek pulo [[Special:WantedCategories|kategori nan diinginkan]].',
+'categoriesfrom' => 'Tunjuakan kategori mulai jo:',
+'special-categories-sort-count' => 'uruikan manuruik jumlah',
+'special-categories-sort-abc' => 'uruikan manuruik abjad',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Jariah nan dihapuih',
+'deletedcontributions-title' => 'Jariah nan dihapuih',
+'sp-deletedcontributions-contribs' => 'Jariah',
 
 # Special:LinkSearch
 'linksearch' => 'Pancarian pautan lua',
+'linksearch-pat' => 'Pola pancarian:',
+'linksearch-ns' => 'Ruang namo:',
+'linksearch-ok' => 'Cari',
 'linksearch-line' => '$1 tapauik dari $2',
 
+# Special:ListUsers
+'listusersfrom' => 'Tunjuakan pangguno mulai dari:',
+'listusers-submit' => 'Tunjuakan',
+'listusers-noresult' => 'Pangguno indak basobok.',
+'listusers-blocked' => '(tasakek)',
+
+# Special:ActiveUsers
+'activeusers' => 'Dafta pangguno aktif',
+'activeusers-from' => 'Tunjuakan pangguno mulai dari:',
+'activeusers-hidebots' => 'Suruakan bot',
+'activeusers-hidesysops' => 'Suruakan panguruih',
+'activeusers-noresult' => 'Pangguno indak basobok',
+
 # Special:ListGroupRights
+'listgrouprights' => 'Dafta kalompok pangguno',
+'listgrouprights-group' => 'Kalompok',
+'listgrouprights-rights' => 'Hak',
+'listgrouprights-helppage' => 'Help:Hak akses',
 'listgrouprights-members' => '(dafta anggota)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Surel pangguno',
 'emailuser-title-target' => 'Kirim surel ka {{GENDER:$1|panggun}} ko',
 'emailuser-title-notarget' => 'Kirim surel',
@@ -1350,11 +1505,11 @@ Alamaik surel nan Sanak masuakkan di [[Special:Preferences|pangaturan akun]] aka
 'emailccme' => 'Kirimkan denai salinan pasan.',
 
 # Watchlist
-'watchlist' => 'Dafta pantau',
-'mywatchlist' => 'Dafta pantau',
+'watchlist' => 'Pantauan',
+'mywatchlist' => 'Pantauan',
 'watchlistfor2' => 'Untuak $1 $2',
-'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
-Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
+'addedwatchtext' => 'Laman "[[:$1]]" lah ditambahan ka [[Special:Watchlist|Pantauan]] Sanak.
+Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.',
 'removewatch' => 'Hapuih dari dafta pantau',
 'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|dafta pantau Sanak]].',
 'watch' => 'Pantau',
@@ -1393,15 +1548,17 @@ Caliak $2 untuak rakam jajak laman nan lah dihapuih.',
 
 # Protect
 'protectlogpage' => 'Log palinduangan',
+'protectlogtext' => 'Di bawah ko dafta parubahan tahadok palinduangan laman.
+Caliak [[Special:ProtectedPages|dafta laman talinduang]] untuak dafta palinduangan laman tabaru.',
 'protectedarticle' => 'malinduangkan "[[$1]]"',
-'modifiedarticleprotection' => 'maubah tingkek perlindungan "[[$1]]"',
+'modifiedarticleprotection' => 'maubah tingkek palinduangan "[[$1]]"',
 'protectcomment' => 'Alasan:',
 'protectexpiry' => 'Kadaluwarsa:',
 'protect_expiry_invalid' => 'Maso kadaluwarsa indak balaku',
 'protect_expiry_old' => 'Maso kadaluwarsa adolah pado maso lampau',
-'protect-text' => "Awak buliah malihek jo mangganti tingkek perlindungan di siko untuak laman '''$1'''.",
-'protect-locked-access' => "Akun awak indak berhak untuak maubah tingkek perlindungan laman ko.
-Berikut ko pengaturan yang balaku untuak laman '''$1''':",
+'protect-text' => "Sanak buliah malihek jo mangganti tingkek palinduangan untuak laman '''$1'''.",
+'protect-locked-access' => "Akun Sanak indak bahak untuak maubah tingkek palinduangan laman ko.
+Barikuik ko pangaturan nan balaku untuak laman '''$1''':",
 'protect-cascadeon' => 'Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.
 Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.',
 'protect-default' => 'Semua pangguno diizinkan',
@@ -1419,7 +1576,21 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'protect-existing-expiry' => 'Alah sampai: $3, $2',
 'protect-otherreason' => 'Alasan lain/tambahan:',
 'protect-otherreason-op' => 'Alasan lain',
-'restriction-type' => 'Perlindungan:',
+'protect-dropdown' => '*Alasan umum palinduangan
+** Vandal baulang
+** Spam baulang
+** Parang suntiangan
+** Laman balalu lintas tinggi
+** Digunoan di Palanta
+** Templat baresiko tinggi
+** Berkas nan banyak digunoan
+** Baulang kali dihapuih dalam waktu dakek
+** Baulang kali dialiahan tanpa barundiang
+** Baulang kali dikosongan
+** Pamintaan pangguno',
+'protect-edit-reasonlist' => 'Suntiang alasan palinduangan',
+'protect-expiry-options' => '1 jam:1 hour,1 ari:1 day,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
+'restriction-type' => 'Palinduangan:',
 'restriction-level' => 'Tingkek larangan:',
 'minimum-size' => 'Ukuran min',
 'maximum-size' => 'Ukuran max',
@@ -1431,8 +1602,19 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'restriction-create' => 'Buek',
 'restriction-upload' => 'Muek',
 
+# Restriction levels
+'restriction-level-sysop' => 'palinduangan panuah',
+'restriction-level-autoconfirmed' => 'palinduangan semi',
+'restriction-level-all' => 'sado tingkek',
+
 # Undelete
-'undeletelink' => 'caliak/cegakkan',
+'undelete' => 'Caliak laman nan dihapuih',
+'undeletepage' => 'Caliak dan baliakan laman tahapuih',
+'undeletepagetitle' => "'''Iko dafta revisi nan dihapuih dari [[:$1|$1]]'''.",
+'viewdeletedpage' => 'Caliak laman nan dihapuih',
+'undelete-nodiff' => 'Indak ado basobok revisi lamo',
+'undeletebtn' => 'Baliakan',
+'undeletelink' => 'caliak/baliakan',
 'undeleteviewlink' => 'caliak',
 
 # Namespace form on various pages
@@ -1451,11 +1633,17 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'year' => 'Dari taun (dan sabalunnyo):',
 
 'sp-contributions-newbies' => 'Tampilkan jariah pangguno baru sajo',
+'sp-contributions-newbies-sub' => 'Untuak pangguno baru',
+'sp-contributions-newbies-title' => 'Jariah pangguno baru',
 'sp-contributions-blocklog' => 'log pamblokiran',
-'sp-contributions-deleted' => 'kontribusi pangguno nan lah batiadoan',
+'sp-contributions-deleted' => 'jariah pangguno nan lah dihapuih',
 'sp-contributions-uploads' => 'muek',
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'maota',
+'sp-contributions-userrights' => 'pangalolaan hak pangguno',
+'sp-contributions-blocked-notice' => 'Pangguno ko sadang kanai sakek. log pamblokiran tarakhia ditunjuakan disiko untuak referensi:',
+'sp-contributions-blocked-notice-anon' => 'Alamaik IP ko tangah diblokir.
+Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 'sp-contributions-search' => 'Cari jariah',
 'sp-contributions-username' => 'Alamat IP atau namo pangguno:',
 'sp-contributions-toponly' => 'Hanyo manampilan suntiangan nan tarakhia',
@@ -1467,7 +1655,8 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'whatlinkshere-page' => 'Laman:',
 'linkshere' => "Laman-laman ko bakaik ka '''[[:$1]]''':",
 'nolinkshere' => "Indak ado laman nan punyo tautan ka '''[[:$1]]'''.",
-'isredirect' => 'laman pengaliahan',
+'nolinkshere-ns' => "Indak ado pautan laman ka '''[[:$1]]''' pado ruang namo nan dipiliah.",
+'isredirect' => 'laman pangaliahan',
 'istemplate' => 'transklusi',
 'isimage' => 'pautan berkas',
 'whatlinkshere-prev' => '{{PLURAL:$1|sabalunnyo}}',
@@ -1509,7 +1698,7 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'ipbotheroption' => 'lainnyo',
 'ipbotherreason' => 'Alasan lain/tambahan:',
 'ipbhidename' => 'Suruakan namo pangguno dari dafta jo suntiangan',
-'ipbwatchuser' => 'Pantau laman pangguno ko jo laman diskusinyo',
+'ipbwatchuser' => 'Pantau laman pangguno ko jo laman rundiangnyo',
 'ipb-disableusertalk' => 'Halang pangguno ko manyuntiang laman diskusinyo wakatu disakek',
 'ipb-change-block' => 'Sakek baliak pangguno jo setelan ko',
 'ipb-confirm' => 'Konfirmasi sakek',
@@ -1520,19 +1709,71 @@ Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 'ipb-blockingself' => 'Angku ka manyakek diri surang! Lai yakin apo nan dikarajoan?',
 'ipb-edit-dropdown' => 'Suntiang alasan manyakek',
 'ipb-unblock-addr' => 'Lapeh sakek $1',
-'blocklist' => 'Pangguno tablokir',
-'ipblocklist' => 'Pangguno tablokir',
+'ipb-unblock' => 'Lapeh sakek pangguno atau alamaik IP',
+'ipb-blocklist' => 'Caliak nan disakek',
+'ipb-blocklist-contribs' => 'Jariah untuak $1',
+'unblockip' => 'Lapeh sakek',
+'unblockiptext' => 'Gunoan formulir ko untuak mangambalian hak akses alamaik IP atau pangguno nan kanai sakek',
+'ipusubmit' => 'Lapeh sakek ko',
+'unblocked' => '[[User:$1|$1]] lah dilapeh sakeknyo',
+'unblocked-range' => '$1 lah dilapeh sakeknyo',
+'unblocked-id' => 'Sakek $1 lah dilapeh',
+'blocklist' => 'Pangguno kanai sakek',
+'ipblocklist' => 'Pangguno kanai sakek',
+'ipblocklist-legend' => 'Cari pangguno kanai sakek',
+'blocklist-userblocks' => 'Suruakan akun tasakek',
+'blocklist-tempblocks' => 'Suruakan sakek samantaro',
+'blocklist-addressblocks' => 'Suruakan ciek IP tasakek',
+'blocklist-rangeblocks' => 'Suruakan wilayah sakek',
+'blocklist-timestamp' => 'tando wakatu',
+'blocklist-target' => 'Target',
+'blocklist-expiry' => 'Kadaluwarsa',
+'blocklist-by' => 'Panguruih nan manyakek',
+'blocklist-params' => 'Parameter sakek',
+'blocklist-reason' => 'Alasan',
+'ipblocklist-submit' => 'Cari',
+'ipblocklist-localblock' => 'Sakek lokal',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Sakek}} lain',
+'infiniteblock' => 'salamonyo',
+'expiringblock' => 'habih pado $1 di $2',
+'anononlyblock' => 'hanyo anon.',
+'noautoblockblock' => 'sakek otomatis dimatian',
+'createaccountblock' => 'mambuek akun dimatian',
+'emailblock' => 'surel diblokir',
+'blocklist-nousertalk' => 'indak dapek manyuntiang laman maota surang',
+'ipblocklist-empty' => 'Dafta sakek ko kosong.',
+'ipblocklist-no-results' => 'Alamaik IP atau pangguno nan dimintak indak disakek.',
 'blocklink' => 'sakek',
-'unblocklink' => 'hilangkan sakek',
+'unblocklink' => 'lapeh sakek',
 'change-blocklink' => 'ubah sakek',
 'contribslink' => 'jariah',
-'blocklogpage' => 'Log pamblokiran',
+'emaillink' => 'kirim surel',
+'autoblocker' => 'Sakek otomatis dek alamaik IP lah digunoan jo "[[User:$1|$1]]".
+Alasan disakek untuak $1 adolah "\'\'$2\'\'"',
+'blocklogpage' => 'Log sakek',
 'blocklogentry' => 'Manyakek [[$1]] dalam maso $2 $3',
-'unblocklogentry' => 'mahilangkan sakek $1',
-'block-log-flags-nocreate' => 'mambuek akun dimatikan',
+'unblocklogentry' => 'lapeh sakek $1',
+'block-log-flags-anononly' => 'hanyo pangguno anonim',
+'block-log-flags-nocreate' => 'mambuek akun dimatian',
+'block-log-flags-noautoblock' => 'sakek otomatis dimatian',
+'block-log-flags-noemail' => 'surel diblokir',
+'block-log-flags-nousertalk' => 'indak dapek manyuntiang laman maota surang',
+'block-log-flags-angry-autoblock' => 'sistim sakek otomatis diaktifkan',
+'block-log-flags-hiddenname' => 'namo pangguno tasuruak',
+'ipb_already_blocked' => '"$1" alah disakek',
+'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Sakek}} lain',
 'blockme' => 'Sakek denai',
+'proxyblocker' => 'Sakek proksi',
+'proxyblocker-disabled' => 'Fungsi ko dimatian',
+
+# Developer tools
+'lockdb' => 'Kunci basis data',
+'unlockdb' => 'Bukak kunci basis data',
 
 # Move page
+'move-page' => 'Pindahan $1',
+'move-page-legend' => 'Pindahan laman',
 'movepagetext' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sadonyo data riwayaik ka namo baru. 
 Judua lamo tu ka manjadi laman paraliahan manuju judua nan baru. 
 Awak dapek mampabarui paraliahan-paraliahan nan manuju ka judua lamo sacaro otomatis.
@@ -1549,16 +1790,28 @@ Iko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jad
 
 Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman sacaro manual.",
 'movearticle' => 'Pindahkan laman',
+'movenologin' => 'Alun masuak log',
+'movenologintext' => 'Sanak musti pangguno tadafta dan [[Special:UserLogin|masuak lo]] untuak mamindahan laman.',
+'movenotallowed' => 'Sanak indak ado izin untuak mamindahan laman.',
+'movenotallowedfile' => 'Sanak indak ado izin untuak mamindahan berkas.',
+'cant-move-user-page' => 'Sanak indak ado izin untuak mamindahan laman pangguno (bagian dari sub laman).',
+'cant-move-to-user-page' => 'Sanak indak ado izin untuak mamindahan laman ka laman pangguno (salain ka sub laman pangguno).',
 'newtitle' => 'Ka judul baru:',
 'move-watch' => 'Pantau laman ko',
-'movepagebtn' => 'Pindahkan laman',
+'movepagebtn' => 'Pindahan laman',
 'pagemovedsub' => 'Pamindahan berhasil',
-'movepage-moved' => '\'\'\'"$1" lah dipindahkan ka "$2"\'\'\'',
-'articleexists' => 'Laman dengan namo tu lah ado, atau namo yang awak pilih indak tapek. Silakan pilih namo lain',
-'talkexists' => "'''Laman tersebut berhasil dipindahkan, tapi laman otanyo indak dapek dipindahkan karano lah ado laman ota pado judul yang baru. Silakan digabuang laman ota tu sacaro manual.'''",
-'movedto' => 'dipindahkan ka',
-'movetalk' => 'Pindahkan laman ota yang takaik',
-'movelogpage' => 'Log pemindahan',
+'movepage-moved' => '\'\'\'"$1" lah dipindahan ka "$2"\'\'\'',
+'movepage-moved-redirect' => 'Pangaliahan lah dibuek.',
+'movepage-moved-noredirect' => 'Pangaliahan indak dibuek.',
+'articleexists' => 'Laman nan banamo tu lah ado, atau namo nan Sanak piliah indak tapek.
+Silakan piliah namo lain.',
+'cantmove-titleprotected' => 'Sanak indak dapek mamindahan laman kasiko dek judul barunyo kanai linduang dari dibuek',
+'talkexists' => "'''Laman tasabuik barasil dipindahan, tapi laman rundiangnyo indak dapek dipindahan dek lah ado laman rundiang disinan. Silakan digabuang laman rundiang tu sacaro manual.'''",
+'movedto' => 'pindahan ka',
+'movetalk' => 'Pindahan laman rundiang nan takaik',
+'move-subpages' => 'Pindahan sub laman (sampai $1)',
+'move-talk-subpages' => 'Pindahan sub laman dari laman rundiang (sampai $1)',
+'movelogpage' => 'Log pamindahan',
 'movereason' => 'Alasan:',
 'revertmove' => 'baliakkan',
 
@@ -1573,6 +1826,12 @@ Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman s
 'thumbnail-more' => 'Pagadang',
 'thumbnail_error' => 'Gagal mambuek miniatur: $1',
 
+# Special:Import
+'importstart' => 'Mangimpor laman...',
+
+# Import log
+'import-logentry-upload' => 'mangimpor [[$1]] malalui pamuekan berkas',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Laman pangguno Sanak',
 'tooltip-pt-anonuserpage' => 'Laman pangguno IP Sanak',
@@ -1681,6 +1940,10 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'markaspatrolledtext' => 'Tandoi laman ko lah dipatroli',
 'markedaspatrolled' => 'Tandoi lah dipatroli',
 
+# Patrol log
+'patrol-log-page' => 'Log patroli',
+'log-show-hide-patrol' => '$1 log patroli',
+
 # Browsing diffs
 'previousdiff' => '← Revisi sabalunnyo',
 'nextdiff' => 'Revisi salanjuiknyo →',
@@ -1825,15 +2088,23 @@ Nan lainnyo akan tasuruak sacaro baku.
 'monthsall' => 'sadonyo',
 'limitall' => 'sadonyo',
 
+# Watchlist editor
+'watchlistedit-raw-titles' => 'Judul:',
+'watchlistedit-raw-submit' => 'Pabarui pantauan',
+'watchlistedit-raw-done' => 'Pantauan Sanak lah dipabarui',
+'watchlistedit-raw-added' => '{{PLURAL:$1|$1 judul lah}} ditambahan:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 judul lah}} dibuang:',
+
 # Watchlist editing tools
-'watchlisttools-view' => 'Tampilkan parubahan takaik',
-'watchlisttools-edit' => 'Tampilkan sarato suntiang dafta pantau',
+'watchlisttools-view' => 'Tunjuakan parubahan takaik',
+'watchlisttools-edit' => 'Tunjuakan sarato suntiang dafta pantau',
 'watchlisttools-raw' => 'Suntiang pantauan mantah',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|maota]])',
 
 # Core parser functions
+'unknown_extension_tag' => 'Tag ekstensi "$1" indak tau',
 'duplicate-defaultsort' => '\'\'\'Peringatan:\'\'\' Kunci panguruitan default "$2" sabalunnyo mangabaikan kunci panguruitan default "$1".',
 
 # Special:Version
@@ -1849,6 +2120,8 @@ Nan lainnyo akan tasuruak sacaro baku.
 'version-license' => 'Lisensi',
 'version-poweredby-credits' => "Wiki ko didukuang jo '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnyo',
+'version-software' => 'Parangkaik lunak tapasang',
+'version-software-product' => 'Produk',
 'version-software-version' => 'Versi',
 'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
index 5ee3452..53ed722 100644 (file)
@@ -866,7 +866,7 @@ $2',
 'loginlanguagelabel' => 'Јазик: $1',
 'suspicious-userlogout' => 'Вашето барање за одјава е одбиено бидејќи се чини дека е испратено од расипан прелистувач или кеширачки застапник (proxy).',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Непозната грешка во функцијата mail() на PHP',
 'user-mail-no-addy' => 'Се обидовте да испратите порака без да внесете адреса',
 'user-mail-no-body' => 'Се обидовте да испратите писмо кое е празно или со неразумно куса содржина.',
@@ -1560,7 +1560,7 @@ $1",
 'prefs-displaywatchlist' => 'Нагодувања на приказот',
 'prefs-diffs' => 'Разлики',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Исправно',
 'email-address-validity-invalid' => 'Се бара исправна адреса!',
 
@@ -2166,6 +2166,12 @@ $1',
 Наместо тоа, може да имаат врска до посоодветната тема.<br />
 Една страница се смета за страница за појаснување ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Страници со својство',
+'pageswithprop-legend' => 'Страници со својство',
+'pageswithprop-text' => 'На страницава се наведени страници што користат дадено својство.',
+'pageswithprop-prop' => 'Име на својството:',
+'pageswithprop-submit' => 'Оди',
+
 'doubleredirects' => 'Двојни пренасочувања',
 'doubleredirectstext' => 'Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.
 Секој ред содржи врски кон првото и второто пренасочување, како и целта на второто пренасочување, кое обично ја посочува <i>вистинската</i> целна страница кон која првото пренасочување би требало да насочува.
@@ -2359,7 +2365,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Може да ги додаде сите групи на сопствената корисничка сметка',
 'listgrouprights-removegroup-self-all' => 'Може да ги избрише сите групи од сопствената корисничка сметка',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Нема адреса за праќање',
 'mailnologintext' => 'Мора да сте [[Special:UserLogin|најавени]] и да имате важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други корисници.',
 'emailuser' => 'Пиши е-пошта на корисникот',
@@ -3849,7 +3855,7 @@ Variants for Chinese language
 'monthsall' => 'сите',
 'limitall' => 'сите',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Потврда на е-поштенска адреса',
 'confirmemail_noemail' => 'Немате наведено важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]].',
 'confirmemail_text' => '{{SITENAME}} бара да ја потврдите вашата е-поштенска адреса пред да ги користите можностите за е-пошта.
@@ -4316,7 +4322,7 @@ $5
 'api-error-invalid-file-key' => 'Внатрешна грешка: не ја пронајдов податотеката во привременото складиште.',
 'api-error-missingparam' => 'Внатрешна грешка: недостасуваат параметри за барањето.',
 'api-error-missingresult' => 'Внатрешна грешка: не можев да одредам дали копирањето заврши успешно.',
-'api-error-mustbeloggedin' => 'Ð\9cоÑ\80а Ð´Ð° Ñ\81Ñ\82е Ð½Ð°Ñ\98авени Ð·Ð° Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð´Ð¸Ð³Ð°Ñ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки.',
+'api-error-mustbeloggedin' => 'Мора да сте најавени за да подигате податотеки.',
 'api-error-mustbeposted' => 'Во програмов има грешка. Не користи исправен HTTP-метод.',
 'api-error-noimageinfo' => 'Погидањето успеа, но опслужувачот не понуди никакви информации за податотеката.',
 'api-error-nomodule' => 'Внатрешна грешка: нема зададено модул за подигање.',
@@ -4344,4 +4350,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
 'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
 
+# Image rotation
+'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|степен|степени}} вдесно',
+
 );
index e16c6ac..8cb57d6 100644 (file)
@@ -831,7 +831,7 @@ $2',
 'loginlanguagelabel' => 'ഭാഷ: $1',
 'suspicious-userlogout' => 'ലോഗൗട്ട് ചെയ്യാനുള്ള താങ്കളുടെ അഭ്യർത്ഥന നിരസിച്ചിരിക്കുന്നു, കാരണം അത് തകർന്ന ബ്രൗസറിൽ നിന്നോ കാഷിങ് പ്രോക്സിയിൽ നിന്നോ ഉണ്ടായതുപോലെ അനുഭവപ്പെടുന്നു.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'പി.എച്ച്.പി.യുടെ main() ഫങ്ഷനിൽ അപരിചിതമായ പിഴവ്',
 'user-mail-no-addy' => 'ഇമെയിൽ വിലാസം ഇല്ലാതെയാണ് ഇമെയിൽ അയയ്ക്കാൻ ശ്രമിച്ചത്',
 'user-mail-no-body' => 'ശൂന്യമായതോ അസാമാന്യമായി ചെറുതോ ആയ ഉള്ളടക്കമുള്ള ഇമെയിൽ അയയ്ക്കാൻ ശ്രമിച്ചു.',
@@ -1382,7 +1382,7 @@ $1",
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
 'mypreferences' => 'ക്രമീകരണങ്ങൾ',
-'prefs-edits' => 'à´\86à´\95àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95ൾ:',
+'prefs-edits' => 'ആകെ തിരുത്തുകൾ:',
 'prefsnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
 'prefsnologintext' => 'ഉപയോക്തൃക്രമീകരണങ്ങൾ മാറ്റാൻ താങ്കൾ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ലോഗിൻ]</span> ചെയ്തിരിക്കണം.',
 'changepassword' => 'രഹസ്യവാക്ക് മാറ്റുക',
@@ -1496,7 +1496,7 @@ $1",
 'prefs-displaywatchlist' => 'പ്രദർശന ഐച്ഛികങ്ങൾ',
 'prefs-diffs' => 'വ്യത്യാസങ്ങൾ',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'സാധുതയുള്ളതെന്ന് തോന്നുന്നു',
 'email-address-validity-invalid' => 'സാധുതയുള്ള വിലാസം ആവശ്യമാണ്!',
 
@@ -2271,7 +2271,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listgrouprights-addgroup-self-all' => 'എല്ലാ സംഘങ്ങളേയും സ്വന്തം അംഗത്വത്തിൽ ചേർക്കുക',
 'listgrouprights-removegroup-self-all' => 'സ്വന്തം അംഗത്വത്തിൽ നിന്ന് എല്ലാ സംഘങ്ങളേയും നീക്കംചെയ്യുക',
 
-# E-mail user
+# Email user
 'mailnologin' => 'അയയ്ക്കാനുള്ള വിലാസം ലഭ്യമല്ല',
 'mailnologintext' => 'മറ്റ് ഉപയോക്താക്കൾക്കു ഇമെയിലയക്കുവാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കുകയും, സാധുവായ ഒരു ഇമെയിൽ വിലാസം താങ്കളുടെ [[Special:Preferences|ക്രമീകരണങ്ങൾ]] താളിൽ സജ്ജീകരിച്ചിരിക്കുകയും വേണം.',
 'emailuser' => 'ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക',
@@ -3105,7 +3105,7 @@ $1',
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
 'pageinfo-not-current' => 'ക്ഷമിക്കുക, പഴയ നാൾപ്പതിപ്പുകളിൽ ഈ വിവരം പ്രദർശിപ്പിക്കുക അസാദ്ധ്യമാണ്.',
 'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
-'pageinfo-header-edits' => 'തിരàµ\81à´¤àµ\8dതൽà´\9aà´°à´¿à´¤àµ\8dà´°à´\82',
+'pageinfo-header-edits' => 'തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´¨à´¾àµ¾à´µà´´à´¿',
 'pageinfo-header-restrictions' => 'സംരക്ഷണം',
 'pageinfo-header-properties' => 'താളിന്റെ ഗുണഗണങ്ങൾ',
 'pageinfo-display-title' => 'പ്രദർശിപ്പിക്കേണ്ട തലക്കെട്ട്',
@@ -3661,7 +3661,7 @@ $1',
 'monthsall' => 'എല്ലാം',
 'limitall' => 'എല്ലാം',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ഇ-മെയിൽ വിലാസം സ്ഥിരീകരിക്കൽ',
 'confirmemail_noemail' => '[[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളുടെ കൂടെ]] സാധുവായൊരു ഇ-മെയിൽ വിലാസം സജ്ജീകരിച്ചിട്ടില്ല.',
 'confirmemail_text' => '{{SITENAME}} സം‌രംഭത്തിൽ ഇ-മെയിൽ സൗകര്യം ഉപയോഗിക്കണമെങ്കിൽ താങ്കൾ താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിന്റെ സാധുത തെളിയിച്ചിരിക്കണം. താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് സ്ഥിരീകരണ മെയിൽ അയക്കുവാൻ താഴെയുള്ള ബട്ടൺ അമർത്തുക. താങ്കൾക്ക് അയക്കുന്ന ഇ-മെയിലിൽ ഒരു സ്ഥിരീകരണ കോഡ് ഉണ്ട്. ആ കോഡിൽ അമർത്തിയാൽ താങ്കളുടെ വിലാസത്തിന്റെ സാധുത തെളിയിക്കപ്പെടും.',
@@ -4071,4 +4071,6 @@ $5
 'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
 'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
 
+# Unknown messages
+'pageswithprop-submit' => 'പോകൂ',
 );
index 16f11e5..efb0ed4 100644 (file)
@@ -806,7 +806,7 @@ $2',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तुमचे अदाखल होणे प्रतिबंधित झाले कारण असे दिसते की ते तुटलेल्या न्याहाळकाद्वारे पाठवले गेले.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक',
 'user-mail-no-addy' => 'ईमेल पत्त्या विना ईमेल पाठवण्यचा प्रयत्न केला',
 
@@ -1438,7 +1438,7 @@ $1",
 'prefs-displaywatchlist' => 'दर्शन पर्याय',
 'prefs-diffs' => 'फरक',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'विपत्रपत्ता वैध आहे',
 'email-address-validity-invalid' => 'वैध विपत्रपत्ता लिहा',
 
@@ -2182,7 +2182,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listgrouprights-addgroup-self-all' => 'सर्व समूह स्वतःच्या खात्यात मिळवा',
 'listgrouprights-removegroup-self-all' => 'सर्व समूह स्वतःच्या खात्यातून काढून टाका',
 
-# E-mail user
+# Email user
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
 'mailnologintext' => 'इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमुद असणे आवश्यक आहे.',
 'emailuser' => 'या सदस्याला ई-मेल पाठवा',
@@ -3511,7 +3511,7 @@ $1',
 'monthsall' => 'सर्व',
 'limitall' => 'सर्व',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ई-मेल पत्ता पडताळून पहा',
 'confirmemail_noemail' => '[[Special:Preferences|सदस्य पसंतीत]] तुम्ही प्रमाणित विपत्र (ई-मेल) पत्ता दिलेला नाही.',
 'confirmemail_text' => 'विपत्र सुविधा वापरण्या पूर्वी {{SITENAME}}वर तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करणे गरजेचे आहे. तुमच्या पत्त्यावर निश्चितीकरण विपत्र (ई-मेल) पाठवण्याकरिता खालील बटण सुरू करा.विपत्रात कुटसंकेतच्(पासवर्ड) असलेला दुवा असेल;तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करण्या करिता तुमच्या विचरकात हा दिलेला दुवा चढवा.',
index 3761e40..60fedcc 100644 (file)
@@ -697,7 +697,7 @@ Sila tunggu sebentar dan cuba lagi.',
 'loginlanguagelabel' => 'Bahasa: $1',
 'suspicious-userlogout' => 'Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
 'user-mail-no-addy' => 'E-eml cuba dihantar tanpa alamat e-mel',
 'user-mail-no-body' => 'Anda telah cuba menghantar e-mel dengan isi yang kosong atau terlampau ringkas.',
@@ -1368,7 +1368,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'prefs-displaywatchlist' => 'Pilihan paparan',
 'prefs-diffs' => 'Beza',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat e-mel adalah sah',
 'email-address-validity-invalid' => 'Sila masukkan alamat e-mel yang sah',
 
@@ -1957,6 +1957,12 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
 Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Halaman dengan sifat halaman',
+'pageswithprop-legend' => 'Halaman dengan sifat halaman',
+'pageswithprop-text' => 'Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.',
+'pageswithprop-prop' => 'Nama sifat:',
+'pageswithprop-submit' => 'Pergi',
+
 '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.
 Masukan yang <del>dipotong</del> telah diselesaikan.',
@@ -2146,7 +2152,7 @@ Anda boleh mengetahui [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan
 'listgrouprights-addgroup-self-all' => 'Menyertai semua kumpulan',
 'listgrouprights-removegroup-self-all' => 'Keluar daripada semua kumpulan',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Tiada alamat e-mel',
 'mailnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
 terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
@@ -3534,7 +3540,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
 'monthsall' => 'semua',
 'limitall' => 'semua',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Sahkan alamat e-mel',
 'confirmemail_noemail' => 'Anda belum menetapkan alamat e-mel yang sah dalam [[Special:Preferences|laman keutamaan]] anda.',
 'confirmemail_text' => '{{SITENAME}} menghendaki supaya anda mengesahkan alamat e-mel anda sebelum menggunakan ciri-ciri e-mel.
@@ -3945,4 +3951,7 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'duration-centuries' => '$1 abad',
 'duration-millennia' => '$1 alaf',
 
+# Image rotation
+'rotate-comment' => 'Imej diputar sebanyak $1 {{PLURAL:$1|darjah|darjah}} mengikut arah jam',
+
 );
index 28834b3..10621f3 100644 (file)
@@ -817,7 +817,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
 'user-mail-no-addy' => 'Forsøkte å sende e-post uten e-postadresse',
 'user-mail-no-body' => 'Prøvde å sende e-post med tom eller for kort brødtekst.',
@@ -1085,7 +1085,7 @@ Du bør vurdere om det er passende å fortsette å redigere denne siden.
 Slette- og flytteloggen for denne siden gjengis her:",
 'moveddeleted-notice' => 'Denne siden har blitt slettet.
 Slette- og flytteloggen vises nedenfor.',
-'log-fulllog' => 'Vil hele loggen',
+'log-fulllog' => 'Vis hele loggen',
 'edit-hook-aborted' => 'Redigering avbrutt av en funksjon, uten forklaring.',
 'edit-gone-missing' => 'Kunne ikke oppdatere siden fordi den har blitt slettet.',
 'edit-conflict' => 'Redigeringskonflikt.',
@@ -1502,7 +1502,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'prefs-displaywatchlist' => 'Visningsalternativer',
 'prefs-diffs' => 'Forskjeller',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-postadressen ser gyldig ut',
 'email-address-validity-invalid' => 'Skriv inn en gyldig e-postadresse',
 
@@ -2092,6 +2092,9 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 De burde i stedet lenke til en passende innholdsside.<br />
 En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Sider med sideverdi',
+'pageswithprop-legend' => 'Sider med en sideverdi',
+
 'doubleredirects' => 'Doble omdirigeringer',
 'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
 Hver 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.
@@ -2282,7 +2285,7 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
 'listgrouprights-addgroup-self-all' => 'Kan legge til alle grupper til egen konto',
 'listgrouprights-removegroup-self-all' => 'Kan ta bort alle grupper fra egen konto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Ingen avsenderadresse',
 'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
 'emailuser' => 'E-post til denne brukeren',
@@ -2779,7 +2782,7 @@ Du kan oppdatere omdirigeringer som peker til den opprinnelige tittelen automati
 Om du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
 Du er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.
 
-Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre den er tom eller er en omdirigeringsside uten historikk.
+Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre sistnevnte er tom eller er en omdirigeringsside uten historikk.
 Det betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.
 
 '''Advarsel!'''
@@ -3663,7 +3666,7 @@ Rotert 90° mot klokka og vridd vertikalt',
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Bekreft e-postadresse',
 'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
 'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
index 9e40c5a..3eb03d1 100644 (file)
@@ -552,7 +552,7 @@ $2',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP मेल() क्रियामा अज्ञात त्रुटि',
 'user-mail-no-addy' => 'इमेल ठेगाना बिना नै इमेल पठाउन खोजिएको थियो।',
 
@@ -1195,7 +1195,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'prefs-displaywatchlist' => 'प्रदर्शन विकल्पहरू',
 'prefs-diffs' => 'diffs(भिन्नता)',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ई मेल ठेगाना मान्य भएको प्रतीत हुन्छ',
 'email-address-validity-invalid' => 'मान्य ईमेल ठेगाना दिनुहोस्',
 
@@ -1831,7 +1831,7 @@ $1',
 'listgrouprights-removegroup-self' => '{{PLURAL:$2|समूह|समूहहरु}} यस  $1 खाताबाट हटाउने',
 'listgrouprights-addgroup-self-all' => 'सबै समूहहरु निजी खातामा थप्ने',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ईमेल पठाउने ठेगाना नै भएन ।',
 'mailnologintext' => 'तपाईले अरु प्रयोगकर्ताहरुलाई ईमेल पठाउनको लागि आफु पहिले [[Special:UserLogin|प्रवेश(लगइन)गरेको]] हुनुपर्छ र [[Special:Preferences|आफ्नो रोजाइहरुमा]] एउटा वैध ईमेल ठेगाना भएको हुनुपर्छ।',
 'emailuser' => 'यो प्रयोगकर्तालाई ई-मेल पठाउनुहोस्',
@@ -3072,7 +3072,7 @@ $8',
 'monthsall' => 'सबै',
 'limitall' => 'सबै',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'इमेल ठेगाना पक्का गर्नुहोस्',
 'confirmemail_noemail' => 'तपाईको प्रयोगकर्ता [[Special:Preferences|अभिरुचीमा]] मान्य इमेल ठेगाना राखीएको छैन ।',
 'confirmemail_pending' => 'तपाईको इमेलमा प्रपाणिकरण कोड पहिले नै पठाइ सकिएको छ;
index 0417459..08eb625 100644 (file)
@@ -877,7 +877,7 @@ Wacht even voordat u het opnieuw probeert.',
 'loginlanguagelabel' => 'Taal: $1',
 'suspicious-userlogout' => 'Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
 'user-mail-no-addy' => 'Geprobeerd een e-mail te verzenden zonder een e-mailadres.',
 'user-mail-no-body' => 'Er is geprobeerd een e-mail te verzenden zonder inhoud of met een hele korte inhoud.',
@@ -1579,7 +1579,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'prefs-displaywatchlist' => 'Weergaveopties',
 'prefs-diffs' => 'Verschillen',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Het e-mailadres lijkt geldig',
 'email-address-validity-invalid' => 'Geef een geldig e-mailadres op',
 
@@ -2191,6 +2191,12 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens deze sjab
 Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
 Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-legend' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-text' => "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
+'pageswithprop-prop' => 'Naam van de eigenschap:',
+'pageswithprop-submit' => 'OK',
+
 'doubleredirects' => 'Dubbele doorverwijzingen',
 'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
 Elke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.
@@ -2386,7 +2392,7 @@ Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individu
 'listgrouprights-addgroup-self-all' => 'Alle groepen toevoegen aan eigen gebruiker',
 'listgrouprights-removegroup-self-all' => 'Alle groepen verwijderen van eigen gebruiker',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Geen verzendadres beschikbaar',
 'mailnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
 'emailuser' => 'Deze gebruiker e-mailen',
@@ -3809,7 +3815,7 @@ Andere velden worden verborgen.
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-mailadres bevestigen',
 'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
 'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
@@ -4233,4 +4239,7 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Image rotation
+'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
+
 );
index 048ccde..62483f9 100644 (file)
@@ -800,7 +800,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Førespurnaden din om å logge ut vart nekta fordi han såg ut til å vere sendt av ein øydelagt nettlesar eller mellomtenar.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
 'user-mail-no-addy' => '↓Prøvde å senda e-post utan e-postadresse',
 'user-mail-no-body' => 'Freista å senda e-post med tom eller urimeleg stutt brødtekst.',
@@ -895,7 +895,8 @@ Mellombels passord: $2',
 'showpreview' => 'Førehandsvis',
 'showlivepreview' => 'Levande førehandsvising',
 'showdiff' => 'Vis skilnader',
-'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for sida.",
+'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga.
+IP-adressa di vert lagra i endringshistorikken til sida.",
 'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta førd opp i endringshistorikken til denne sida.''",
 'missingsummary' => "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
 'missingcommenttext' => 'Ver venleg og skriv ein kommentar nedanfor.',
@@ -1449,7 +1450,7 @@ Dette kan ikkje tilbakestillast.',
 'prefs-i18n' => 'Internasjonalisering',
 'prefs-signature' => 'Signatur',
 'prefs-dateformat' => 'Datoformat',
-'prefs-timeoffset' => 'Tidsforskuving',
+'prefs-timeoffset' => 'Tidforskuving',
 'prefs-advancedediting' => 'Avanserte val',
 'prefs-advancedrc' => 'Avanserte val',
 'prefs-advancedrendering' => 'Avanserte val',
@@ -1460,7 +1461,7 @@ Dette kan ikkje tilbakestillast.',
 'prefs-displaywatchlist' => 'Val for vising',
 'prefs-diffs' => 'Skilnader',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-postadressa ser ut til å vera gyldig',
 'email-address-validity-invalid' => 'Skriv inn ei gyldig e-postaddresse.',
 
@@ -2044,6 +2045,12 @@ Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
 Dei bør kan henda lenkja til ei meir passande side i staden.<br />
 Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja til frå [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Sider med ein sideeigenskap',
+'pageswithprop-legend' => 'Sider med ein sideeigenskap',
+'pageswithprop-text' => 'Denne sida listar opp sider som nyttar ein viss sideeigenskap.',
+'pageswithprop-prop' => 'Namn på eigenskap:',
+'pageswithprop-submit' => 'Gå',
+
 'doubleredirects' => 'Doble omdirigeringar',
 'doubleredirectstext' => 'Kvar line inneheld lenkjer til den første og den andre omdirigeringa, og den første lina frå den andre omdirigeringsteksten. Det gjev som regel den «rette» målartikkelen, som den første omdirigeringa skulle ha peikt på. <del>Overstrykne</del> liner har vorte retta på.',
 'double-redirect-fixed-move' => '[[$1]] har blitt flytta, og er no ei omdirigering til [[$2]]',
@@ -2230,7 +2237,7 @@ Det er påkravt med eit toppnivådomene, til dømes «*.org».<br />
 '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',
 
-# E-mail user
+# Email user
 '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',
@@ -2599,7 +2606,7 @@ $1',
 'ipb-change-block' => 'Blokker brukaren på nytt med desse innstillingane',
 'ipb-confirm' => 'Stadfest blokkering',
 'badipaddress' => 'IP-adressa er ugyldig eller blokkering av brukarar er slått av på tenaren.',
-'blockipsuccesssub' => 'Blokkeringa er utførd',
+'blockipsuccesssub' => 'Blokkeringa er utført',
 'blockipsuccesstext' => '«[[Special:Contributions/$1|$1]]» er blokkert.<br />
 Sjå [[Special:BlockList|blokkeringslista]] for alle blokkeringane.',
 'ipb-blockingself' => 'Du er i ferd med å blokkera deg sjølv. Er du viss på at du ynskjer gjera dette?',
@@ -3591,7 +3598,7 @@ Andre er gøymde som standard.
 'monthsall' => 'alle',
 'limitall' => 'alle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Stadfest e-postadresse',
 'confirmemail_noemail' => 'Du har ikkje gjeve ei gyldig e-postadresse i [[Special:Preferences|innstillingane dine]].',
 'confirmemail_text' => '{{SITENAME}} krev at du stadfester e-postadressa di
index 2e34445..477e2b0 100644 (file)
@@ -784,7 +784,7 @@ Esperatz abans d’ensajar tornamai.',
 'loginlanguagelabel' => 'Lenga: $1',
 'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
 
 # Change password dialog
@@ -1396,7 +1396,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'prefs-displaywatchlist' => "Opcions d'afichatge",
 'prefs-diffs' => 'Diferéncias',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "L'adreça electronica sembla bona",
 'email-address-validity-invalid' => 'entrar una adreça electronica valida',
 
@@ -2105,7 +2105,7 @@ I pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàr
 'listgrouprights-addgroup-self-all' => 'Se pòt apondre totes los gropes a son compte pròpri',
 'listgrouprights-removegroup-self-all' => 'Se pòt levar totes los gropes de son compte pròpri',
 
-# E-mail user
+# Email user
 'mailnologin' => "Pas d'adreça",
 'mailnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
 e aver indicat una adreça electronica valida dins vòstras [[Special:Preferences|preferéncias]]
@@ -3408,7 +3408,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'monthsall' => 'totes',
 'limitall' => 'totes',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Confirmar l'adreça de corrièr electronic",
 'confirmemail_noemail' => 'L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.',
 'confirmemail_text' => '{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.',
index fbfbb57..13e0a46 100644 (file)
@@ -265,7 +265,7 @@ $messages = array(
 'tog-extendwatchlist' => 'କେବଳ ନଗଦ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ନିମନ୍ତେ ଦେଖଣାତାଲିକାକୁ ବଢ଼ାଇବେ',
 'tog-usenewrc' => 'ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-numberheadings' => 'ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ',
-'tog-showtoolbar' => 'ସମà­\8dପାଦନା à¬\9fà­\81ଲବାର à¬¦à­\87à¬\96ାà¬\87ବà­\87 (à¬\9cାଭାସà­\8dà¬\95à­\8dରିପà­\8dà¬\9f à¬¸à¬\9aଳ à¬\95ରିବà­\87)',
+'tog-showtoolbar' => 'ସମà­\8dପାଦନା à¬\9fà­\81ଲବାର à¬¦à­\87à¬\96ାà¬\87ବà­\87 (à¬\9cାଭାସà­\8dà¬\95à­\8dରିପà­\8dà¬\9f à¬²à­\8bଡ଼ା)',
 'tog-editondblclick' => 'ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-editsection' => '[ବଦଳାଇବେ] ଲିଙ୍କରେ ବିଭାଗର ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ',
 'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
@@ -353,7 +353,7 @@ $messages = array(
 'november-gen' => 'ନଭେମ୍ବର',
 'december-gen' => 'ଡିସେମ୍ବର',
 'jan' => 'ଜାନୁଆରୀ',
-'feb' => 'ଫà­\87ବà­\8dରà­\81ଆରୀ',
+'feb' => 'ଫà­\87ବà­\83ଆରୀ',
 'mar' => 'ମାର୍ଚ୍ଚ',
 'apr' => 'ଅପ୍ରେଲ',
 'may' => 'ମଇ',
@@ -542,7 +542,7 @@ $1',
 'feedlinks' => 'ଫିଡ଼:',
 'feed-invalid' => 'ଅଚଳ ସବସ୍କ୍ରିପସନ ଫିଡ଼ ପ୍ରକାର ।',
 'feed-unavailable' => 'ସିଣ୍ଡିକେସନ ଫିଡ଼ସବୁ ମିଳୁନାହିଁ',
-'site-rss-feed' => '$1 à¬\86ରà­\87ସà­\87ସ ଫିଡ଼',
+'site-rss-feed' => '$1 à¬\86ରà¬\8fସà¬\8fସ ଫିଡ଼',
 'site-atom-feed' => '$1 ଆଟମ ଫିଡ଼',
 'page-rss-feed' => '$1 ଟି ଆରେସେସ ଫିଡ଼',
 'page-atom-feed' => '$1 ଟି ଆଟମ ଫିଡ଼',
@@ -651,7 +651,7 @@ $2',
 'filereadonlyerror' => 'ଫାଇଲ ଧାରକ "$2"ଟି ଖାଲି ପଢିବା ହେବାଭଳି ରହିଥିବା ହେତୁ ଏଥିରେ ଥିବା $1 ପାଇଲଟିକୁ ବଦଳା ଯାଇପାରିବ ନାହିଁ ।
 
 ଯେଉଁ ପରିଚ୍ଛା ଏହାକୁ ବନ୍ଦ କରିଛନ୍ତି ସେ ଏହି ବିବରଣୀ ଦେଇଛନ୍ତି: "$3"',
-'invalidtitle-knownnamespace' => '"$2" à¬¨à­\87ମà­\8dସà­\8dପà­\87ସ à¬\8fବà¬\82 "$3" à¬²à­\87à¬\96ାଥିବା à¬\85ବà­\88ଧ à¬¶à­\80ରà­\8dଷà¬\95 à¥¤',
+'invalidtitle-knownnamespace' => '"$2" ନେମସ୍ପେସ ଏବଂ "$3" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
 'invalidtitle-unknownnamespace' => '"$1" ନେମ୍ସ୍ପେସ ଏବଂ "$2" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
 'exception-nologin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
 'exception-nologin-text' => 'ଏହା କରିବାକୁ ହେଲେ ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଲଗଇନ କରିବାକୁ ପଡିବ ।',
@@ -764,12 +764,12 @@ continue using your old password.',
 ଯଦି ଭୁଲରେ ଏହି ଖାତାଟି ତିଆରି କରାଯାଇଥାଏ, ତେବେ ଏହି ସୂଚନାଟିକୁ ଅଣଦେଖା କରିବେ ।',
 'usernamehasherror' => 'ଇଉଜର ନାମରେ ହାସ ଅକ୍ଷର (hash characters) ରହି ପାରିବନାହିଁ',
 'login-throttled' => 'ଆପଣ ବହୁ ଥର ଲଗ ଇନ କରିବାର ଉଦ୍ୟମ କରିଅଛନ୍ତି ।
-ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ କିଛି କାଳ ଅପେକ୍ଷ କରନ୍ତୁ ।',
+ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ କିଛି କାଳ ଅପେକ୍ଷ କରନ୍ତୁ ।',
 'login-abort-generic' => 'ଆପଣଙ୍କ ଲଗ ଇନ ଅସଫଳ ହେଲା - ନାକଚ କରିଦିଆଗଲା',
 'loginlanguagelabel' => 'ଭାଷା: $1',
 'suspicious-userlogout' => 'ଲଗ ଆଉଟ କରିବା ନିମନ୍ତେ ଆପଣ କରିଥିବା ଆବେଦନ ନାକଚ କରିଦିଆଗଲା କାରଣ ଲାଗୁଅଛି ଯେ ଏହା ଏକ ଅସ୍ଥିର ବ୍ରାଉଜରରୁ ପଠାଯାଇଅଛି ଅବା ପ୍ରକ୍ସି ଧରାଯାଇଅଛି ।',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସୁବିଧା ।',
 'user-mail-no-addy' => 'ଏକ ଇ-ମେଲ ଠିକଣା ବିନା ଇ-ମେଲ ପଠାଇବାକୁ ଚେଷ୍ଟା କଲୁଁ ।',
 'user-mail-no-body' => 'ଏକ ଖାଲି କିମ୍ବା ଅଦରକାରୀ ଛୋଟ ଲେଖା ଥିବା ମେଲ ପଠେଇବାକୁ ଚେଷ୍ଟା କରିଥିଲେ',
@@ -783,9 +783,9 @@ continue using your old password.',
 'newpassword' => 'ନୂଆ ପାସୱାର୍ଡ଼:',
 'retypenew' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ ଦିଅନ୍ତୁ:',
 'resetpass_submit' => 'ପାସୱାର୍ଡ଼ଟିଏ ଦେଇ ଲଗ ଇନ କରନ୍ତୁ',
-'resetpass_success' => 'à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à¬¬ାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
+'resetpass_success' => 'à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±ାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
 ଏବେ ଲଗ ଇନ କରୁଅଛୁଁ...',
-'resetpass_forbidden' => 'ପାସବାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ',
+'resetpass_forbidden' => 'ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ',
 'resetpass-no-info' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।',
 'resetpass-submit-loggedin' => 'ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ',
 'resetpass-submit-cancel' => 'ନାକଚ',
@@ -797,7 +797,7 @@ continue using your old password.',
 'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
 'passwordreset-text' => 'ନିଜ ଖାତାର ସବିଶେଷ ବିବରଣୀ ଏକ ଇ-ମେଲରେ ପାଇବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
 'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-disabled' => 'ପାସବାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
+'passwordreset-disabled' => 'ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
 'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
 'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'passwordreset-domain' => 'ଡୋମେନ:',
@@ -917,16 +917,16 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'loginreqtitle' => 'ଲଗ ଇନ ଲୋଡ଼ା',
 'loginreqlink' => 'ଲଗଇନ',
 'loginreqpagetext' => 'ବାକି ପୃଷ୍ଠାମାନ ଦେଖିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ $1 କରିବାକୁ ପଡ଼ିବ ।',
-'accmailtitle' => 'ପାସବାର୍ଡ଼ଟି ପଠାଇ ଦିଆଗଲା ।',
-'accmailtext' => "[[User talk:$1|$1]]à¬\99à­\8dà¬\95 à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬\8fà¬\95 à¬¯à¬¾à¬¹à¬¿à¬¤à¬¾à¬¹à¬¿ à¬ªà¬¾à¬¸à¬¬ାର୍ଡ଼ $2ଙ୍କ ନିକଟକୁ ପଠାଗଲା ।
+'accmailtitle' => 'ପାସୱାର୍ଡ଼ଟି ପଠାଇ ଦିଆଗଲା ।',
+'accmailtext' => "[[User talk:$1|$1]]à¬\99à­\8dà¬\95 à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬\8fà¬\95 à¬¯à¬¾à¬¹à¬¿à¬¤à¬¾à¬¹à¬¿ à¬ªà¬¾à¬¸à­±ାର୍ଡ଼ $2ଙ୍କ ନିକଟକୁ ପଠାଗଲା ।
 
-à¬\8fହି à¬ªà¬¾à¬¸à¬¬à¬¾à¬°à­\8dଡ଼à¬\9fି ''[[Special:ChangePassword|ପାସବାରà­\8dଡ଼  ବଦଳାଇବା]]'' ପୃଷ୍ଠାରେ ଲଗଇନ କରି କରାଯାଇପାରିବ ।",
+à¬\8fହି à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\9fି ''[[Special:ChangePassword|ପାସୱାରà­\8dଡ଼ ବଦଳାଇବା]]'' ପୃଷ୍ଠାରେ ଲଗଇନ କରି କରାଯାଇପାରିବ ।",
 'newarticle' => '(ନୁଆ)',
 'newarticletext' => "ଆପଣ ଖୋଲିଥିବା ଲିଙ୍କଟିରେ ଏଯାଏଁ କିଛିବି ପୃଷ୍ଠା ନାହିଁ ।
 ଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରି କରିବା ପାଇଁ ତଳ ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ (ଅଧିକ ଜାଣିବା ପାଇଁ [[{{MediaWiki:Helppage}}|ସାହାଯ୍ୟ ପୃଷ୍ଠା]] ଦେଖନ୍ତୁ) ।
 ଯଦି ଆପଣ ଏଠାକୁ ଭୁଲରେ ଆସିଯାଇଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ବ୍ରାଉଜରର '''Back''' ପତିଟି ଦବାନ୍ତୁ ।",
 'anontalkpagetext' => "----''ଏହା ଏକ IP ଖାତା ଖୋଲିନଥିବା ବା ଖାତା ବ୍ୟବହାର କରିନଥିବା ଜଣେ ବେନାମି ସଭ୍ୟଙ୍କର ଆଲୋଚନା ପୃଷ୍ଠା ।
-ତà­\87ଣà­\81 à¬\86ମà­\8dଭà­\87 à¬¸à¬\99à­\8dà¬\96à­\8dà­\9fା à¬¦à­\87à¬\87 à¬¸à­\82à¬\9aିତ IP ଠିକଣା ଦେଇ ତାହାଙ୍କୁ ଜାଣିବା ।
+ତà­\87ଣà­\81 à¬\86ମà­\8dଭà­\87 à¬¸à¬\82à¬\96à­\8dà­\9fା à¬¦à­\87à¬\87 à¬¸à­\82à¬\9aà­\80ତ IP ଠିକଣା ଦେଇ ତାହାଙ୍କୁ ଜାଣିବା ।
 ଏହି ପ୍ରକାରର IP ଠିକଣା ବହୁ ସଭ୍ୟଙ୍କ ଦେଇ ବଣ୍ଟା ବି ଯାଇପାରେ ।
 ଯଦି ଆପଣ ଜଣେ ଅଜଣା ସଭ୍ୟ ଓ ଭାବୁଛନ୍ତି ଇଆଡୁ ସିଆଡୁ ମତାମତ ସବୁ ଆପଣଙ୍କ ଉପରେ ଦିଆଯାଇଛି ତେବେ ଦୟାକରି [[Special:UserLogin/signup|ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ]] କିମ୍ବା [[Special:UserLogin|ଆଗରୁ ଥିବା ଖାତାରେ ଲଗ ଇନ କରନ୍ତୁ]] ଯାହା ବେନାମି ସଭ୍ୟଙ୍କୁ ନେଇ ଉପୁଜିଥିବା ଦ୍ଵନ୍ଦର ସମାଧାନ କରିବ ।''",
 'noarticletext' => 'ଏହି ପୃଷ୍ଠାଟିରେ କିଛି ବି ଲେଖା ନାହିଁ ।
@@ -1048,7 +1048,7 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'edit-conflict' => 'ବଦଳାଇବା ଦ୍ଵନ୍ଦ.',
 'edit-no-change' => 'ଆପଣଙ୍କ ସମ୍ପାଦନାକୁ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।',
 'edit-already-exists' => 'ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।
-à¬\8fହା à¬\85ଗରୁ ଅଛି ।',
+à¬\8fହା à¬\86ଗରୁ ଅଛି ।',
 'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 'content-failed-to-parse' => '$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3',
 'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥ୍ୟ',
@@ -1445,12 +1445,12 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'gender-unknown' => 'ଲୁଚାଯାଇଥିବା',
 'gender-male' => 'ପୁରୁଷ',
 'gender-female' => 'ନାରୀ',
-'prefs-help-gender' => 'à¬\87à¬\9aà­\8dà¬\9bାଧିନ: à¬¸à¬«à­\8dà¬\9fବେରରେ ଲିଙ୍ଗବାଚକ ସମ୍ବୋଧନ ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଇଥାଏ ।
+'prefs-help-gender' => 'à¬\87à¬\9aà­\8dà¬\9bାଧିନ: à¬¸à¬«à­\8dà¬\9fà­±େରରେ ଲିଙ୍ଗବାଚକ ସମ୍ବୋଧନ ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଇଥାଏ ।
 ଏହି ତଥ୍ୟ ସାଧାରଣରେ ପ୍ରକାଶିତ ।',
 'email' => 'ଇ-ମେଲ',
 'prefs-help-realname' => 'ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।
 ଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।',
-'prefs-help-email' => 'à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬\87à¬\9aà­\8dà¬\9bାଧà­\80ନ, à¬\95ିନà­\8dତà­\81 à¬\86ପଣ à¬ªà¬¾à¬¸à¬¬à¬¾à¬°à­\8dଡ଼à¬\9fି à¬¯à¬¦ି ଭୁଲିଗଲେ ତାହା ଆଉଥରେ ତିଆରିବା ପାଇଁ ଏହା କାମରେ ଲାଗିବ ।',
+'prefs-help-email' => 'à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬\87à¬\9aà­\8dà¬\9bାଧà­\80ନ, à¬\95ିନà­\8dତà­\81 à¬\86ପଣ à¬¯à¬¦à¬¿ à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\9fି ଭୁଲିଗଲେ ତାହା ଆଉଥରେ ତିଆରିବା ପାଇଁ ଏହା କାମରେ ଲାଗିବ ।',
 'prefs-help-email-others' => 'ଆପଣ ନିଜର ଇ-ମେଲଟିଏ ନିଜର ସଭ୍ୟ ବା ଆଲୋଚନା ପୃଷ୍ଠାରେ ଦେଇ ଅନ୍ୟମାନଙ୍କୁ ଇ-ମେଲରେ ଯୋଗଯୋଗ କରିବାର ସୁବିଧା ଦେଇପାରିବେ ।
 ଆପଣଙ୍କୁ କେହି ମେଲ କଲେ ଆପଣଙ୍କ ଇ-ମେଲ ତାହାଙ୍କୁ ଦେଖାଯିବ ନାହିଁ ।',
 'prefs-help-email-required' => 'ଇ-ମେଲ ଠିକଣାଟି ଲୋଡ଼ା ।',
@@ -1469,7 +1469,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'prefs-displaywatchlist' => 'ଦେଖଣା ବିକଳ୍ପ',
 'prefs-diffs' => 'ତଫାତସବୁ',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗୁଅଛି',
 'email-address-validity-invalid' => 'ଏକ ସଠିକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ',
 
@@ -1550,7 +1550,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'right-deletedtext' => 'ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଓ ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଭିତରର ସଙ୍କଳନର ବଦଳ ଦେଖିବେ',
 'right-browsearchive' => 'ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ଖୋଜିବେ',
 'right-undelete' => 'ଲିଭାଇ ଦିଆଯାଇଥିବା ପୃଷ୍ଠାଟିଏକୁ ଫେରାଇ ଆଣିବେ',
-'right-suppressrevision' => 'ପରିà¬\9bାମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଙ୍କଳନ ପରଖିବେ ଓ ଲେଉଟାଇବେ',
+'right-suppressrevision' => 'ପରିà¬\9aାଳà¬\95ମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଙ୍କଳନ ପରଖିବେ ଓ ଲେଉଟାଇବେ',
 'right-suppressionlog' => 'ବ୍ୟକ୍ତିଗତ ଲଗ ଦେଖାଇବେ',
 'right-block' => 'ବାକି ସଭ୍ୟମାନଙ୍କୁ ସମ୍ପାଦନାରୁ ବାରଣ କରିବେ',
 'right-blockemail' => 'ଇ-ମେଲ ପଠାଇବାରୁ ଜଣେ ସଭ୍ୟଙ୍କୁ ବାରଣ କରିବେ',
@@ -2254,7 +2254,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'listgrouprights-addgroup-self-all' => 'ନିଜ ଖାତାରେ ସବୁଯାକ ଗୋଠ ଯୋଡ଼ିବେ',
 'listgrouprights-removegroup-self-all' => 'ନିଜ ଖାତାରୁ ସବୁଯାକ ଗୋଠ ହଟାଇଦେବେ',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ଗୋଟିଏ ବି ପଠାଇବା ଠିକଣା ନାହିଁ',
 'mailnologintext' => 'ଆପଣ ନିଜ [[Special:Preferences|ପସନ୍ଦସବୁ]]ରେ [[Special:UserLogin|ଲଗ ଇନ]] କରିଥିଲେ ଓ ନିଜର ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଥିଲେ ଯାଇ ବାକି ସବୁ ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ ପଠାଇପାରିବେ ।',
 'emailuser' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଇମେଲ କରିବେ',
@@ -3010,7 +3010,7 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 'tooltip-n-mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
 'tooltip-n-portal' => 'ଏହି ପ୍ରକଳ୍ପଟିରେ ଖୋଜା ଖୋଜି ପାଇଁ ଆପଣ କେମିତି ସାହାଯ୍ୟ କରିପାରିବେ',
 'tooltip-n-currentevents' => 'ନଗଦ କାମର ପଛପଟେ ଚାଲିଥିବା କାମର ତଥ୍ୟ',
-'tooltip-n-recentchanges' => 'ବିକିରେ ଏହିମାତ୍ର କରାଯାଇଥିବା ଅଦଳ ବଦଳ',
+'tooltip-n-recentchanges' => 'à­±ିକିରେ ଏହିମାତ୍ର କରାଯାଇଥିବା ଅଦଳ ବଦଳ',
 'tooltip-n-randompage' => 'ଯାହିତାହି ପୃଷ୍ଠାଟିଏ ଖୋଲ',
 'tooltip-n-help' => 'ଖୋଜି ପାଇବା ଭଳି ଜାଗା',
 'tooltip-t-whatlinkshere' => 'ଏଠାରେ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା',
@@ -3626,7 +3626,7 @@ $1',
 'monthsall' => 'ସବୁ',
 'limitall' => 'ସବୁ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ଟି ଠିକ ବୋଲି ଥୟ କରନ୍ତୁ',
 'confirmemail_noemail' => '[[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]] ଭିତରେ  ଏକ ସଠିକ ଇମେଲ ଠିକଣା ଦିଆଯାଇନାହିଁ ।',
 'confirmemail_text' => 'ଆପଣା ଇମେଲ ସୁବିଧା ବ୍ୟବହାର କରିବା ଆଗରୁ {{SITENAME}}ରେ ଆପଣଙ୍କର ଇମେଲ ଠିକଣା ଥୟ କରିବାକୁ ପଡ଼ିବ ।
index 06a3205..932c13a 100644 (file)
@@ -189,23 +189,23 @@ $digitGroupingPattern = "##,##,###";
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'à¨\85ੰਡਰ-ਲਾà¨\88ਨ à¨²à¨¿à©°à¨\95:',
-'tog-justify' => 'ਪà©\88ਰਾ à¨¸à¨¹à©\80 à¨\95ਰà©\87 .',
-'tog-hideminor' => 'ਮà©\8cਨà¨\9cà©\81ਦਾ à¨¬à¨¦à¨²à¨¾à¨¬ à¨®à©\88 à¨¸à©\88 à¨¨à©\80à¨\95à©\88 à¨¬à¨¦à¨²à¨¾à¨¬ à¨\95à©\8c à¨\9bà©\81ਪਾ à¨\95ਰ à¨°à¨\96à©\87.',
-'tog-hidepatrolled' => 'ਮà©\8cਨà¨\9cà©\81ਦਾ à¨¬à¨¦à¨²à¨¾à¨¬ à¨®à©\88 à¨¸à©\88 à¨¸à¨¹à©\80ਤà¨\95 à¨¬à¨¦à¨²à¨¾à¨¬ à¨\95à©\8c à¨\9bà©\81ਪਾ à¨\95ਰ à¨°à¨\96à©\87.',
+'tog-underline' => 'à¨\95à©\9cà©\80à¨\86à¨\82 à¨\85ਧà©\8bਰà©\87à¨\96ਨ:',
+'tog-justify' => 'ਪਰਿੱà¨\9bà©\87ਦ à¨¸à¨®à¨¾à¨¨ à¨\95ਰà©\8b',
+'tog-hideminor' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨µà¨¿à©±à¨\9a à¨\9bà©\8bà¨\9fà©\87 à¨¬à¨¦à¨²à¨¾à¨µ à¨\9bà©\81ਪਾà¨\93',
+'tog-hidepatrolled' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨µà¨¿à©±à¨\9a à¨\9cਾà¨\82à¨\9aà©\87 à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨\9bà©\81ਪਾà¨\93',
 'tog-newpageshidepatrolled' => 'ਨਵੀ ਸੁਚੀ ਮੈ ਸੈ ਗਸ਼ਤ ਪਰਚੇ ਕੌ ਛੁਪਾਏ.',
-'tog-extendwatchlist' => 'ਸਾਰà©\80 à¨¨à¨µà©\80 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86 à¨¹à©\80 à¨¨à¨¹à©\80 ,ਪà©\82ਰਾਣà©\80 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86 à¨¨à©\82à©° à¨µà©\80 à¨¨à¨µà©\80 à¨¸à©\82à¨\9aà©\80 à¨µà¨¿à¨\9a à¨µà¨§à¨¾ à¨\95à©\88 à¨¸à¨¼à¨¾à¨®à©\80ਲ à¨\95ਰà©\8c.',
-'tog-usenewrc' => 'ਤਾà¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨\85ਤà©\87 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à¨\9a à¨¸à¨«à¨¼à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¦à©\87 à¨\97ਰà©\81ੱਪ à¨¬à¨£à¨¾à¨\93 (à¨\9cਾਵਾ à¨¸à¨\95à©\8dਰਿਪà¨\9f à¨²à©\8bà©\9cà©\80à¨\82ਦà©\80 ਹੈ)',
+'tog-extendwatchlist' => 'à¨\95à©\87ਵਲ à¨¹à¨¾à¨²à¨¿à¨\86 à¨¹à©\80 à¨¨à¨¹à©\80à¨\82, à¨¸à¨\97à©\8bà¨\82 à¨¸à¨¾à¨°à©\87 à¨ªà¨°à¨¿à¨µà¨°à¨¤à¨¨à¨¾à¨\82 à¨¨à©\82à©° à¨µà¨¿à¨\96ਾà¨\89ਣ à¨²à¨\88 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨¨à©\82à©° à¨µà¨¿à¨¸à¨¥à¨¾à¨°à¨¿à¨¤ à¨\95ਰà©\8b',
+'tog-usenewrc' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨\85ਤà©\87 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±à¨\9a à¨ªà©°à¨¨à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¬à¨¦à¨²à¨¾à¨µ à¨¦à©\87 à¨\97ਰà©\81ੱਪ à¨¬à¨£à¨¾à¨\93 (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨¦à©\80 à¨\9cਰà©\82ਰਤ ਹੈ)',
 'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਹੈਡਿੰਗ',
 'tog-showtoolbar' => 'ਐਡਿਟ ਟੂਲਬਾਰ ਵੇਖੋ (JavaScript)',
-'tog-editondblclick' => 'ਦੂਹਰੇ ਕਲਿੱਕ ਨਾਲ਼ ਸਫ਼ੇ ਸੋਧੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
-'tog-editsection' => '[ਸੰਪਾਦਨ] à¨²à¨¿à©°à¨\95ਾà¨\82 à¨\9c਼ਰà©\80à¨\8f à¨¸à©\88à¨\95ਸ਼ਨ à¨¸à©\8bਧ à¨\9aਾਲà©\82 ਕਰੋ',
+'tog-editondblclick' => 'ਦੂਹਰੇ ਕਲਿੱਕ ’ਤੇ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਦੀ ਜਰੂਰਤ ਹੈ)',
+'tog-editsection' => '[ਸੰਪਾਦਨ] à¨\95à©\9cà©\80à¨\86à¨\82 à¨¦à©\81à¨\86ਰਾ à¨\85ਨà©\81ਭਾà¨\97 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¸à¨®à¨°à©±à¨¥à¨¾à¨µà¨¾à¨¨ ਕਰੋ',
 'tog-editsectiononrightclick' => 'ਸੈਕਸ਼ਨ ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
 'tog-showtoc' => 'ਟੇਬਲ ਆਫ਼ ਕੰਨਟੈੱਟ ਵੇਖਾਓ (for pages with more than 3 headings)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
 'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਪੰਨੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪਾਓ',
-'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©\8bਧà©\87 à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿ਚ ਪਾਓ',
-'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¬à¨¦à¨²à©\87 à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 à¨µà¨¾à¨²à¨¼à©\87 à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿ਚ ਪਾਓ',
+'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©°à¨ªà¨¾à¨¦à¨¿à¨¤ à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±ਚ ਪਾਓ',
+'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à¨¥à¨¾à¨¨à¨¾à¨\82ਤਰਿਤ à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±ਚ ਪਾਓ',
 'tog-watchdeletion' => 'ਮੇਰੇ ਵਲੋਂ ਮਿਟਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
 'tog-minordefault' => 'ਸਾਰੇ ਫੇਰ-ਬਦਲਾਂ ’ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੀਆਂ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tog-previewontop' => 'ਐਡਿਟ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
@@ -671,7 +671,7 @@ Note that some pages may continue to be displayed as if you were still logged in
 'login-abort-generic' => 'ਤੁਹਾਡੀ ਲਾਗਇਨ ਨਾਕਾਮ ਸੀ - ਰੱਦ',
 'loginlanguagelabel' => 'ਭਾਸ਼ਾ: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => 'ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।',
 
 # Change password dialog
@@ -1170,7 +1170,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-advancedwatchlist' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-diffs' => 'ਫ਼ਰਕ',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ਈ-ਮੇਲ ਪਤਾ ਸਹੀ ਲਗਦਾ ਹੈ',
 'email-address-validity-invalid' => 'ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਾਖ਼ਲ ਕਰੋ',
 
@@ -1603,7 +1603,7 @@ to upload files.',
 'listgrouprights-addgroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਜੋੜੋ',
 'listgrouprights-removegroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਹਟਾਓ',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ਕੋਈ ਭੇਜਣ ਐਡਰੈੱਸ ਨਹੀਂ',
 'mailnologintext' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਹੋਣਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।',
 'emailuser' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
@@ -2119,7 +2119,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'monthsall' => 'ਸਭ',
 'limitall' => 'ਸਭ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ਈਮੇਲ ਐਡਰੈੱਸ ਪੁਸ਼ਟੀ',
 'confirmemail_send' => 'ਇੱਕ ਪੁਸ਼ਟੀ ਕੋਡ ਭੇਜੋ',
 'confirmemail_sent' => 'ਪੁਸ਼ਟੀ ਈਮੇਲ ਭੇਜੀ ਗਈ।',
index 2cea497..b6e650b 100644 (file)
@@ -432,6 +432,7 @@ $messages = array(
 'newwindow' => '(otwiera się w nowym oknie)',
 'cancel' => 'Anuluj',
 'moredotdotdot' => 'Więcej...',
+'morenotlisted' => 'I inne...',
 'mypage' => 'Strona',
 'mytalk' => 'Dyskusja',
 'anontalk' => 'Dyskusja tego IP',
@@ -808,7 +809,7 @@ Odczekaj chwilę zanim ponowisz próbę.',
 'loginlanguagelabel' => 'Język: $1',
 'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
 'user-mail-no-addy' => 'Próba wysłania e‐maila bez adresu odbiorcy',
 'user-mail-no-body' => 'Próbowano wysłać e-mail o psutej lub krótkiej treści.',
@@ -1491,7 +1492,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'prefs-displaywatchlist' => 'Opcje wyświetlania',
 'prefs-diffs' => 'Zmiany',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Wygląda na prawidłowy',
 'email-address-validity-invalid' => 'Wymagany jest prawidłowy adres!',
 
@@ -2282,7 +2283,7 @@ Sprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informac
 'listgrouprights-addgroup-self-all' => 'Może dodać własne konto do wszystkich grup',
 'listgrouprights-removegroup-self-all' => 'Może usunąć własne konto ze wszystkich grup',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Brak adresu',
 'mailnologintext' => 'Musisz się [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres e‐mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysłać e‐mail do innego użytkownika.',
 'emailuser' => 'Wyślij e‐mail do tego użytkownika',
@@ -3136,6 +3137,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-robot-noindex' => 'Nieindeksowalne',
 'pageinfo-views' => 'Odsłon',
 'pageinfo-watchers' => 'Liczba obserwujących',
+'pageinfo-few-watchers' => 'Mniej niż $1 {{PLURAL:$1|obserwujący|obserwujących}}',
 'pageinfo-redirects-name' => 'Liczba przekierowań do tej strony',
 'pageinfo-subpages-name' => 'Liczba podstron tej strony',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})',
@@ -3691,7 +3693,7 @@ Pozostałe pola zostaną domyślnie ukryte.
 'monthsall' => 'wszystkie',
 'limitall' => 'wszystkie',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potwierdzanie adresu e‐mail',
 'confirmemail_noemail' => 'Nie podał{{GENDER:|eś|aś|eś/aś}} prawidłowego adresu e‐mail w [[Special:Preferences|preferencjach]].',
 'confirmemail_text' => 'Projekt {{SITENAME}} wymaga weryfikacji adresu e‐mail przed użyciem funkcji korzystających z poczty.
@@ -4144,4 +4146,7 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'duration-centuries' => '$1 {{PLURAL:$1|stulecie|stulecia|stuleci}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tysiąclecie|tysiąclecia|tysiącleci}}',
 
+# Image rotation
+'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
+
 );
index 3b701cd..ce32151 100644 (file)
@@ -533,6 +533,7 @@ $1',
 
 تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل <span class='plainlinks'>[$1 بيا غونډال ته ورننوځۍ]</span>.
 دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
+'welcomeuser' => '$1، ښه راغلې!',
 'yourname' => 'کارن-نوم:',
 'yourpassword' => 'پټنوم:',
 'yourpasswordagain' => 'پټنوم بيا وليکه',
@@ -621,7 +622,7 @@ $1',
 'login-abort-generic' => 'غونډال کې مو ننوتل نابريالی شو - ناڅاپي بند شو',
 'loginlanguagelabel' => 'ژبه: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => 'د يوې برېښليک پتې پرته د برېښليک لېږلو هڅه شوې.',
 
 # Change password dialog
@@ -1096,7 +1097,7 @@ $1',
 'prefs-displaywatchlist' => 'د ښکارېدنې خوښنې',
 'prefs-diffs' => 'توپيرونه',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'برېښليک پته سمه ښکاري',
 'email-address-validity-invalid' => 'يوه سمه برېښليک پته وليکۍ',
 
@@ -1601,7 +1602,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'خپل ګڼون کې ټولې ډلې ورګډول',
 'listgrouprights-removegroup-self-all' => 'خپل ګڼون نه ټولې ډلې ليري کول',
 
-# E-mail user
+# Email user
 'mailnologin' => 'هېڅ کومه لېږل شوې پته نشته',
 'emailuser' => 'کارن ته برېښليک لېږل',
 'emailuser-title-target' => 'دې {{GENDER:$1|کارن}} ته برېښليک لېږل',
@@ -2424,7 +2425,7 @@ $1',
 'monthsall' => 'ټول',
 'limitall' => 'ټول',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'د برېښليک پتې پخلی وکړی',
 'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
 'confirmemail_send' => 'يو تاييدي کوډ لېږل',
@@ -2614,7 +2615,7 @@ $5
 'specialpages-group-highuse' => 'ډېر کارېدونکي مخونه',
 'specialpages-group-pages' => 'د مخونو لړليک',
 'specialpages-group-pagetools' => 'د مخ اوزارونه',
-'specialpages-group-wiki' => 'ويکيډاټا او اوزارونه',
+'specialpages-group-wiki' => 'توکي او اوزارونه',
 
 # Special:BlankPage
 'blankpage' => 'تش مخ',
index 93cca94..73b7c2f 100644 (file)
@@ -388,7 +388,7 @@ $messages = array(
 'february' => 'fevereiro',
 'march' => 'março',
 'april' => 'abril',
-'may_long' => 'Maio',
+'may_long' => 'maio',
 'june' => 'junho',
 'july' => 'julho',
 'august' => 'agosto',
@@ -819,7 +819,7 @@ Aguarde antes de tentar novamente, por favor.',
 'loginlanguagelabel' => 'Língua: $1',
 'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
 
-# E-mail sending
+# Email sending
 '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 correio electrónico',
 
@@ -891,7 +891,7 @@ Palavra-chave temporária: $2',
 'extlink_sample' => 'http://www.example.com título da ligação',
 'extlink_tip' => 'Ligação externo (lembre-se do prefixo http://)',
 'headline_sample' => 'Texto do cabeçalho',
-'headline_tip' => 'Secção de nível 2',
+'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
 'nowiki_tip' => 'Ignorar formatação wiki',
 'image_sample' => 'Exemplo.jpg',
@@ -1511,13 +1511,13 @@ Esta informação será pública.',
 'prefs-displaywatchlist' => 'Opções de apresentação',
 'prefs-diffs' => 'Diferenças',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Parece válido',
 'email-address-validity-invalid' => 'Endereço válido necessário!',
 
 # User rights
 'userrights' => 'Privilégios dos utilizadores',
-'userrights-lookup-user' => 'Gerir grupos do utilizador',
+'userrights-lookup-user' => 'Gerir grupos de utilizadores',
 'userrights-user-editname' => 'Introduza um nome de utilizador:',
 'editusergroup' => 'Editar grupos do utilizador',
 'editinguser' => "A modificar os privilégios do utilizador '''[[User:$1|$1]]''' $2",
@@ -2303,7 +2303,7 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
 'listgrouprights-addgroup-self-all' => 'Adicionar a própria conta a todos os grupos',
 'listgrouprights-removegroup-self-all' => 'Remover a própria conta de todos os grupos',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Não existe endereço de envio',
 'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
 'emailuser' => 'Enviar correio electrónico a este utilizador',
@@ -3115,7 +3115,7 @@ Permite colocar uma justificação no resumo da edição.',
 'nocredits' => 'Não há informação disponível sobre os créditos desta página.',
 
 # Spam protection
-'spamprotectiontitle' => 'Filtro de protecção contra spam',
+'spamprotectiontitle' => 'Filtro de proteção contra spam',
 'spamprotectiontext' => "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.
 Este bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
 'spamprotectionmatch' => 'O seguinte texto activou o filtro de spam: $1',
@@ -3680,7 +3680,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
 'monthsall' => 'todos',
 'limitall' => 'tudo',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar endereço de correio electrónico',
 'confirmemail_noemail' => 'Não tem um endereço de correio electrónico válido nas suas [[Special:Preferences|preferências de utilizador]].',
 'confirmemail_text' => 'A {{SITENAME}} requer que valide o seu endereço de correio electrónico antes de usar as funcionalidades de correio.
index 4af987f..51107c8 100644 (file)
@@ -823,7 +823,7 @@ Por favor aguarde antes de tentar novamente.',
 'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
 'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de e-mail.',
 'user-mail-no-body' => 'Você tentou enviar com o campo de e-mail vazio ou com poucos caracteres.',
@@ -1007,7 +1007,7 @@ O registro de bloqueio mais recente é fornecido abaixo, para referência:',
 'userjspreview' => "'''Lembre-se que está apenas testando/prevendo o seu JavaScript particular e que ele ainda não foi salvo!'''",
 'sitecsspreview' => "'''Lembre-se de que você está apenas previsualizando este CSS.'''
 '''Ele ainda não foi salvo!'''",
-'sitejspreview' => "''Lembre-se de que você está apenas previsualizando este código JavaScript.'''
+'sitejspreview' => "'''Lembre-se de que você está apenas previsualizando este código JavaScript.'''
 '''Ele ainda não foi salvo!'''",
 'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e  .js utilizam um título em minúsculas, exemplo: {{ns:user}}:Alguém/vector.css aposto a {{ns:user}}:Alguém/Vector.css.",
 'updated' => '(Atualizado)',
@@ -1307,7 +1307,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'difference-title-multipage' => 'Mudanças entre as páginas "$1" e "$2"',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
-'compareselectedversions' => 'Compare as versões selecionadas',
+'compareselectedversions' => 'Comparar as versões selecionadas',
 'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
 'editundo' => 'desfazer',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
@@ -1508,7 +1508,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'prefs-displaywatchlist' => 'Opções de exibição',
 'prefs-diffs' => 'Diferenças',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Parece válido',
 'email-address-validity-invalid' => 'Forneça um endereço de e-mail válido',
 
@@ -2114,6 +2114,12 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
 Talvez fosse melhor que possuissem links para uma página mais específica.</br>
 Uma página é considerada como de desambiguação se utilizar uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Páginas com uma propriedade de página',
+'pageswithprop-legend' => 'Páginas com uma propriedade de página',
+'pageswithprop-text' => 'Esta página lista as páginas que usam uma determinada propriedade de página.',
+'pageswithprop-prop' => 'Nome da propriedade:',
+'pageswithprop-submit' => 'Ir',
+
 'doubleredirects' => 'Redirecionamentos duplos',
 'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
 Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
@@ -2255,7 +2261,7 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'special-categories-sort-abc' => 'ordenar alfabeticamente',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'Contribuições de usuário eliminadas',
+'deletedcontributions' => 'Edições eliminadas',
 'deletedcontributions-title' => 'Contribuições de usuário eliminadas',
 'sp-deletedcontributions-contribs' => 'contribuições',
 
@@ -2304,7 +2310,7 @@ Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] s
 'listgrouprights-addgroup-self-all' => 'Pode adicionar todos os grupos à própria conta',
 'listgrouprights-removegroup-self-all' => 'Pode remover todos os grupos da própria conta',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nenhum endereço de envio',
 'mailnologintext' => 'Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.',
 'emailuser' => 'Enviar-lhe um e-mail',
@@ -2512,7 +2518,7 @@ Esta é a configuração atual para a página '''$1''':",
 'protect-fallback' => 'Permitir apenas os usuários com privilégio de "$1"',
 'protect-level-autoconfirmed' => 'Permitir apenas usuários auto-confirmados',
 'protect-level-sysop' => 'Permitir apenas administradores',
-'protect-summary-cascade' => 'p. progressiva',
+'protect-summary-cascade' => 'em cascata',
 'protect-expiring' => 'expira em $1 (UTC)',
 'protect-expiring-local' => 'expira $1',
 'protect-expiry-indefinite' => 'indefinidamente',
@@ -2987,6 +2993,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
 'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
 'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
+'import-error-unserialize' => 'Revisão  $2  da página " $1 " não pôde ser desserializada. A revisão foi relatada para usar o modelo de conteúdo  $3  serializado como  $4',
 'import-options-wrong' => '{{PLURAL:$2|Opção com erro|Opções com erros}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
 'import-rootpage-nosubpage' => 'O espaço nominal $1 da página principal não permite subpáginas.',
@@ -3138,6 +3145,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
 'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-few-watchers' => 'Menos de  $1  {{PLURAL:$1|vigilante|vigilantes}}',
 'pageinfo-redirects-name' => 'Redirecionamentos para esta página',
 'pageinfo-subpages-name' => 'Subpáginas desta página',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})',
@@ -3684,7 +3692,7 @@ Por padrão, outros campos estarão ocultos.
 'monthsall' => 'todos',
 'limitall' => 'todas',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmar endereço de E-mail',
 'confirmemail_noemail' => 'Não possui um endereço de e-mail válido indicado nas suas [[Special:Preferences|preferências de usuário]].',
 'confirmemail_text' => '{{SITENAME}} requer o seu endereço de e-mail esteja validado antes de utilizar as funcionalidades que requerem um endereço de e-mail.
@@ -3823,7 +3831,7 @@ Tente a previsão comum.',
 'watchlistedit-normal-explain' => 'Os títulos das páginas de sua lista de vigiadas são exibidos abaixo.
 Para remover um título, marque a caixa ao lado do mesmo e clique "{{int:Watchlistedit-normal-submit}}".
 Você pode também [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].',
-'watchlistedit-normal-submit' => 'Remover Títulos',
+'watchlistedit-normal-submit' => 'Remover páginas',
 'watchlistedit-normal-done' => '{{PLURAL:$1|um título foi removido|$1 títulos foram removidos}} de sua lista de páginas vigiadas:',
 'watchlistedit-raw-title' => 'Edição crua da lista de páginas vigiadas',
 'watchlistedit-raw-legend' => 'Edição crua da lista de páginas vigiadas',
@@ -4069,6 +4077,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'api-error-ok-but-empty' => 'Erro interno: não há resposta do servidor.',
 'api-error-overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
 'api-error-stashfailed' => 'Erro interno: o servidor não conseguiu armazenar o arquivo temporário.',
+'api-error-publishfailed' => 'Erro interno: O servidor falhou ao publicar o arquivo temporário.',
 'api-error-timeout' => 'O servidor não respondeu dentro do tempo esperado.',
 'api-error-unclassified' => 'Ocorreu um erro desconhecido',
 'api-error-unknown-code' => 'Erro desconhecido: "$1"',
index 9c968ac..c39e9eb 100644 (file)
  * @author Usarker
  * @author Verdy p
  * @author Vinhtantran
+ * @author Vivaelcelta
  * @author Waldir
  * @author Whym
  * @author Yekrats
@@ -162,8 +163,11 @@ This is the toolbar: [[Image:Toolbar.png]]",
 'tog-editsectiononrightclick' => "[[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title. {{Gender}}",
 'tog-showtoc' => "[[Special:Preferences]], tab 'Misc'.
 Offers user to show a table of contents automatically if a page has more than 3 headings (= 4 or more headings).",
-'tog-rememberpassword' => "{{Identical|Remember my login on this computer}}[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details.  {{Gender}} Parameters:
-* $1 is the number of days the login details are remembered.",
+'tog-rememberpassword' => "{{Gender}}
+[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details.
+Parameters:
+* $1 - the number of days the login details are remembered
+{{Identical|Remember my login on this computer}}",
 'tog-watchcreations' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add created pages to watchlist. {{Gender}}",
 'tog-watchdefault' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add edited pages to watchlist. {{Gender}}",
 'tog-watchmoves' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add moved pages to watchlist. {{Gender}}",
@@ -223,8 +227,7 @@ This option means "underline links as in your user skin or your browser", there
 # Font style option in Special:Preferences
 'editfont-style' => 'Used in [[Special:Preferences]], tab Editing. {{Gender}}',
 'editfont-default' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}
-
-{{identical|Browser default}}',
+{{Identical|Browser default}}',
 'editfont-monospace' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
 'editfont-sansserif' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
 'editfont-serif' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
@@ -315,25 +318,36 @@ This option means "underline links as in your user skin or your browser", there
 'category-empty' => 'The text displayed in category page when that category is empty',
 'hidden-categories' => 'Used in the categories section of pages. Is followed by a colon and a list of categories.',
 'hidden-category-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where hidden categories will be listed.',
-'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category. Parameters:
-* $1: number of subcategories shown
-* $2: total number of subcategories in category',
-'category-subcat-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of subcategories shown',
+'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
+
+Parameters:
+* $1 - number of subcategories shown
+* $2 - total number of subcategories in category',
+'category-subcat-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of subcategories shown',
 'category-article-count' => 'This message is used on category pages. Parameters:
-* $1: number of pages shown
-* $2: total number of pages in category',
-'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of pages shown',
-'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category. Parameters:
-* $1: number of files shown
-* $2: total number of files in category',
-'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of files shown',
-'listingcontinuesabbrev' => 'Shown in contiuation of each first letter group.
+* $1 - number of pages shown
+* $2 - total number of pages in category',
+'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of pages shown',
+'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
+
+Parameters:
+* $1 - number of files shown
+* $2 - total number of files in category',
+'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of files shown',
+'listingcontinuesabbrev' => 'Shown in contiuation of each first letter group. This message follows the first letter.
+
 See http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.',
-'index-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
-'noindex-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
+'index-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
+'noindex-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
 'broken-file-category' => 'Name of [[mw:Help:Tracking categories|tracking category]] where pages that embed files that do not exist ("broken images") are listed.',
 'categoryviewer-pagedlinks' => '{{Optional}}
 The pagination links in category viewer. Parameters:
@@ -437,7 +451,7 @@ This can also appear in the credits page if the credits feature is enabled,for e
 Used to identify the source of copied information.',
 'help' => 'General text (noun) used in the sidebar (by default).
 
-See also [[MediaWiki:Helppage/{{SUBPAGENAME}}|{{int:helppage}}]] and [[MediaWiki:Edithelp/{{SUBPAGENAME}}|{{int:edithelp}}]].
+See also {{msg-mw|Helppage}} and {{msg-mw|Edithelp}}.
 
 See also:
 * {{msg-mw|Help}}
@@ -453,16 +467,14 @@ See also:
 * {{msg-mw|Accesskey-search}}
 * {{msg-mw|Tooltip-search}}
 {{Identical|Search}}',
-'searchbutton' => 'The button you can see in the sidebar, below the search input box. The "Go" button is [[MediaWiki:Searcharticle/{{SUBPAGENAME}}]].
-
+'searchbutton' => 'The button you can see in the sidebar, below the search input box. The "Go" button is {{msg-mw|Searcharticle}}.
 {{Identical|Search}}',
 'go' => 'See also:
 * {{msg-mw|Go}}
 * {{msg-mw|Accesskey-search-go}}
 * {{msg-mw|Tooltip-search-go}}
 {{Identical|Go}}',
-'searcharticle' => 'Button description in the search menu displayed on every page. The "Search" button is [[MediaWiki:Searchbutton/{{SUBPAGENAME}}]].
-
+'searcharticle' => 'Button description in the search menu displayed on every page. The "Search" button is {{msg-mw|Searchbutton}}.
 {{Identical|Go}}',
 'history' => '{{Identical|Page history}}',
 'history_short' => 'Text used on the history tab.
@@ -564,16 +576,18 @@ See also:
 'viewtalkpage' => 'Used in Standard (a.k.a. Classic) skin as a link to talk page for all namespaces, in edit or history mode.',
 'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
 {{Identical|Otherlanguages}}',
-'redirectedfrom' => 'The text displayed when a certain page is redirected to another page.
-*<tt>$1</tt> contains the name of the page user came from.',
+'redirectedfrom' => 'The text displayed when a certain page is redirected to another page. Parameters:
+* $1 - the name of the page user came from',
 'redirectpagesub' => 'Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.
 
 {{Identical|Redirect page}}',
 'lastmodifiedat' => 'This message is shown below each page, in the footer with the logos and links.
-* $1: date
-* $2: time
 
-See also [[MediaWiki:Lastmodifiedatby/{{SUBPAGENAME}}]].',
+Parameters:
+* $1 - date
+* $2 - time
+See also:
+* {{msg-mw|Lastmodifiedatby}}',
 'viewcount' => 'Used as page-view counter.',
 'protectedpage' => "This message is displayed when trying to edit a page you can't edit because it has been protected.
 
@@ -585,7 +599,8 @@ This message is the title for the message {{msg-mw|protectedpagetext}}.",
 '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}}.
 
 {{Identical|Search}}',
-'view-pool-error' => 'Error message. $1 is probably unused.',
+'view-pool-error' => 'Error message. Parameters:
+* $1 - probably unused',
 'pool-timeout' => "Part of {{msg-mw|view-pool-error}}.
 
 For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
@@ -665,10 +680,9 @@ See also:
 
 'badaccess' => 'Title shown within page indicating unauthorized access.',
 'badaccess-group0' => 'Shown when you are not allowed to do something.',
-'badaccess-groups' => "Error message when you aren't allowed to do something.
-
-* $1 is a list of groups.
-* $2 is the number of groups.",
+'badaccess-groups' => "Error message when you aren't allowed to do something. Parameters:
+* $1 - a list of groups
+* $2 - the number of groups",
 
 'versionrequired' => 'This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions. See also {{msg|versionrequiredtext}}.',
 'versionrequiredtext' => 'This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions. See also {{msg|versionrequired}}.',
@@ -681,7 +695,10 @@ Do '''not''' replace SITENAME with a translation of Wikipedia or some encycopedi
 'backlinksubtitle' => '{{optional}}
 Appears in subtitle
 * $1 is 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. $1 is a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}.',
+'retrievedfrom' => 'Message which appears in the source of every page, but it is hidden. It is shown when printing.
+
+Parameters:
+* $1 - a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}',
 'youhavenewmessages' => 'The yellow message appearing when someone edited your user talk page.
 The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslink/{{SUBPAGENAME}}|{{int:newmessageslink}}]] |[[MediaWiki:Newmessagesdifflink/{{SUBPAGENAME}}|{{int:newmessagesdifflink}}]]}}"',
 'newmessageslink' => 'This is the first link displayed in an orange rectangle when a user gets a message on his talk page.
@@ -693,14 +710,17 @@ Used in message {{msg-mw|youhavenewmessages}} (as parameter $1).
 
 See also:
 * {{msg-mw|Newmessagesdifflinkplural}}',
-'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
-The message takes three parameters;
-*$1 {{msg-mw|newmessageslinkplural}},
-*$2 {{msg-mw|newmessagesdifflinkplural}}, and
-*$3 the number of authors who have edited the talk page since the owning user last viewed it.',
-'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to{{msg-mw|youhavenewmessages}}. Parameters:
-* $1 is {{msg-mw|newmessageslinkplural}},
-* $2 is  {{msg-mw|newmessagesdifflinkplural}}.',
+'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Parameters:
+* $1 - defined as {{msg-mw|newmessageslinkplural}}
+* $2 - defined as {{msg-mw|newmessagesdifflinkplural}}
+* $3 - the number of authors who have edited the talk page since the owning user last viewed it',
+'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
+
+Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to {{msg-mw|youhavenewmessages}}.
+
+Parameters:
+* $1 - {{msg-mw|newmessageslinkplural}}
+* $2 - {{msg-mw|newmessagesdifflinkplural}}',
 'newmessageslinkplural' => 'Like {{msg-mw|newmessageslink}} but supporting pluralization. Used in message {{msg-mw|youhavenewmessagesfromusers}} (as parameter $1).
 This message itself takes one parameter, $1, which is 1 if there was one new edit, or 2 if there was more than one new edit
 since the last time the user has seen his or her talk page.',
@@ -736,7 +756,8 @@ The format is: "{{int:youhavenewmessagesmulti| [[MediaWiki:Newmessageslink/{{SUB
 This is the link used to collapse a collapsible element. (used as plaintext. No wikitext or html is parsed.)
 
 See also:
-* {{msg-mw|Collapsible-expand}}',
+* {{msg-mw|Collapsible-expand}}
+{{Identical|Collapse}}',
 'collapsible-expand' => '{{Doc-actionlink}}
 This is the link used to expand a collapsible element (used as plaintext. No wikitext or html is parsed.)
 
@@ -759,12 +780,16 @@ View or restore <nowiki>{{PLURAL:$1|one deleted edit|$1 deleted edits}}</nowiki>
 'feed-invalid' => 'Result of check whether feed type is valid or not.',
 'feed-unavailable' => 'This message is displayed when a user tries to use an RSS or Atom feed on a wiki where such feeds have been disabled.',
 'site-rss-feed' => "Used in the HTML header of a wiki's RSS feed.
-$1 is <nowiki>{{SITENAME}}</nowiki>.
 HTML markup cannot be used.
+
+Parameters:
+* $1 - <nowiki>{{SITENAME}}</nowiki>
 {{Identical|S1 RSS/Atom feed}}",
 'site-atom-feed' => "Used in the HTML header of a wiki's Atom feed.
-$1 is <nowiki>{{SITENAME}}</nowiki>.
 HTML markup cannot be used.
+
+Parameters:
+* $1 - <nowiki>{{SITENAME}}</nowiki>
 {{Identical|S1 RSS/Atom feed}}",
 'page-rss-feed' => '{{Identical|S1 RSS/Atom feed}}',
 'page-atom-feed' => '{{Identical|S1 RSS/Atom feed}}',
@@ -880,33 +905,32 @@ This error is shown when trying to open a special page which does not exist, e.g
 'readonly' => 'Used as title of error message when database is locked.',
 'enterlockreason' => 'For developers when locking the database',
 'readonlytext' => 'Used as error message when the database is locked.',
-'missing-article' => "This message is shown when a revision does not exist, either as permalink or as diff. Examples:
-
+'missing-article' => 'This message is shown when a revision does not exist, either as permalink or as diff. Examples:
 # [{{canonicalurl:Project:News|oldid=9999999}} Permalink with invalid revision#]
 # [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
-
-'''Parameters'''
-* $1: Pagename
-* $2: Content of
+Parameters:
+* $1 - Pagename
+* $2 - Content of
 *# {{msg-mw|Missingarticle-rev}} - Permalink with invalid revision#
-*# {{msg-mw|Missingarticle-diff}} - Diff with invalid revision#",
+*# {{msg-mw|Missingarticle-diff}} - Diff with invalid revision#',
 'missingarticle-rev' => 'Parameter $2 of {{msg-mw|Missing-article}}: It is shown after the articlename.
 
-* $1: revision# of the requested id
+Parameters:
+* $1 - revision# of the requested id
 
 [{{canonicalurl:Translating:Tasks|oldid=371789000}} Click here] to see an example of such an error message.',
 'missingarticle-diff' => 'Parameter $2 of {{msg-mw|Missing-article}}: It is shown after the articlename.
 
-* $1: revision# of the old id
-* $2: revision# of the id build the diff with.
+Parameters:
+* $1 - revision# of the old id
+* $2 - revision# of the id build the diff with
 
 [{{canonicalurl:Translating:Tasks|diff=372398&oldid=371789000}} Click here] to see an example of such an error message.',
 'readonly_lag' => 'Error message displayed when the database is locked.',
 'internalerror' => '{{Identical|Internal error}}',
 'internalerror_info' => '* $1 - error message',
-'fileappenderrorread' => '"Append" is a computer procedure, explained on [[w:Append|Wikipedia]].
-
-$1 is a filename, I think.',
+'fileappenderrorread' => '"Append" is a computer procedure, explained on [[w:Append|Wikipedia]]. Parameters:
+* $1 - probably filename',
 'fileappenderror' => 'Parameters:
 * $1 - file name
 * $2 - file name',
@@ -930,8 +954,8 @@ See also:
 * {{msg-mw|Bad-target-model}}',
 'cannotdelete' => 'Error message in deleting. Parameters:
 * $1 - page name or file name',
-'cannotdelete-title' => 'Title of error page when the user cannot delete a page
-* $1 is the page name',
+'cannotdelete-title' => 'Title of error page when the user cannot delete a page. Parameters:
+* $1 - the page name',
 'delete-hook-aborted' => 'Error message shown when an extension hook prevents a page deletion, but does not provide an error message.',
 'badtitle' => 'The page title when a user requested a page with invalid page name. The content will be {{msg-mw|badtitletext}}.',
 'badtitletext' => 'The message shown when a user requested a page with invalid page name. The page title will be {{msg-mw|badtitle}}.
@@ -941,13 +965,15 @@ See also:
 * {{msg-mw|immobile-source-namespace}}
 * {{msg-mw|immobile-target-namespace-iw}}
 * {{msg-mw|immobile-target-namespace}}',
-'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen). Parameters:
-* $1 is the max result cut off ($wgQueryCacheLimit)',
+'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen).
+
+Parameters:
+* $1 - the max result cut off ($wgQueryCacheLimit)',
 'perfcachedts' => 'Used on pages that list page lists for which the displayed data is cached. Parameters:
-* $1 is a time stamp (date and time combined)
-* $2 is a date (optional)
-* $3 is a time (optional)
-* $4 is the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
+* $1 - a time stamp (date and time combined)
+* $2 - a date (optional)
+* $3 - a time (optional)
+* $4 - the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
 'querypage-no-updates' => 'Text on some special pages, e.g. [[Special:FewestRevisions]].',
 'wrong_wfQuery_params' => 'Used as error message.',
 'viewsource' => 'The text displayed in place of the {{msg-mw|Edit}} tab when the user has no permission to edit the page.
@@ -957,8 +983,8 @@ See also:
 * {{msg-mw|Accesskey-ca-viewsource}}
 * {{msg-mw|Tooltip-ca-viewsource}}
 {{Identical|View source}}',
-'viewsource-title' => 'Page title shown when trying to edit a protected page.
-* $1 is the name of the page',
+'viewsource-title' => 'Page title shown when trying to edit a protected page. Parameters:
+* $1 - the name of the page',
 'actionthrottled' => 'This is the title of an error page. Read it in combination with {{msg-mw|actionthrottledtext}}.',
 'actionthrottledtext' => 'Used as error message. Read it in combination with {{msg-mw|actionthrottled}}.',
 'protectedpagetext' => "This message is displayed when trying to edit a page you can't edit because it has been protected.
@@ -986,12 +1012,14 @@ See also {{msg-mw|protectedinterface}}.',
 * $2 - file repository name
 * $3 - reason',
 'invalidtitle-knownnamespace' => 'Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.
-* $1 is the namespace number
-* $2 is the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
-* $3 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
-'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.
-* $1 is the namespace number
-* $2 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+
+Parameters:
+* $1 - the namespace number
+* $2 - the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
+* $3 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown. Parameters:
+* $1 - the namespace number
+* $2 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
 'exception-nologin' => 'Generic page title used on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.
 {{Identical|Not logged in}}',
 'exception-nologin-text' => 'Generic reason displayed on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
@@ -1003,14 +1031,12 @@ See also {{msg-mw|protectedinterface}}.',
 'virus-unknownscanner' => 'Used as error message. This message is followed by the virus scanner name.',
 
 # Login and logout pages
-'logouttext' => 'Log out message
-* $1 is an URL to [[Special:Userlogin]] containing returnto and returntoquery parameters',
+'logouttext' => 'Log out message. Parameters:
+* $1 - an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters',
 'welcomeuser' => 'Text for a welcome heading that users see after registering a user account. $1 is the username of the new user. See [[bugzilla:42215]]',
 'welcomecreation-msg' => 'A welcome message users see after registering a user account, following a welcomeuser heading. $1 is the username of the new user. Replaces welcomecreation in 1.21wmf5,see [[bugzilla:42215]]',
-'yourname' => "In user preferences
-
-<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.
-
+'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
+In user preferences.
 {{Identical|Username}}",
 'yourpassword' => 'In user preferences
 
@@ -1031,7 +1057,7 @@ See also:
 * {{msg-mw|Tooltip-pt-anonlogin}}
 {{Identical|Log in}}",
 'nav-login-createaccount' => "Shown to anonymous users in the upper right corner of the page. When you can't create an account, the message {{msg-mw|login}} is shown.
-{{identical|Log in / create account}}",
+{{Identical|Log in / create account}}",
 'loginprompt' => 'A small notice in the log in form.',
 'userlogin' => 'Name of special page [[Special:UserLogin]] where a user can log in or click to create a user account.
 {{Identical|Log in / create account}}',
@@ -1050,8 +1076,9 @@ See also:
 'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
 
 {{Identical|Not logged in}}',
-'nologin' => 'A message shown in the log in form. $1 is a link to the account creation form, and the text of it is "[[MediaWiki:Nologinlink/{{SUBPAGENAME}}|{{int:nologinlink}}]]".',
-'nologinlink' => 'Text of the link to the account creation form. Before that link, the message [[MediaWiki:Nologin/{{SUBPAGENAME}}]] appears.
+'nologin' => 'A message shown in the log in form. Parameters:
+* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}',
+'nologinlink' => 'Text of the link to the account creation form. Before that link, the message {{msg-mw|Nologin}} appears.
 {{Identical|Create an account}}',
 'createaccount' => 'The title of [[Special:CreateAccount]], where users can register a new account. Used on [[Special:SpecialPages]] and on the submit button in the form where you register a new account.
 
@@ -1059,8 +1086,7 @@ It is also used on the top of the page for logged out users, where it appears ne
 {{Identical|Create account}}',
 'gotaccount' => 'A message shown in the account creation form.
 * $1 - a link to the log in form, and the text of it is {{msg-mw|Gotaccountlink}}',
-'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message [[MediaWiki:Gotaccount/{{SUBPAGENAME}}]] appears.
-
+'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
 {{Identical|Log in}}',
 'userlogin-resetlink' => 'Used on the login page.',
 'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
@@ -1080,9 +1106,11 @@ Defaults to '''nocookieslogin''' ({{int:nocookieslogin}})",
 'noname' => 'Error message.',
 'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.
 {{Identical|Login successful}}',
-'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is "[[MediaWiki:Loginsuccesstitle/{{SUBPAGENAME}}|{{int:loginsuccesstitle}}]]". $1 is the name of the logged in user.
+'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is {{msg-mw|Loginsuccesstitle}}.
 
-<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is supported.',
+Parameters:
+* $1 - the name of the logged in user
+{{Gender}}',
 'nosuchuser' => 'Displayed when trying to log in with an unexisting username. When you are not allowed to create an account, the message {{msg-mw|nosuchusershort}} is displayed.',
 'nosuchusershort' => "Displayed when trying to log in with a non-existant username. This message is only shown when you can't create an account, otherwise the message {{msg-mw|nosuchusershort}} is displayed.",
 'nouserspecified' => 'Used as error message when username to fetch is not specified.',
@@ -1117,13 +1145,15 @@ Parameters:
 * $1 - password reminder resend time (in hours)',
 'mailerror' => 'Used as error message in sending confirmation mail to user. Parameters:
 * $1 - new mail address',
-'acct_creation_throttle_hit' => 'Errormessage at [[Special:CreateAccount]].
+'acct_creation_throttle_hit' => 'Error message at [[Special:CreateAccount]].
+
 "in the last day" precisely means: during the lasts 86400 seconds (24 hours) ending right now.',
 'emailauthenticated' => 'In user preferences ([[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}) and on [[Special:ConfirmEmail]].
 
-* $1: obsolete, date and time
-* $2: date
-* $3: time',
+Parameters:
+* $1 - obsolete, date and time
+* $2 - date
+* $3 - time',
 'emailnotauthenticated' => 'Message in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. It appears after saving your e-mail address but before it has been authenticated.',
 'noemailprefs' => "Message appearing in the 'E-mail options' section of the 'User profile' page in [[Special:Preferences|Preferences]], when no user e-mail address has been entered.",
 'emailconfirmlink' => 'Link to [[Special:ConfirmEmail]]. Appears in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}} after saving your e-mail address but before it has been authenticated.',
@@ -1152,7 +1182,7 @@ See also:
 {{Identical|Language}}',
 'suspicious-userlogout' => 'Used when the logout request looks suspicious, in Special:UserLogout.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
 'user-mail-no-addy' => 'This is the error message in case an e-mail could not be sent because there was no e-mail address to send it to.',
 'user-mail-no-body' => 'This is the error message in case an e-mail has an empty or unreasonably short body',
@@ -1176,9 +1206,8 @@ See also:
 'resetpass-submit-loggedin' => 'Button on [[Special:ResetPass]] to submit new password.
 
 {{Identical|Change password}}',
-'resetpass-submit-cancel' => '{{Identical|Cancel}}
-
-Used on [[Special:ResetPass]]',
+'resetpass-submit-cancel' => 'Used on [[Special:ResetPass]].
+{{Identical|Cancel}}',
 'resetpass-wrong-oldpass' => 'Error message shown on [[Special:ChangePassword]] when the old password is not valid.',
 'resetpass-temp-password' => 'The label of the input box for the temporary password (received by e-mail) on the form displayed after logging in with a temporary password.',
 
@@ -1212,8 +1241,8 @@ Parameters:
 * $3 - the number of repetitions in $2
 * $4 - base URL of the wiki',
 'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password. Parameters:
-* $1 will be the user's login name. This parameter can be used for GENDER.
-* $2 will be the temporary password given by the system.",
+* $1 - the user's login name. This parameter can be used for GENDER.
+* $2 - the temporary password given by the system",
 'passwordreset-emailsent' => 'Used in [[Special:PasswordReset]].
 
 See also:
@@ -1260,9 +1289,8 @@ See also:
 
 {{Identical|Italic text}}',
 'link_sample' => 'This is the default text in the internal link that is created when you press the third button from the left on the edit toolbar (the "Ab" icon).',
-'link_tip' => '{{Identical|Internal link}}
-
-Tip for internal links',
+'link_tip' => 'Tip for internal links.
+{{Identical|Internal link}}',
 'extlink_sample' => 'This message appears when clicking on the fourth button of the edit toolbar. You can translate "link title". Because many of the localisations had urls that went to domains reserved for advertising, it is recommended that the link is left as-is. All customised links were replaced with the standard one, that is reserved in the standard and will never have ads or something.',
 'extlink_tip' => 'This is the tip that appears when you hover the mouse over the fourth button from the left on the edit toolbar.
 
@@ -1349,28 +1377,24 @@ Should match: {{msg-mw|summary}}.',
 'blockedtitle' => 'Used as title displayed for blocked users. The corresponding message body is one of the following messages:
 * {{msg-mw|Blockedtext|notext=1}}
 * {{msg-mw|Autoblockedtext|notext=1}}',
-'blockedtext' => 'Text displayed to blocked users.
-
-Parameters:
-* <tt>$1</tt> is the blocking sysop (with a link to his/her userpage)
-* <tt>$2</tt> is the reason for the block
-* <tt>$3</tt> is the current IP address of the blocked user
-* <tt>$4</tt> is the blocking sysop’s username (plain text, without the link)
-* <tt>$5</tt> is the unique numeric identifier of the applied autoblock
-* <tt>$6</tt> is the expiry of the block
-* <tt>$7</tt> is the intended target of the block (what the blocking user specified in the blocking form)
-* <tt>$8</tt> is the timestamp when the block started',
-'autoblockedtext' => 'Text displayed to automatically blocked users.
-
-Parameters:
-* <tt>$1</tt> is the blocking sysop (with a link to his/her userpage)
-* <tt>$2</tt> is the reason for the block
-* <tt>$3</tt> is the current IP address of the blocked user
-* <tt>$4</tt> is the blocking sysop’s username (plain text, without the link). Use it for GENDER.
-* <tt>$5</tt> is the unique numeric identifier of the applied autoblock
-* <tt>$6</tt> is the expiry of the block
-* <tt>$7</tt> is the intended target of the block (what the blocking user specified in the blocking form)
-* <tt>$8</tt> is the timestamp when the block started',
+'blockedtext' => "Text displayed to blocked users. Parameters:
+* $1 - the blocking sysop (with a link to his/her userpage)
+* $2 - the reason for the block
+* $3 - the current IP address of the blocked user
+* $4 - the blocking sysop's username (plain text, without the link)
+* $5 - the unique numeric identifier of the applied autoblock
+* $6 - the expiry of the block
+* $7 - the intended target of the block (what the blocking user specified in the blocking form)
+* $8 - the timestamp when the block started",
+'autoblockedtext' => "Text displayed to automatically blocked users. Parameters:
+* $1 - the blocking sysop (with a link to his/her userpage)
+* $2 - the reason for the block
+* $3 - the current IP address of the blocked user
+* $4 - the blocking sysop's username (plain text, without the link). Use it for GENDER.
+* $5 - the unique numeric identifier of the applied autoblock
+* $6 - the expiry of the block
+* $7 - the intended target of the block (what the blocking user specified in the blocking form)
+* $8 - the timestamp when the block started",
 'blockednoreason' => 'Substituted with <code>$2</code> in the following message if the reason is not given:
 * {{msg-mw|cantcreateaccount-text}}.
 {{Identical|No reason given}}',
@@ -1558,15 +1582,15 @@ See also:
 * {{msg-mw|edit-gone-missing}}
 * {{msg-mw|edit-conflict}}
 * {{msg-mw|edit-no-change}}',
-'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking “Show changes” when creating a new page in the MediaWiki: namespace',
+'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking "Show changes" when creating a new page in the MediaWiki: namespace',
 'content-failed-to-parse' => "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.
 *$1 – content model ({{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}})
 *$2 – content format as MIME type (e.g. <tt>text/css</tt>)
 *$3 – specific error message",
 '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.
-* $1 is 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}}
-* $2 is the title of the page in question.',
+* $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}}
+* $2 - the title of the page in question',
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -1622,20 +1646,16 @@ See also:
 * {{msg-mw|Post-expand-template-argument-warning}}',
 'parser-template-loop-warning' => '* $1 - page title',
 'parser-template-recursion-depth-warning' => '* $1 - limit value of recursion depth',
-'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
-
-* <tt>$1</tt> is the value of the depth limit',
+'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax. Parameters:
+* $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.',
-'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor
-
-* <tt>$1</tt> is the value of the node-count limit
-* <tt>$2</tt> is the value of the max node-count limit',
+'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor. Parameters:
+* $1 - the value of the node-count limit
+* $2 - the value of the max node-count limit',
 'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [[meta:Help:Expansion_depth|expansion depth]] of the preprocessor exceeds the limit.',
-'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor.
-
-Parameters:
-* <tt>$1</tt> is the value of the depth limit
-* <tt>$2</tt> is the value of the max depth limit',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor. Parameters:
+* $1 - the value of the depth limit
+* $2 - the value of the max depth limit',
 'parser-unstrip-loop-warning' => '{{Doc-important|Do not translate function name "<code>unstrip</code>".}}
 This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
 
@@ -1695,17 +1715,18 @@ See the error message:
 * $2 is a date (optional)
 * $3 is a time (optional)',
 'revisionasof' => 'Used on a difference page when comparing different versions of a page or when viewing an non-current version of a page. See {{msg-mw|Currentrev-asof}} for the message for the current version.
-* $1 is the date/time at which the revision was created. Example: "\'\'Revision as of 14:44, 24 January 2008\'\'".
-* $2 is the date at which the revision was created.
-* $3 is the time at which the revision was created.',
+* $1 - the date/time at which the revision was created. Example: "\'\'Revision as of 14:44, 24 January 2008\'\'".
+* $2 - the date at which the revision was created
+* $3 - the time at which the revision was created',
 'revision-info' => 'Appears just below the page title when an old version of the page is being viewed.
 
-* $1: date and time of revision
-* $2: a series of links: to author of the revision, his talk page, etc.
-* (optional) $3: revision ID
-* (optional) $4: date of revision
-* (optional) $5: time of revision
-* (optional) $6: author of revision, for GENDER use',
+Parameters:
+* $1 - date and time of revision
+* $2 - a series of links: to author of the revision, his talk page, etc.
+* $3 - (Optional) revision ID
+* $4 - (Optional) date of revision
+* $5 - (Optional) time of revision
+* $6 - (Optional) author of revision, for GENDER use',
 'previousrevision' => 'See also:
 * {{msg-mw|Nextrevision}}',
 'nextrevision' => 'See also:
@@ -1795,13 +1816,13 @@ It is the page title of [[Special:RevisionDelete]].',
 'revdelete-nologid-text' => 'See also:
 * {{msg-mw|Revdelete-nologid-title}}',
 'revdelete-no-file' => 'Used as error message in [[Special:RevisionDelete]].',
-'revdelete-show-file-confirm' => 'A confirmation message shown on Special:Revisiondelete when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
+'revdelete-show-file-confirm' => 'A confirmation message shown on [[Special:Revisiondelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
 
-* <code>$1</code> is a file name
-* <code>$2</code> is a date
-* <code>$3</code> is a time
-
-{{identical|Are you sure you want to view the deleted revision of the file...}}',
+Parameters:
+* $1 - a file name
+* $2 - a date
+* $3 - a time
+{{Identical|Are you sure you want to view the deleted revision of the file...}}',
 'revdelete-show-file-submit' => 'Reply to {{msg-mw|Revdelete-show-file-confirm}}.
 
 {{Identical|Yes}}',
@@ -2115,8 +2136,8 @@ This message has sometimes a tooltip {{msg-mw|tooltip-undo}}
 *Parameter $1 is the number of revisions
 *Parameter $2 is the number of distinct users who made those revisions",
 'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users. Parameters:
-* $1 is the number of revisions, will always be 101 or more.
-* $2 is the number of users that were found, which was limited at 100.",
+* $1 - the number of revisions, will always be 101 or more
+* $2 - the number of users that were found, which was limited at 100",
 'difference-missing-revision' => 'Text displayed when the requested revision does not exist using a diff link.
 
 Example: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
@@ -2234,8 +2255,8 @@ See also:
 * {{msg-mw|Searchprofile-advanced|message}}
 * {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}',
 'search-result-size' => 'Shown per line of a [[Special:Search|search result]]
-* $1 is the size of the page in bytes, but no need to add "byte" or similar as the unit is added by special function.
-* $2 is the sum of all words in this page.',
+* $1 - the size of the page in bytes, but no need to add "byte" or similar as the unit is added by special function
+* $2 - the sum of all words in this page',
 'search-result-category-size' => '* $1 - number of members in this category. $1 is equal to $2+$3.
 * $2 - number of subcategories
 * $3 - number of files',
@@ -2254,13 +2275,13 @@ $1 is the relevance of this result in per cent.
 'search-relatedarticle' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
 {{Identical|Related}}',
 'mwsuggest-disable' => "The text of an option on the 'search options' tab of a user's Preferences.",
-'searcheverything-enable' => 'Used in [[Special:Preferences]], tab “Search”.',
+'searcheverything-enable' => 'Used in [[Special:Preferences]], tab "Search".',
 'searchrelated' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
 {{Identical|Related}}',
 'searchall' => '{{Identical|All}}',
 'showingresults' => 'This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:
-*$1 is the total number of results in the batch shown.
-*$2 is the number of the first item listed.
+* $1 - the total number of results in the batch shown
+* $2 - the number of the first item listed
 See also:
 * {{msg-mw|Showingresultsnum}}',
 'showingresultsnum' => 'Parameters:
@@ -2416,8 +2437,8 @@ This option lets your time zone setting use the one that is used on the wiki (of
 {{Related|Timezoneregion}}',
 'allowemail' => 'Used in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
 'prefs-searchoptions' => '{{Identical|Search}}',
-'prefs-namespaces' => "{{Identical|Namespaces}}
-Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]",
+'prefs-namespaces' => "Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]
+{{Identical|Namespaces}}",
 'defaultns' => 'Used in [[Special:Preferences]], tab "Search".',
 'default' => '{{Identical|Default}}',
 'prefs-files' => 'Title of a tab in [[Special:Preferences]].
@@ -2524,7 +2545,7 @@ Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
 * {{msg-mw|Prefs-watchlist-edits}}',
 'prefs-diffs' => 'Used in [[Special:Preferences]], tab "Misc".',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.',
 'email-address-validity-invalid' => 'Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.',
 
@@ -2545,14 +2566,14 @@ Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
 'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
 
 Parameters:
-* $1 - the number of items in the list following the message, for PLURAL.
-* $2 - the user name, for GENDER.',
+* $1 - the number of items in the list following the message, for PLURAL
+* $2 - the user name, for GENDER',
 'userrights-groupsmember-auto' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
 "Implicit" is for groups that the user was automatically added to (such as "autoconfirmed"); cf. {{msg-mw|userrights-groupsmember}}
 
 Parameters
-* $1 - the number of items in the list following the message, for PLURAL.
-* $2 - the user name, for GENDER.',
+* $1 - the number of items in the list following the message, for PLURAL
+* $2 - the user name, for GENDER',
 'userrights-groupsmember-type' => '{{optional}}
 Parameters:
 * $1 is list of group names.
@@ -3163,7 +3184,7 @@ See also:
 * {{msg-mw|http-invalid-url}}
 * {{msg-mw|upload-copy-upload-invalid-domain}}
 * {{msg-mw|tmp-create-error}}',
-'large-file' => 'Variables $1 and $2 have appropriate unit symbols already. See for example [[Mediawiki:size-kilobytes]].',
+'large-file' => 'Variables $1 and $2 have appropriate unit symbols already. See for example {{msg-mw|Size-kilobytes}}.',
 'largefileserver' => 'Error message when uploading a file whose size is larger than the maximum allowed',
 'emptyfile' => 'Error message when trying to upload an empty file',
 'windows-nonascii-filename' => 'Used as error message when uploading a file.
@@ -3378,14 +3399,14 @@ See also:
 'backend-fail-alreadyexists' => 'Parameters:
 * $1 is a filename.',
 'backend-fail-store' => 'Parameters:
-* $1 is a filename
-* $2 is a storage path.',
+* $1 - a filename
+* $2 - a storage path',
 'backend-fail-copy' => 'Parameters:
-* $1 is a file path
-* $2 is a file path.',
+* $1 - a file path
+* $2 - a file path',
 'backend-fail-move' => 'Parameters:
-* $1 is a file path
-* $2 is a file path.',
+* $1 - a file path
+* $2 - a file path',
 'backend-fail-opentemp' => 'Used as error message.
 {{Related|Backend-fail}}',
 'backend-fail-writetemp' => 'Used as error message.
@@ -3406,8 +3427,8 @@ See also:
 'backend-fail-contenttype' => '$1 is a storage (file) path',
 'backend-fail-batchsize' => 'Error message when the limit of operations to be done at once in the file backend was reached.
 Parameters:
-* $1 is the number of operations attempted at once in this case.
-* $2 is the maximum number of operations that can be attempted at once.
+* $1 - the number of operations attempted at once in this case
+* $2 - the maximum number of operations that can be attempted at once
 
 A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
 'backend-fail-usable' => 'Parameters:
@@ -3558,13 +3579,15 @@ See also:
 * {{msg-mw|Upload-curl-error28|title}}
 * {{msg-mw|Upload-curl-error28-text|body}}',
 
-'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.',
+'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.
+{{Identical|Licensing}}',
 'license-header' => 'Used as section header in [[Special:Upload]].
 
 See also:
 * {{msg-mw|Filedesc}}
 * {{msg-mw|Filestatus}}
-* {{msg-mw|Filesource}}',
+* {{msg-mw|Filesource}}
+{{Identical|Licensing}}',
 'nolicense' => '{{Identical|None selected}}',
 'license-nopreview' => 'Error message when a certain license does not exist',
 'upload_source_url' => 'Used in [[Special:Upload]].
@@ -3644,19 +3667,21 @@ Example: [[:Image:Addon-icn.png]]',
 * Parameter $1 is the number of pages that link to the file/image.',
 'linkstoimage-more' => 'Shown on an image description page when a file is used/linked more than 100 times on other pages.
 
-* $1: limit. At the moment hardcoded at 100
-* $2: filename',
+Parameters:
+* $1 - limit. At the moment hardcoded at 100
+* $2 - filename',
 'nolinkstoimage' => 'Displayed on image description pages, see for exampe [[:Image:Tournesol.png#filelinks]].',
 'morelinkstoimage' => '{{doc-important|Do not translate "Special:WhatLinksHere"}}
 Parameters:
 * $1 - page title',
 'linkstoimage-redirect' => 'Item in the "the following pages link to this file" section on a file page if the item is a redirect.
-* $1: an HTML link to the file
-* $2: the list of files that link to the redirect (may be empty)',
-'duplicatesoffile' => 'Shown on file description pages when a file is duplicated
 
-* $1: Number of identical files
-* $2: Name of the shown file to link to the special page "FileDuplicateSearch"',
+Parameters:
+* $1 - an HTML link to the file
+* $2 - the list of files that link to the redirect (may be empty)',
+'duplicatesoffile' => 'Shown on file description pages when a file is duplicated. Parameters:
+* $1 - Number of identical files
+* $2 - Name of the shown file to link to the special page [[Special:FileDuplicateSearch]]',
 'sharedupload' => 'Shown on an image description page when it is used in a central repository (i.e. [[commons:|Commons]] for Wikimedia wikis).
 
 * $1 is the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|shared-repo-name-shared}}. The default value for $1 is {{msg-mw|shared-repo}}.
@@ -3837,9 +3862,8 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 'statistics-users' => '{{doc-important|Do not translate "Special:ListUsers"}}
 Used in [[Special:Statistics]].',
 'statistics-users-active' => 'Used in [[Special:Statistics]]',
-'statistics-users-active-desc' => "Description shown beneath ''Active users'' in [[Special:Statistics]]
-
-* \$1: Value of \$wgRCMaxAge in days",
+'statistics-users-active-desc' => "Description shown beneath ''Active users'' in [[Special:Statistics]]. Parameters:
+* \$1 - Value of <code>\$wgRCMaxAge</code> in days",
 'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
 
 'disambiguations' => 'Name of a special page displayed in [[Special:SpecialPages]].',
@@ -3851,11 +3875,15 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 \'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
 
-'pageswithprop'         => 'Title for [[Special:PagesWithProp]]',
-'pageswithprop-legend'  => 'Legend for the input form on [[Special:PagesWithProp]]',
-'pageswithprop-text'    => 'Introductory text for the input form on [[Special:PagesWithProp]]',
-'pageswithprop-prop'    => 'Label for the property name input field on [[Special:PagesWithProp]]',
-'pageswithprop-submit'  => 'Label for the submit button on [[Special:PagesWithProp]]',
+'pageswithprop' => 'Title for [[Special:PagesWithProp]].
+{{Identical|Page with page property}}',
+'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
+{{Identical|Page with page property}}',
+'pageswithprop-text' => 'Introductory text for the input form on [[Special:PagesWithProp]]',
+'pageswithprop-prop' => 'Label for the property name input field on [[Special:PagesWithProp]].
+{{Identical|Property name}}',
+'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
+{{Identical|Go}}',
 
 'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
@@ -3933,10 +3961,10 @@ $1 is a page title",
 'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
 'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
 'usereditcount' => 'Shown behind every username on [[Special:ListUsers]].',
-'usercreated' => 'Used in [[Special:ListUsers]].
-* <code>$1</code> is a date
-* <code>$2</code> is a time
-* <code>$3</code> is the name of the user, for use in GENDER',
+'usercreated' => 'Used in [[Special:ListUsers]]. Parameters:
+* $1 - a date
+* $2 - a time
+* $3 - the name of the user, for use in GENDER',
 'newpages' => 'Name of special page displayed in [[Special:SpecialPages]]
 {{Identical|New page}}',
 'newpages-username' => '{{Identical|Username}}',
@@ -4068,8 +4096,8 @@ In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|
 'deletedcontributions-title' => 'Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.
 
 {{Identical|Deleted user contributions}}',
-'sp-deletedcontributions-contribs' => 'Link to user’s contributions on [[Special:DeletedContributions]].
-{{Identical|Contribution}}',
+'sp-deletedcontributions-contribs' => "Link to user's contributions on [[Special:DeletedContributions]].
+{{Identical|Contribution}}",
 
 # Special:LinkSearch
 'linksearch' => 'Title of [[Special:LinkSearch|special page]] and legend of fieldset on that page.
@@ -4150,29 +4178,31 @@ See also:
 * $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
 * $2 is the codename of this right",
 'listgrouprights-addgroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 is an enumeration of group names.
-* $2 is the number of group names in $1.
-See also {{msg|listgrouprights-removegroup}}.',
+* $1 - an enumeration of group names
+* $2 - the number of group names in $1
+See also:
+* {{msg-mw|listgrouprights-removegroup}}',
 'listgrouprights-removegroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 is an enumeration of group names.
-* $2 is the number of group names in $1.
-See also {{msg|listgrouprights-addgroup}}.',
+* $1 - an enumeration of group names
+* $2 - the number of group names in $1
+See also:
+* {{msg-mw|listgrouprights-addgroup}}',
 'listgrouprights-addgroup-all' => 'Used on [[Special:ListGroupRights]].
 {{Related|Listgrouprights}}',
 'listgrouprights-removegroup-all' => 'Used on [[Special:ListGroupRights]].
 {{Related|Listgrouprights}}',
 'listgrouprights-addgroup-self' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 are the group names.
-* $2 is the number of group names in $1.',
+* $1 - the group names
+* $2 - the number of group names in $1',
 'listgrouprights-removegroup-self' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 are the group names.
-* $2 is the number of group names in $1.',
+* $1 - the group names
+* $2 - the number of group names in $1',
 'listgrouprights-addgroup-self-all' => 'Used on [[Special:ListGroupRights]].
 {{Related|Listgrouprights}}',
 'listgrouprights-removegroup-self-all' => 'Used on [[Special:ListGroupRights]].
 {{Related|Listgrouprights}}',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Used in [[Special:EmailUser]].
 
 Used as title of the error message {{msg-mw|Mailnologintext}}.',
@@ -4191,7 +4221,7 @@ See also:
 'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
 'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
 
-Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
+Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message {{msg-mw|Noemailtext}} will appear instead of Special:EmailUser.',
 'defemailsubject' => 'The default subject of EmailUser emails. Parameters:
 * $1 is the username of the user sending the email and can be used for GENDER.',
 'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
@@ -4206,9 +4236,8 @@ The title for this error message is {{msg-mw|Usermaildisabled}}.',
 'emailusername' => 'This is a prompt being used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.
 
 {{Identical|Username}}',
-'emailusernamesubmit' => '{{Identical|Submit}}
-
-This is a button text used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.',
+'emailusernamesubmit' => 'This is a button text used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.
+{{Identical|Submit}}',
 'email-legend' => 'Title of the box in [[Special:EmailUser]]',
 'emailfrom' => 'Field in [[Special:EmailUser]].
 {{Identical|From}}',
@@ -4227,10 +4256,9 @@ This is a button text used in [[Special:Emailuser]] when called without a (valid
 'emailccsubject' => 'Subject of the carbon-copied  email for the sender sent through MediaWiki.',
 'emailsent' => 'Title of [[Special:EmailUser]] when it says you it sent an email',
 'emailsenttext' => 'When you send an e-mail, [[Special:EmailUser]] says you this (Your email has been sent).',
-'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function.
-
-* $1: username of the sender
-* $2: username of the recipient',
+'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function. Parameters:
+* $1 - username of the sender
+* $2 - username of the recipient',
 
 # User Messenger
 'usermessage-summary' => 'This message is used as an edit summary for any message that is posted because of a system event. Translate "leaving a message" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.',
@@ -4247,9 +4275,9 @@ See also:
 * {{msg-mw|Tooltip-pt-watchlist}}
 {{Identical|My watchlist}}',
 'watchlistfor2' => 'Subtitle on [[Special:Watchlist]].
-
-*$1: Username of current user
-*$2: Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)
+Parameters:
+* $1 - Username of current user
+* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)
 {{Identical|For $1}}',
 'nowatchlist' => 'Displayed when there is no pages in the watchlist.',
 'watchlistanontext' => '* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
@@ -4315,11 +4343,14 @@ See also:
 * {{msg-mw|Watchmethod-recent}}',
 'watchlistcontains' => '* $1 - number of pages in your watchlist',
 'wlnote' => 'Used on [[Special:Watchlist]] when the maximum number of days is specified.
+
 Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
-* $1 is the number of changes shown,
-* $2 is the number of hours for which the changes are shown,
-* $3 is a date alone,
-* $4 is a time alone.',
+
+Parameters:
+* $1 - the number of changes shown
+* $2 - the number of hours for which the changes are shown
+* $3 - a date alone
+* $4 - a time alone',
 'wlshowlast' => 'Appears on [[Special:Watchlist]]. Parameters:
 * $1 - a choice of different numbers of hours ("1 | 2 | 6 | 12")
 * $2 - a choice of different numbers of days ("1 | 3 | 7")
@@ -4333,8 +4364,8 @@ See also:
 * {{msg-mw|enotif reset|Submit button text}}',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Text displayed when clicked on the watch tab: [[MediaWiki:Watch/{{SUBPAGENAME}}|{{int:watch}}]]. It means the wiki is adding that page to your watchlist.',
-'unwatching' => 'Text displayed when clicked on the unwatch tab: [[MediaWiki:Unwatch/{{SUBPAGENAME}}|{{int:unwatch}}]]. It means the wiki is removing that page from your watchlist.',
+'watching' => 'Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.',
+'unwatching' => 'Text displayed when clicked on the unwatch tab: {{msg-mw|Unwatch}}. It means the wiki is removing that page from your watchlist.',
 'watcherrortext' => 'When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed.
 
 This message is used raw and should not contain wikitext.
@@ -4483,17 +4514,17 @@ See also:
 # Rollback
 'rollback' => '{{Identical|Rollback}}',
 'rollback_short' => '{{Identical|Rollback}}',
-'rollbacklink' => '{{Identical|Rollback}}
+'rollbacklink' => '{{Doc-actionlink}}
 This link text appears on the recent changes page to users who have the "rollback" right.
 This message has a tooltip {{msg-mw|tooltip-rollback}}
+{{Identical|Rollback}}',
+'rollbacklinkcount' => '{{doc-actionlink}}
+Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
 
-{{Doc-actionlink}}',
-'rollbacklinkcount' => 'Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
-* $1: the number of edits that will be rollbacked. If $1 is over the value of $wgShowRollbackEditCount (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
-
-The rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}
+Parameters:
+* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
 
-{{Doc-actionlink}}',
+The rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}',
 'rollbacklinkcount-morethan' => 'Text of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.
 
 When the number of edits rolled back is smaller than [[mw:Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.
@@ -4506,19 +4537,21 @@ See also:
 * {{msg-mw|Notvisiblerev}}
 {{Identical|Revert}}
 {{Identical|Rollback}}',
-'alreadyrolled' => "Appear when there's rollback and/or edit collision.
-* $1: the page to be rollbacked
-* $2: the editor to be rollbacked of that page
-* $3: the editor that cause collision
-
+'alreadyrolled' => "Appear when there's rollback and/or edit collision. Parameters:
+* $1 - the page to be rolled back
+* $2 - the editor to be rolled-back of that page
+* $3 - the editor that cause collision
 {{Identical|Rollback}}",
 'editcomment' => "Only shown if there is an edit ''{{msg-mw|summary}}''",
-'revertpage' => '{{Identical|Revert}}
-Additionally available:
-* $3: revid of the revision reverted to,
-* $4: timestamp of the revision reverted to,
-* $5: revid of the revision reverted from,
-* $6: timestamp of the revision reverted from',
+'revertpage' => 'Parameters:
+* $1 - username 1
+* $2 - username 2
+Additionally available parameters:
+* $3 - revid of the revision reverted to
+* $4 - timestamp of the revision reverted to
+* $5 - revid of the revision reverted from
+* $6 - timestamp of the revision reverted from
+{{Identical|Revert}}',
 'revertpage-nouser' => 'This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.
 In other cases the message {{msg-mw|revertpage}} is used.',
 'rollback-success' => 'This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.
@@ -4601,9 +4634,10 @@ See also:
 {{Identical|Other time}}',
 'protect-existing-expiry' => 'Shows the existing expiry time in the drop down menu of the protection form ([{{canonicalurl:User:Raymond/test|action=unprotect}} example])
 
-* $1: date and time of the existing expiry time (kept for backward compatibility purposes)
-* $2: date of the existing expiry time
-* $3: time of the existing expiry time',
+Parameters:
+* $1 - date and time of the existing expiry time (kept for backward compatibility purposes)
+* $2 - date of the existing expiry time
+* $3 - time of the existing expiry time',
 'protect-otherreason' => 'Shown on the page protection form as label for the following input field (text)
 {{Identical|Other/additional reason}}',
 'protect-otherreason-op' => 'Shown on the page protection form in the drop down menu
@@ -4617,9 +4651,9 @@ See also:
 See also:
 * {{msg-mw|Delete-edit-reasonlist}}
 * {{msg-mw|Ipb-edit-dropdown}}',
-'protect-expiry-options' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
-
-Options for the duration of the page protection. Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.",
+'protect-expiry-options' => "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
+Options for the duration of the page protection. Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.
+{{Identical|Infinite}}",
 'restriction-type' => 'Used on [[Special:ProtectedPages]]. The text next to a drop-down box. See [[mw:Manual:Administrators|MediaWiki Manual]] for more information on protection.
 {{Identical|Permission}}',
 'restriction-level' => 'Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. The text next to a drop-down box. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.',
@@ -4671,7 +4705,9 @@ See also:
 {{Identical|View deleted pages}}',
 'undeletepagetext' => '* $1 - number of pages',
 'undelete-fieldset-title' => 'Used as the title of the fieldset.',
-'undeleteextrahelp' => "Help message displayed when restoring history of a page. In your language, ''Restore'' is called ''[[MediaWiki:Undeletebtn/{{SUBPAGENAME}}|{{int:Undeletebtn}}]]'' ({{msg|Undeletebtn}}), The ''Reset'' button is called ''[[MediaWiki:Undeletereset/{{SUBPAGENAME}}|{{int:Undeletereset}}]]'' ({{msg|Undeletereset}}).",
+'undeleteextrahelp' => "Help message displayed when restoring history of a page.
+
+In your language, ''Restore'' is called {{msg-mw|Undeletebtn}}, the ''Reset'' button is called {{msg-mw|Undeletereset}}.",
 'undeleterevisions' => '* $1 - number of revisions',
 'undeletehistory' => 'Used in [[Special:Undelete]].
 
@@ -4689,13 +4725,14 @@ See also:
 * {{msg-mw|Undeletehistory}}
 * {{msg-mw|Undeleterevdel}}',
 'undelete-revision' => 'Shown in "View and restore deleted pages" ([[Special:Undelete/$1]]).
-
-* $1: deleted page name
-* $3: user name (author of revision, not who deleted it)
-* $4: date of the revision
-* $5: time of the revision
-
-\'\'Example:\'\' Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
+Parameters:
+* $1 - deleted page name
+* $2 - (unused)
+* $3 - user name (author of revision, not who deleted it)
+* $4 - date of the revision
+* $5 - time of the revision
+Example:
+* Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
 'undelete-nodiff' => 'Used in [[Special:Undelete]].',
 'undeletebtn' => 'Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).
 
@@ -4725,8 +4762,8 @@ See also:
 See also:
 * {{msg-mw|Undeletedrevisions-files}}
 * {{msg-mw|Undeletedrevisions}}',
-'cannotundelete' => 'Message shown when undeletion failed for some reason.
-* <code>$1</code> is the combined wikitext of messages for all errors that caused the failure.',
+'cannotundelete' => 'Message shown when undeletion failed for some reason. Parameters:
+* $1 - the combined wikitext of messages for all errors that caused the failure',
 'undeletedpage' => '* $1 - page title',
 'undelete-header' => 'Used in [[Special:Undelete]].',
 'undelete-search-title' => 'Page title when showing the search form in [[Special:Undelete]].
@@ -4767,10 +4804,12 @@ See also:
 * {{msg-mw|Undelete-error-short}}
 * {{msg-mw|Undelete-error-long}}',
 'undelete-show-file-confirm' => 'A confirmation message shown on [[Special:Undelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
-* <code>$1</code> is the name of the file being undeleted.
-* <code>$2</code> is the date of the displayed revision.
-* <code>$3</code> is the time of the displayed revision.
-{{identical|Are you sure you want to view the deleted revision of the file...}}',
+
+Parameters:
+* $1 - the name of the file being undeleted
+* $2 - the date of the displayed revision
+* $3 - the time of the displayed revision
+{{Identical|Are you sure you want to view the deleted revision of the file...}}',
 'undelete-show-file-submit' => '{{Identical|Yes}}',
 'undelete-revisionrow' => "{{Optional}}
 A revision row in the undelete page. Parameters:
@@ -5018,9 +5057,9 @@ See also:
 {{Identical|Automatically block ...}}',
 'ipbsubmit' => '{{Identical|Block this user}}',
 'ipbother' => '{{Identical|Other time}}',
-'ipboptions' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
-
-Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.",
+'ipboptions' => "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
+Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.
+{{Identical|Infinite}}",
 'ipbotheroption' => '{{Identical|Other}}',
 'ipbotherreason' => '{{Identical|Other/additional reason}}',
 'ipbhidename' => 'This is the label for a checkbox in the user block form on [[Special:Block]].
@@ -5232,10 +5271,11 @@ The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[
 'blocklog-showsuppresslog' => 'Parameters:
 * $1 is the blocked user. Can be used for GENDER (optional)',
 '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:
-* $1 is the blocked user or IP (with link to contributions and talk)
-* $2 is the duration of the block (hours, days etc.) or the specified expiry date
-* $3 contains "(details) (\'\'reason\'\')"
-See also {{msg-mw|Blocklistline}}.',
+* $1 - the blocked user or IP (with link to contributions and talk)
+* $2 - the duration of the block (hours, days etc.) or the specified expiry date
+* $3 - contains "(details) (\'\'reason\'\')"
+See also:
+* {{msg-mw|Blocklistline}}',
 '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:
 * $1 is the user being reblocked
 * $2 is the expiry time of the block
@@ -5639,7 +5679,7 @@ See also:
 'delete_and_move_text' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is to confirm that you really want to delete the page. See also {{msg|delete and move confirm}}.',
 'delete_and_move_confirm' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is for a checkbox to confirm that you really want to delete the page. See also {{msg|delete and move text}}.',
 'delete_and_move_reason' => 'Shown as reason in content language in the deletion log. Parameter:
-* $1: The page name for which this page was deleted.',
+* $1 - The page name for which this page was deleted.',
 'selfmove' => 'Used as error message when moving page.
 
 See also:
@@ -5674,9 +5714,11 @@ See also:
 * {{msg-mw|Immobile-target-page}}',
 'bad-target-model' => 'This message is shown when attempting to move a page, but the move would change the page\'s content model.
 This may be the case when [[mw:Manual:$wgContentHandlerUseDB|$wgContentHandlerUseDB]] is set to false, because then a page\'s content model is derived from the page\'s title.
-* $1: The localized name of the original page\'s content model:
+
+Parameters:
+* $1 - The localized name of the original page\'s content model:
 **{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
-* $2: The localized name of the content model used by the destination title:
+* $2 - The localized name of the content model used by the destination title:
 **{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}',
 'imagenocrossnamespace' => 'Used as error message.
 
@@ -5964,14 +6006,14 @@ See also:
 * {{msg-mw|Import-noarticle}}
 * {{msg-mw|Importbadinterwiki}}',
 'import-nonewrevisions' => 'Used in [[Special:Import]].',
-'xml-error-string' => ':$1: Some kind of message, perhaps name of the error?
-:$2: line number
-:$3: columm number
-:$4: ?? $this->mByte . $this->mContext
-:$5: error description
-----
-:Example
-Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki xml"): Empty document',
+'xml-error-string' => 'Parameters:
+* $1 - Some kind of message, perhaps name of the error?
+* $2 - line number
+* $3 - column number
+* $4 - ?? $this->mByte . $this->mContext
+* $5 - error description
+Example:
+Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki xml"): Empty document',
 'import-upload' => 'Used on [[Special:Import]].
 
 Related messages:
@@ -6000,11 +6042,14 @@ See also:
 'import-error-special' => '* $1 - page title',
 'import-error-invalid' => '* $1 - page title',
 'import-error-unserialize' => 'Import error message displayed when a revision could not be unserialized.
-This may happen if the content got corrupted or the serialization format is mis-reported. Parameters:
-* $1 is the name of the page the offending revision belongs to.
-* $2 is the ID of the offending revision, as reported in the dump that is being imported.
-* $3 is the content model reported for the offending revision in the dump that is being imported.
-* $4 is the serialization format reported for the offending revision in the dump that is being imported.',
+
+This may happen if the content got corrupted or the serialization format is mis-reported.
+
+Parameters:
+* $1 - the name of the page the offending revision belongs to
+* $2 - the ID of the offending revision, as reported in the dump that is being imported
+* $3 - the content model reported for the offending revision in the dump that is being imported
+* $4 - the serialization format reported for the offending revision in the dump that is being imported',
 'import-options-wrong' => 'Used on [[Special:Import]], when one of the options has an error.',
 'import-rootpage-invalid' => 'Used on [[Special:Import]], when the root page is invalid.',
 'import-rootpage-nosubpage' => 'Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:
@@ -6281,7 +6326,7 @@ See also:
 * {{msg-mw|Accesskey-t-upload}}
 * {{msg-mw|Tooltip-t-upload}}
 {{Identical|Upload file}}',
-'tooltip-t-specialpages' => 'The tooltip when hovering over the link "[[MediaWiki:Specialpages/{{SUBPAGENAME}}|{{int:specialpages}}]]" going to a list of all special pages available in the wiki.
+'tooltip-t-specialpages' => 'The tooltip when hovering over the link {{msg-mw|Specialpages}} going to a list of all special pages available in the wiki.
 
 See also:
 * {{msg-mw|Specialpages}}
@@ -6488,9 +6533,13 @@ JS for users using Monobook skin.',
 
 # Attribution
 '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).
-This message appears at the very end of the list of names in the message [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]]. If there are no anonymous users in the credits list then this message does not appear at all.
 
-* $1 is the number of anonymous users in the message',
+This message appears at the very end of the list of names in the message {{msg-mw|Othercontribs}}.
+
+If there are no anonymous users in the credits list then this message does not appear at all.
+
+Parameters:
+* $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}}.
 
 Parameters:
@@ -6501,37 +6550,48 @@ This message is the variable $3 in the message {{msg-mw|lastmodifiedatby}}. This
 
 See also {{msg-mw|Anonusers}} and {{msg-mw|Siteuser}}.",
 'lastmodifiedatby' => "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).
-* $1: date
-* $2: time
-* $3: if the user has entered his 'real name' in his preferences then this variable is his 'real name'. If the user has not entered his 'real name' in his preferences then this variable is the message [[Mediawiki:siteuser/{{SUBPAGENAME}}]], which includes his username.
-* $4: username in plain text. Can be used for GENDER
 
-See also [[MediaWiki:Lastmodifiedat/{{SUBPAGENAME}}]].",
+Parameters:
+* $1 - date
+* $2 - time
+* $3 - if the user has entered his 'real name' in his preferences then this variable is his 'real name'. If the user has not entered his 'real name' in his preferences then this variable is the message {{msg-mw|Siteuser}}, which includes his username.
+* $4 - username in plain text. Can be used for GENDER
+See also:
+* {{msg-mw|Lastmodifiedat}}",
 'othercontribs' => '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 - to use type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar).
-* $1: the list of author(s) of the revisions preceding the current revision. It appears after the message [[Mediawiki:lastmodifiedatby/{{SUBPAGENAME}}]]. If there are no previous authors this message does not appear at all. If needed the messages [[Mediawiki:siteusers/{{SUBPAGENAME}}]], [[Mediawiki:anonymous/{{SUBPAGENAME}}]] and [[Mediawiki:and/{{SUBPAGENAME}}]] are part of the list of names.
-* $2: optional, the count of names in $1',
+
+Parameters:
+* $1 - the list of author(s) of the revisions preceding the current revision. It appears after the message {{msg-mw|Lastmodifiedatby}}. If there are no previous authors this message does not appear at all. If needed the messages {{msg-mw|Siteusers}}, {{msg-mw|Anonymous}} and {{msg-mw|And}} are part of the list of names.
+* $2 - (Optional) the count of names in $1',
 'others' => 'The following explanation is guesswork. 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 - to use type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar).
 
-The message appears at the end of the list of credits given in the message [[Mediawiki:Othercontribs/{{SUBPAGENAME}}]] if the number of contributors is above a certain level.
+The message appears at the end of the list of credits given in the message {{msg-mw|Othercontribs}} if the number of contributors is above a certain level.
 {{Identical|Other}}',
 'siteusers' => '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).
-It should be in a form that fits with [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]].
 
-* $1 is a list of user names (example: "\'\'Jim, Janet, Jane, Joe\'\'") where the user has not put his \'real name\' in his preferences.
-* $2 is the number of user names in $1
+It should be in a form that fits with {{msg-mw|Othercontribs}}.
 
-If there is more than one user in the list then the message {{msg-mw|and}} appears before the last name. If $2 is NIL then this message does not appear at all.
+Parameters:
+* $1 - a list of user names (example: "\'\'Jim, Janet, Jane, Joe\'\'") where the user has not put his \'real name\' in his preferences.
+* $2 - the number of user names in $1
+
+If there is more than one user in the list then the message {{msg-mw|And}} appears before the last name. If $2 is NULL then this message does not appear at all.
 
-See also {{msg-mw|Siteuser}}.',
+See also:
+* {{msg-mw|Siteuser}}',
 'anonusers' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Support|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).
-It should be in a form that fits with [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]].
 
-* $1 is a list of IP addresses
-* $2 is the number of IP addresses in $1
+It should be in a form that fits with {{msg-mw|Othercontribs}}.
+
+Parameters:
+* $1 - a list of IP addresses
+* $2 - the number of IP addresses in $1
 
 If there is more than one user in the list then the message {{msg-mw|and}} appears before the last name. If $2 is NIL then this message does not appear at all.
 
-See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
+See also:
+* {{msg-mw|Anonuser}}
+* {{msg-mw|Siteusers}}',
 'creditspage' => "This message is the ''contentSub'' (the grey subtitle) shown when viewing credits of a page (example: {{fullurl:Project:News|action=credits}}). Note that the credits action is disabled by default (currently enabled on translatewiki.net).",
 'nocredits' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}) but when there are no credits available. Note that the credits action is disabled by default (currently enabled on translatewiki.net).',
 
@@ -6596,9 +6656,9 @@ Parameters:
 
 Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]).",
 'pageinfo-subpages-value' => 'Parameters:
-* $1 is the number of subpages of the page.
-* $2 is the number of subpages of the page that are redirects.
-* $3 is the number of subpages of the page that are not redirects.',
+* $1 - the number of subpages of the page
+* $2 - the number of subpages of the page that are redirects
+* $3 - the number of subpages of the page that are not redirects',
 'pageinfo-firstuser' => 'The user who created the page.',
 'pageinfo-firsttime' => 'The date and time the page was created.',
 'pageinfo-lastuser' => 'The last user who edited the page.',
@@ -6744,9 +6804,9 @@ See also:
 'widthheightpage' => 'This message is used on image pages in the dimensions column in the file history section for images  with more than one page.
 
 Parameters:
-* $1 is the width of the image pages in pixels.
-* $2 is the height of the image pages in pixels.
-* $3 is the number of pages in the file.',
+* $1 - the width of the image pages in pixels
+* $2 - the height of the image pages in pixels
+* $3 - the number of pages in the file',
 'file-info' => 'File info displayed on file description page.',
 'file-info-size' => 'File info displayed on file description page.
 
@@ -6758,21 +6818,21 @@ Parameters:
 'file-info-size-pages' => 'File info displayed on file description page, when the file is a multi-page document, with at least two pages. Like {{msg-mw|file-info-size}} but $5 is the total number of pages in the document.
 
 Parameters:
-* $1 is the width of the image pages in pixels.
-* $2 is the height of the image pagess in pixels.
-* $3 is the file size as a number followed by a unit — for example: 99 KB
-* $4 is the MIME type, a formalized textual information — for example: <code>image/jpeg</code>
-* $5 is the total number of pages in the document.',
+* $1 - the width of the image pages in pixels
+* $2 - the height of the image pagess in pixels
+* $3 - the file size as a number followed by a unit — for example: 99 KB
+* $4 - the MIME type, a formalized textual information — for example: <code>image/jpeg</code>
+* $5 - the total number of pages in the document',
 'file-nohires' => 'File info displayed on file description page. For example of message in use see [[:File:Mouse10.gif]].',
 'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].
 
-Start with a lowercase letter, unless the first word is “SVG”.',
+Start with a lowercase letter, unless the first word is "SVG".',
 'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}.
-* $1 is the width in pixels
-* $2 is the height in pixels, and
-* $3 is the file size including a unit (for example "10 KB").
+* $1 - the width in pixels
+* $2 - the height in pixels
+* $3 - the file size including a unit (for example "10 KB")
 
-Start with a lowercase letter, unless the first word is “SVG”.',
+Start with a lowercase letter, unless the first word is "SVG".',
 'svg-long-error' => 'Displayed for invalid SVG file metadata. Parameters:
 * $1 - the error message
 See also:
@@ -6780,10 +6840,9 @@ See also:
 'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
 'show-big-image-preview' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-other}}.',
 'show-big-image-other' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-preview}}, if the image is in high resolution.',
-'show-big-image-size' => '
-Parameters:
-* $1 is the width of the image(s) in pixels.
-* $2 is the height of the image(s) in pixels.',
+'show-big-image-size' => 'Parameters:
+* $1 - the width of the image(s) in pixels
+* $2 - the height of the image(s) in pixels',
 'file-info-gif-looped' => 'Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].',
 'file-info-gif-frames' => 'Part of the information provided about a [[w:Gif|.gif file]] on its file description page.',
 'file-info-png-looped' => 'Part of the information provided about a [[w:APNG|.apng file]] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.',
@@ -6972,8 +7031,8 @@ Varient Option for wikis with variants conversion enabled.',
 # Metadata
 '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]].
 {{Identical|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 "[[MediaWiki:Metadata-collapse/{{SUBPAGENAME}}|{{int: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 "[[MediaWiki:Metadata-expand/{{SUBPAGENAME}}|{{int:metadata-expand}}]]", you can see more data and information. This message is for the link to hide back the less important data.',
+'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|Do not translate list items, only translate the text! So leave "<code>* make</code>" and the other items exactly as they are.}}
 The sentences are for explanation only and are not shown to the user.',
 'metadata-langitem' => '{{optional}}
@@ -7104,9 +7163,11 @@ This tag shows the detail of the fraction of a second (1/100s) at which the file
 The exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}',
 'exif-exposuretime-format' => "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].
 
-*$1 is the exposure time written as a fraction of a second, for example 1/640 of a second.
-*$2 is the exposure time written as a decimal, for example 0.0015625.
-*'sec' is the abbreviation used in English for the unit of time 'second'.",
+Parameters:
+* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second
+* $2 - the exposure time written as a decimal, for example 0.0015625
+
+'sec' is the abbreviation used in English for the unit of time 'second'.",
 'exif-fnumber' => '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].
 
 The [[w:F_number|F number]] is the relative aperture of the camera.',
@@ -7358,7 +7419,7 @@ This is taken from IPTC-iim 2:135 and XMP's dc:language.
 {{Identical|Language}}",
 'exif-iimversion' => 'IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)',
 'exif-iimcategory' => 'Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.
-{{identical|Category}}',
+{{Identical|Category}}',
 'exif-iimsupplementalcategory' => 'Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.',
 'exif-datetimeexpires' => 'Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.',
 'exif-datetimereleased' => 'Earliest date the image (media) can be used. See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
@@ -7830,7 +7891,7 @@ $1 is maxaperture in APEX units (APEX aperture units = 2log<sub>2</sub>(f-number
 'exif-iimcategory-hum' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
 'exif-iimcategory-lab' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}
 
-"Labour" here refers to all news on labour issues; employment; unemployment; work relations; labour disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)',
+"Labor" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)',
 'exif-iimcategory-lif' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
 'exif-iimcategory-pol' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
 'exif-iimcategory-rel' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
@@ -7867,14 +7928,13 @@ This message is variable $3 in the message {{msg-mw|Wlshowlast}}.
 'namespacesall' => 'In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.
 
 {{Identical|All}}',
-'monthsall' => 'Used in a drop-down box on [[Special:Contributions]] as an option for "all months". See also [[MediaWiki:Month/{{SUBPAGENAME}}]].
-
+'monthsall' => 'Used in a drop-down box on [[Special:Contributions]] as an option for "all months". See also {{msg-mw|Month}}.
 {{Identical|All}}',
 'limitall' => 'Used on [[Special:AllMessages]] (and potentially other TablePager based tables) to display "all" the messages.
 
 {{Identical|All}}',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Title of [[Special:ConfirmEmail]] page.',
 'confirmemail_noemail' => 'Failure message on [[Special:ConfirmEmail]].',
 'confirmemail_text' => 'Explanation on [[Special:ConfirmEmail]]',
@@ -8257,15 +8317,19 @@ Name of month in Hebrew calendar.',
 Name of month in Hebrew calendar.',
 
 # Signatures
-'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp)
-* $1: the username that is currently login
-* $2: the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw
+'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp). Parameters:
+* $1 - the username that is currently login
+* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw
 Use your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.",
 'timezone-utc' => '{{optional}}',
 
 # Core parser functions
-'unknown_extension_tag' => '* Description: This is an error shown when you use an unknown extension tag name. This feature allows tags like <tt><nowiki><pre></nowiki></tt> to be called with a parser like <tt><nowiki>{{#tag:pre}}</nowiki></tt>.
-* Parameter $1: This is the unknown extension tag name.',
+'unknown_extension_tag' => 'This is an error shown when you use an unknown extension tag name.
+
+This feature allows tags like <code><nowiki><pre></nowiki></code> to be called with a parser like <code><nowiki>{{#tag:pre}}</nowiki></code>.
+
+Parameters:
+* $1 - the unknown extension tag name',
 'duplicate-defaultsort' => 'See definition of [[w:Sorting|sort key]] on Wikipedia.',
 
 # Special:Version
@@ -8298,9 +8362,9 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
 
 {{Identical|Revision}}',
 'version-license' => '{{Identical|License}}',
-'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters are:
-*$1: the current year
-*$2: a list of selected MediaWiki authors',
+'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters:
+* $1 - the current year
+* $2 - a list of selected MediaWiki authors',
 'version-poweredby-others' => 'Used at the very end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there\'s a long list of selected MediaWiki authors, then the word "and" (from {{msg-mw|and}}) follows and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.',
 'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
 'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
@@ -8336,12 +8400,13 @@ A short description of the script path entry point. Links to the mediawiki.org d
 'fileduplicatesearch-submit' => 'Button label on [[Special:FileDuplicateSearch]].
 
 {{Identical|Search}}',
-'fileduplicatesearch-info' => 'Information beneath the thumbnail on the right side shown after a successful search via [[Special:FileDuplicateSearch]]
+'fileduplicatesearch-info' => 'Information beneath the thumbnail on the right side shown after a successful search via [[Special:FileDuplicateSearch]].
 
-* $1: width of the file
-* $2: height of the file
-* $3: File size
-* $4: MIME type',
+Parameters:
+* $1 - width of the file
+* $2 - height of the file
+* $3 - File size
+* $4 - MIME type',
 'fileduplicatesearch-result-1' => 'Result line after the list of files of [[Special:FileDuplicateSearch]]
 
 $1 is the name of the requested file.',
@@ -8403,11 +8468,12 @@ It appears that the word 'valid' describes 'tags', not 'change'. It also appears
 'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
-'tags-edit' => '{{Identical|Edit}}
-Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.',
+'tags-edit' => 'Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.
+{{Identical|Edit}}',
 'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
 
-* <code>$1</code> is the number of changes marked with the tag',
+Parameters:
+* $1 - the number of changes marked with the tag',
 
 # Special:ComparePages
 'comparepages' => 'The title of [[Special:ComparePages]]',
@@ -8658,11 +8724,11 @@ $4 is the gender of the target user.',
 'api-error-badtoken' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-copyuploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-duplicate' => 'API error message that can be used for client side localisation of API errors. Parameters:
-* $1 is a number of files
-* $2 is a link to a list of duplicate files.',
+* $1 - a number of files
+* $2 - a link to a list of duplicate files',
 'api-error-duplicate-archive' => 'API error message that can be used for client side localisation of API errors. Parameters:
-* $1 is a number of files
-* $2 is a link to a list of duplicate files.',
+* $1 - a number of files
+* $2 - a link to a list of duplicate files',
 'api-error-duplicate-archive-popup-title' => 'API error message that can be used for client side localisation of API errors. Parameters:
 * $1 is a number of files.',
 'api-error-duplicate-popup-title' => 'This message is a pop-up title shown in case one or more files exactly equal to the one just uploaded are already present. The word "duplicate" is an adjective.',
@@ -8720,4 +8786,7 @@ $4 is the gender of the target user.',
 'duration-centuries' => '{{Related|Duration}}',
 'duration-millennia' => '{{Related|Duration}}',
 
+# Image rotation
+'rotate-comment' => 'Edit summary for the act of rotating an image.',
+
 );
index ac35dad..87c9fe6 100644 (file)
@@ -432,6 +432,7 @@ $messages = array(
 'namespaces' => "Suti k'itikuna",
 'variants' => "Ñawra rikch'akuykuna",
 
+'navigation-heading' => "Wamp'una last'a",
 'errorpagetitle' => 'Pantasqa',
 'returnto' => '$1-man kutimuy.',
 'tagline' => '{{SITENAME}}manta',
@@ -625,6 +626,8 @@ Ama hina kaspa, huk [[Special:ListUsers/sysop|kamachiqman]] willariy, URL nisqa
 'cannotdelete' => 'Manam atinichu "$1" sutiyuq p\'anqata icha willañiqita qulluyta.
 P\'anqaqa pipapas qullusqanñachá.',
 'cannotdelete-title' => 'Manam atinichu "$1" sutiyuq p\'anqata qulluyta',
+'delete-hook-aborted' => "Ch'iwinam qulluyta t'ipirqan.
+Manam nirqanchu imarayku.",
 'badtitle' => "P'anqap sutinqa manam allinchu",
 'badtitletext' => "Kay p'anqap sutinqa manam allinchu, mana allin interwiki t'inkichá icha ch'usaqchá, p'anqa sutipaq mana saqillasqa sananchayuqchá.",
 'perfcached' => "Kay qatiq willakunaqa ''cache'' nisqa pakasqa hallch'apim kachkan, chayrayku manañachá musuqchasqachu. {{PLURAL:$1|Huklla|$1-lla}} taripasqam pakasqa hallch'api aypalla kachkan, manam aswanchu.",
@@ -642,7 +645,7 @@ Tapuna: $2',
 'viewyourtext' => "'''Qampa llamk'apusqayki'''p pukyu qillqantam qhawayta iskaychaytapas atinki:",
 'protectedinterface' => "Kay p'anqapiqa wakichintinpa uyapuranpaq qillqam. Wandalismu nisqamanta amachasqam kachkan.
 Tukuy wikikunapi uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruray.",
-'editinginterface' => "'''Paqtataq:''' Llamp'u kaqpaq uyapura qillqakuna runanapaq p'anqatam llamk'apuchkanki.
+'editinginterface' => "'''Paqtataq:''' Llamp'u kaqpaq uyapura qillqakuna ruranapaq p'anqatam llamk'apuchkanki.
 Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa kay wikipi huk ruraqkunapaqpas.
 Uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
 'sqlhidden' => '(SQL tapunaqa pakasqam)',
@@ -659,6 +662,7 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 'invalidtitle-knownnamespace' => '"$2" sutisuyu, "$3" qillqasqayuq mana allin kaq qillqa suti',
 'invalidtitle-unknownnamespace' => 'Mana riqsisqa $1 kaq sutisuyu yupay, "$2" qillqasqayuq mana allin kaq qillqa suti',
 'exception-nologin' => 'Manam yaykurqankichu',
+'exception-nologin-text' => 'Kay wikipiqa icha kay ruranataqa rakiqunaykiwan yaykuspalla ruraytam atinki.',
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -670,12 +674,15 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 
 Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
 'welcomeuser' => 'Allinmi hamusqayki, $1!',
+'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam.
+Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.',
 'yourname' => 'Ruraq sutiyki:',
 'yourpassword' => 'Yaykuna rimayki',
 'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
 'remembermypassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy llamk'ay tiyayniypura ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
 'securelogin-stick-https' => "Yaykurquspa HTTPS nisqawan t'inkisqa kakuy",
 'yourdomainname' => 'Duminyuykip sutin',
+'password-change-forbidden' => 'Kay wikipi yaykuna rimataqa manam hukchayta atinkichu.',
 'externaldberror' => 'Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.',
 'login' => 'Yaykuy',
 'nav-login-createaccount' => 'Yaykuy',
@@ -691,7 +698,7 @@ Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa
 'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
 'gotaccountlink' => 'Rakiqunaykita willaway',
 'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
-'createaccountmail' => 'chaskipaq',
+'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
 'createaccountreason' => 'Kayrayku:',
 'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
 'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
@@ -752,9 +759,10 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
 'loginlanguagelabel' => 'Rimay: $1',
 'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Mana riqsisqa pantasqa PHP mail() rurananpi',
 'user-mail-no-addy' => 'Mana chaskiqniyuq e-chaskita kachayta munarqanki.',
+'user-mail-no-body' => 'Mana kurkuyuq icha ancha pisilla kurkuyuq e-chaskita kachayta munarqanki.',
 
 # Change password dialog
 'resetpass' => 'Ruraqpa yaykuna rimanta hukchay',
@@ -820,6 +828,7 @@ Mit'alla yaykuna rima: $2",
 'changeemail-oldemail' => 'Kunan kachkaq e-chaski imamayta:',
 'changeemail-newemail' => 'Musuq e-chaski imamayta:',
 'changeemail-none' => '(mana ima)',
+'changeemail-password' => '{{SITENAME}} yaykuna rimayki:',
 'changeemail-submit' => 'E-chaskita wakinchay',
 'changeemail-cancel' => 'Ama niy',
 
@@ -907,6 +916,10 @@ icha [{{fullurl:{{FULLPAGENAME}}|action=edit}} kay p'anqata llamk'apuy]</span>."
 Kaytam rurayta atinkiman: kay p'anqap sutinta [[Special:Search/{{PAGENAME}}|huk p'anqakunapi maskay]]
 icha payman kapuq <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hallch'akunapi maskay]</span>,
 ichataq kay p'anqata kamariyta manam saqillasunkichu.",
+'missing-revision' => "\"{{PAGENAME}}\" nisqa p'anqapaq #\$1 musuqchasqaqa manam kanchu.
+
+Kayqa tukurqanman qullusqa p'anchaman t'inkimuq mawk'ayasqa wiñay kawsay t'inkiraykuchá.
+Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy hallch'apim] tariykiman.",
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" sutiyuq ruraqpa rakiqunanqa manam kanchu. Ama hina kaspa, llanchikuy kay p\'anqata kamarinaykimanta.',
 'userpage-userdoesnotexist-view' => '"$1" sutiyuq rakiqunaqa manam hallch\'asqachu.',
 'blocked-notice-logextract' => "Kay ruraqqa hark'asqam kachkan.
@@ -962,8 +975,8 @@ Takyachichkankim: Kayqa ñuqap qillqasqaymi icha qispi pukyumanta iskaychamusqay
 Takyachichkankim: Kayqa ñuqap qillqasqaymi, ñuqamanmi kapuwan icha qispi pukyumanta iskaychamusqaymi, nispa ($1 p'anqata qhaway).
 <br />'''Mana saqillasqa kaspaykiqa, ama qillqarimuychu iskaychay hayñi ''(copyright)'' nisqayuq qillqakunata iskaychamuspa!'''",
 'longpageerror' => "'''Pantasqa: Kachasqayki qillqaqa {{PLURAL:$1|huk kB|$1 kB}} hatunmi, {{PLURAL:$2|huk kB|$2 kB}}-manta aswan hatunmi. Manam waqaychasqa kayta atinchu.'''",
-'readonlywarning' => "'''PAQTATAQ: Willañiqintinqa hark'asqam mit'awa kakuchinapaq. Chayrayku kunanqa manam atichkankichu llamk'apusqaykikunata waqaychayta.
-Qillqasqaykita iskaychaspa antañiqiqniykipi willañiqiman llut'amuspa chaypi waqaychariy. Kunanmanta huk pachallapi musuqmanta waqaychaykachay.'''
+'readonlywarning' => "'''Paqtataq: Willañiqintinqa hark'asqam mit'awa kakuchinapaq. Chayrayku kunanqa manam atichkankichu llamk'apusqaykikunata waqaychayta.'''
+Qillqasqaykita iskaychaspa antañiqiqniykipi willañiqiman llut'amuspa chaypi waqaychariykiman, kunanmanta huk pachallapi musuqmanta waqaychaykachaspa.
 
 Hark'aq kamachiqqa kaytam nirqan: $1, kayraykum nispa.",
 'protectedpagewarning' => "'''Paqtataq: Kay p'anqaqa llamk'apuymanta amachasqam kamachiqkunallap hukchananpaq.'''
@@ -1258,7 +1271,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
 'search-interwiki-default' => '$1 taripasqakuna:',
 'search-interwiki-more' => '(aswan)',
 'search-relatedarticle' => 'Apanakuq',
-'mwsuggest-disable' => 'AJAX rimapuykunaman ama niy',
+'mwsuggest-disable' => 'Maskana rimapuykunaman ama niy',
 'searcheverything-enable' => "Tukuy suti k'itikunapi maskay",
 'searchrelated' => 'apanakuq',
 'searchall' => 'tukuy',
@@ -1369,7 +1382,7 @@ Chaytataq manam kutichiyta atinkichu.",
 'prefs-memberingroups' => 'Kay {{PLURAL:$1|huñuman|huñukunaman}} {{GENDER:$2|kapuq}}:',
 'prefs-registration' => "Hallch'ay pacha:",
 'yourrealname' => 'Chiqap sutiyki*',
-'yourlanguage' => 'Rimay',
+'yourlanguage' => 'Rimay:',
 'yourvariant' => "Samiq rimaypa rikch'aynin:",
 'prefs-help-variant' => "Qampa astawan munasqayki allin qillqay kay wikipi samiqniyuq p'anqakunata rikuchinapaq.",
 'yournick' => 'Chutu sutiyki (ruruchinapaq)',
@@ -1402,7 +1415,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'prefs-displaywatchlist' => 'Akllanakunata rikuchiy',
 'prefs-diffs' => 'Wakin kaykuna',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-chaski imamaytaqa allinchá',
 'email-address-validity-invalid' => 'Allin e-chaski imamaytata yaykuchiy',
 
@@ -1477,6 +1490,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-writeapi' => "Ima hina qillqana API-ta llamk'achiy",
 'right-delete' => "P'anqakunata qulluy",
 'right-bigdelete' => "Wiñay kawsaysapa p'anqakunatapas qulluy",
+'right-deletelogentry' => "Sapaq hallch'asqakunata qulluy icha qullusqamanta paqarichiy",
 'right-deleterevision' => "P'anqakunapaq sapaq musuqchasqankunata qulluy paqarichiy ima",
 'right-deletedhistory' => 'Wiñay kawsaymanta qullusqa musuqchasqakunapaq pisichaykunata qhaway, manataq kapuq qillqakunatachu',
 'right-deletedtext' => 'Qullusqa musuqchasqapura qullusqa qillqata hukchasqakunatapas qhaway',
@@ -1965,6 +1979,8 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
 Chay rantiqa chiqap, hukchanasqa p'anqamanmi t'inkichun.<br />
 P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam kanqa.",
 
+'pageswithprop-submit' => 'Riy',
+
 'doubleredirects' => 'Iskaylla pusapunakuna',
 'doubleredirectstext' => "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.
 <del>Chakapusqa</del> taripasqakunaqa paskasqañam.",
@@ -2154,7 +2170,7 @@ Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgro
 'listgrouprights-addgroup-self-all' => 'Tukuy huñukunatam yapayta atin kikinpa raqiqunanman',
 'listgrouprights-removegroup-self-all' => 'Tukuy huñukunatam qichuyta atin kikinpa raqiqunanmanta',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Imamaytataqa ama kachaychu',
 'mailnologintext' => '[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.',
 'emailuser' => 'Kay ruraqman e-chaskita kachay',
@@ -2634,16 +2650,13 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 # Move page
 'move-page' => '$1-ta astay',
 'move-page-legend' => "P'anqata astay",
-'movepagetext' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas astasqa kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Mawk'a sutiman t'inkimuq p'anqakunaqa manam hukyanqachu. Paqtataq [[Special:DoubleRedirects|iskayllapas]] [[Special:BrokenRedirects|p'akisqapas]] pusapuna p'anqakunata allinchallay. Ama panta t'inkimuqkunata saqiychu.
-
+'movepagetext' => "Kay hunt'ana p'anqawanqa huk p'anqa tukuy wiñay kawsasqanpas astasqam kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Akllaptiykiqa, mawk'a sutiman t'inkimuq pusapuna p'anqakuna kikinmanta allinchasqam kanqa. Mana hinaptiykiqa, paqtataq [[Special:DoubleRedirects|iskayllapas]] [[Special:BrokenRedirects|p'akisqapas]] pusapuna p'anqakunata llanchispa allinchallay. Qammi paqtachiq, t'inkimuqkuna allinraq kana hawam kanki. Ama panta t'inkimuqkunata saqiychu.
 
-Nisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu.
-
-Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk'a kachkaqña p'anqamanchu.
+Nisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu. Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataqmi huk mawk'a kachkaqña p'anqamanchu.
 
 '''Paqtataq!'''
 Kay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;
-ama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
+ama hina kaspa, yuyarillay imachus kay astanayki saqispa tukunata atinman.",
 'movepagetext-noredirectfixer' => "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas musuq sutiman astasqa kanqa.
 Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa.
 Paqtataq [[Special:DoubleRedirects|iskaylla]] icha [[Special:BrokenRedirects|p'akisqa]] pusapuna p'anqakunata allinchallay.
@@ -2980,6 +2993,8 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'pageinfo-lasttime' => "Ñaqha llamk'apuypa p'unchawnin",
 'pageinfo-edits' => "Tukuymanta hayk'a hukchasqakuna",
 'pageinfo-authors' => "Tukuymanta hayk'a sapaq kaq ruraqkuna",
+'pageinfo-recent-edits' => "Ñaqha llamk'apusqakuna yupay (ñaqha $1-pi)",
+'pageinfo-recent-authors' => "Ñaqha hayk'a sapaq kaq ruraqkuna",
 'pageinfo-magic-words' => 'Layqa {{PLURAL:$1|simi|simikuna}} ($1)',
 'pageinfo-hidden-categories' => 'Pakasqa {{PLURAL:$1|katiguriya|katiguriyakuna}} ($1)',
 'pageinfo-templates' => "Ch'aqtasqa {{PLURAL:$1|plantilla|plantillakuna}} ($1)",
@@ -3055,7 +3070,7 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'newimages' => 'Musuq rikchakunap suyu-suyun',
 'imagelisttext' => "Kay qatiqpiqa '''$1''' {{PLURAL:$1|rikchatam|rikchakunatam}} rikunki, $2-kama ñiqichasqa.",
 'newimages-summary' => "Kay sapaq p'anqapiqa ñaqha churkusqa willañiqikunatam rikunki.",
-'newimages-legend' => 'Suysuna',
+'newimages-legend' => "Ch'illchina",
 'newimages-label' => 'Willañiqip sutin (icha sutinpa rakin):',
 'showhidebots' => '($1 rurana antacha)',
 'noimages' => 'Manam ima rikunallapas kanchu.',
@@ -3498,7 +3513,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 'monthsall' => '(tukuy)',
 'limitall' => 'tukuy',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-chaski imamaytaykita takyachiy',
 'confirmemail_noemail' => 'Manaraq [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytayki kachkanchu.',
 'confirmemail_text' => "{{SITENAME}}piqa e-chaski imamaytaykita takyachinaykim tiyan e-chaskita llamk'achinaykipaq. Urapi butunta ñit'ipay e-chaski imamaytaykiman takyachina chaskita kachamunaykupaq.
@@ -3707,7 +3722,7 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'specialpages-group-highuse' => "Achka kuti llamk'achisqa p'anqakuna",
 'specialpages-group-pages' => "P'anqa sutisuyukuna",
 'specialpages-group-pagetools' => "P'anqa llamk'anakuna",
-'specialpages-group-wiki' => "Wiki willakuna llamk'anakunapas",
+'specialpages-group-wiki' => "Willakuna llamk'anakunapas",
 'specialpages-group-redirects' => "Pusapunapaq sapaq p'anqakuna",
 'specialpages-group-spam' => "Spam nisqa millay rurayta hark'anapaq llamk'anakuna",
 
@@ -3727,8 +3742,8 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 
 # Special:Tags
 'tags' => 'Waliq unancha hukchay',
-'tag-filter' => '[[Special:Tags|Unancha]] suysuna:',
-'tag-filter-submit' => 'Suysuna',
+'tag-filter' => "[[Special:Tags|Unancha]] ch'illchina:",
+'tag-filter-submit' => "Ch'illchina",
 'tags-title' => 'Unanchakuna',
 'tags-intro' => "Kay p'anqapiqa hukchaykunata llamp'u kaqpa sananchananpaq unanchakunatam rikunki, sut'inkunatapas.",
 'tags-tag' => 'Unanchachap sutin',
@@ -3838,6 +3853,8 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'api-error-empty-file' => "Kachasqayki willañiqiqa ch'usaqmi.",
 'api-error-emptypage' => "Musuq ch'usaq p'anqakunata kamariyqa manam saqillasqachu.",
 'api-error-fetchfileerror' => 'Ukhupi pantasqa: Willañiqita chaskiykachachkaptiyki ima mana allin kaqpas tukurqan.',
+'api-error-fileexists-forbidden' => '"$1" sutiyuq willañiqiqa kachkañam, manam huknachayta atinkichu.',
+'api-error-fileexists-shared-forbidden' => '"$1" sutiyuq willañiqiqa rakinakusqa willañiqi churanapi kachkañam, manam huknachayta atinkichu.',
 'api-error-file-too-large' => 'Kachasqayki willañiqiqa nisyu hatunmi.',
 'api-error-filename-tooshort' => 'Kay willañiqi sutiqa nisyu pisillam.',
 'api-error-filetype-banned' => 'Kay willañiqi layaqa manam saqillasqachu.',
index 1585ced..0544c24 100644 (file)
@@ -647,7 +647,7 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(Kay tantanakuypa rurakkunapa shutikuna)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Kay rurakman e-chaskita kachana',
 
 # Watchlist
index fd1c171..cddd69d 100644 (file)
@@ -804,7 +804,7 @@ Vă rugăm să așteptați până să mai încercați.',
 'loginlanguagelabel' => 'Limba: $1',
 'suspicious-userlogout' => 'Cererea dumneavoastră de a închide sesiunea a fost refuzată întrucât pare că a fost trimisă printr-o eroare a navigatorului sau de un proxy memorat în cache.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
 'user-mail-no-addy' => 'S-a încercat trimiterea e-mailului fără o adresă de e-mail.',
 'user-mail-no-body' => 'S-a încercat trimiterea unui e-mail fără conținut sau nejustificat de scurt.',
@@ -1489,7 +1489,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'prefs-displaywatchlist' => 'Opțiuni de afișare',
 'prefs-diffs' => 'Diferențe',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adresa de e-mail pare validă',
 'email-address-validity-invalid' => 'Introduceți o adresă de e-mail validă',
 
@@ -2085,6 +2085,12 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
 Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
 O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-legend' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-text' => 'Această pagină listează paginile care utilizează o anumită proprietate de pagină.',
+'pageswithprop-prop' => 'Numele proprietății:',
+'pageswithprop-submit' => 'Du-te',
+
 'doubleredirects' => 'Redirecționări duble',
 'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
 Fiecare 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ă.
@@ -2275,7 +2281,7 @@ Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații suplimentare]] d
 'listgrouprights-addgroup-self-all' => 'Pot fi adăugate toate grupurile contului propriu',
 'listgrouprights-removegroup-self-all' => 'Pot fi șterse toate grupurile din contul propriu',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nu există adresă de trimitere',
 'mailnologintext' => 'Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.',
 'emailuser' => 'Trimiteți un e-mail',
@@ -2516,12 +2522,12 @@ Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta pr
 'restriction-level-all' => 'orice nivel',
 
 # Undelete
-'undelete' => 'Recuperează pagina ștearsă',
-'undeletepage' => 'Vizualizează și recuperează pagini șterse',
+'undelete' => 'Recuperare pagină ștearsă',
+'undeletepage' => 'Vizualizare și recuperare pagini șterse',
 'undeletepagetitle' => "'''Această listă cuprinde versiuni șterse ale paginii [[:$1|$1]].'''",
 'viewdeletedpage' => 'Vezi paginile șterse',
 'undeletepagetext' => '{{PLURAL:$1|Următoarea pagină a fost ștearsă, dar încă se află în arhivă și poate fi recuperată|Următoarele $1 pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate|Următoarele $1 de pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate}}. Arhiva ar putea fi ștearsă periodic.',
-'undelete-fieldset-title' => 'Recuperează versiuni',
+'undelete-fieldset-title' => 'Recuperare versiuni',
 'undeleteextrahelp' => "Pentru a restaura întregul istoric al paginii lăsați toate căsuțele nebifate și apăsați butonul '''''{{int:undeletebtn}}'''''.
 Pentru a realiza o recuperare selectivă bifați versiunile pe care doriți să le recuperați și apăsați butonul '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|versiune arhivată|versiuni arhivate|de versiuni arhivate}}',
@@ -2547,7 +2553,7 @@ $1',
 'undeletedpage' => "'''$1 a fost recuperat'''
 
 Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
-'undelete-header' => 'Vezi [[Special:Log/delete|logul de ștergere]] pentru paginile șterse recent.',
+'undelete-header' => 'Consultați [[Special:Log/delete|jurnalul de ștergeri]] pentru paginile șterse recent.',
 'undelete-search-title' => 'Căutare pagini șterse',
 'undelete-search-box' => 'Caută pagini șterse',
 'undelete-search-prefix' => 'Arată paginile care încep cu:',
@@ -3666,7 +3672,7 @@ Altele vor fi ascunse implicit.
 'monthsall' => 'toate',
 'limitall' => 'toate',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Confirmă adresa de e-mail',
 'confirmemail_noemail' => 'Nu aveți o adresă de e-mail validă setată la [[Special:Preferences|preferințe]].',
 'confirmemail_text' => '{{SITENAME}} solicită validarea adresei de e-mail înaintea utilizării funcțiilor specifice poștei electronice.
@@ -4060,4 +4066,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
 
+# Image rotation
+'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
+
 );
index 80d4285..eecc93d 100644 (file)
@@ -25,30 +25,30 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Cullegaminde sottolinèete:',
+'tog-underline' => 'Collegaminde sottolinèate:',
 'tog-justify' => 'Giustifeche le paragrafe',
 'tog-hideminor' => "Scunne le cangiaminde stuédeche jndr'à le cangiaminde recende",
-'tog-hidepatrolled' => "Scunne le cangiaminde condrollete jndr'à le cangiaminde recende",
-'tog-newpageshidepatrolled' => "Scunne le pàggene tenute sotte condrolle da 'a liste de le pàggene nuève",
-'tog-extendwatchlist' => "Spanne 'a liste de le pàggene condrollete pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
+'tog-hidepatrolled' => "Scunne le cangiaminde condrollate jndr'à le cangiaminde recende",
+'tog-newpageshidepatrolled' => "Scunne le pàggene tenute sotte condrolle da l'elenghe de le pàggene nuève",
+'tog-extendwatchlist' => "Spanne l'elenghe de le pàggene condrollate pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
 'tog-usenewrc' => "Ause le cangiaminde recende migliorate (vole 'u JavaScript)",
-'tog-numberheadings' => 'Testete auto-numerete',
+'tog-numberheadings' => 'Testate auto-numerate',
 'tog-showtoolbar' => "Fà vedè 'a barra de le cangiaminde (JavaScript)",
 'tog-editondblclick' => "Cange le pàggene cu 'nu doppie clic (JavaScript)",
-'tog-editsection' => 'Abilite le cangiaminde a sezione ausanne [cange]',
-'tog-editsectiononrightclick' => "Abilite le cngiaminde d'a sezione ausanne 'u pulsande destre d'u mouse cazzanne sus a 'u titele (Javascript)",
-'tog-showtoc' => "Fa vedè 'a taggelle de le condenute (pe le pàggene cu cchiù de 3 testete)",
-'tog-rememberpassword' => "Arrencuerdete 'u nome mije sus a stu browser (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
+'tog-editsection' => "Abbilite le cangiaminde d'a sezione ausanne le collagaminde [cange]",
+'tog-editsectiononrightclick' => "Abbilite le cangiaminde d'a sezione ausanne 'u pulsande destre d'u mouse cazzanne sus a 'u titole (Javascript)",
+'tog-showtoc' => "Fa vedè 'a tabbelle de le condenute (pe le pàggene cu cchiù de 3 testate)",
+'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",
+'tog-watchmoves' => "Mitte le pàggene ca je agghie spustate jndr'à le pàggene condrollate",
 'tog-watchdeletion' => "Mitte le pàggene ca je agghie scangellate jndr'à le pàggene condrollate",
-'tog-minordefault' => 'Pe convenzione signe tutte le cangiaminde cumme stuédeche',
-'tog-previewontop' => "Fa vedè l'andeprime apprime de 'a scatole de le cangiaminde",
-'tog-previewonfirst' => "Fà vedè l'andeprime sus a 'u prime cangiaminde",
-'tog-nocache' => "Disabbilete 'u caching d'a pàgene sfogliate",
+'tog-minordefault' => 'Pe convenzione signe tutte le cangiaminde cumme stuédeche',
+'tog-previewontop' => "Fa vedè l'andeprime apprime d'a caselle de le cangiaminde",
+'tog-previewonfirst' => "Fà vedè l'andeprime sus a 'u prime cangiamende",
+'tog-nocache' => "Disabbilite 'u caching d'a pàgene sfogliate",
 'tog-enotifwatchlistpages' => "Manneme 'na mail quanne 'a pàgene ca stoche a condrolle ha cangiate",
-'tog-enotifusertalkpages' => "Manneme 'na mail quanne 'a pàgene de le 'ngazzaminde ha cangete",
+'tog-enotifusertalkpages' => "Manneme 'na mail quanne 'a pàgene de le 'ngazzaminde ha cangiate",
 'tog-enotifminoredits' => "Manneme 'na mail quanne onne state fatte cangiaminde stuèdeche sus a le pàggene",
 'tog-enotifrevealaddr' => "Fa vedè l'indirizze e-mail jndr'à le e-mail de notifiche",
 'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
@@ -58,9 +58,9 @@ $messages = array(
 [//www.mediawiki.org/wiki/Manual:External_editors Pe cchiù 'mbormaziune.])",
 'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
 [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => 'Abbilite "zumbe a" pe accedere a le collegaminde',
-'tog-uselivepreview' => "Ause l'andeprime da 'u vive (JavaScript) (Sperimendele)",
-'tog-forceeditsummary' => "Ciercheme conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
+'tog-showjumplinks' => 'Abbilite "zumbe a" pe scè sus a le collegaminde',
+'tog-uselivepreview' => "Ause l'andeprime da 'u vive (JavaScript) (Sperimendale)",
+'tog-forceeditsummary' => "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
 'tog-watchlisthideown' => "Scunne le cangiaminde mie da 'a liste de le pàgene condrollete",
 'tog-watchlisthidebots' => "Scunne le cangiaminde de le not da 'a liste de le pàgene condrollete",
 'tog-watchlisthideminor' => "Scunne le cangiaminde stuèdeche da 'a liste de le pàgene condrollete",
@@ -554,7 +554,7 @@ Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
 'loginlanguagelabel' => 'Lénga: $1',
 'suspicious-userlogout' => "'A richiesta toje de assè ha state bloccate purcè pare ca ha state mannate da 'nu browser scuasciate o da 'a cache de 'nu proxy.",
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
 'user-mail-no-addy' => "E' pruvate a mannà 'na mail senze 'u 'ndirizze mail",
 'user-mail-no-body' => "Pruvate a mannà 'na mail cu 'nu cuèrpe vacande o troppe curte.",
@@ -1254,7 +1254,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'prefs-displaywatchlist' => "Fà vedè l'opzione",
 'prefs-diffs' => 'Diff',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => "L'indirizze e-mail pare valide",
 'email-address-validity-invalid' => "Mitte 'n'indirizze e-mail valide",
 
@@ -1863,6 +1863,12 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
 'Nvece avessere appondà a 'a temateca appropriate.<br />
 'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-legend' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-text' => "Sta pàgene elenghe le pàggene ca ausane 'na particolare probbietà d'a pàgene.",
+'pageswithprop-prop' => "Nome d'a probbietà:",
+'pageswithprop-submit' => 'Véje',
+
 'doubleredirects' => 'Ridirezionaminde a doppie',
 'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
 Ogne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.
@@ -2058,7 +2064,7 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
 'listgrouprights-addgroup-self-all' => "Mitte tutte le gruppe sus a 'u cunde utende mije",
 'listgrouprights-removegroup-self-all' => "Live tutte le gruppe da 'u cunde utende mije",
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nisciune indirizze de invie',
 'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
 'emailuser' => "Manne n'email a stu utende",
@@ -3591,7 +3597,7 @@ $8',
 'monthsall' => 'tutte',
 'limitall' => 'tutte',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Conferme l'indirizze e-mail",
 'confirmemail_noemail' => "Tu non ge tine 'n'indirizze e-mail valide configurate sus a le [[Special:Preferences|preferenze tue]].",
 'confirmemail_text' => "{{SITENAME}} richiede ca tu ha validà l'indirizze email tue apprime de ausà 'a funzione de l'email.
@@ -4089,4 +4095,7 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
 
+# Image rotation
+'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
+
 );
index fc02919..5de63cf 100644 (file)
@@ -911,7 +911,7 @@ $2',
 'loginlanguagelabel' => 'Язык: $1',
 'suspicious-userlogout' => 'Ваш запрос на завершение сеанса отклонён, так как он похож на запрос, отправленный некорректным браузером или кэширующим прокси.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Неизвестная ошибка в PHP-функции mail()',
 'user-mail-no-addy' => 'Пытался отправить электронное письмо без адреса электронной почты',
 'user-mail-no-body' => 'Пытался отправить электронное письмо с пустым или бессмысленно коротким содержанием.',
@@ -1601,7 +1601,7 @@ $1",
 'prefs-displaywatchlist' => 'Настройки отображения',
 'prefs-diffs' => 'Разница версий',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядит корректно',
 'email-address-validity-invalid' => 'Введите корректный адрес электронной почты!',
 
@@ -2194,6 +2194,12 @@ $1',
 Вместо этого они, вероятно, должны указывать на соответствующую конкретную страницу.<br />
 Страница считается многозначной, если на ней размещён шаблон, имя которого указано на странице [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Страницы с переопределёнными свойствами',
+'pageswithprop-legend' => 'Страницы с переопределёнными свойствами',
+'pageswithprop-text' => 'Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.',
+'pageswithprop-prop' => 'Название свойства:',
+'pageswithprop-submit' => 'Найти',
+
 'doubleredirects' => 'Двойные перенаправления',
 'doubleredirectstext' => 'На этой странице представлен список перенаправлений на другие перенаправления.
 Каждая строка содержит ссылки на первое и второе перенаправления, а также целевую страницу второго перенаправления, в которой обычно указывается название страницы, куда должно ссылаться первое перенаправление.
@@ -2387,7 +2393,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Может добавлять все группы к своей учётной записи',
 'listgrouprights-removegroup-self-all' => 'может удалять все группы со своей учётной записи',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Адрес для отправки отсутствует',
 'mailnologintext' => 'Вы должны [[Special:UserLogin|представиться системе]] и иметь действительный адрес электронной почты в ваших [[Special:Preferences|настройках]], чтобы иметь возможность отправлять электронную почту другим участникам.',
 'emailuser' => 'Письмо участнику',
@@ -3798,7 +3804,7 @@ $1',
 'monthsall' => 'все',
 'limitall' => 'все',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Подтверждение адреса электронной почты',
 'confirmemail_noemail' => 'Вы не задали корректный адрес электронной почты в своих [[Special:Preferences|настройках]].',
 'confirmemail_text' => 'Вики-движок требует подтверждения адреса электронной почты перед тем, как начать с ним работать.
@@ -4201,8 +4207,8 @@ MediaWiki распространяется в надежде, что она бу
 'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
 'logentry-newusers-newusers' => 'Создана учётная запись $1',
 'logentry-newusers-create' => 'Создана учётная запись $1',
-'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись для $3',
-'logentry-newusers-byemail' => 'Учетная запись пользователя $3 была создана $1 и пароль был отправлен по электронной почте',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3 и пароль был отправлен по электронной почте',
 'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
 'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
index 67b8110..6f30d2a 100644 (file)
@@ -542,8 +542,8 @@ $1',
 'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
 'newmessageslink' => 'नूतनाः सन्देशाः',
 'newmessagesdifflink' => 'अन्तिमं परिवर्तनम्',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|अन्ययोजकः|$3 योजकाः}} ($2) इत्यस्मात्  भवतः $1 अस्ति ।',
-'youhavenewmessagesmanyusers' => 'à¤\85नà¥\88à¤\95à¥\87भà¥\8dयà¤\83 à¤¯à¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤¤à¥\87 $1 à¤¸à¤¨à¥\8dति $2 à¥¤',
+'youhavenewmessagesfromusers' => 'भवदर्थम् {{PLURAL:$3|अन्यस्मात् सदस्यात्|$3 सदस्येभ्यः}} $1 अस्ति ($2)।',
+'youhavenewmessagesmanyusers' => 'नैकेभ्यः योजकेभ्यः ते $1 सन्ति $2 ।',
 'newmessageslinkplural' => '{{PLURAL:$1|नूतनः सन्देशः|नूतनसन्देशाः}}',
 'newmessagesdifflinkplural' => 'सद्यः {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
 'youhavenewmessagesmulti' => 'भवतः कृते $1 मध्ये नूतनः सन्देशः विद्यते',
@@ -783,7 +783,7 @@ You may ignore this message, if this account was created in error.',
 'loginlanguagelabel' => 'भाषा : $1',
 'suspicious-userlogout' => 'भवतः सत्राद् बहिर्गमनस्य अनुरोधः अस्वीकृतोऽस्ति, यस्मादेतत् भग्नादेकस्मात् ब्राउज़र्तः अथवा स्वल्पसञ्चयि-प्रॉक्सितः प्रेषित आसीत्।',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
 'user-mail-no-addy' => 'ईपत्रसङ्केतं विना ईपत्रप्रेषणस्य प्रयासः कृतः ।',
 
@@ -1430,7 +1430,7 @@ You can still [$1 view this revision]",
 'prefs-displaywatchlist' => 'प्रदर्शनविकल्पाः',
 'prefs-diffs' => 'अन्तरम्',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।',
 'email-address-validity-invalid' => 'मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।',
 
@@ -2204,7 +2204,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'listgrouprights-addgroup-self-all' => 'स्वस्थाने सर्वसमूहान योजयतु ।',
 'listgrouprights-removegroup-self-all' => 'स्वस्थानात् सर्वसमूहान् अपनयतु ।',
 
-# E-mail user
+# Email user
 'mailnologin' => 'सम्प्रेषणस्य सङ्केतः नास्ति ।',
 'mailnologintext' => 'अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।',
 'emailuser' => 'एतस्मै योजकाय ईपत्रं प्रेष्यताम्',
@@ -3558,7 +3558,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'monthsall' => 'सर्वाणि',
 'limitall' => 'सर्वाणि',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ईपत्रसङ्केतः प्रमाणीक्रियताम्',
 'confirmemail_noemail' => 'भवतः योजकाद्यतायां व्यवस्थापितः विद्युन्मानपत्रसङ्केतः मान्यं नाश्ति ।  [[Special:Preferences|user preferences]]',
 'confirmemail_text' => '{{SITENAME}} इत्यत्र विद्युन्मानसुविधोपयोगात् पूर्वं भवतः विद्युन्मानपत्रसङ्केतं मान्यं करोतु । 
index 3e1d325..94ec90a 100644 (file)
@@ -1753,7 +1753,7 @@ Protucolli suppurtati: <code>$1</code>',
 'listgrouprights-addgroup-self-all' => 'Junci tutti li gruppa ô propriu account',
 'listgrouprights-removegroup-self-all' => 'Può livari tutti li gruppi dô propriu account',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nuddu ndirizzu cui mannari lu missaggiu',
 'mailnologintext' => 'Hai a fari lu [[Special:UserLogin|login]] e aver riggistratu na casella e-mail vàlida ntê tò [[Special:Preferences|prifirenzi]] pi mannari posta alittrònica a àutri Utenti.',
 'emailuser' => "Manna n'imail a stu utenti",
@@ -2777,7 +2777,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
 'namespacesall' => 'Tutti',
 'monthsall' => 'tutti',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Cunferma ndirizzu e-mail',
 'confirmemail_noemail' => 'Nun hà statu ndicatu un ndirizzu e-mail vàlidu ntê propi [[Special:Preferences|prifirenzi]].',
 'confirmemail_text' => "Stu situ richiedi la virìfica di l ndirizzu e-mail prima di putiri usari li funzioni cunnessi a l'email. Prèmiri lu pulsanti ccà sutta pi mannari na richiesta di cunferma a lu propiu ndirizzu; ntô missaggiu è prisenti un culligamenti ca cunteni un còdici. Visitari lu culligamentu cu lu propiu browser pi cunfirmari ca lu ndirizzu e-mail è vàlidu.",
index c33c931..ffd9dc3 100644 (file)
@@ -717,7 +717,7 @@ Molimo Vas da sačekate prije nego što pokušate ponovo.',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
 '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.',
@@ -1414,7 +1414,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'prefs-displaywatchlist' => 'Postavke prikaza',
 'prefs-diffs' => 'Razlike',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail adresa izgleda valjano',
 'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
 
@@ -2195,7 +2195,7 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 'listgrouprights-addgroup-self-all' => 'Može dodati sve grupe na svoj račun',
 'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog računa',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Nema adrese za slanje',
 'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.',
 'emailuser' => 'Pošalji E-mail ovom korisniku',
@@ -3577,7 +3577,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'monthsall' => 'sve',
 'limitall' => 'sve',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potvrdite adresu e-pošte',
 'confirmemail_noemail' => 'Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].',
 'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž
index 34d3fbe..8fe62a8 100644 (file)
@@ -781,7 +781,7 @@ Prosím, počkajte predtým, než to skúsite znova.',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
 'user-mail-no-addy' => 'Pokus o odoslanie e-mailu bez e-mailovej adresy.',
 
@@ -1463,7 +1463,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'prefs-displaywatchlist' => 'Možnosti zobrazenia',
 'prefs-diffs' => 'Rozdiely',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Formát e-mailovej adresa vyzerá byť správny',
 'email-address-validity-invalid' => 'Zadajte platnú e-mailovú adresu',
 
@@ -2242,7 +2242,7 @@ Môžete si prečítať [[{{MediaWiki:Listgrouprights-helppage}}|ďalšie inform
 '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',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Žiadna adresa na zaslanie',
 'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
 'emailuser' => 'E-mail tomuto používateľovi',
@@ -3627,7 +3627,7 @@ Ostatné budú predvolene skryté.
 'monthsall' => 'všetky',
 'limitall' => 'všetky',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potvrdiť e-mailovú adresu',
 'confirmemail_noemail' => 'Nenastavili ste platnú emailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].',
 'confirmemail_text' => '{{SITENAME}} vyžaduje, aby ste potvrdili platnosť vašej e-mailovej adresy
index bd709c6..a09a709 100644 (file)
@@ -13,6 +13,7 @@
  * @author Irena Plahuta
  * @author McDutchie
  * @author Smihael
+ * @author Vadgt
  * @author XJamRastafire
  * @author Yerpo
  * @author romanm
@@ -701,7 +702,7 @@ Prosimo počakajte, preden poskusite znova.',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
 'user-mail-no-addy' => 'Poskušal poslati e-pošto brez e-poštnega naslova',
 'user-mail-no-body' => 'Poskušali ste poslati e-pošto s prazno ali nerazumno kratko vsebino.',
@@ -1392,7 +1393,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'prefs-displaywatchlist' => 'Možnosti prikaza',
 'prefs-diffs' => 'Primerjave',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Izgleda veljaven',
 'email-address-validity-invalid' => 'Obvezen je veljaven naslov!',
 
@@ -1997,6 +1998,12 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
 Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
 Stran se obravnava kot razločitvena, če uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Strani z lastnostmi strani',
+'pageswithprop-legend' => 'Strani z lastnostmi strani',
+'pageswithprop-text' => 'Stran navaja vse strani, ki uporabljajo določene lastnosti strani.',
+'pageswithprop-prop' => 'Ime lastnosti:',
+'pageswithprop-submit' => 'Pojdi',
+
 'doubleredirects' => 'Dvojne preusmeritve',
 'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
 Vsaka 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.
@@ -2188,7 +2195,7 @@ Morda so na razpolago tudi [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 'listgrouprights-addgroup-self-all' => 'Lastni račun dodaj v vse skupine',
 'listgrouprights-removegroup-self-all' => 'Lastni račun odstrani iz vseh skupin',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Manjka naslov pošiljatelja',
 'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
 'emailuser' => 'Pošlji uporabniku e-pismo',
@@ -2325,7 +2332,7 @@ Za zapise nedavnih brisanj glej $2.',
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
 'deletionlog' => 'dnevnik brisanja',
-'reverted' => 'Vrnjeno na prejšnje urejanje.',
+'reverted' => 'Vrnjeno na prejšnjo redakcijo.',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlogi:',
 'deletereasonotherlist' => 'Drug razlog',
@@ -3126,7 +3133,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2&nbsp;×&nbsp;$3',
 'seconds-abbrev' => '$1 s',
-'minutes-abbrev' => '$1 m',
+'minutes-abbrev' => '$1 min',
 'hours-abbrev' => '$1 h',
 'days-abbrev' => '$1 d',
 'seconds' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
@@ -3568,7 +3575,7 @@ Druga bodo po privzetem skrita.
 'monthsall' => 'vse',
 'limitall' => 'vse',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Potrditev naslova elektronske pošte',
 'confirmemail_noemail' => 'Nimate določenega veljavnega e-poštnega naslova v vaših [[Special:Preferences|uporabniških nastavitvah]].',
 'confirmemail_text' => 'Za uporabo e-poštnih možnosti {{GRAMMAR:rodilnik|{{SITENAME}}}} morate najprej potrditi svoj e-poštni naslov.
@@ -3661,6 +3668,9 @@ Prosimo, potrdite, da jo resnično želite znova ustvariti.",
 'confirm-unwatch-button' => 'V redu',
 'confirm-unwatch-top' => 'Odstranim stran z vašega spiska nadzorov?',
 
+# Separators for various lists, etc.
+'percent' => '$1 %',
+
 # Multipage image navigation
 'imgmultipageprev' => '← prejšnja stran',
 'imgmultipagenext' => 'naslednja stran →',
@@ -3978,4 +3988,7 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
 
+# Image rotation
+'rotate-comment' => 'Slika zavrti s  $1  {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
+
 );
index d93c164..36e0bb8 100644 (file)
@@ -472,7 +472,7 @@ Fadlan waxyar sug intii aadan soo gelin.',
 'login-abort-generic' => 'Ma u soo gali karin gudaha - waa la noqay',
 'loginlanguagelabel' => 'Luqada: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
 
 # Change password dialog
@@ -1068,7 +1068,7 @@ Tafaasiishiisa waxee ku qorantahay [$2 bogga tafaasiisha faylka] oo ka arki kart
 # Special:ListGroupRights
 'listgrouprights-members' => '(Inta ka mid ah liiskooda)',
 
-# E-mail user
+# Email user
 'mailnologin' => "Ma'jiro cinwaan wax lagu diro",
 'mailnologintext' => 'Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]
 kuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],
@@ -1163,6 +1163,7 @@ Faalada iyo helista caawinaad dheeraad ah:
 # Rollback
 'rollback_short' => 'Soo celi',
 'rollbacklink' => 'dib u soo celi',
+'rollbacklinkcount-morethan' => 'soo celinta in kabadan $1 {{PLURAL:$1|badal|badallo}}',
 'revertpage' => 'Wuxuu dib u noqay badalkii oo sameeyay  [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) kuna celiyay badalkii ka  danbeeyay oo sameeyay  [[User:$1|$1]]',
 'revertpage-nouser' => 'Wuxuu dib u noqay bedelyada (magaca isticmaalaha waa laga saaray) kuna celiyay  [[User:$1|$1]]',
 'rollback-success' => 'Wuxuu dib u noqay bedelka oo sameeyay  $1;
@@ -1421,7 +1422,7 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
 'namespacesall' => 'dhamaan',
 'monthsall' => 'Dhamaan',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_noemail' => 'Kuma haysatid cinwaan E-boosto sax [[Special:Preferences|isticmaala dooqiisa]].',
 
 # action=watch/unwatch
index 60a5d8d..d0aec6b 100644 (file)
@@ -822,7 +822,7 @@ Vänta innan du försöker igen.',
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
 'user-mail-no-addy' => 'Försökte skicka e-post utan en e-postadress',
 'user-mail-no-body' => 'Försökte skicka e-post med tomt eller orimligt kort innehåll.',
@@ -1503,7 +1503,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'prefs-displaywatchlist' => 'Visningalternativ',
 'prefs-diffs' => 'Skillnader',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ser giltig ut',
 'email-address-validity-invalid' => 'Giltig adress krävs!',
 
@@ -2097,6 +2097,12 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
 De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
 En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Sidor med en sidegenskap',
+'pageswithprop-legend' => 'Sidor med en sidegenskap',
+'pageswithprop-text' => 'Denna sida listar sidor som använder en speciell sidegenskap.',
+'pageswithprop-prop' => 'Egenskapsnamn:',
+'pageswithprop-submit' => 'Gå',
+
 'doubleredirects' => 'Dubbla omdirigeringar',
 'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. Varje 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.
 <del>Stryk över</del> poster som har åtgärdats.',
@@ -2286,7 +2292,7 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
 'listgrouprights-addgroup-self-all' => 'Kan lägga till alla grupperna till sitt eget konto',
 'listgrouprights-removegroup-self-all' => 'Kan ta bort alla grupperna från sitt eget konto',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Ingen adress att skicka till',
 'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
 'emailuser' => 'Skicka e-post till den här användaren',
@@ -3691,7 +3697,7 @@ Andra kommer att gömmas som standard
 'monthsall' => 'alla',
 'limitall' => 'alla',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Bekräfta e-postadress',
 'confirmemail_noemail' => 'Du har inte angivit någon giltig e-postadress i dina [[Special:Preferences|inställningar]].',
 'confirmemail_text' => 'Innan du kan använda {{SITENAME}}s funktioner för e-post måste du bekräfta din e-postadress. Aktivera knappen nedan för att skicka en bekräftelsekod till din e-postadress. Mailet kommer att innehålla en länk, som innehåller en kod. Genom att klicka på den länken eller kopiera den till din webbläsares fönster för webbadresser, bekräftar du att din e-postadress fungerar.',
@@ -4096,4 +4102,7 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
 
+# Image rotation
+'rotate-comment' => 'Bilden roteras $1 {{PLURAL:$1|grad|grader}} medurs',
+
 );
index 5c28ebd..7dbcac1 100644 (file)
@@ -642,7 +642,7 @@ $2',
 'loginlanguagelabel' => 'భాష: $1',
 'suspicious-userlogout' => 'సరిగా పనిచేయని విహారిణి లేదా కాషింగ్ ప్రాక్సీ వల్ల పంపబడడం చేత, నిష్క్రమించాలనే మీ అభ్యర్థనని నిరాకరించారు.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP యొక్క mail() ఫంక్షన్‍లో ఏదో తెలియని లోపం దొర్లింది',
 'user-mail-no-addy' => 'ఈ-మెయిలు చిరునామాని ఇవ్వకుండానే ఈ-మెయిలు పంపడానికి ప్రయత్నించారు.',
 
@@ -1281,7 +1281,7 @@ $1",
 'prefs-displaywatchlist' => 'ప్రదర్శన ఎంపికలు',
 'prefs-diffs' => 'తేడాలు',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ఈ-మెయిలు చిరునామా సరిగానే ఉన్నట్టుంది',
 'email-address-validity-invalid' => 'దయచేసి సరైన ఈమెయిలు చిరునామాని ఇవ్వండి',
 
@@ -1990,7 +1990,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listgrouprights-addgroup-self-all' => 'అన్ని సమూహాలని స్వంత ఖాతాకి చేర్చుకోలగడటం',
 'listgrouprights-removegroup-self-all' => 'స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం',
 
-# E-mail user
+# Email user
 'mailnologin' => 'పంపించవలసిన చిరునామా లేదు',
 'mailnologintext' => 'ఇతరులకు ఈ-మెయిలు పంపించాలంటే, మీరు [[Special:UserLogin|లాగిన్‌]] అయి ఉండాలి, మరియు మీ [[Special:Preferences|అభిరుచుల]]లో సరైన ఈ-మెయిలు చిరునామా ఇచ్చి ఉండాలి.',
 'emailuser' => 'ఈ వాడుకరికి ఈ-మెయిలుని పంపించండి',
@@ -3236,7 +3236,7 @@ $1',
 'monthsall' => 'అన్నీ',
 'limitall' => 'అన్నీ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ఈ-మెయిలు చిరునామా ధృవీకరించండి',
 'confirmemail_noemail' => '[[Special:Preferences|మీ అభిరుచులలో]] ఈమెయిలు అడ్రసు పెట్టి లేదు.',
 'confirmemail_text' => '{{SITENAME}}లో ఈ-మెయిలు అంశాల్ని వాడుకునే ముందు మీ ఈ-మెయిలు చిరునామాను నిర్ధారించవలసిన అవసరం ఉంది.
index ebde245..c15263a 100644 (file)
@@ -639,7 +639,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'listgrouprights-rights' => 'Priviléjiu',
 'listgrouprights-members' => '(lista membru nian)',
 
-# E-mail user
+# Email user
 'emailuser' => "Haruka korreiu eletróniku ba uza-na'in ne'e",
 'defemailsubject' => '{{SITENAME}} - korreiu eletróniku husi uza-na\'in "$1"',
 'noemailtitle' => "Lá'os diresaun korreiu eletróniku",
index 371a819..9a9c71f 100644 (file)
@@ -77,7 +77,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир',
 'tog-newpageshidepatrolled' => 'Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав',
 'tog-extendwatchlist' => 'Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйиротҳо, на танҳо аз ҳама охирин',
-'tog-usenewrc' => 'Ð\90з Ñ\82аÒ\93йиÑ\80оÑ\82и Ð¾Ñ\85иÑ\80и Ð³Ñ\83Ñ\81Ñ\82аÑ\80иÑ\88Ñ\91Ñ\84Ñ\82а Ð¸Ñ\81Ñ\82иÑ\84ода Ð±Ð°Ñ\80ед(ҶаваСкÑ\80ипÑ\82 Ð»Ð¾Ð·Ð¸Ð¼ Ð°Ñ\81т)',
+'tog-usenewrc' => 'Ð\93Ñ\83Ñ\80ӯҳбандии Ñ\82аÒ\93ийÑ\80оÑ\82 Ð±Ð°Ñ\80 Ð¿Ð¾Ñ\8fи Ñ\81аÑ\84ҳа Ð´Ð°Ñ\80 Ñ\82аÒ\93ийÑ\80оÑ\82и Ð¾Ñ\85иÑ\80 Ð²Ð° Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð¿Ð°Ð¹Ð³Ð¸Ñ\80иҳо (ниÑ\91зманди Ò¶Ð°Ð²Ð°Ð¡ÐºÑ\80ипт)',
 'tog-numberheadings' => 'шуморагузори~и худкори инвонҳо',
 'tog-showtoolbar' => 'Намоиши навори абзори вироиш (JavaScript)',
 'tog-editondblclick' => 'Вироиш намудани саҳифаҳо ҳангоми ду карат пахш намудани тугмаи мушак (JavaScript)',
@@ -85,17 +85,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Ба кор андохтани вироиши сарлавҳаҳои қисматҳо бо клики рост (ҶаваСкрипт)',
 'tog-showtoc' => 'Намоиши феҳристи мундариҷон (барои мақолаҳои бо беш аз 3 сарлавҳа)',
 'tog-rememberpassword' => 'Вуруди манро дар ин мурургар дар хотир нигоҳ дор (ҳадди аксар то $1 {{PLURAL:$1|рӯз|рӯз}})',
-'tog-watchcreations' => 'Ð\94оÑ\85ил Ð½Ð°Ð¼Ñ\83дани Ñ\81аҳиÑ\84аҳое, ÐºÐ¸ Ð¼Ð°Ð½ Ñ\81оÑ\85Ñ\82аам Ð±Ð° Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð½Ð°Ð·Ð°Ñ\80оÑ\82и Ð¼Ð°Ð½',
-'tog-watchdefault' => 'Саҳифаҳои эҷодкардаамро ба феҳристи пайгириам илова кунед',
-'tog-watchmoves' => 'Саҳифаҳои кӯчонидаамро ба феҳристи пайгириҳоям илова кунед',
-'tog-watchdeletion' => 'Саҳифаҳои эҷодкардаи манро ба феҳристи пайгириҳоям илова кунед',
+'tog-watchcreations' => 'СаҳиÑ\84аҳое, ÐºÐ¸ Ð¼ÐµÑ\81озам Ð²Ð° Ð¿Ð°Ñ\80вандаҳое, ÐºÐ¸ Ð±Ð¾Ñ\80гÑ\83зоÑ\80Ó£ Ð¼ÐµÐºÑ\83нам Ð±Ð° Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð¿Ð°Ð¹Ð³Ð¸Ñ\80иҳоÑ\8fм Ð°Ñ\84зÑ\83да Ñ\88авад.',
+'tog-watchdefault' => 'Саҳифаҳо ва парвандаҳое, ки вироиш мекунам ба феҳристи пайгириҳоям афзуда шавад',
+'tog-watchmoves' => 'Саҳифаҳо ва парвандаҳое, ки мунтақил мекунам ба феҳристи пайгириҳоям афзуда шавад',
+'tog-watchdeletion' => 'Саҳифаҳо ва парвандаҳое, ки ҳазф мекунам ба феҳристи пайгириҳоям афзуда шавад',
 'tog-minordefault' => 'Пешфарзи ҳамаи вироишҳоро ҷузъи ишора кунед',
 'tog-previewontop' => 'Намоиши пешнамоиши қаблӣ пеш аз қуттии вироиш ва на пас аз он',
 'tog-previewonfirst' => 'Нишон додани пешнамоиш дар нахустин вироиш',
 'tog-nocache' => 'Ҳофизаи ниҳонии саҳифа дар мурургар ғайрифаъол шавад',
-'tog-enotifwatchlistpages' => 'Агар саҳифае мавриди пайгирии ман тағйир карда шавад ба ман тариқи почтаи электронӣ пайём бифиристед.',
+'tog-enotifwatchlistpages' => 'Агар сафҳа ё парвандае аз феҳристи пайгириҳоям вироиш шуд ба ман номае фиристода шавад',
 'tog-enotifusertalkpages' => 'Ҳангоме ки дар саҳифаи корбариам тағйир дода мешавад ба ман тариқи почтаи электронӣ пайём бифиристед.',
-'tog-enotifminoredits' => 'Ð\91аÑ\80ои Ñ\82аÒ\93йиÑ\80оÑ\82и Ò·Ñ\83зÑ\8aи Ð±Ð° Ð¼Ð°Ð½ Ñ\82аÑ\80иÒ\9bи Ð¿Ð¾Ñ\87Ñ\82аи Ñ\8dлекÑ\82Ñ\80онӣ Ð¿Ð°Ð¹Ñ\91м Ð±Ð¸Ñ\84иÑ\80иÑ\81Ñ\82ед.',
+'tog-enotifminoredits' => 'Ð\91аÑ\80ои Ñ\82аÒ\93ийÑ\80оÑ\82и Ò·Ñ\83зÑ\8aÓ£ Ð´Ð°Ñ\80 Ñ\81аÑ\84ҳаҳо Ð²Ð° Ð¿Ð°Ñ\80вандаҳо Ò³Ð°Ð¼ Ð±Ð° Ð¼Ð°Ð½ Ð½Ð¾Ð¼Ð°Ðµ Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88авад',
 'tog-enotifrevealaddr' => 'Нишонаи почтаи электронии ман дар номаҳои иттилорасонӣ қайд шавад',
 'tog-shownumberswatching' => 'Нишон додани шумораи корбарони пайгир',
 'tog-oldsig' => 'Пешнамоиши имзои вуҷуддошта:',
@@ -118,7 +118,7 @@ $messages = array(
 
 'underline-always' => 'Доимо',
 'underline-never' => 'Ҳеҷгоҳ',
-'underline-default' => 'Пешфарзи мурургар',
+'underline-default' => 'Пӯст ё мурургари пешфарз',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Сабки қалами ҷаъбаи вироиш:',
@@ -196,14 +196,15 @@ $messages = array(
 'listingcontinuesabbrev' => 'идома',
 'index-category' => 'Саҳифаҳои намояшуда',
 'noindex-category' => 'Саҳифаҳои намоиянашуда',
+'broken-file-category' => 'Саҳифаҳои дорои пайванди шикаста ба парванда',
 
 'about' => 'Дар бораи',
 'article' => 'Саҳифаи мӯҳтаво',
 'newwindow' => '(дар равзанаи ҷадид боз мешавад)',
 'cancel' => 'Лағв',
 'moredotdotdot' => 'Бештар...',
-'mypage' => 'Саҳифаи ман',
-'mytalk' => 'Ð\93Ñ\83Ñ\84Ñ\82Ñ\83гӯи Ð¼Ð°Ð½',
+'mypage' => 'Саҳифа',
+'mytalk' => 'Ð\91аҳÑ\81',
 'anontalk' => 'Баҳс бо ин IP',
 'navigation' => 'Гаштан',
 'and' => '&#32;ва',
@@ -424,7 +425,7 @@ $1',
 'viewsource' => 'Намоиши матни вики',
 'actionthrottled' => 'Ҷилави амали шумо гирифта шуд',
 'actionthrottledtext' => 'Ба манзури ҷилавгирӣ аз спам, шумо иҷоза надоред, ки чунин амалеро беш аз чанд бор дар як муддати замони кӯтоҳ анҷом бидиҳед. Лутфан пас аз чанд дақиқа дубора талош кунед.',
-'protectedpagetext' => 'Ин саҳифа барои ҷилавгирӣ аз вироиш қуфл шудааст.',
+'protectedpagetext' => 'Ин саҳифа барои ҷилавгирӣ аз вироиш ва дигар амалҳо қуфл шудааст.',
 'viewsourcetext' => 'Шумо метавонед матни викии ин саҳифаро назар кунед ё нусха бардоред:',
 'protectedinterface' => 'Ин саҳифа ороишдиҳандаи матни ин нармафзор аст, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааст.',
 'editinginterface' => "'''Огоҳӣ:''' Шумо саҳифаеро вироиш карда истодаед, ки матни интерфейси барнома мебошад. Тағйироти ин саҳифа барои намуди интерфейси дигар корбарон таъсир хоҳад расонид. Барои тарҷумаҳо, лутфан аз [//translatewiki.net/wiki/Main_Page?setlang=tg Бетавики], ки лоиҳаи маҳаликунонии МедиаВики мебошад, истифода кунед.",
@@ -464,6 +465,7 @@ $1',
 'createaccount' => 'Ҳисоби ҷадидеро созед',
 'gotaccount' => "Ҳисоби корбарӣ доред? '''$1'''.",
 'gotaccountlink' => 'Вуруд шавед',
+'userlogin-resetlink' => 'Ҷузъиёти вурудро фаромӯш кардаед?',
 'createaccountmail' => 'бо почтаи электронӣ',
 'createaccountreason' => 'Сабаб:',
 'badretype' => 'Калимаҳои убуре, ки ворид кардаед бо ҳамдигар мувофиқат намекунанд.',
@@ -529,12 +531,18 @@ $1',
 'resetpass_forbidden' => 'Дар {{SITENAME}} калимаҳои убурро наметавон тағйир дод',
 'resetpass-no-info' => 'Барои дастрасии мустақим ба ин саҳифа шумо бояд ба систем ворид шуда бошед.',
 'resetpass-submit-loggedin' => 'Тағйири гузарвожа',
+'resetpass-submit-cancel' => 'Лағв',
 'resetpass-wrong-oldpass' => 'Гузарвожаи мувақат ё охир номӯътабар.
 Мумкин аст, ки шумо аллакай гузарвожаатонро бо муваффақият тағйир дода бошед ё дархости як гузарвожаи мувақатӣ карда бошед.',
 'resetpass-temp-password' => 'Гузарвожаи муваққатӣ:',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Номи корбарӣ',
+'passwordreset-username' => 'Номи корбарӣ:',
+'passwordreset-emailelement' => 'Номи корбарӣ: $1
+Гузарвожаи муваққатӣ: $2',
+
+# Special:ChangeEmail
+'changeemail-cancel' => 'Лағв',
 
 # Edit page toolbar
 'bold_sample' => 'Матни пурранг',
@@ -627,7 +635,8 @@ $1',
 'userinvalidcssjstitle' => "'''Ҳушдор:'''Пӯсте бо номи \"\$1\" вуҷуд надорад. Таваҷҷӯҳ кунед ки саҳифаҳои .css ва .js бо ҳарфҳои хурд навишта мешаванд, Намуна. {{ns:user}}:Фу/vector.css дар муқобили корбар {{ns:user}}:Фу/Vector.css.",
 'updated' => '(Ба рӯз шуда)',
 'note' => "'''Эзоҳ:'''",
-'previewnote' => "'''Ин фақат пешнамоиш аст; дигаргуниҳо ҳоло захира нашудаанд!'''",
+'previewnote' => "'''Ба ёд дошта бошед, ки ин фақат пешнамоиш аст.'''
+Тағийроти шумо ҳанӯз захира нашудааст!",
 'previewconflict' => 'Ин пешнамоиш аккоскунандаи матни ноҳияи вироиш дар боло аст ва агар онро захира кунед бо ҳамин шакл нишода дода хоҳад шуд.',
 'session_fail_preview' => "'''Бубахшед! Аз сабаби аз даст рафтани иттилооти нишасти корбарӣ, наметавонем вироишҳои шуморо пардозиш кунем.
 Лутфан дубора саъй кунед. Агар боз бо ҳамин паём рӯ ба рӯ шавед, аз систем хориҷ шавед ва муҷаддадан ворид шавед.'''",
@@ -681,6 +690,9 @@ $1',
 Шумо зарурияти вироиши ин саҳифаро дида баромаданатон лозим.
 Сабти ҳазфшавии ин саҳифа барои фароҳам овардани имкониятҳои қулай оварда шудааст:",
 
+# Parser/template warnings
+'post-expand-template-argument-category' => 'Саҳифаҳои ҳавои шаблонҳои бо параметрҳои нодида гирифташуда',
+
 # "Undo" feature
 'undo-success' => 'Ин вироиш метавонад ботил шавад. Лутфан муқоисаи зеринро барои таъйид кардани амалӣ худ, баррасӣ кунед, ва баъдан барои анҷом додани ботилкунии вироиш тағйироти зеринро захира кунед.',
 'undo-failure' => 'Ба иллати бархӯрдани вироишҳои дар миён омада, ин вироишро ботил наметавон кард.',
@@ -711,6 +723,7 @@ $1',
 Шарҳ: (феълӣ) тафовут бо нусхаи феълӣ
 (қаблӣ) = тафовут бо нусхаи феълӣ, ҷузъ = вироиши ҷузъӣ',
 'history-fieldset-title' => 'Мурури таърих',
+'history-show-deleted' => 'Фақат ҳазфшуда',
 'histfirst' => 'Аввалин',
 'histlast' => 'Охирин',
 'historysize' => '({{PLURAL:$1|1 байт|$1 байт}})',
@@ -754,6 +767,7 @@ $1',
 'revdelete-success' => "'''Тағйири намоёнии нусха бо муваффақият анҷом шуд.'''",
 'logdelete-success' => "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
 'revdel-restore' => 'Тағйири падидорӣ',
+'revdel-restore-deleted' => 'нусхаҳои ҳазфшуда',
 'revdel-restore-visible' => 'нусхаҳои намоён',
 'pagehist' => 'Таърихи саҳифа',
 'deletedhist' => 'Таърихи ҳазфшуда',
@@ -796,7 +810,7 @@ $1',
 'lineno' => 'Сатри $1:',
 'compareselectedversions' => 'Нусхаҳои интихобшударо муқоиса кунед',
 'editundo' => 'ботил',
-'diff-multi' => '({{PLURAL:$1|вироиши миёнӣ|$1 вироишоти миёнӣ}} нишон дода нашудааст.)',
+'diff-multi' => '({{PLURAL:$1|як|$1}} вироиш миёнӣ тавассути {{PLURAL:$2|як|$2}} корбар нишон дода нашудааст)',
 
 # Search results
 'searchresults' => 'Натиҷаҳои ҷустуҷӯ',
@@ -813,16 +827,19 @@ $1',
 'nextn' => 'баъдӣ {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Намоиш ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Гузинаҳои ҷустуҷӯ',
+'searchmenu-exists' => "'''Саҳифае бо номи \"[[:\$1]]\" дар ин вики вуҷуд дорад.'''",
 'searchmenu-new' => "'''Эҷоди саҳифаи \"[[:\$1]]\" дар ин вики!'''",
 'searchhelp-url' => 'Help:Мундариҷа',
-'searchprofile-articles' => 'Саҳифаҳои мӯҳтавоӣ',
-'searchprofile-project' => 'Саҳифаҳои лоиҳа',
-'searchprofile-images' => 'Парвандаҳо',
+'searchprofile-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-score' => 'Иртибот: $1%',
 'search-redirect' => '(тағйири масир $1)',
@@ -838,6 +855,7 @@ $1',
 'showingresultsnum' => "Намоиши {{PLURAL:$3|'''1''' натиҷа|'''$3''' натоиҷ}} оғоз аз #'''$2'''.",
 'nonefound' => "'''Эзоҳ''': Танҳо чанд фазоиномҳо аз рӯи пешфарш ҷустуҷӯ мешаванд.
 Ҷустуҷӯи худро бо пешванди ''ҳама:'' барои ҷустуҷӯи мӯҳтавои пурра (саҳифаҳои баҳс, шаблонҳо ва ғайраҳо) такрор кунед, ё фазои номи дилхоҳро чун пешванд истифода баред.",
+'search-nonefound' => 'Натиҷаи муносиб бо дархост пайдо нашуд.',
 'powersearch' => 'Ҷустуҷӯ',
 'powersearch-legend' => 'Ҷустуҷӯи пешрафта',
 'powersearch-ns' => 'Ҷустуҷӯ дар фазоҳои ном:',
@@ -856,7 +874,7 @@ $1',
 
 # Preferences page
 'preferences' => 'Тарҷиҳот',
-'mypreferences' => 'Тарҷиҳоти ман',
+'mypreferences' => 'Танзимот',
 'prefs-edits' => 'Шумораи вироишҳо:',
 'prefsnologin' => 'Ба систем ворид нашудаед',
 'prefsnologintext' => 'Барои танзими тарҷиҳоти корбарӣ бояд [[Special:UserLogin|вуруд ба систем шавед]].',
@@ -916,7 +934,7 @@ $1',
 'gender-female' => 'Зан',
 'email' => 'Почтаи электронӣ',
 'prefs-help-realname' => 'Номи ҳақиқӣ ихтиёрӣ ва агар шумо онро пешниҳод кунед онро ҳамчун муаллифи эҷодиётатон ёдоварӣ карда хоҳад шуд.',
-'prefs-help-email' => 'Нишонаи почтаи электронӣ (ихтиёрӣ); тамоси дигар корбарон бо шуморо ба василаи номаи электронӣ аз тариқи саҳифаи корбарӣ ё саҳифаи баҳси корбарӣ, бидуни ниёз ба фош кардани сомона ва нишонаи воқеъи почтаи электронии шумо мумкин месозад.',
+'prefs-help-email' => 'Нишонаи электронӣ ихтиёрист, аммо фиристодани гузарвожаи навро агар гузарвожаи худро фаромӯш кунед мумкин мегардад.',
 'prefs-help-email-required' => 'Нишони почтаи электрони лозим аст.',
 
 # User rights
@@ -1022,6 +1040,10 @@ $1',
 'recentchanges-legend' => 'Ихтиёроти тағйироти охирин',
 'recentchanges-summary' => 'Назорати тағйиротҳои навтарин дар Википедиа дар ҳамин саҳифа аст.',
 'recentchanges-feed-description' => 'Радёбии охирин тағйироти ин вики дар ин хурд.',
+'recentchanges-label-newpage' => 'Ин вироиш саҳифаи нав эҷод кард',
+'recentchanges-label-minor' => 'Ин вироиши ҷузъи аст',
+'recentchanges-label-bot' => 'Ин вироишро робот анҷом додааст',
+'recentchanges-label-unpatrolled' => 'Ин вироиш ҳанӯз гаштзанӣ нашудааст',
 'rcnote' => "Дар поён  {{PLURAL:$1|'''1''' тағйире аст|'''$1''' тағйирот мебошанд}}, ки дар давоми {{PLURAL:$2|рӯҳ|'''$2''' рӯзҳои}} охир, сар карда аз $5, $4.",
 'rcnotefrom' => 'Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).',
 'rclistfrom' => 'Нишон додани тағйиротҳои нав сар карда аз $1',
@@ -1140,7 +1162,7 @@ $1',
 'upload-curl-error28-text' => 'Ин сомона беш аз андоза дар посух тӯл кард. Лутфан баррасӣ кунед, ки оё сомона фаъол ва бар хат аст ё на. Сипас лаҳзае интизор шавед ва дубора талош кунед. Шояд бад набошад дар вақти н он қадар банд дубора талош кунед.',
 
 'license' => 'Иҷозатнома:',
-'license-header' => 'Иҷозатнома:',
+'license-header' => 'Иҷозатнома',
 'nolicense' => 'Ҳеҷ яке интихоб нашудааст',
 'license-nopreview' => '(Пешнамоиш вуҷуд надорад)',
 'upload_source_url' => '(як нишони интернетии мӯътабар ва оммавӣ)',
@@ -1306,6 +1328,7 @@ $1',
 'protectedtitlestext' => 'Унвонҳои зерин аз эҷод муҳофизат шудаанд',
 'protectedtitlesempty' => 'Дар ҳоли ҳозир ҳеҷ унвоне бо ин параметрҳо муҳофизат нащудааст',
 'listusers' => 'Рӯйхати корбарон',
+'usercreated' => '{{GENDER:$3|Эҷодшуда}} дар таърихи $1 дар соати $2',
 'newpages' => 'Саҳифаҳои нав',
 'newpages-username' => 'Номи корбар:',
 'ancientpages' => 'Саҳифаҳои кӯҳнатарин',
@@ -1386,7 +1409,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-helppage' => 'Help:Дастрасиҳои гурӯҳӣ',
 'listgrouprights-members' => '(феҳристи аъзоён)',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Нишонае аз фиристанда вуҷуд надорад',
 'mailnologintext' => 'Барои фиристодани почтаи электронӣ барои корбарони дигар бояд [[Special:UserLogin|ба систем ворид шавед]] ва нишонаи почтаи электронии мӯътабар дар [[Special:Preferences|тарҷиҳоти]] худ дошта бошед.',
 'emailuser' => 'Фиристодани email ба ин корбар',
@@ -1408,8 +1431,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailsenttext' => 'Номаи почтаи электронии шумо фиристода шуд.',
 
 # Watchlist
-'watchlist' => 'Феҳристи назароти ман',
-'mywatchlist' => 'Феҳристи назароти ман',
+'watchlist' => 'Феҳристи пайгирӣ',
+'mywatchlist' => 'Феҳристи пайгириҳо',
+'watchlistfor2' => 'Барои $1 $2',
 'nowatchlist' => 'Дар феҳристи пайгириҳои шумо ҳеҷ мавриде нест.',
 'watchlistanontext' => 'Лутфан барои мушоҳида ва вироиши феҳристи пайгириҳои худ аз $1 истифода кунед.',
 'watchnologin' => 'Вуруд нашуда',
@@ -1486,6 +1510,7 @@ $NEWPAGE
 'historywarning' => 'Ҳушдор: Саҳифае ки шумо ҳазф карданиед, таърих дорад:',
 'confirmdeletetext' => 'Шумо дар ҳоли ҳазф кардани як саҳифа ё аксе аз пойгоҳ дода ҳамроҳ бо тамоми таърихи он ҳастед. Лутфан ин амалро тасдиқ кунед ва итминон ҳосил кунед, ки оқибати ин корро медонед ва ин амалро мутобиқи [[{{MediaWiki:Policy-url}}|сиёсати ҳазф]] анҷом медиҳед.',
 'actioncomplete' => 'Амал иҷро шуд',
+'actionfailed' => 'Амал номуваффақ шуд',
 'deletedtext' => '"$1" ҳазф шудааст.
 Нигаред ба $2 барои гузориши ҳазфи охирин.',
 'dellogpage' => 'Гузоришҳои ҳазф',
@@ -1615,9 +1640,9 @@ $1',
 'blanknamespace' => '(Аслӣ)',
 
 # Contributions
-'contributions' => 'Ҳиссагузории корбар',
+'contributions' => 'Ҳиссагузориҳои {{GENDER:$1|корбар}}',
 'contributions-title' => 'Ҳиссагузориҳои корбар барои $1',
-'mycontris' => 'Хиссагузории ман',
+'mycontris' => 'Ҳиссагузориҳо',
 'contribsub2' => 'Барои $1 ($2)',
 'nocontribs' => 'Ҳеҷ тағйире бо ин мушаххасот пайдо нашуд.',
 'uctop' => '(боло)',
@@ -1628,7 +1653,9 @@ $1',
 'sp-contributions-newbies-sub' => 'Барои навкорон',
 'sp-contributions-blocklog' => 'Гузориши басташуданҳо',
 'sp-contributions-deleted' => 'Ҳиссагузориҳои ҳазфшудаи корбар',
-'sp-contributions-talk' => 'Баҳс',
+'sp-contributions-uploads' => 'боргузориҳо',
+'sp-contributions-logs' => 'гузоришҳо',
+'sp-contributions-talk' => 'баҳс',
 'sp-contributions-userrights' => 'Мудирияти ихтиёроти корбарӣ',
 'sp-contributions-search' => 'Ҷустуҷӯи ҳиссагузориҳо',
 'sp-contributions-username' => 'IP нишона ё номи корбар:',
@@ -1643,13 +1670,14 @@ $1',
 'nolinkshere-ns' => "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''[[:$1]]''' пайванд надорад.",
 'isredirect' => 'саҳифаи тағйири масир',
 'istemplate' => 'истифодашуда дар саҳифа',
-'isimage' => 'пайванди акс',
+'isimage' => 'пайванд ба парванда',
 'whatlinkshere-prev' => '{{PLURAL:$1|қаблӣ|қаблӣ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|баъдӣ|баъдӣ $1}}',
 'whatlinkshere-links' => '← пайвандҳо',
 'whatlinkshere-hideredirs' => '$1 тағйири масир',
 'whatlinkshere-hidetrans' => '$1 трансгунҷоишҳо',
 'whatlinkshere-hidelinks' => '$1 пайвандҳо',
+'whatlinkshere-hideimages' => '$1 пайвандҳои парванда',
 'whatlinkshere-filters' => 'Филтрҳо',
 
 # Block/unblock
@@ -1692,7 +1720,7 @@ $1',
 'ipusubmit' => 'Боз кардани дастрасӣ',
 'unblocked' => 'Дастрасии [[User:$1|$1]] боз карда шуд',
 'unblocked-id' => 'Қатъи дастрасии шумораи $1 хотима ёфт',
-'ipblocklist' => 'IP нишонаҳо ва номҳои корбарии баста шуда',
+'ipblocklist' => 'Корбарони басташуда',
 'ipblocklist-legend' => 'Ҷустуҷӯи корбари баста шуда',
 'ipblocklist-submit' => 'Ҷустуҷӯ',
 'infiniteblock' => 'бе поён',
@@ -1959,6 +1987,7 @@ $1',
 'tooltip-rollback' => '"Вогард" вироиш(ҳо)ро ба ин саҳифаи охирин ҳиссагузор бо як клик мегардонад',
 'tooltip-undo' => '"Ботил" ин вироишро ботил мекунад ва форми вироишро дар ҳолати пешнамоиш боз мекунад.
 Ин имкони илова кардани як сабаберо дар хулоса медиҳад.',
+'tooltip-summary' => 'Хулосаи кӯтоҳ ворид кунед',
 
 # Metadata
 'notacceptable' => 'Коргузори ин вики аз ирсоли дода ба шакле ки барномаи шумо битавонад намоиш диҳад, пешкаш карда наметавонад.',
@@ -2048,7 +2077,7 @@ $1',
 'metadata-help' => 'Ин парванда иттилооти иловагиро дар бар мегирад, эҳтимол аз аксбардораки рақамӣ ё сканер дар вақти сохтан ва рақамӣ кардан, илова шудааст. Агар парванда аз вазъияти ибтидоиаш тағйир дода бошад, мумкин аст, шарҳу тафсилоти мавҷуди иттилооти аксро тамоман бозтоб надиҳад.',
 'metadata-expand' => 'Намоиши ҷузъиёти тафсилӣ',
 'metadata-collapse' => 'Пинҳон кардани ҷузъиёти тафсилӣ',
-'metadata-fields' => 'EXIF фосилаҳои додаҳо, ки дар ин паём оварда шудаанд дар ҷадвали акс ҷамъ шуда бошанд ҳам, намоиш дода хоҳанд шуд. Бақия онҳо танҳо дар вақти боз кардани ҷадвал нишон дода хоҳанд шуд.
+'metadata-fields' => 'Фарододаҳои тасвир нишон додашуда дар ин пайғом вақти ҷадвал фарододаҳои тавсир ҷамъ шуда бошад ҳам намоиш дода мешавад. Бақияи маворид танҳо замоне нишон дода мешавад, ки ҷадвали ёдшуда боз шавад.
 * make
 * model
 * datetimeoriginal
@@ -2318,7 +2347,7 @@ $1',
 'monthsall' => 'ҳама',
 'limitall' => 'ҳама',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Тасдиқи нишонаи почтаи электронӣ',
 'confirmemail_noemail' => 'Шумо дар саҳифаи [[Special:Preferences|тарҷиҳоти корбарии]] худ нишонаи почтаи электронии мӯътабареро ворид накардаед.',
 'confirmemail_text' => '{{SITENAME}} таъйиди эътибои почтаи электронии шуморо пеш аз истифода хидмати электронӣ талаб мекунад. Тугмаи зеринро фаъол кунед то номаи таъйидӣ ба почтаи электронии шумо фиристода шавад. Ин нома пайвандеро дар бар мегирад, ки коде дорад; пайвандро дар мурургар боз кунед, то ки почтаи электрониатон  дар ҳақиқат таъйид шавад.',
@@ -2511,6 +2540,7 @@ $5
 'blankpage' => 'Саҳифаи холӣ',
 
 # Special:Tags
+'tag-filter' => 'Филтри [[Special:Tags|барчасбҳо]]:',
 'tags-edit' => 'вироиш',
 
 # Database error messages
index 7b4cbe5..efae1ab 100644 (file)
@@ -691,7 +691,7 @@ $1',
 'loginlanguagelabel' => 'ภาษา: $1',
 'suspicious-userlogout' => 'คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
 'user-mail-no-addy' => 'พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล',
 'user-mail-no-body' => 'พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล',
@@ -1347,7 +1347,7 @@ $1",
 'prefs-displaywatchlist' => 'ตัวเลือกผลแสดง',
 'prefs-diffs' => 'ผลต่าง',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูกต้อง',
 'email-address-validity-invalid' => 'ป้อนที่อยู่อีเมลที่ถูกต้อง',
 
@@ -1895,10 +1895,10 @@ $1',
 'doubleredirectstext' => 'หน้านี้แสดงรายการหน้าที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
 แต่ละแถวมีการเชื่อมโยงไปยังการเปลี่ยนทางครั้งแรกและครั้งที่สอง เช่นเดียวกับเป้าหมายของการเปลี่ยนทางครั้งที่สอง ซึ่งมักเป็นหน้าเป้าหมาย "ที่แท้จริง" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป
 หน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว',
-'double-redirect-fixed-move' => '[[$1]] à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อแล้ว 
+'double-redirect-fixed-move' => '[[$1]] à¹\84à¸\94à¹\89ยà¹\89ายแล้ว 
 ขณะนี้เปลี่ยนทางไปยัง [[$2]]',
 'double-redirect-fixed-maintenance' => 'การแก้ไขการเปลี่ยนทางซ้ำซ้อนจาก [[$1]] ไปยัง [[$2]]',
-'double-redirect-fixer' => 'à¸\9cูà¹\89ซ่อมหน้าเปลี่ยนทาง',
+'double-redirect-fixer' => 'à¸\95ัวซ่อมหน้าเปลี่ยนทาง',
 
 'brokenredirects' => 'หน้าเปลี่ยนทางเสีย',
 'brokenredirectstext' => 'หน้าเปลี่ยนทางต่อไปนี้เชื่อมโยงไปยังหน้าที่ยังไม่ถูกสร้าง:',
@@ -2075,7 +2075,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'เพิ่มทุกกลุ่มเข้าไปในบัญชีนี้',
 'listgrouprights-removegroup-self-all' => 'นำทุกกลุ่มออกจากบัญชีนี้',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ไม่มีที่อยู่ส่ง',
 'mailnologintext' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณ ในการส่งอีเมลหาผู้ใช้อื่น',
 'emailuser' => 'ส่งอีเมลหาผู้ใช้นี้',
@@ -2196,7 +2196,7 @@ $UNWATCHURL
 'deletepage' => 'ลบหน้า',
 'confirm' => 'ยืนยัน',
 'excontent' => "เนื้อหาเดิม: '$1'",
-'excontentauthor' => "เนื้อหาเดิม: '$1' (และผู้เขียนคนเดียว คือ '[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "à¹\80à¸\99ืà¹\89อหาà¹\80à¸\94ิม: '$1' (à¹\81ละมีà¸\9cูà¹\89à¹\80à¸\82ียà¸\99à¸\84à¸\99à¹\80à¸\94ียว à¸\84ือ '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "เนื้อหาก่อนถูกทำว่างคือ: '$1'",
 'exblank' => 'หน้าว่าง',
 'delete-confirm' => 'ลบ "$1"',
@@ -2356,7 +2356,7 @@ $1',
 'undelete-filename-mismatch' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ชื่อไฟล์ไม่ตรง',
 'undelete-bad-store-key' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ไฟล์สูญหายก่อนถูกลบ',
 'undelete-cleanup-error' => 'เกิดความผิดพลาดในการลบไฟล์กรุที่ไม่ใช้แล้ว "$1"',
-'undelete-missing-filearchive' => 'ไม่สามารถกู้คืนไฟล์เก่าหมายเลข $1 เพราะไม่มีในฐานข้อมูล 
+'undelete-missing-filearchive' => 'à¹\84มà¹\88สามารà¸\96à¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\80à¸\81à¹\88าหมายà¹\80ลà¸\82 $1 à¹\80à¸\9eราะà¹\84มà¹\88มีà¸\82à¹\89อมูลà¹\83à¸\99à¸\90าà¸\99à¸\82à¹\89อมูล 
 ไฟล์อาจถูกกู้คืนไปแล้ว',
 'undelete-error' => 'เกิดข้อผิดพลาดในการกู้คืนหน้า',
 'undelete-error-short' => 'เกิดข้อผิดพลาดในการกู้คืนไฟล์: $1',
@@ -2438,10 +2438,10 @@ $1',
 ** ใส่ข้อมูลเท็จ
 ** ลบเนื้อหาในหน้าออก
 ** ใส่ลิงก์สแปม
-** ใส่ข้อความขยะเข้ามา
-** à¸\84ุà¸\81à¸\84ามà¸\9cูà¹\89อืà¹\88
-** à¸\81à¹\88อà¸\81วà¸\99à¸\9cูà¹\89อืà¹\88à¸\99
-** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\84มà¹\88สุภาà¸\9eหรือà¹\84มà¹\88à¸\84วรà¹\83à¸\8a้',
+** à¹\83สà¹\88à¸\82à¹\89อà¸\84วามà¹\84รà¹\89สาระ/à¸\82ยะà¹\80à¸\82à¹\89ามา
+** à¸\9eฤà¸\95ิà¸\81รรมà¸\82à¹\88มà¸\82ูà¹\88/รัà¸\87à¸\84วา
+** à¹\83à¸\8aà¹\89หลายà¸\9aัà¸\8dà¸\8aีà¹\83à¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\9cิà¸\94
+** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\84มà¹\88อาà¸\88ยอมรัà¸\9aà¹\84à¸\94้',
 'ipb-hardblock' => 'ป้องกันไม่ให้ผู้ใช้ล็อกอินแก้ไขจากเลขที่อยู่ไอพีนี้',
 'ipbcreateaccount' => 'ป้องกันการสร้างบัญชี',
 'ipbemailban' => 'ป้องกันมิให้ผู้ใช้ส่งอีเมล',
@@ -2463,14 +2463,14 @@ $1',
 'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
 'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
-'ipb-unblock-addr' => 'à¹\80ลิà¸\81บล็อก $1',
-'ipb-unblock' => 'à¹\80ลิà¸\81บล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
+'ipb-unblock-addr' => 'à¸\9bลà¸\94บล็อก $1',
+'ipb-unblock' => 'à¸\9bลà¸\94บล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
 'ipb-blocklist' => 'ดูการบล็อกปัจจุบัน',
 'ipb-blocklist-contribs' => 'ผลงานเขียนโดย $1',
 'unblockip' => 'ปลดบล็อกผู้ใช้',
-'unblockiptext' => 'à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87สำหรัà¸\9aคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
+'unblockiptext' => 'à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
 'ipusubmit' => 'ยกเลิกการบล็อกนี้',
-'unblocked' => '[[User:$1|$1]] ถูกบล็อก',
+'unblocked' => '[[User:$1|$1]] à¸\96ูà¸\81à¸\9bลà¸\94à¸\9aลà¹\87อà¸\81',
 'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
 'unblocked-id' => 'เลิกบล็อก $1',
 'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
@@ -2486,16 +2486,16 @@ $1',
 'blocklist-by' => 'ผู้ดูแลระบบที่บล็อก',
 'blocklist-params' => 'พารามิเตอร์การบล็อก',
 'blocklist-reason' => 'เหตุผล',
-'ipblocklist-submit' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'ipblocklist-localblock' => 'à¸\81ารสà¸\81ัà¸\94à¸\81ัà¹\89à¸\99ภายในวิกินี้',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|à¸\81ารสà¸\81ัà¸\94à¸\81ัà¹\89à¸\99}}อืà¹\88à¸\99à¹\86',
+'ipblocklist-submit' => 'à¸\84à¹\89à¸\99หา',
+'ipblocklist-localblock' => 'à¸\81ารà¸\9aลà¹\87อà¸\81ในวิกินี้',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|à¸\81ารà¸\9aลà¹\87อà¸\81}}อืà¹\88à¸\99',
 'infiniteblock' => 'ไม่มีกำหนด',
 'expiringblock' => 'หมดอายุ $1 เวลา $2',
 'anononlyblock' => 'ไม่ล็อกอินเท่านั้น',
 'noautoblockblock' => 'ยกเลิกการบล็อกอัตโนมัติ',
-'createaccountblock' => 'à¸\9aลà¹\87อà¸\81การสร้างบัญชีผู้ใช้ใหม่',
-'emailblock' => 'à¸\9aลà¹\87อà¸\81à¸\81ารสà¹\88à¸\87อีเมล',
-'blocklist-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าอภิà¸\9bรายของตนเอง',
+'createaccountblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99การสร้างบัญชีผู้ใช้ใหม่',
+'emailblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมล',
+'blocklist-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ของตนเอง',
 'ipblocklist-empty' => 'รายการบล็อกว่าง',
 'ipblocklist-no-results' => 'เลขที่อยู่ไอพีหรือชื่อผู้ใช้ที่ต้องการไม่ได้ถูกบล็อก',
 'blocklink' => 'บล็อก',
@@ -2694,7 +2694,7 @@ $1',
 
 # Thumbnails
 'thumbnail-more' => 'ขยาย',
-'filemissing' => 'à¹\84มà¹\88à¹\80à¸\88อà¹\84à¸\9fลà¹\8c',
+'filemissing' => 'à¹\84à¸\9fลà¹\8cสูà¸\8dหาย',
 'thumbnail_error' => 'เกิดปัญหาไม่สามารถทำรูปย่อได้: $1',
 'djvu_page_error' => 'หน้าเดจาวู (DjVu) เกินขนาด',
 'djvu_no_xml' => 'ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)',
@@ -2758,11 +2758,11 @@ $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
-'tooltip-pt-anonuserpage' => 'หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87หมายà¹\80ลà¸\82à¹\84อà¸\9eีà¸\97ีà¹\88แก้ไข',
+'tooltip-pt-anonuserpage' => 'หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\83à¸\8aà¹\89แก้ไข',
 'tooltip-pt-mytalk' => 'หน้าอภิปรายของคุณ',
-'tooltip-pt-anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\88าà¸\81หมายà¹\80ลà¸\82à¹\84อà¸\9eี',
+'tooltip-pt-anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\99ีà¹\89',
 'tooltip-pt-preferences' => 'ตั้งค่าการใช้งานส่วนตัว',
-'tooltip-pt-watchlist' => 'รายà¸\81ารà¸\97ีà¹\88เฝ้าดูการแก้ไข',
+'tooltip-pt-watchlist' => 'รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93เฝ้าดูการแก้ไข',
 'tooltip-pt-mycontris' => 'รายการหน้าที่คุณเขียน',
 'tooltip-pt-login' => 'ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน',
 'tooltip-pt-anonlogin' => 'ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน',
@@ -2864,7 +2864,7 @@ $1',
 'notacceptable' => 'เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้',
 
 # Attribution
-'anonymous' => 'ผู้ใช้นิรนามของ{{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|ผู้ใช้|ผู้ใช้}}นิรนามของ{{SITENAME}}',
 'siteuser' => 'ผู้ใช้ $1 จาก {{SITENAME}}',
 'anonuser' => 'ผู้ใช้นิรนามจาก {{SITENAME}} $1',
 'lastmodifiedatby' => 'แก้ไขล่าสุดเมื่อเวลา $2 $1 โดย $3',
@@ -2877,8 +2877,9 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'ตัวกรองป้องกันสแปม',
-'spamprotectiontext' => 'หน้าที่คุณต้องการบันทึกโดนบล็อกด้วยตัวกรองสแปม ซึ่งอาจเกิดจากมีลิงก์ไปยังเว็บไซต์ภายนอกที่อยู่ในบัญชีดำ',
-'spamprotectionmatch' => 'ข้อความต่อไปนี้ได้ทำให้ตัวกรองสแปมของเราทำงาน: $1',
+'spamprotectiontext' => 'ข้อความที่คุณต้องการบันทึกถูกตัวกรองสแปมบล็อก
+อาจเกิดจากลิงก์ไปยังเว็บไซต์ภายนอกที่ถูกขึ้นบัญชีดำ',
+'spamprotectionmatch' => 'ข้อความต่อไปนี้กระตุ้นให้ตัวกรองสแปมของเราทำงาน: $1',
 'spambot_username' => 'กวาดล้างมีเดียวิกิสแปม',
 'spam_reverting' => 'ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1',
 'spam_blanking' => 'รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)',
@@ -2899,6 +2900,7 @@ $1',
 'pageinfo-robot-policy' => 'สถานะเสิร์ชเอนจิน',
 'pageinfo-views' => 'จำนวนการเข้าดู',
 'pageinfo-watchers' => 'จำนวนผู้เข้าดูหน้า',
+'pageinfo-few-watchers' => '{{PLURAL:$1|ผู้เฝ้าดู|ผู้เฝ้าดู}}น้อยกว่า $1 คน',
 'pageinfo-redirects-name' => 'หน้าเปลี่ยนทางมายังหน้านี้',
 'pageinfo-subpages-name' => 'หน้าย่อยของหน้านี้',
 'pageinfo-subpages-value' => '$1 ($2 หน้าเปลี่ยนทาง; $3 หน้าไม่เปลี่ยนทาง)',
@@ -3333,24 +3335,31 @@ $1',
 'monthsall' => 'ทั้งหมด',
 'limitall' => 'ทั้งหมด',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ยืนยันอีเมล',
 'confirmemail_noemail' => 'ไม่ได้ใส่อีเมลในส่วน [[Special:Preferences|การตั้งค่าส่วนตัว]]',
-'confirmemail_text' => 'ถ้าต้องการใช้คำสั่งพิเศษในด้านอีเมสล จำเป็นต้องใส่ค่าอีเมลก่อน โดยกดที่ปุ่มด้านล่าง และทางระบบจะส่งไปที่อีเมลนี้ ในอีเมลจะมีลิงก์ซึ่งมีรหัสสำหรับยืนยันอีเมล',
-'confirmemail_pending' => 'รหัสยืนยันได้ถูกส่งไปที่อีเมลของคุณ ถ้าได้สร้างบัญชีเร็วนี้ ให้รอซักครู่ก่อนที่จะขอรหัสอีกครั้งหนึ่ง',
-'confirmemail_send' => 'ส่งรหัสยืนยันผ่านทางอีเมล',
-'confirmemail_sent' => 'อีเมลยืนยันได้ส่งเรียบร้อย',
-'confirmemail_oncreate' => 'รหัสยืนยันได้ถูกส่งไปที่อีเมล อย่างไรก็ตามรหัสนี้ไม่จำเป็นสำหรับการล็อกอิน เว้นเสียแต่ว่าต้องการใช้คำสั่งพิเศษในด้านอีเมลของวิกินี้',
-'confirmemail_sendfailed' => 'ขออภัย {{SITENAME}} ไม่สามารถส่งอีเมลให้คุณยืนยันการใช้งานได้
-กรุณาตรวจสอบอีเมลว่าถูกต้อง และไม่มีอักขระที่ไม่สามารถใช้ได้
+'confirmemail_text' => '{{SITENAME}} กำหนดให้คุณตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุณก่อนใช้คุณลักษณะอีเมล
+เปิดใช้งานปุ่มด้านล่างเพื่อส่งเมลยืนยันไปยังที่อยู่ของคุณ
+เมลจะรวมลิงก์ซึ่งมีรหัส
+โหลดลิงก์ในเบราว์เซอร์ของคุณเพื่อยืนยันว่าที่อยู่อีเมลของคุณสมเหตุสมผล',
+'confirmemail_pending' => 'รหัสยืนยันถูกอีเมลไปหาคุณแล้ว 
+ถ้าคุณเพิ่งสร้างบัญชี คุณอาจอยากรอสักครู่ให้ส่งไปถึงก่อนพยายามขอรหัสใหม่',
+'confirmemail_send' => 'ส่งรหัสยืนยันทางอีเมล',
+'confirmemail_sent' => 'ส่งอีเมลยืนยันแล้ว',
+'confirmemail_oncreate' => 'รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ
+รหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้',
+'confirmemail_sendfailed' => '{{SITENAME}} ไม่สามารถส่งเมลยืนยันได้
+โปรดตรวจสอบที่อยู่อีเมลว่าไม่มีอักขระที่ไม่สมเหตุสมผล
 
 ข้อความตีกลับ: $1',
-'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง หรือรหัสหมดอายุ',
-'confirmemail_needlogin' => 'ต้องทำการ $1 เพื่อยืนยันอีเมลของคุณว่าถูกต้อง',
-'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว คุณอาจจะล็อกอินและมีความสุขกับวิกิ',
+'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง 
+รหัสอาจหมดอายุแล้ว',
+'confirmemail_needlogin' => 'ต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ',
+'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว
+คุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ',
 'confirmemail_loggedin' => 'อีเมลคุณได้รับการยืนยันแล้ว',
-'confirmemail_error' => 'มีà¸\9bัà¸\8dหาà¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¹\83à¸\99à¸\81ารยืà¸\99ยัà¸\99อีà¹\80มล',
-'confirmemail_subject' => '{{SITENAME}} ยืนยันการใช้งานอีเมล',
+'confirmemail_error' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\82à¸\93ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารยืà¸\99ยัà¸\99à¸\82อà¸\87à¸\84ุà¸\93',
+'confirmemail_subject' => 'การยืนยันที่อยู่อีเมล {{SITENAME}}',
 'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
 
 เพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:
index 99682ec..7a249ab 100644 (file)
@@ -756,7 +756,7 @@ Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ ot
 [[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
 'yourname' => 'Kullanıcı adı:',
 'yourpassword' => 'Parola:',
-'yourpasswordagain' => 'Parolayı yeniden yaz:',
+'yourpasswordagain' => 'Parolayı yeniden girin:',
 'remembermypassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
 'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
 'yourdomainname' => 'Alan adınız:',
@@ -770,10 +770,10 @@ Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ ot
 'logout' => 'Oturumu kapat',
 'userlogout' => 'Oturumu kapat',
 'notloggedin' => 'Oturum açık değil',
-'nologin' => "Kayıtlı değil misiniz? '''$1'''",
+'nologin' => 'Bir hesabınız yok mu? $1.',
 'nologinlink' => 'Hesap oluşturun',
 'createaccount' => 'Hesap oluştur',
-'gotaccount' => "Çoktan kayıt oldunuz mu? '''$1'''.",
+'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
 'gotaccountlink' => 'Oturum açın',
 'userlogin-resetlink' => 'Giriş bilgilerinizi mi unuttunuz?',
 'createaccountmail' => 'Geçici bir rastgele şifre kullan ve şifreyi aşağıda belirtilen e-posta adresine gönder',
@@ -844,7 +844,7 @@ Lütfen tekrar denemeden önce bekleyin.',
 'loginlanguagelabel' => 'Dil: $1',
 'suspicious-userlogout' => 'Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
 'user-mail-no-addy' => 'Bir e-posta adresi olmadan e-posta göndermeye çalıştı.',
 
@@ -918,7 +918,7 @@ Geçici şifre: $2',
 'italic_tip' => 'Eğik yazı',
 'link_sample' => 'Bağlantı başlığı',
 'link_tip' => 'İç bağlantı',
-'extlink_sample' => 'http://www.example.com adres açıklaması',
+'extlink_sample' => 'http://www.example.com bağlantı başlığı',
 'extlink_tip' => 'Dış bağlantı (Adresin önüne http:// koymayı unutmayın)',
 'headline_sample' => 'Başlık metni',
 'headline_tip' => '2. seviye başlık',
@@ -1150,7 +1150,7 @@ $3 tarafından verilen sebep ''$2''",
 'revisionasof' => '$1 tarihindeki hâli',
 'revision-info' => '$2 tarafından oluşturulmuş $1 tarihli sürüm',
 'previousrevision' => '← Önceki hâli',
-'nextrevision' => 'Sonraki hali →',
+'nextrevision' => 'Sonraki hâli →',
 'currentrevisionlink' => 'en güncel halini göster',
 'cur' => 'fark',
 'next' => 'sonraki',
@@ -1360,7 +1360,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'search-interwiki-default' => '$1 sonuçlar:',
 'search-interwiki-more' => '(daha çok)',
 'search-relatedarticle' => 'ilgili',
-'mwsuggest-disable' => 'AJAX önerilerini devre dışı bırak',
+'mwsuggest-disable' => 'Arama önerilerini devre dışı bırak',
 'searcheverything-enable' => 'Tüm ad alanlarında ara',
 'searchrelated' => 'ilgili',
 'searchall' => 'hepsi',
@@ -1487,7 +1487,7 @@ $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
 'prefs-help-gender' => 'İsteğe bağlı: Yazılım tarafından doğru cinsiyet adreslemesi için kullanılır. Bu bilgi umumi olacaktır.',
 'email' => 'E-posta',
 'prefs-help-realname' => '* Gerçek isim (isteğe bağlı): eğer gerçek isminizi vermeyi seçerseniz, çalışmanızı size atfederken kullanılacaktır.',
-'prefs-help-email' => 'E-posta adresi isteğe bağlıdır; ancak eğer parolanızı unutursanız e-posta adresinize yeni parola gönderilmesine olanak sağlar.',
+'prefs-help-email' => 'E-posta adresi isteğe bağlıdır; ancak parolanızı unutmanız durumunda parola sıfırlamak için gerekecektir.',
 'prefs-help-email-others' => 'Ayrıca kullanıcı sayfanızdaki bir bağlantı yoluyla diğer kullanıcıların size e-posta atmasına izin vermeyi seçebilirsiniz.
 Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz açıklanmaz.',
 'prefs-help-email-required' => 'E-posta adresi gerekmektedir.',
@@ -1506,7 +1506,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
 'prefs-diffs' => 'Farklar',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-posta adresi geçerli görünüyor',
 'email-address-validity-invalid' => 'Geçerli bir e-posta adresi girin',
 
@@ -2245,7 +2245,7 @@ Bireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bil
 'listgrouprights-addgroup-self-all' => 'Kendi hesabına tüm grupları ekleyebilir',
 'listgrouprights-removegroup-self-all' => 'Kendi hesabından tüm grupları çıkarabilir',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Gönderi adresi yok.',
 'mailnologintext' => 'Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.',
 'emailuser' => 'Bu kullanıcıya e-posta gönder',
@@ -2552,7 +2552,7 @@ $1',
 'nocontribs' => 'Bu kriterlere uyan değişiklik bulunamadı',
 'uctop' => '(son)',
 'month' => 'Ay:',
-'year' => 'Yıl:',
+'year' => 'Bu yıla kadar (ve önceki yıllar):',
 
 'sp-contributions-newbies' => 'Sadece yeni kullanıcıların katkılarını göster',
 'sp-contributions-newbies-sub' => 'Yeni kullanıcılar için',
@@ -3591,7 +3591,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'monthsall' => 'hepsi',
 'limitall' => 'tümü',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-posta adresini onayla',
 'confirmemail_noemail' => '[[Special:Preferences|Kullanıcı tercihlerinizde]] tanımlanmış uygun bir e-posta adresiniz yok.',
 'confirmemail_text' => "Viki'nin e-posta işlevlerini kullanmabilmek için, önce e-posta adresinizin doğrulanması gerekiyor.
@@ -3706,7 +3706,7 @@ Sayfayı baştan açmak isityorsanız, lütfen onaylayın.",
 'autosumm-blank' => 'Sayfayı boşalttı',
 'autosumm-replace' => "Sayfa içeriği '$1' ile değiştiriliyor",
 'autoredircomment' => '[[$1]] sayfasına yönlendirildi',
-'autosumm-new' => "Sayfa oluşturdu, içeriği: '$1'",
+'autosumm-new' => 'Yeni sayfa: "$1"',
 
 # Live preview
 'livepreview-loading' => 'Yükleniyor...',
index 121decf..e308178 100644 (file)
@@ -224,15 +224,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү бите ачылсын (JavaScript кирәк)',
 'tog-showtoc' => 'Эчтәлек күрсәтелсен (3 тән күбрәк башламлы битләрдә)',
 'tog-rememberpassword' => 'Хисап язмамны бу браузерда саклансын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
-'tog-watchcreations' => 'ТөзегÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80ем күзәтү исемлегемә өстәлсен',
-'tog-watchdefault' => 'Үзгәрткән битләрем күзәтү исемлегемә өстәлсен',
-'tog-watchmoves' => 'Ð\9aÒ¯Ñ\87еÑ\80гÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80ем күзәтү исемлегемә өстәлсен',
-'tog-watchdeletion' => 'Ð\91еÑ\82еÑ\80елгÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80емне ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегемгÓ\99 Ó©Ñ\81Ñ\82Ó\99Ò¯',
+'tog-watchcreations' => 'Ð\9cин Ñ\82өзегÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ò»Ó\99м Ð¹Ó©ÐºÐ»Ó\99гÓ\99н Ñ\84айллаÑ\80 күзәтү исемлегемә өстәлсен',
+'tog-watchdefault' => 'Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен',
+'tog-watchmoves' => 'Ð\9cин ÐºÒ¯Ñ\87еÑ\80гÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ò»Ó\99м Ñ\84айллаÑ\80 күзәтү исемлегемә өстәлсен',
+'tog-watchdeletion' => 'Ð\9cин Ð±ÐµÑ\82еÑ\80гÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ò»Ó\99м Ñ\84айллаÑ\80нÑ\8b ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегемгÓ\99 Ó©Ñ\81Ñ\82Ó\99лÑ\81ен',
 'tog-minordefault' => 'Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен',
 'tog-previewontop' => 'Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен',
 'tog-previewonfirst' => 'Үзгәртү битенә күчкәндә башта алдан карау бите күрсәтелсен',
 'tog-nocache' => 'Битләр кэшлауны тыелсын',
-'tog-enotifwatchlistpages' => 'Күзәтү исемлегемдәге бит үзгәртелү турында электрон почтага хәбәр җибәрелсен',
+'tog-enotifwatchlistpages' => 'Күзәтү исемлегемдәге бит яки файл үзгәртелү турында электрон почтага хәбәр җибәрелсен',
 'tog-enotifusertalkpages' => 'Бәхәс битем үзгәртелү турында электрон почтага хәбәр җибәрелсен',
 'tog-enotifminoredits' => 'Кече үзгәртүләр турында да электрон почтага хәбәр җибәрелсен',
 'tog-enotifrevealaddr' => 'Хәбәрләрдә e-mail адресым күрсәтелсен',
@@ -607,6 +607,7 @@ $2',
 
 Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан <span class='plainlinks'>[$1 керә]</span> аласыз.
 Кайбер битләр Сез кергән кебек күрсәтелергә мөмкин. Моны бетерү өчен браузер кэшын чистартыгыз.",
+'welcomeuser' => 'Хуш килдегез, $1!',
 'yourname' => 'Кулланучы исеме:',
 'yourpassword' => 'Серсүз:',
 'yourpasswordagain' => 'Серсүзне кабат кертү:',
@@ -686,7 +687,7 @@ $2',
 'loginlanguagelabel' => 'Тел: $1',
 'suspicious-userlogout' => 'Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP mail() функциясендә билгесез хата',
 'user-mail-no-addy' => 'Электрон почта адресыннан башка электрон хат җибәрмәкче булды',
 
@@ -754,6 +755,7 @@ $2
 'changeemail-oldemail' => 'Хәзерге электрон әрҗә адресы:',
 'changeemail-newemail' => 'Яңа электрон почта адресы:',
 'changeemail-none' => '(юк)',
+'changeemail-password' => '«{{SITENAME}}» проекты өчен серсүзегез:',
 'changeemail-submit' => 'E-mail адресын үзгәртү',
 'changeemail-cancel' => 'Баш тарту',
 
@@ -885,6 +887,7 @@ $2
 Мондый хаталар аноним web-проксилар кулланганда килеп чыгарга мөмкин.",
 'edit_form_incomplete' => "'''Төзәтү кырларының кайбер өлешләре серверга барып ирешмәде. Сезнең үзгәртүләр бозылмаганмы - игътибар белән тикшерегез һәм яңадан җибәреп карагыз.'''",
 'editing' => '«$1» битен үзгәртү',
+'creating' => '«$1» битен ясау',
 'editingsection' => '«$1» битендә бүлек үзгәртүе',
 'editingcomment' => '«$1» битен үзгәртү (яңа бүлек)',
 'editconflict' => 'Үзгәртү конфликты: $1',
@@ -1675,6 +1678,7 @@ PICT # төрле
 'allpagesnext' => 'Киләсе',
 'allpagessubmit' => 'Башкару',
 'allpagesprefix' => 'Алкушымчалы битләрне күрсәтү:',
+'allpages-hide-redirects' => 'Юнәлтүләрне яшер',
 
 # Special:Categories
 'categories' => 'Төркемнәр',
@@ -1712,7 +1716,7 @@ PICT # төрле
 'listgrouprights-helppage' => 'Help:Төркемнәрнең хокуклары',
 'listgrouprights-members' => '(төркем исемлеге)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Бу кулланучыга хат',
 'emailuser-title-target' => '{{GENDER:$1|Кулланучыга}} электрон хат язу',
 'emailuser-title-notarget' => 'Кулланучыга хат җибәрү',
@@ -1738,7 +1742,7 @@ PICT # төрле
 'emailsenttext' => 'E-mail хатыгыз җиберелде.',
 
 # Watchlist
-'watchlist' => 'Күзәтү исемлегем',
+'watchlist' => 'Күзәтү исемлеге',
 'mywatchlist' => 'Күзәтү исемлеге',
 'watchlistfor2' => '$1 $2 өчен',
 'nowatchlist' => 'Күзәтү исемлегегездә битләр юк.',
@@ -1907,7 +1911,7 @@ $1',
 'blanknamespace' => '(Төп)',
 
 # Contributions
-'contributions' => 'Кулланучының кертеме',
+'contributions' => '{{GENDER:$1|Кулланучының} кертеме',
 'contributions-title' => '$1 исемле кулланучының кертеме',
 'mycontris' => 'Кертем',
 'contribsub2' => '$1 ($2) өчен',
@@ -2427,6 +2431,9 @@ $1',
 'hijri-calendar-m7' => 'Раҗәб',
 'hijri-calendar-m9' => 'Рамазан',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бәхәс]])',
+
 # Core parser functions
 'duplicate-defaultsort' => 'Игътибар. Уйланма куелган "$2" бүлгәләү ачкычы элеккеге уйланма куелган "$1" бүлгәләү ачкычын үзгәртә.',
 
index 907b52e..52c5226 100644 (file)
@@ -16,6 +16,7 @@
  * @author AlexSm
  * @author Andrijko Z.
  * @author Arturyatsko
+ * @author AtUkr
  * @author Base
  * @author Dim Grits
  * @author DixonD
@@ -869,7 +870,7 @@ $1',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Невідома помилка в PHP-mail() функції',
 'user-mail-no-addy' => 'Спроба надсилання електронної пошти без зазначеної адреси електронної пошти.',
 'user-mail-no-body' => 'Спроба надіслати електронного листа з порожнім або надто коротким вмістом.',
@@ -1559,7 +1560,7 @@ $1",
 'prefs-displaywatchlist' => 'Налаштування показу',
 'prefs-diffs' => 'Різниці версій',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адреса електронної пошти є чинною',
 'email-address-validity-invalid' => 'Введіть чинну адресу електронної пошти',
 
@@ -2164,6 +2165,12 @@ $1',
 Ймовірно, вони повинні вказувати на відповідну конкретну статтю.<br />
 Сторінка вважається багатозначною, якщо на ній розміщений шаблон, назва якого є на сторінці [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Сторінки з перевизначеними властивостями',
+'pageswithprop-legend' => 'Сторінки з перевизначеними властивостями',
+'pageswithprop-text' => 'Тут перераховані сторінки, у яких були вручну перевизначені окремі властивості.',
+'pageswithprop-prop' => 'Назва властивості:',
+'pageswithprop-submit' => 'Перейти',
+
 'doubleredirects' => 'Подвійні перенаправлення',
 'doubleredirectstext' => 'На цій сторінці наведено список перенаправлень на інші перенаправлення.
 Кожен рядок містить посилання на перше та друге перенаправлення, а також перший рядок тексту другого перенаправлення, що зазвичай містить «реальне» перенаправлення на необхідну сторінку, куди повинно вказувати й перше перенаправлення.
@@ -2357,7 +2364,7 @@ $1',
 'listgrouprights-addgroup-self-all' => 'Може додавати всі групи до свого облікового запису',
 'listgrouprights-removegroup-self-all' => 'може вилучати всі групи зі свого облікового запису',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Відсутня адреса для відправки',
 'mailnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до системи]] і мати підтверджену адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях]], щоб мати змогу надсилати електронну пошту іншим користувачам.',
 'emailuser' => 'Надіслати листа',
@@ -3001,7 +3008,7 @@ $1',
 'importinterwiki' => 'Міжвікі імпорт',
 'import-interwiki-text' => 'Вкажіть вікі й назву імпортованої сторінки.
 Дати змін й імена авторів буде збережено.
\92Ñ\81Ñ\96 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ð¼ÐµÐ¶Ð²Ñ\96кÑ\96 імпорту реєструються в [[Special:Log/import|відповідному протоколі]].',
£Ñ\81Ñ\96 Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97 Ð¼Ñ\96жвÑ\96кÑ\96-імпорту реєструються в [[Special:Log/import|відповідному протоколі]].',
 'import-interwiki-source' => 'Вікі/сторінка-джерело',
 'import-interwiki-history' => 'Копіювати всю історію змін цієї сторінки',
 'import-interwiki-templates' => 'Включити всі шаблони',
@@ -3865,7 +3872,7 @@ $8',
 'monthsall' => 'всі',
 'limitall' => 'усі',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Підтвердження адреси ел. пошти',
 'confirmemail_noemail' => 'Ви не зазначили коректну адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях користувача]].',
 'confirmemail_text' => 'Вікі-двигун потребує підтвердження адреси електронної пошти перед початком роботи. Натисніть на кнопку, щоб за вказаною адресою одержати листа, який міститиме посилання на спеціальну сторінку, після відкриття якої у браузері адреса електронної пошти буде вважатися підтвердженою.',
@@ -4344,4 +4351,7 @@ MediaWiki поширюється в надії, що вона буде кори
 'duration-centuries' => '$1 {{PLURAL:$1|століття|століття|століть}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тисячоліття|тисячоліття|тисячоліть}}',
 
+# Image rotation
+'rotate-comment' => 'Зображення повернуте на $1 {{PLURAL:$1|градус|градусів}} за годинниковою стрілкою',
+
 );
index e01943a..bd55bb0 100644 (file)
@@ -105,42 +105,61 @@ $linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Havolalarning tagiga chizish:',
-'tog-justify' => "Matnni sahifaning eni bo'yicha tekislash",
-'tog-hideminor' => "Yangi oʻzgarishlar ro'yxatida kichik tahrirlarni yashirish",
-'tog-hidepatrolled' => 'Yangi oʻzgarishlar roʻyxatida patrullangan tahrirlarni yashirish',
-'tog-newpageshidepatrolled' => "Yangi sahifalar ro'yxatida patrullangan sahifalarni yashirish",
-'tog-numberheadings' => 'Sarlavhalarni avtomatik tarzda raqamlash',
-'tog-showtoolbar' => "Tahrirlash vaqtida yuqorigi unsurlar darchasini ko'rsatish (JavaScript)",
-'tog-editsection' => "[tahrir] havolasini har bir seksiyada ko'rsatish",
-'tog-showtoc' => "Mundarijani ko'rsatish (3 ta sarlavhadan ko'p bo'lgan sahifalar uchun)",
-'tog-rememberpassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
+'tog-justify' => 'Matnni sahifaning eni boʻyicha tekislash',
+'tog-hideminor' => 'Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish',
+'tog-hidepatrolled' => 'Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish',
+'tog-newpageshidepatrolled' => 'Yangi sahifalar roʻyxatida tekshirilgan sahifalarni yashirish',
+'tog-extendwatchlist' => 'Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi',
+'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
+'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
+'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
+'tog-editondblclick' => 'Sichqoncha tugmasini ikki martagina bosib tahrirlashni boshlash',
+'tog-editsection' => '[tahrir] havolasini har bir boʻlim boshida koʻrsatish',
+'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
+'tog-showtoc' => 'Mundarijani koʻrsatish (3 tadan koʻproq sarlavha bor sahifalarda)',
+'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
 'tog-watchcreations' => 'Men yaratgan sahifalarni va yuklagan fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-watchmoves' => 'Men koʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-watchdeletion' => 'Men yoʻqotgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-minordefault' => "Boshlang'ich holatga barcha tahrirlarni kamahamiyatli qilib belgilash",
-'tog-previewontop' => "Oldindan ko'rishni tahrirlash oynasi oldiga joylashtirish",
-'tog-previewonfirst' => "Tahrirlashga o'tishda batafsil ko'rinishni ko'rsatish",
-'tog-nocache' => "Brauzerda sahifalarni keshda saqlashni o'chirish",
+'tog-watchdeletion' => 'Men oʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-minordefault' => 'Sukut boʻyicha barcha tahrirlarimni «kichik tahrir» etib belgilash',
+'tog-previewontop' => 'Tahrir oynasi tepasida koʻrib chiqish',
+'tog-previewonfirst' => 'Tahrirlashga oʻtiboq koʻrib chiqishni boshlash',
+'tog-nocache' => 'Brauzer sahifalarni kesh xotirasida saqlamasin',
 'tog-enotifwatchlistpages' => 'Kuzatuv roʻyxatimdagi sahifa yoki fayllar oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
 'tog-enotifusertalkpages' => 'Munozara sahifam oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
+'tog-enotifminoredits' => 'Kichik tahrir qilinsa ham e-pochtamga bu haqda xat yuborilsin',
+'tog-enotifrevealaddr' => 'Xabar beruvchi xatlarda e-pochta manzilim koʻrsatilsin',
+'tog-shownumberswatching' => 'Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish',
 'tog-oldsig' => 'Joriy imzo:',
-'tog-fancysig' => 'Imzoni wikimatn sifatida qara (avtomatik ishoratsiz)',
-'tog-showjumplinks' => '"ga o\'tish" yordamchi havolalarini yoqish',
-'tog-ccmeonemails' => 'Men boshqa foydalanuvchilarga yuborayotgan xatnig nusxasi oʻzimning e-pochtamga ham yuborilsin',
+'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
+'tog-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors More batafsil])',
+'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors More batafsil])',
+'tog-showjumplinks' => 'yordamchi "tez oʻtish" havolalarini yoqish',
+'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
+'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
+'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthidebots' => 'Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideminor' => 'Kichik tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideliu' => 'Tizimga kirgan foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideanons' => 'Anonim foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthidepatrolled' => 'Tekshirilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimning e-pochtamga joʻnatilsin.',
+'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
 'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
 'tog-noconvertlink' => "Sarlavhaga aylantirish dastagini o'chirib qo'yish",
+'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosini koʻrsatish kerak emas',
 
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
 'underline-default' => 'Brauzer moslamari boʻyicha',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Tahrirlash maydoni bosma harflari turi',
+'editfont-style' => 'Tahrirlash maydonidagi shrift turi:',
 'editfont-default' => 'Brauzer moslamari boʻyicha',
-'editfont-monospace' => 'Monoenli bosma harflar',
-'editfont-sansserif' => 'Sans-serif bosma harflari',
-'editfont-serif' => 'Serif bosma harflari',
+'editfont-monospace' => 'Teng enli shrift (Monospaced)',
+'editfont-sansserif' => 'Kertiksiz shrift (Sans-serif)',
+'editfont-serif' => 'Kertikli shrift (Serif)',
 
 # Dates
 'sunday' => 'Yakshanba',
@@ -195,20 +214,23 @@ $messages = array(
 'dec' => 'dek',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
+'pagecategories' => '{{PLURAL:$1|Turkum}}',
 'category_header' => '"$1" turkumidagi maqolalar.',
 'subcategories' => 'Ostturkumlar',
 'category-media-header' => '"$1" turkumidagi fayllar',
 'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
-'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'hidden-categories' => '{{PLURAL:$1|Yashirin turkum}}',
 'hidden-category-category' => 'Yashirin turkumlar',
-'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
-'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
-'category-file-count' => "{{PLURAL:$2|Ushbu turkum faqat bitta faylga ega.|Ushbu turkumdagi $2 ta fayldan quyidagi $1 tasi ko'rsatildi.}}",
+'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Quyida ushbu turkumga kiruvchi $2 ta ostturkumdan $1 tasi koʻrsatilgan.}}',
+'category-subcat-count-limited' => 'Ushbu turkumda $1 ta ostturkum mavjud.',
+'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Quyida ushbu turkumga kiruvchi $2 ta sahifadan $1 tasi koʻrsatilgan.}}',
+'category-article-count-limited' => 'Ushbu turkumda $1 ta sahifa mavjud.',
+'category-file-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta fayl mavjud.|Quyida ushbu turkumga kiruvchi $2 ta fayldan $1 tasi koʻrsatilgan.}}',
+'category-file-count-limited' => 'Ushbu turkumda $1 ta fayl mavjud.',
 'listingcontinuesabbrev' => 'davomi',
 'index-category' => 'Indekslanadigan sahifalar',
 'noindex-category' => 'Indekslanmaydigan sahifalar',
-'broken-file-category' => 'Ishlamaydigan fayl havolalariga ega sahifalar',
+'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
 
@@ -217,18 +239,19 @@ $messages = array(
 'newwindow' => '(yangi oynada ochiladi)',
 'cancel' => 'Bekor qilish',
 'moredotdotdot' => 'Batafsil...',
+'morenotlisted' => 'Boshqa hech nima yoʻq...',
 'mypage' => 'Sahifa',
-'mytalk' => 'Munozaram',
-'anontalk' => 'Bu IP uchun suhbat',
+'mytalk' => 'Munozara',
+'anontalk' => 'Ushbu IP-manzil munozarasi',
 'navigation' => 'Saytda harakatlanish',
 'and' => '&#32;va',
 
 # Cologne Blue skin
 'qbfind' => 'Qidiruv',
-'qbbrowse' => "Ko'rish",
+'qbbrowse' => 'Koʻrish',
 'qbedit' => 'Tahrirlash',
-'qbpageoptions' => 'Ushbu sahifa',
-'qbmyoptions' => 'Mening sahifalarim',
+'qbpageoptions' => 'Ushbu sahifa moslamalari',
+'qbmyoptions' => 'Moslamalarim',
 'qbspecialpages' => 'Maxsus sahifalar',
 'faq' => 'TSS',
 'faqpage' => 'Project:TSS',
@@ -239,80 +262,86 @@ $messages = array(
 'vector-action-move' => 'Ko‘chirish',
 'vector-action-protect' => 'Himoyalash',
 'vector-action-undelete' => 'Tiklash',
-'vector-action-unprotect' => "Himoyani o'zgartirish",
-'vector-simplesearch-preference' => 'Soddalashtirilgan qidiruv uskunasini yoqish (faqat "Vektor" tashqi ko\'rinishi uchun)',
+'vector-action-unprotect' => 'Himoyalashni oʻzgartirish',
+'vector-simplesearch-preference' => 'Soddalashtirilgan qidiruv qatorini koʻrsat (faqat «Vektorli» tashqi koʻrinish uchun)',
 'vector-view-create' => 'Yaratish',
 'vector-view-edit' => 'Tahrirlash',
 'vector-view-history' => 'Tarix',
 'vector-view-view' => 'Mutolaa',
-'vector-view-viewsource' => "Manbasini ko'rish",
+'vector-view-viewsource' => 'Manbasini koʻrish',
 'actions' => 'Amallar',
 'namespaces' => 'Nomfazolar',
 'variants' => 'Variantlar',
 
+'navigation-heading' => 'Navigatsiya',
 'errorpagetitle' => 'Xato',
 'returnto' => '$1 sahifasiga qaytish.',
-'tagline' => '{{SITENAME}} dan',
+'tagline' => '{{SITENAME}} dan olingan',
 'help' => 'Yordam',
 'search' => 'Qidiruv',
 'searchbutton' => 'Qidirish',
-'go' => "O'tish",
+'go' => 'Oʻtish',
 'searcharticle' => 'O‘tish',
 'history' => 'Sahifa tarixi',
 'history_short' => 'Tarix',
-'updatedmarker' => 'mening oxirgi tashrifimdan keyin yangilandi',
+'updatedmarker' => 'oxirgi tashrifimdan keyingi oʻzgarishlar',
 'printableversion' => 'Bosma uchun versiya',
 'permalink' => 'Doimiy ishorat',
-'print' => 'Chop et',
+'print' => 'Chop etish',
 'view' => 'Koʻrish',
 'edit' => 'Tahrirlash',
 'create' => 'Yaratish',
-'editthispage' => 'Sahifani tahrirlash',
+'editthispage' => 'Ushbu sahifani tahrirlash',
 'create-this-page' => 'Ushbu sahifani yaratish',
 'delete' => 'O‘chirish',
 'deletethispage' => 'Ushbu sahifani o‘chirish',
-'undelete_short' => '{{PLURAL:$1|tahrir|$1 tahrirlar}}ni tiklash',
-'viewdeleted_short' => "{{PLURAL:$1|o'chirilgan tahrir|$1 ta o'chirilgan tahrirlar}}ni ko'rish",
+'undelete_short' => '$1 ta tahrirni tiklash',
+'viewdeleted_short' => '$1 ta oʻchirilgan tahrirni koʻrish',
 'protect' => 'Himoyalash',
-'protect_change' => 'o‘zgartirish',
+'protect_change' => 'zgartirish',
 'protectthispage' => 'Ushbu sahifani himoyalash',
 'unprotect' => 'Himoyadan chiqarish',
-'unprotectthispage' => "Ushbu sahifaning himoyasini o'zgaritish",
+'unprotectthispage' => 'Ushbu sahifaning himoyasini oʻzgaritish',
 'newpage' => 'Yangi sahifa',
 'talkpage' => 'Bu sahifa haqida munozara',
-'talkpagelinktext' => 'munozara',
+'talkpagelinktext' => 'Munozara',
 'specialpage' => 'Maxsus sahifa',
 'personaltools' => 'Shaxsiy uskunalar',
 'postcomment' => 'Yangi boʻlim',
-'articlepage' => 'Sahifani ko‘rish',
+'articlepage' => 'Maqolani koʻrib chiqish',
 'talk' => 'Munozara',
-'views' => 'Ko‘rinishlar',
+'views' => 'Qarashlar',
 'toolbox' => 'Asboblar',
-'userpage' => "Foydalanuvchi sahifasini ko'rish",
-'projectpage' => "Loyiha sahifasini ko'rish",
-'imagepage' => "Fayl sahifasini ko'rish",
-'mediawikipage' => "Xabar sahifasini ko'rsatish",
-'templatepage' => "Andoza sahifasini ko'rish",
+'userpage' => 'Foydalanuvchi sahifasini koʻrish',
+'projectpage' => 'Loyiha sahifasini koʻrish',
+'imagepage' => 'Fayl sahifasini koʻrish',
+'mediawikipage' => 'Xabar sahifasini koʻrsatish',
+'templatepage' => 'Andoza sahifasini koʻrish',
 'viewhelppage' => 'Yordam olish',
-'categorypage' => 'Turkum sahifasi',
+'categorypage' => 'Turkum sahifasini koʻrish',
 'viewtalkpage' => 'Munozarani koʻrish',
 'otherlanguages' => 'Boshqa tillarda',
 'redirectedfrom' => '($1dan yoʻnaltirildi)',
 'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
-'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
+'lastmodifiedat' => 'Bu sahifa oxirgi marta $1 soat $2 da tahrirlangan.',
 'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
 'protectedpage' => 'Himoyalangan sahifa',
 'jumpto' => 'Oʻtish:',
 'jumptonavigation' => 'saytda harakatlanish',
 'jumptosearch' => 'qidiruv',
-'pool-timeout' => "Muhosara (to'sish) ni kutish vaqti tugadi",
-'pool-queuefull' => "So'rovlar jamlanmasi to'ldi",
-'pool-errorunknown' => "Noma'lum xato",
+'view-pool-error' => 'Uzr, ayni paytda serverlarga ortiqcha yuk tushgan.
+Bu sahifaga birdaniga koʻpchilik kirmoqchi boʻldi.
+Iltimos, biroz kutib turing va keyin yangitdan kirishga urinib koʻring.
+
+$1',
+'pool-timeout' => 'Toʻsishni kutish vaqti tugadi',
+'pool-queuefull' => 'Soʻrovlar jamlanmasi toʻldi',
+'pool-errorunknown' => 'Nomaʼlum xato',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} haqida',
 'aboutpage' => 'Project:Haqida',
-'copyright' => 'Kontent $1 ostidadir.',
+'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda.',
 'copyrightpage' => '{{ns:project}}:Mualliflik huquqlari',
 'currentevents' => 'Joriy hodisalar',
 'currentevents-url' => 'Project:Joriy hodisalar',
@@ -385,7 +414,7 @@ $messages = array(
 'nstab-category' => 'Turkum',
 
 # Main script and global functions
-'nosuchaction' => "Bunday amal yo'q",
+'nosuchaction' => 'Bunday amal yoʻq',
 'nosuchspecialpage' => "Bunday maxsus sahifa yo'q",
 
 # General errors
@@ -425,7 +454,7 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'yourname' => 'Foydalanuvchi nomi',
 'yourpassword' => 'Maxfiy soʻz',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
-'remembermypassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kun|kun}} uchun)',
+'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
 'securelogin-stick-https' => "Kirgandan keyin HTTPS bo'yicha ulanishni davom ettirish",
 'yourdomainname' => 'Sizning domeningiz:',
 'password-change-forbidden' => "Siz bu vikida maxfiy so'zni o'zgartira olmaysiz.",
@@ -1113,7 +1142,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-helppage' => 'Help:Guruhlar huquqlari',
 'listgrouprights-members' => '(a’zolar ro‘yxati)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Foydalanuvchiga maktub',
 'emailuser-title-target' => 'Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish',
 'emailuser-title-notarget' => 'Foydalanuvchiga elektron maktub yozish',
@@ -1122,7 +1151,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'defemailsubject' => '{{SITENAME}} — $1 tomonidan maktub',
 'usermaildisabled' => 'Foydalanuvchi elektron pochtasi o‘chirilgan',
 'noemailtitle' => 'Elektron pochta manzili mavjud emas',
-'noemailtext' => "Bu foydalanuvchi e-mail manzil ko'rsatgani yo'q.",
+'noemailtext' => 'Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.',
 'nowikiemailtitle' => 'Maktub joʻnatishga ruxsat yoʻq',
 'emailtarget' => 'Oluvchi ishtirokchining ismini kiriting',
 'emailusername' => 'Ishtirokchi nomi:',
@@ -1133,7 +1162,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailsubject' => 'Sarlavha:',
 'emailmessage' => 'Xabar',
 'emailsend' => 'Joʻnatish',
-'emailccme' => 'Maktub nusxasini menga joʻnatish',
+'emailccme' => 'Maktub nusxasi mening elektron pochtamga joʻnatilsin',
 'emailccsubject' => '$1ga maktubingizning nusxasi: $2',
 'emailsent' => "Xat jo'natildi",
 'emailsenttext' => "Sizning elektron maktubingiz jo'natildi.",
@@ -1153,7 +1182,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
 'removewatch' => "Kuzatuv ro'yxatidan o'chirish",
-'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
+'removedwatchtext' => '"[[:$1]]" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.',
 'watch' => 'Kuzatish',
 'watchthispage' => 'Sahifani kuzatish',
 'unwatch' => 'Kuzatmaslik',
index eb32c04..c90b0a5 100644 (file)
@@ -510,7 +510,7 @@ $messages = array(
 'userpage' => 'Xem trang thành viên',
 'projectpage' => 'Xem trang dự án',
 'imagepage' => 'Xem trang tập tin',
-'mediawikipage' => 'Thông báo giao diện',
+'mediawikipage' => 'Thông điệp giao diện',
 'templatepage' => 'Trang bản mẫu',
 'viewhelppage' => 'Trang trợ giúp',
 'categorypage' => 'Trang thể loại',
@@ -603,7 +603,7 @@ $1',
 'nstab-special' => 'Trang đặc biệt',
 'nstab-project' => 'Dự án',
 'nstab-image' => 'Tập tin',
-'nstab-mediawiki' => 'Thông báo',
+'nstab-mediawiki' => 'Thông điệp',
 'nstab-template' => 'Bản mẫu',
 'nstab-help' => 'Trợ giúp',
 'nstab-category' => 'Thể loại',
@@ -637,7 +637,7 @@ Cơ sở dữ liệu báo lỗi “$3: $4”',
 'enterlockreason' => 'Nêu lý do khóa, cùng với thời hạn khóa',
 'readonlytext' => 'Cơ sở dữ liệu hiện đã bị khóa không nhận trang mới và các điều chỉnh khác, có lẽ để bảo trì cơ sở dữ liệu định kỳ, một thời gian ngắn nữa nó sẽ trở lại bình thường.
 
-Quản lý viên khóa nó đã đưa ra lời giải thích sau: $1',
+Bảo quản viên khóa nó đã đưa ra lời giải thích sau: $1',
 'missing-article' => 'Cơ sở dữ liệu không tìm thấy văn bản của trang lẽ ra phải có, trang      Normal   0               false   false   false      EN-US   X-NONE   X-NONE                                                     MicrosoftInternetExplorer4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     “$1” $2.
 
 Điều này thường xảy ra do nhấn vào liên kết khác biệt phiên bản đã quá lâu hoặc liên kết lịch sử của một trang đã bị xóa.
@@ -679,8 +679,8 @@ Truy vấn: $2',
 'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi hoặc tác động khác.',
 'viewsourcetext' => 'Bạn vẫn có thể xem và chép xuống mã nguồn của trang này:',
 'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
-'protectedinterface' => 'Trang này cung cấp một thông báo trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
-'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông báo giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
+'protectedinterface' => 'Trang này cung cấp một thông điệp trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
+'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông điệp giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
 'sqlhidden' => '(đã giấu truy vấn SQL)',
 'cascadeprotected' => 'Trang này đã bị khóa không cho sửa đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} đã bị khóa với tùy chọn “khóa theo tầng” được kích hoạt:
 $2',
@@ -783,7 +783,7 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỏ trống ô
 'createaccount-title' => 'Tài khoản mới tại {{SITENAME}}',
 'createaccount-text' => 'Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của "$2" là "$3". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.
 
-Xin hãy bỏ qua thông báo này nếu tài khoản này không phải do bạn tạo ra.',
+Xin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.',
 'usernamehasherror' => 'Tên người dùng không thể chứa dấu rào',
 'login-throttled' => 'Bạn đã thử quá nhiều mật khẩu của tài khoản này.
 Xin hãy đợi chốc lát rồi thử lại.',
@@ -791,7 +791,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
 'loginlanguagelabel' => 'Ngôn ngữ: $1',
 'suspicious-userlogout' => 'Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
 'user-mail-no-addy' => 'Không có địa chỉ để gửi thư điện tử đến',
 'user-mail-no-body' => 'Không thể gửi thư điện tử rỗng hoặc có nội dung ngắn một cách vô lý.',
@@ -1025,7 +1025,7 @@ Bạn phải đảm bảo với chúng tôi rằng chính bạn là người vi
 Không thể lưu trang.",
 'readonlywarning' => "'''CẢNH BÁO: Cơ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lưu các sửa đổi của mình. Bạn nên cắt-dán đoạn bạn vừa sửa vào một tập tin và lưu nó lại để sửa đổi sau này.'''
 
-Quản lý viên khi khóa dữ liệu đã đưa ra lý do: $1",
+Bảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
 'protectedpagewarning' => "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''
 Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
 'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể sửa đổi được.
@@ -1081,10 +1081,10 @@ Nó nên ít hơn $2 {{PLURAL:$2|lần gọi|lần gọi}}, hiện giờ đang l
 'expensive-parserfunction-category' => 'Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao',
 'post-expand-template-inclusion-warning' => 'Cảnh báo: Kích thước bản mẫu nhúng vào quá lớn.
 Một số bản mẫu sẽ không được đưa vào.',
-'post-expand-template-inclusion-category' => 'Những trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép',
-'post-expand-template-argument-warning' => 'Cảnh báo: Trang này có chứa ít nhất một giá trị bản mẫu có kích thước bung ra quá lớn.
-Những giá trị này sẽ bị bỏ đi.',
-'post-expand-template-argument-category' => 'Những trang có chứa những giá trị bản mẫu bị loại bỏ',
+'post-expand-template-inclusion-category' => 'Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép',
+'post-expand-template-argument-warning' => 'Cảnh báo: Trang này có chứa ít nhất một tham số bản mẫu có kích thước bung ra quá lớn.
+Những tham số này sẽ bị bỏ đi.',
+'post-expand-template-argument-category' => 'Trang có chứa tham số bản mẫu bị loại bỏ',
 '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)',
@@ -1476,7 +1476,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'prefs-displaywatchlist' => 'Tùy chọn hiển thị',
 'prefs-diffs' => 'Khác biệt',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Có vẻ hợp lệ',
 'email-address-validity-invalid' => 'Yêu cầu địa chỉ hợp lệ!',
 
@@ -2069,6 +2069,12 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
 'disambiguationspage' => 'Template:disambig',
 'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Trang có thuộc tính trang',
+'pageswithprop-legend' => 'Các trang có thuộc tính trang',
+'pageswithprop-text' => 'Trang này liệt kê các trang sử dụng một thuộc tính trang nào đó.',
+'pageswithprop-prop' => 'Tên thuộc tính:',
+'pageswithprop-submit' => 'Xem',
+
 '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.
 Mỗ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.
@@ -2119,10 +2125,10 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'mostlinked' => 'Trang được liên kết đến nhiều nhất',
 'mostlinkedcategories' => 'Thể loại có nhiều trang nhất',
 'mostlinkedtemplates' => 'Bản mẫu được liên kết đến nhiều nhất',
-'mostcategories' => 'Các trang có nhiều thể loại nhất',
+'mostcategories' => 'Trang có nhiều thể loại nhất',
 'mostimages' => 'Tập tin được liên kết đến nhiều nhất',
-'mostinterwikis' => 'Các trang có nhiều liên kết liên wiki nhất',
-'mostrevisions' => 'Các trang được sửa đổi nhiều lần nhất',
+'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)',
 'shortpages' => 'Trang ngắn nhất',
@@ -2134,7 +2140,7 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'protectedpages-cascade' => 'Chỉ hiển thị khóa theo tầng',
 'protectedpagestext' => 'Các trang này bị khóa không cho sửa đổi hay di chuyển',
 'protectedpagesempty' => 'Hiện không có trang nào bị khóa với các thông số này.',
-'protectedtitles' => 'Các tựa trang được bảo vệ',
+'protectedtitles' => 'Tên trang bị khóa',
 'protectedtitlestext' => 'Các tựa trang sau đây đã bị khóa không cho tạo mới',
 'protectedtitlesempty' => 'Không có tựa trang nào bị khóa với các thông số như vậy.',
 'listusers' => 'Danh sách thành viên',
@@ -2142,9 +2148,9 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'listusers-creationsort' => 'Xếp theo ngày khởi tạo',
 'usereditcount' => '$1 {{PLURAL:$1|sửa đổi|sửa đổi}}',
 'usercreated' => '{{GENDER:$3}}mở $1 lúc $2',
-'newpages' => 'Các trang mới nhất',
+'newpages' => 'Trang mới',
 'newpages-username' => 'Tên người dùng:',
-'ancientpages' => 'Các trang cũ nhất',
+'ancientpages' => 'Trang cũ nhất',
 'move' => 'Di chuyển',
 'movethispage' => 'Di chuyển trang này',
 'unusedimagestext' => 'Các tập tin sau tồn tại nhưng chưa được nhúng vào trang nào.
@@ -2257,7 +2263,7 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] về từng nhó
 'listgrouprights-addgroup-self-all' => 'Có thể đưa tài khoản của chính mình vào tất cả các nhóm',
 'listgrouprights-removegroup-self-all' => 'Có thể loại tài khoản của chính mình ra khỏi tất cả các nhóm',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Không có địa chỉ gửi thư',
 'mailnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo một địa chỉ thư điện tử hợp lệ trong phần [[Special:Preferences|tùy chọn cá nhân]] thì mới gửi được thư cho người khác.',
 'emailuser' => 'Gửi thư cho người này',
@@ -2291,8 +2297,8 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] về từng nhó
 'emailuserfooter' => 'Thư điện tử này được $1 gửi đến $2 thông qua chức năng “Gửi thư cho người này” của {{SITENAME}}.',
 
 # User Messenger
-'usermessage-summary' => 'Đang để lại thông báo hệ thống.',
-'usermessage-editor' => 'Trình thông báo hệ thống',
+'usermessage-summary' => 'Đang để lại thông điệp hệ thống.',
+'usermessage-editor' => 'Trình thông điệp hệ thống',
 
 # Watchlist
 'watchlist' => 'Danh sách theo dõi',
@@ -2660,8 +2666,8 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'unblocked' => '[[User:$1|$1]] đã hết bị cấm',
 'unblocked-range' => '$1 đã được bỏ cấm',
 'unblocked-id' => '$1 đã hết bị cấm',
-'blocklist' => 'Những người dùng bị cấm',
-'ipblocklist' => 'Những người dùng bị cấm',
+'blocklist' => 'Người dùng bị cấm',
+'ipblocklist' => 'Người dùng bị cấm',
 'ipblocklist-legend' => 'Tìm một thành viên bị cấm',
 'blocklist-userblocks' => 'Ẩn tác vụ cấm tài khoản',
 'blocklist-tempblocks' => 'Ẩn tác vụ cấm có thời hạn',
@@ -2867,12 +2873,12 @@ Trong trường hợp sau bạn cũng có thể dùng một liên kết, ví d
 'export-pagelinks' => 'Gồm cả các trang liên kết sâu đến:',
 
 # Namespace 8 related
-'allmessages' => 'Thông báo hệ thống',
-'allmessagesname' => 'Tên thông báo',
+'allmessages' => 'Thông điệp hệ thống',
+'allmessagesname' => 'Tên thông điệp',
 'allmessagesdefault' => 'Nội dung mặc định',
 'allmessagescurrent' => 'Nội dung hiện thời',
-'allmessagestext' => 'Đây là toàn bộ thông báo hệ thống có trong không gian tên MediaWiki.
-Mời vào [//www.mediawiki.org/wiki/Localisation Địa phương hóa MediaWiki]  và [//translatewiki.net translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.',
+'allmessagestext' => 'Đây là toàn bộ thông điệp hệ thống có trong không gian tên MediaWiki.
+Mời vào [//www.mediawiki.org/wiki/Localisation?uselang=vi Địa phương hóa MediaWiki] và [//translatewiki.net/wiki/?uselang=vi translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.',
 'allmessagesnotsupportedDB' => "Trang này không dùng được vì biến '''\$wgUseDatabaseMessages''' đã bị tắt.",
 'allmessages-filter-legend' => 'Bộ lọc',
 'allmessages-filter' => 'Lọc theo tình trạng sửa đổi:',
@@ -3008,13 +3014,13 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'tooltip-t-specialpages' => 'Danh sách các trang đặc biệt',
 'tooltip-t-print' => 'Bản để in ra của trang',
 'tooltip-t-permalink' => 'Liên kết thường trực đến phiên bản này của trang',
-'tooltip-ca-nstab-main' => 'Xem trang nội dung này',
-'tooltip-ca-nstab-user' => 'Xem trang về người này',
+'tooltip-ca-nstab-main' => 'Xem trang nội dung',
+'tooltip-ca-nstab-user' => 'Xem trang cá nhân',
 'tooltip-ca-nstab-media' => 'Xem trang phương tiện',
 'tooltip-ca-nstab-special' => 'Đây là một trang đặc biệt, bạn không thể sửa đổi nó.',
 'tooltip-ca-nstab-project' => 'Xem trang dự án',
 'tooltip-ca-nstab-image' => 'Xem trang miêu tả tập tin',
-'tooltip-ca-nstab-mediawiki' => 'Xem thông báo hệ thống',
+'tooltip-ca-nstab-mediawiki' => 'Xem thông điệp hệ thống',
 'tooltip-ca-nstab-template' => 'Xem bản mẫu',
 'tooltip-ca-nstab-help' => 'Xem trang trợ giúp',
 'tooltip-ca-nstab-category' => 'Xem trang thể loại',
@@ -3709,7 +3715,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 'monthsall' => 'tất cả',
 'limitall' => 'tất cả',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Xác nhận thư điện tử',
 'confirmemail_noemail' => 'Bạn chưa đưa vào địa chỉ thư điện tử hợp lệ ở [[Special:Preferences|tùy chọn cá nhân]].',
 'confirmemail_text' => '{{SITENAME}} đòi hỏi bạn xác minh thư điện tử của mình
@@ -3994,7 +4000,7 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 * <strong class="mw-specialpagerestricted">Trang đặc biệt được hạn chế.</strong>
 * <span class="mw-specialpagecached">Trang đặc biệt được lấy từ vùng nhớ đệm (có thể lỗi thời).</span>',
 'specialpages-group-maintenance' => 'Báo cáo bảo quản',
-'specialpages-group-other' => 'Những trang đặc biệt khác',
+'specialpages-group-other' => 'Trang đặc biệt khác',
 'specialpages-group-login' => 'Đăng nhập / Mở tài khoản',
 'specialpages-group-changes' => 'Thay đổi gần đây và nhật trình',
 'specialpages-group-media' => 'Báo cáo và tải lên phương tiện',
@@ -4021,7 +4027,7 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 #Hãy đặt các mẩu biểu thức chính quy ở phía trên dòng này. Hãy để yên dòng này</pre>',
 
 # Special:Tags
-'tags' => 'Các thẻ đánh dấu thay đổi hợp lệ',
+'tags' => 'Thẻ đánh dấu thay đổi hợp lệ',
 'tag-filter' => 'Bộ lọc [[Special:Tags|thẻ]]:',
 'tag-filter-submit' => 'Bộ lọc',
 'tags-title' => 'Thẻ đánh dấu',
@@ -4179,4 +4185,7 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'duration-centuries' => '$1 thế kỷ',
 'duration-millennia' => '$1 thiên niên kỷ',
 
+# Image rotation
+'rotate-comment' => 'Đã quay hình $1 độ theo chiều kim đồng hồ',
+
 );
index 766b3e5..c52243f 100644 (file)
@@ -532,7 +532,7 @@ San-o matagan pa hin iba nga e-mail para ha imo akawnt, kinahanglan mo sundon an
 'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
 'loginlanguagelabel' => 'Pinulongan: $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
 
 # Change password dialog
@@ -631,7 +631,11 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} igliwat ini nga pakli]</span>.',
 'noarticletext-nopermission' => 'Waray yana nahasurat hini nga pakli
 Puyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling han ngaran hini nga pakli]] ha iba nga mga pakli,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mamiling han mga nanginginlabot nga mga talaan]</span>, kundi diri ka gintutugotan hin paghímò hini nga pakli.',
+'userpage-userdoesnotexist' => 'Diri nakarehistro an akawnt han gumaramit nga "$1".
+Alayon pagpamuruotbuot kun karuyag mo maghimo/mag-edit hini nga pakli.',
 'userpage-userdoesnotexist-view' => "An akawnt han gumaramit ni ''$1'' in diri nakarehistro.",
+'blocked-notice-logextract' => 'Ini nga gumaramit in nakapugong yana.
+An pinakaurhi nga log entry han mga pinugong in ginhatag ha ubos para hit reperensya:',
 'updated' => '(Ginbag-ohan)',
 'note' => "'''Pahibaro:'''",
 'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
@@ -850,6 +854,7 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'prefs-user-pages' => 'Mga pakli hin gumaramit',
 'prefs-personal' => 'Pangilal-an han nagamit',
 'prefs-rc' => 'Kalalabay la nga mga pagbabag-o',
+'prefs-watchlist' => 'Listahan hit binabantayan',
 'prefs-watchlist-days' => 'Mga adlaw nga makikita ha barantayan:',
 'prefs-watchlist-days-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'prefs-watchlist-edits-max' => 'Pinakadako nga ihap: 1000',
@@ -889,8 +894,8 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'default' => 'aada-nga-daan',
 'prefs-files' => 'Mga paypay',
 'youremail' => 'E-mail:',
-'username' => 'Agnay hiton gumaramit:',
-'uid' => 'ID han gumaramit:',
+'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
+'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
 'prefs-memberingroups' => 'Api han {{PLURAL:$1| nga hugpo|nga mga hugpo}}:',
 'prefs-registration' => 'Oras han pagrehistro:',
 'yourrealname' => 'Tinuod nga ngaran:',
@@ -921,7 +926,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-diffs' => 'Mga kaibhan',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail address in baga puydi',
 
 # User rights
@@ -956,6 +961,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
 
 'grouppage-user' => '{{ns:project}}:Mga gumaramit',
+'grouppage-autoconfirmed' => '{{ns:project}}:Mga gumaramit nga naka-awtokompirmado',
 'grouppage-bot' => '{{ns:project}}:Mga bot',
 'grouppage-sysop' => '{{ns:project}}:Mga magdudumara',
 'grouppage-bureaucrat' => '{{ns:project}}:Mga burokrata',
@@ -974,7 +980,9 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-movefile' => 'Balhina an mga paypay',
 'right-upload' => 'Igkarga paigbaw an mga paypay',
 'right-reupload' => 'Sapawa an mga aada nga mga paypay',
+'right-reupload-own' => 'Igsapaw an aada yana nga mga paypay nga ginkarga-pasaka nimo mismo',
 'right-upload_by_url' => 'Igkarga paigbaw an mga paypay tikang ha uska URL',
+'right-autoconfirmed' => 'Igliwat an mga semi-pinanpasaliporan nga pakli',
 'right-bot' => 'Igtrato komo uska naglulugaring nga proseso',
 'right-delete' => 'Igpara an mga pakli',
 'right-bigdelete' => 'Igpara an mga pakli nga may-ada dagko nga mga kaagi',
@@ -1026,6 +1034,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'action-protect' => 'igsaliwan an katupngan han pananalipod para hini nga pakli',
 'action-import' => 'ig-angbit ini nga pakli tikang ha iba nga wiki',
 'action-importupload' => 'ig-angbit ini nga pakli tikang ha uska ginkarga-pasaka nga paypay',
+'action-patrol' => 'markahi an kanan iba pagliwat komo nakapatrolya',
 'action-mergehistory' => 'Igtampo an kaagi hini nga pakli',
 'action-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
 'action-sendemail' => 'Padara hin mga e-mail',
@@ -1084,6 +1093,7 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 
 An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
 'upload-permitted' => 'Gintutugotan nga mga klase han paypay: $1.',
+'upload-preferred' => 'Mas karugag nga mga tipo hin paypay: %1.',
 'upload-prohibited' => 'Gindidire nga mga klase han paypay: $1.',
 'uploadlog' => 'Talaan hin ginkarga-pasaka',
 'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
@@ -1091,11 +1101,15 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'filedesc' => 'Dalikyat nga pulong',
 'fileuploadsummary' => 'Dalikyat nga pulong:',
 'filereuploadsummary' => 'Mga pagbal-iw ha fayl:',
+'filestatus' => 'Kahimtang han copyright:',
 'filesource' => 'Tinikangan:',
+'uploadedfiles' => 'Mga paypay nga ginkarga-pasaka',
 'ignorewarning' => 'Pabay-i an pahimatngon ngan igtipig la ngahaw',
 'ignorewarnings' => 'Pasagdi an bisan ano nga mga pahimatngon',
+'minlength1' => 'Iton ngaran-han-paypay in kinahanglan may-ada bisan usa la nga letra.',
 'filename-toolong' => 'Iton ngaran hin paypay in diri puyde na mas lapos pa ha 240 ka mga byte.',
 'badfilename' => 'An ngaran-han-paypay in ginliwat ngada ha "$1".',
+'empty-file' => 'An paypay nga imo ginsumite in waray sulod.',
 'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
 'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
@@ -1105,6 +1119,7 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'large-file' => 'Ginrerekomenda nga it mga paypay in diri malapos hin $1;
 ini nga paypay in $2.',
 'largefileserver' => 'Ini nga paypay in durudako kaysa ha ginpapakarawat han serbidor.',
+'windows-nonascii-filename' => 'Ini nga wiki in diri nakasuportado han mga ngaran-han-paypay nga may-ada pinaurog nga mga karakter.',
 'uploadwarning' => 'Pahimatngon han pagkarga paigbaw',
 'savefile' => 'Igtipig an paypay',
 'uploadedimage' => 'ginkarga-paigbaw "[[$1]]"',
@@ -1153,6 +1168,21 @@ $1',
 'backend-fail-create' => 'Diri nasusuratan an paypay nga "$1".',
 'backend-fail-maxsize' => 'Diri nasusuratan an paypay nga "$1" tungod nga mas dako ini kaysa hin {{PLURAL:"$2|usa nga byte|$2 nga mga byte}}.',
 'backend-fail-readonly' => 'An panluyo nga tiripigan nga "$1" in ha pagkayana in panbasa-la.  An rason nga ginhatag in: "\'\'$2\'\'"',
+'backend-fail-connect' => 'Diri nakakasumpay ha storage backend "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Waray ka rangka an "$1"; diri ini nakatrangka.',
+'lockmanager-fail-closelock' => 'Diri nakakasera han nakatrangka nga paypay para han "$1".',
+'lockmanager-fail-deletelock' => 'Diri nakakapara han nakatrangka nga paypay para hit "$1".',
+'lockmanager-fail-acquirelock' => 'Diri nakakakarawat hin trangka para hit "$1".',
+'lockmanager-fail-openlock' => 'Diri nakakaabre han nakatrangka nga paypay para hit "$1".',
+'lockmanager-fail-releaselock' => 'Diri nakakabul-iw han trangka para hit "$1".',
+
+# ZipDirectoryReader
+'zip-wrong-format' => 'An espisipikado nga paypay in diri naka ZIP nga paypay.',
+
+# Special:UploadStash
+'uploadstash-errclear' => 'An paghawan han mga paypay in diri malinamposon.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Diri gintutugutan makasulod',
@@ -1207,7 +1237,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'upload-disallowed-here' => 'Diri nimo masasapaw ini nga paypay.',
 
 # File reversion
+'filerevert' => 'Igbalik $1',
+'filerevert-legend' => 'Igbalik an paypay',
 'filerevert-comment' => 'Rason:',
+'filerevert-defaultcomment' => 'Ginbalik nga bersyon han $2, $1',
+'filerevert-submit' => 'Igbalik',
 
 # File deletion
 'filedelete' => 'Igpara $1',
@@ -1225,6 +1259,9 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'mimetype' => 'MIME nga klase:',
 'download' => 'pagkarga paubos',
 
+# Unwatched pages
+'unwatchedpages' => 'Mga paypay nga gintanggal an pagbantay',
+
 # List redirects
 'listredirects' => 'Talaan hin mga redirect',
 
@@ -1258,6 +1295,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
 'disambiguationspage' => 'Template:pansayod',
 
+'pageswithprop-submit' => 'Kadto-a',
+
+'doubleredirects' => 'Mga doble nga redirekta',
+'double-redirect-fixer' => 'Mangangayad hin redirekta',
+
 'brokenredirects' => 'Mga redirect nga utod',
 'brokenredirects-edit' => 'igliwat',
 'brokenredirects-delete' => 'paraa',
@@ -1289,12 +1331,18 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'mostlinked' => 'Pinakadamo nga mga ginsumpayan nga pakli',
 'mostlinkedcategories' => 'Pinakadamo nga mga ginsumpayan nga kaarangay',
 'mostlinkedtemplates' => 'Pinakadamo nga mga ginsumpayan nga batakan',
+'mostcategories' => 'Mga paypay nga may-ada pinakadamo nga mga kaarangay',
+'mostimages' => 'Pinakadamo nga nahisumpayan nga mga paypay',
+'mostinterwikis' => 'Mga pakli nga may-ada pinakadamo nga mga interwiki',
+'mostrevisions' => 'Mga pakli nga may-ada pinakadamo nga mga rebisyon',
 'prefixindex' => 'Ngatanan nga pakli nga may-ada pahiuna-nga-sumpay',
 'shortpages' => 'Haglipot nga mga pakli',
 'longpages' => 'Haglaba nga mga pakli',
 'deadendpages' => 'Waray na kakadtoan nga mga pakli',
 'protectedpages' => 'Pinapasaliporan nga mga pakli',
+'protectedtitles' => 'Pinapasaliporan nga mga titulo',
 'listusers' => 'Lista han mga gumaramit',
+'listusers-editsonly' => 'Igpakita la an mga gumaramit nga may-ada ginliwat',
 'listusers-creationsort' => 'Ginsusunodsunod pinaagi han paghimo nga petsa',
 'usereditcount' => '$1 {{PLURAL:$1|ka pagliwat|ka mga pagliwat}}',
 'usercreated' => '{{GENDER:$3|Ginhimo}} han $1 ha $2',
@@ -1333,6 +1381,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'allpagesnext' => 'Sunod',
 'allpagessubmit' => 'Kadto-a',
 'allpages-bad-ns' => '{{SITENAME}} in waray ngaran-lat\'ang nga "$1".',
+'allpages-hide-redirects' => 'Igtago an mga redirekta',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => 'Igkita an pinakaurhi.',
@@ -1376,7 +1425,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listgrouprights-addgroup-all' => 'Igdugang ngatanan nga mga hugpo',
 'listgrouprights-removegroup-all' => 'Igtanggal ngatanan nga mga hugpo',
 
-# E-mail user
+# Email user
 'emailuser' => 'Ig-e-mail ini nga gumaramit',
 'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
 'emailuser-title-notarget' => 'Gumaramit han e-mail',
@@ -1387,6 +1436,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'noemailtitle' => 'Waray e-mail address',
 'nowikiemailtitle' => 'Waray gintutugutan nga e-mail',
 'emailusername' => 'Agnay hiton gumaramit:',
+'emailusernamesubmit' => 'Igsumite',
 'emailfrom' => 'Tikang kan:',
 'emailto' => 'Para kan:',
 'emailsubject' => 'Himangrawon:',
@@ -1404,13 +1454,20 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'mywatchlist' => 'Mga angay timan-an nakon',
 'watchlistfor2' => 'Para ha $1 $2',
 'watchnologin' => 'Diri nakalog-in',
+'addwatch' => 'Igdugang an listahan hit binabantayan',
 'watch' => 'Bantayi',
 'watchthispage' => 'Bantayi ini nga pakli',
 'unwatch' => 'Pabay-i an pagbantay',
+'unwatchthispage' => 'Undangi pagbantay',
 'watchlist-details' => '{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri lakip an mga hiruhimangraw-nga-pakli.',
 'wlshowlast' => 'Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3',
 'watchlist-options' => 'Mga pirilian han talaan han binabantayan',
 
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Ginbabantay...',
+'unwatching' => 'Diri na ginbabantay...',
+
+'enotif_reset' => 'Markahi an ngatanan nga mga pakli nga ginbisita na',
 'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
 'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
 'created' => 'nahimo',
@@ -1421,6 +1478,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'confirm' => 'Kompirma',
 'excontent' => "An sulod in: ''$1''",
 'excontentauthor' => 'an sulod in: \'\'$1\'\' (ngan hi "[[Special:Contributions/$2|$2]]" la an nag-amot)',
+'exbeforeblank' => 'sulod san-o paghawan in: "$1"',
 'exblank' => 'waray sulod an pakli',
 'delete-confirm' => 'Igpara "$1"',
 'delete-legend' => 'Igpara',
@@ -1452,7 +1510,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'prot_1movedto2' => '[[$1]] in ginbalhin ngadto ha [[$2]]',
 'protectcomment' => 'Katadongan:',
 'protect-default' => 'Togota an ngatanan nga mga gumaramit',
-'protect-level-sysop' => 'Mga magdudumara la',
+'protect-level-sysop' => 'Tuguti la an mga magdudumara',
 'protect-othertime' => 'Lain nga oras:',
 'protect-othertime-op' => 'lain nga oras',
 'protect-otherreason' => 'Lain/dugang nga katadongan:',
@@ -1855,6 +1913,7 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'ago' => '$1 an nakalabay',
+'just-now' => 'yana pala',
 
 # Bad image list
 'bad_image_list' => 'An kabutangan in masunod:
@@ -2042,7 +2101,7 @@ An iba in daan nakatago.
 'monthsall' => 'ngatanan',
 'limitall' => 'ngatanan',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Igkompirma an e-mail address',
 'confirmemail_sent' => 'Ginpadara an kompirmasyon han e-mail.',
 'confirmemail_needlogin' => 'Kinahanglanon mo hin $1 para makakompirma han imo e-mail address.',
index 8a21cc4..c102940 100644 (file)
@@ -320,7 +320,7 @@ $messages = array(
 'about' => 'וועגן',
 'article' => 'אינהאלט בלאט',
 'newwindow' => '(עפֿנט זיך אין א נײַעם פענסטער)',
-'cancel' => '×\96×\99×\99 ×\9e×\91×\98×\9c',
+'cancel' => '×\90Ö·× ×\95×\9c×\99ר×\9f',
 'moredotdotdot' => 'נאך…',
 'mypage' => 'מײַן בלאט',
 'mytalk' => 'שמועס',
@@ -700,7 +700,7 @@ $2',
 'loginlanguagelabel' => 'שפראך: $1',
 'suspicious-userlogout' => ' אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.',
 'user-mail-no-addy' => 'געפרוווט צו שיקן ע-פּאָסט אָן אַן ע-פּאָסט אַדרעס.',
 'user-mail-no-body' => 'האט פרובירט צו שיקן א בליצבריוו וואס זיין אינהאלט איז ליידיק אדער גאר קורץ.',
@@ -1377,7 +1377,7 @@ $1",
 'prefs-displaywatchlist' => 'ווײַזן אפציעס',
 'prefs-diffs' => 'צווישנשיידן',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'ע-פּאָסט אַדרעס זעט אויס גילטיק',
 'email-address-validity-invalid' => 'לייגט אַרײַן א גילטיקן ע־פאסט אַדרעס',
 
@@ -2093,7 +2093,7 @@ $1",
 'listgrouprights-addgroup-self-all' => 'צולייגן אַלע גרופעס צו אייגענער קאנטע',
 'listgrouprights-removegroup-self-all' => 'אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע',
 
-# E-mail user
+# Email user
 'mailnologin' => 'נישטא קיין אדרעס צו שיקן',
 'mailnologintext' => 'איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.',
 'emailuser' => 'שיקן ע-פאסט צו דעם באַניצער',
@@ -2812,7 +2812,7 @@ $1',
 'tooltip-pt-anonlogin' => "עס איז רעקאָמענדירט זיך אײַנשרײַבן; ס'איז אָבער נישט קײַן פֿליכט",
 'tooltip-pt-logout' => 'ארויסלאגירן',
 'tooltip-ca-talk' => 'שמועס וועגן דעם אינהאַלט בלאַט',
-'tooltip-ca-edit' => "איר קענט ענדערן דעם בלאט. ביטע באניצט דעם ''פֿאָרויסדיקער אויסקוק'' קנעפל בעפֿארן אפהיטן",
+'tooltip-ca-edit' => "איר קענט ענדערן דעם בלאט. ביטע באניצט דעם ''פֿארויסקוק'' קנעפל בעפֿארן אפהיטן",
 'tooltip-ca-addsection' => 'אָנהייבן א נײַע אָפטיילונג',
 'tooltip-ca-viewsource' => 'דאס איז א פֿארשלאסענער בלאט, איר קענט נאר באַקוקן זיין מקור',
 'tooltip-ca-history' => 'פריערדיגע ווערסיעס פון דעם בלאט.',
@@ -2903,6 +2903,7 @@ $1',
 'spamprotectiontitle' => 'ספעם באשיצונג פילטער',
 'spambot_username' => 'מעדיעוויקי ספאם פוצן',
 'spam_reverting' => 'צוריקגעשטעלט צו דער לעצטער ווערסיע אן לינקען צו $1',
+'spam_blanking' => 'אלע רעוויזיעס האבן לינקען צו $1, אויסליידיקן',
 'spam_deleting' => 'אלע רעוויזיעס האבן לינקען צו $1, אויסמעקן',
 
 # Info page
@@ -2922,6 +2923,7 @@ $1',
 'pageinfo-robot-noindex' => 'נישט אינדעקסירבאר',
 'pageinfo-views' => 'צאַל קוקן',
 'pageinfo-watchers' => '!צאָל בלאט אויפֿפאַסער',
+'pageinfo-few-watchers' => 'ווינציקער ווי $1 {{PLURAL:$1|אויפֿפאסער}}',
 'pageinfo-redirects-name' => 'ווײַטערפירונגען צו דעם בלאט',
 'pageinfo-subpages-name' => 'אונטערבלעטער פון דעם בלאט',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ווײַטערפירונג|ווײַטערפירונגען}}; $3 {{PLURAL:$3|סתם בלאט|סתם בלעטער}})',
@@ -2936,12 +2938,15 @@ $1',
 'pageinfo-magic-words' => '{{PLURAL:$1|מאגיש ווארט|מאגישע ווערטער}} ($1)',
 'pageinfo-hidden-categories' => 'באהאלטענע {{PLURAL:$1|קאטעגאריע|קאטעגאריעס}} ($1)',
 'pageinfo-templates' => ' {{PLURAL:$1|אריבערגעשלאסענער מוסטער|אריבערגשלאסענע מוסטערן}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|בלאט|בלעטער}} אריבעגעשלאסן אויף ($1)',
 'pageinfo-toolboxlink' => 'בלאַט־אינפֿארמאַציע',
 'pageinfo-redirectsto' => 'פירט ווײַטער צו',
 'pageinfo-redirectsto-info' => 'אינפֿארמאַציע',
 'pageinfo-contentpage' => 'געציילט ווי אן אינהאלט בלאט',
 'pageinfo-contentpage-yes' => 'יאָ',
+'pageinfo-protect-cascading' => 'שיצונגען קאסקאדירן פון דאנעט',
 'pageinfo-protect-cascading-yes' => 'יאָ',
+'pageinfo-protect-cascading-from' => 'שיצונגען קאסקאדירן פון',
 'pageinfo-category-info' => 'קאטעגאריע אינפארמאציע',
 'pageinfo-category-pages' => 'צאָל בלעטער',
 'pageinfo-category-subcats' => 'צאָל אונטערקאטעגאריעס',
@@ -3144,6 +3149,7 @@ $1',
 'exif-sharpness' => 'שארף',
 'exif-devicesettingdescription' => 'אפאראט שטעלונגען אראפמאלונג',
 'exif-imageuniqueid' => 'בילד־ID',
+'exif-gpsversionid' => 'GPS טאַג ווערסיע',
 'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
 'exif-gpslatitude' => 'גארטל־ליניע',
 'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
@@ -3153,6 +3159,7 @@ $1',
 'exif-gpstimestamp' => 'GPS צייט (אטאם־זייגער)',
 'exif-gpssatellites' => 'סאטעליטן געניצט פאר מעסטן',
 'exif-gpsstatus' => 'אויפנעמער סטאטוס',
+'exif-gpsmeasuremode' => 'מעסטן מאדע',
 'exif-gpsdop' => 'מאס פוקנטליכקייט',
 'exif-gpsspeedref' => 'גיך איינהייט',
 'exif-gpsspeed' => 'גיך פון GPS־אויפֿנעמער',
@@ -3303,7 +3310,7 @@ $1',
 'exif-sharpness-1' => 'ווייך',
 'exif-sharpness-2' => 'הארט',
 
-'exif-subjectdistancerange-0' => '×\90×\95×\9e×\91×\90Ö·×\95×\95×\99סט',
+'exif-subjectdistancerange-0' => '×\90×\95×\9e×\91×\90Ö·×\95×\95×\90×\95סט',
 'exif-subjectdistancerange-1' => 'מאקרא',
 'exif-subjectdistancerange-2' => 'נאנטע ווייזונג',
 'exif-subjectdistancerange-3' => 'ווײַטע ווײַזונג',
@@ -3320,6 +3327,8 @@ $1',
 'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} איבערן ים־שפיגלl',
 'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} אונטערן ים־שפיגל',
 
+'exif-gpsstatus-a' => "מ'האלט אינמיטן מעסטן",
+
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'ק"מ אין א שעה',
 'exif-gpsspeed-m' => 'מייל פער שעה',
@@ -3393,7 +3402,7 @@ $1',
 'monthsall' => 'אלע',
 'limitall' => 'אַלע',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'באַשטעטיקט בליצפּאָסט אַדרעס',
 'confirmemail_noemail' => 'איר האט נישט קיין גוטן בליצבריוו אַדרעס אין אײַער [[Special:Preferences|באניצער פרעפֿערענצן]].',
 'confirmemail_text' => 'די וויקי פארלאנגט אז איר זאלט באשטעטיגן אייער בליצפאסט אדרעס איידער איר באניצט זיך מיט דער ע-פאסט באדינסט. דרוקט אויפן קנעפל אונטן כדי צו שיקן א באשטעטיגונג קאד צו אייער אדרעס. לאדט אן דעם לינק אין אייער בלעטערער צו באשטעטיגן אז אייער אדרעס איז גילטיג.',
@@ -3583,6 +3592,7 @@ $5
 'version' => 'ווערסיע',
 'version-extensions' => 'אינסטאלירטע פארברייטערונגען',
 'version-specialpages' => 'ספעציעלע בלעטער',
+'version-parserhooks' => 'פארזער פארברייטונגען',
 'version-variables' => 'וואַריאַבלען',
 'version-skins' => 'באניצער־אייבערפלאכן',
 'version-other' => 'אנדער',
index 1ae93eb..47d8d0f 100644 (file)
@@ -565,7 +565,7 @@ E-mail kankan kò ní jẹ́ fífiránṣẹ́ fún ìkankan nínú àwọn ìn
 '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íẹ̀.',
 
-# E-mail sending
+# Email sending
 '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.',
 
@@ -1259,7 +1259,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'prefs-displaywatchlist' => 'Ìfihàn àwọn àṣàyàn',
 'prefs-diffs' => 'Àwọn ìyàtọ̀',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Àdírẹ́ẹ̀sì e-mail dà bí èyí tótọ́',
 'email-address-validity-invalid' => 'Ẹ tẹ e-mail tótọ́',
 
@@ -2044,7 +2044,7 @@ Orúkọ ibiàyè pọndandan, fún àpẹrẹ "*.org".<br />
 'listgrouprights-addgroup-self-all' => 'Ìfikún gbogbo ẹgbẹ́ mọ́ àpamọ́ araẹni',
 'listgrouprights-removegroup-self-all' => 'Ìyọkúrò gbogbo ẹgbẹ́ kúrò nínú àpamọ́ araẹni',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Kò sí àdírẹ́sì àfiránṣẹ́',
 'mailnologintext' => 'Ẹ gbọ́dọ̀ ti [[Special:UserLogin|wọlé]] kí ẹ sì ní àdírẹ́ẹ̀sì e-mail oníìbámu nínú [[Special:Preferences|àwọn ìfẹ́ràn]] yín láti le baà le fi e-mail ránṣẹ́ sí àwọn onísẹ míràn.',
 'emailuser' => 'Ẹ fi e-mail ránṣẹ́ sí oníṣe yìí',
@@ -3261,7 +3261,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'monthsall' => 'gbogbo',
 'limitall' => 'gbogbo',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Ṣè'múdájú àdírẹ́ẹ̀sì e-mail",
 'confirmemail_noemail' => 'Ẹ kò tíì ṣètò àdírẹ́ẹ̀sì e-mail tó tótọ́ nínú [[Special:Preferences|ìfẹ́ràn oníṣe]] yín.',
 'confirmemail_send' => 'Fi àmìọ̀rọ̀ ìmúdájú ránṣẹ́',
index 9354cda..faf797b 100644 (file)
@@ -835,7 +835,7 @@ $2',
 'loginlanguagelabel' => '语言:$1',
 'suspicious-userlogout' => '注销请求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
 'user-mail-no-addy' => '尝试发送邮件而不附带电子邮件地址。',
 'user-mail-no-body' => '试图发送空的或者主体短得不合理的电子邮件。',
@@ -862,7 +862,7 @@ $2',
 'passwordreset-text' => '完成该表格以接收你账户信息的邮件提醒。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此wiki已经禁用密码重置。',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据之一}}',
+'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据之一}}',
 'passwordreset-username' => '用户名:',
 'passwordreset-domain' => '域:',
 'passwordreset-capture' => '查看生成的电子邮件吗?',
@@ -1456,7 +1456,7 @@ $1",
 'prefs-displaywatchlist' => '显示',
 'prefs-diffs' => '差异对比',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => '电子邮件地址有效',
 'email-address-validity-invalid' => '请输入有效的电子邮件地址',
 
@@ -2020,6 +2020,9 @@ $1',
 'disambiguationspage' => 'Template:消歧义',
 'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们可能可以链接到更适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
+'pageswithprop-prop' => '属性名称:',
+'pageswithprop-submit' => '提交',
+
 'doubleredirects' => '双重重定向页',
 'doubleredirectstext' => '本页面列出重定向至其他重定向页的页面。每行含有第一及第二重定向的链接和第二重定向的目标(通常是第一重定向应该指向的“真实”目标页面)。<del>带删除线的</del>条目已被解决。',
 'double-redirect-fixed-move' => '[[$1]]已被移动。它现在重定向至[[$2]]。',
@@ -2207,7 +2210,7 @@ $1',
 'listgrouprights-addgroup-self-all' => '添加所有用户组至自己的账户',
 'listgrouprights-removegroup-self-all' => '删除自己的账户的所有用户组',
 
-# E-mail user
+# Email user
 'mailnologin' => '无电子邮件地址',
 'mailnologintext' => '你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。',
 'emailuser' => '电邮联系',
@@ -3610,7 +3613,7 @@ Variants for Chinese language
 'monthsall' => '全部',
 'limitall' => '全部',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => '确认邮箱地址',
 'confirmemail_noemail' => '你还没有在你的[[Special:Preferences|系统设置]]中设置有效的电子邮件地址。',
 'confirmemail_text' => '{{SITENAME}}要求您在使用邮件功能之前验证您的邮箱地址。
index b550cab..d863b82 100644 (file)
@@ -753,7 +753,7 @@ $2',
 'loginlanguagelabel' => '語言:$1',
 'suspicious-userlogout' => '您登出的要求已經被拒絕,因為它可能是由已損壞的瀏覽器或者快取代理傳送。',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => '在 PHP 的 mail() 參數中的未知錯誤',
 'user-mail-no-addy' => '嘗試不帶電郵地址發送電郵。',
 'user-mail-no-body' => '試圖發送空的或主體不合理短的電子郵件。',
@@ -1271,7 +1271,7 @@ $1",
 'showingresults' => '下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:',
 'showingresultsnum' => "下面顯示從第 '''$2''' 條開始的 '''{{PLURAL:$3|1|$3}}''' 條結果。",
 'showingresultsheader' => "對'''$4'''的{{PLURAL:$5|第'''$1'''至第'''$3'''項結果|第'''$1 - $2'''項,共'''$3'''項結果}}",
-'nonefound' => "'''注意''': 只有一些名字空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名字空間作為前綴。",
+'nonefound' => "'''注意:'''只有一些名字空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名字空間作為前綴。",
 'search-nonefound' => '在查詢中無結果相符。',
 'powersearch' => '進階搜尋',
 'powersearch-legend' => '進階搜尋',
@@ -1409,7 +1409,7 @@ $1",
 'prefs-displaywatchlist' => '顯示選項',
 'prefs-diffs' => '差異',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => '電子郵件地址有效',
 'email-address-validity-invalid' => '請提供一個有效的電子郵件地址',
 
@@ -1873,7 +1873,7 @@ $1',
 'filehist-filesize' => '檔案大小',
 'filehist-comment' => '註解',
 'filehist-missing' => '檔案遺失',
-'imagelinks' => 'æ\96\87件使用情況',
+'imagelinks' => 'æª\94æ¡\88使用情況',
 'linkstoimage' => '以下的$1個頁面連接到本檔案:',
 'linkstoimage-more' => '多於$1個頁面連接到這個檔案。
 下面的清單只列示了連去這個檔案的最首$1個頁面。
@@ -1986,6 +1986,12 @@ Template:消歧義
 Template:消除歧義',
 'disambiguations-text' => "以下的頁面都有至少一個連到'''消歧義頁'''的鏈接,但它們應鏈接到合適的頁面。<br />一個頁面如果使用了[[MediaWiki:Disambiguationspage]]內的模板,則會被視為消歧義頁。",
 
+'pageswithprop' => '有頁面屬性的頁面',
+'pageswithprop-legend' => '有頁面屬性的頁面',
+'pageswithprop-text' => '此頁列出所有頁面使用了特定的頁面屬性。',
+'pageswithprop-prop' => '屬性名稱:',
+'pageswithprop-submit' => '進入',
+
 'doubleredirects' => '雙重重定向頁面',
 'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是"真正"的目標頁面,也就是第一個重定向頁面應該指向的頁面。
 <del>已劃去</del>的為已經解決之項目。',
@@ -2174,7 +2180,7 @@ Template:消除歧義',
 'listgrouprights-addgroup-self-all' => '在自己的賬戶中加入所有群組',
 'listgrouprights-removegroup-self-all' => '在自己的賬戶中移除所有群組',
 
-# E-mail user
+# Email user
 'mailnologin' => '無電郵地址',
 'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
 並在[[Special:Preferences|偏好設定]]
@@ -3589,7 +3595,7 @@ Variants for Chinese language
 'monthsall' => '全部',
 'limitall' => '全部',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => '確認郵箱位址',
 'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|用戶設定]]裡面輸入一個有效的 email 位址。',
 'confirmemail_text' => '{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。
@@ -3656,7 +3662,7 @@ $5
 'scarytranscludetoolong' => '[URL 地址太長]',
 
 # Delete conflict
-'deletedwhileediting' => '警告: 此頁在您開始編輯之後已經被刪除﹗',
+'deletedwhileediting' => "'''警告:'''此頁在您開始編輯之後已經被刪除﹗",
 'confirmrecreate' => "在您開始編輯這個頁面後,用戶[[User:$1|$1]] ([[User talk:$1|對話]])以下列原因刪除了這個頁面:
 : ''$2''
 請確認在您重新創建頁面前三思。",
@@ -3990,4 +3996,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'duration-centuries' => '$1個世紀',
 'duration-millennia' => '$1千年',
 
+# Image rotation
+'rotate-comment' => '順時針旋轉圖像$1{{PLURAL:$1|度|度}}',
+
 );
index 728530f..9471c65 100644 (file)
--- a/load.php5
+++ b/load.php5
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of load.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9f95f5d..5cb6f5f 100644 (file)
@@ -93,7 +93,7 @@ installations.
        runJobs.php
        Immediately complete all jobs in the job queue
 
-       stats.php
+       showCacheStats.php
        Show all statistics stored in the cache
 
        undelete.php
@@ -106,4 +106,4 @@ installations.
        Update pages restriction to the new schema
 
        userOptions.php
-       Change user options
\ No newline at end of file
+       Change user options
index ad2577a..66f9e87 100644 (file)
@@ -114,7 +114,7 @@ class TitleCleanup extends TableCleanup {
        protected function moveInconsistentPage( $row, $title ) {
                if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
                        if ( $title->getInterwiki() || !$title->canExist() ) {
-                               $prior = $title->getPrefixedDbKey();
+                               $prior = $title->getPrefixedDBkey();
                        } else {
                                $prior = $title->getDBkey();
                        }
diff --git a/maintenance/clearCacheStats.php b/maintenance/clearCacheStats.php
new file mode 100644 (file)
index 0000000..7a0d664
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Removes all statistics tracking from the cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to remove all statistics tracking from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ClearCacheStats extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Remove all statistics tracking from the cache";
+       }
+
+       public function execute() {
+               global $wgLocalDatabases, $wgMemc;
+               foreach ( $wgLocalDatabases as $db ) {
+                       $wgMemc->delete( "$db:stats:request_with_session" );
+                       $wgMemc->delete( "$db:stats:request_without_session" );
+                       $wgMemc->delete( "$db:stats:pcache_hit" );
+                       $wgMemc->delete( "$db:stats:pcache_miss_expired" );
+                       $wgMemc->delete( "$db:stats:pcache_miss_absent" );
+                       $wgMemc->delete( "$db:stats:pcache_miss_stub" );
+                       $wgMemc->delete( "$db:stats:image_cache_hit" );
+                       $wgMemc->delete( "$db:stats:image_cache_miss" );
+                       $wgMemc->delete( "$db:stats:image_cache_update" );
+                       $wgMemc->delete( "$db:stats:diff_cache_hit" );
+                       $wgMemc->delete( "$db:stats:diff_cache_miss" );
+                       $wgMemc->delete( "$db:stats:diff_uncacheable" );
+                       $wgMemc->delete( "$db:stats:job-insert" );
+                       $wgMemc->delete( "$db:stats:job-pop" );
+               }
+       }
+}
+
+$maintClass = "ClearCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clearInterwikiCache.php b/maintenance/clearInterwikiCache.php
new file mode 100644 (file)
index 0000000..88769df
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Clear the cache of interwiki prefixes for all local wikis.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
+ *
+ * @ingroup Maintenance
+ */
+class ClearInterwikiCache extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Clear all interwiki links for all languages from the cache";
+       }
+
+       public function execute() {
+               global $wgLocalDatabases, $wgMemc;
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'interwiki', array( 'iw_prefix' ), false );
+               $prefixes = array();
+               foreach ( $res as $row ) {
+                       $prefixes[] = $row->iw_prefix;
+               }
+
+               foreach ( $wgLocalDatabases as $db ) {
+                       $this->output( "$db..." );
+                       foreach ( $prefixes as $prefix ) {
+                               $wgMemc->delete( "$db:interwiki:$prefix" );
+                       }
+                       $this->output( "done\n" );
+               }
+       }
+}
+
+$maintClass = "ClearInterwikiCache";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_interwiki_cache.php b/maintenance/clear_interwiki_cache.php
deleted file mode 100644 (file)
index 88769df..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Clear the cache of interwiki prefixes for all local wikis.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
- *
- * @ingroup Maintenance
- */
-class ClearInterwikiCache extends Maintenance {
-
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Clear all interwiki links for all languages from the cache";
-       }
-
-       public function execute() {
-               global $wgLocalDatabases, $wgMemc;
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'interwiki', array( 'iw_prefix' ), false );
-               $prefixes = array();
-               foreach ( $res as $row ) {
-                       $prefixes[] = $row->iw_prefix;
-               }
-
-               foreach ( $wgLocalDatabases as $db ) {
-                       $this->output( "$db..." );
-                       foreach ( $prefixes as $prefix ) {
-                               $wgMemc->delete( "$db:interwiki:$prefix" );
-                       }
-                       $this->output( "done\n" );
-               }
-       }
-}
-
-$maintClass = "ClearInterwikiCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_stats.php b/maintenance/clear_stats.php
deleted file mode 100644 (file)
index 4581d53..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Removes all statistics tracking from the cache.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to remove all statistics tracking from the cache.
- *
- * @ingroup Maintenance
- */
-class clear_stats extends Maintenance {
-
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Remove all statistics tracking from the cache";
-       }
-
-       public function execute() {
-               global $wgLocalDatabases, $wgMemc;
-               foreach ( $wgLocalDatabases as $db ) {
-                       $wgMemc->delete( "$db:stats:request_with_session" );
-                       $wgMemc->delete( "$db:stats:request_without_session" );
-                       $wgMemc->delete( "$db:stats:pcache_hit" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_expired" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_absent" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_stub" );
-                       $wgMemc->delete( "$db:stats:image_cache_hit" );
-                       $wgMemc->delete( "$db:stats:image_cache_miss" );
-                       $wgMemc->delete( "$db:stats:image_cache_update" );
-                       $wgMemc->delete( "$db:stats:diff_cache_hit" );
-                       $wgMemc->delete( "$db:stats:diff_cache_miss" );
-                       $wgMemc->delete( "$db:stats:diff_uncacheable" );
-                       $wgMemc->delete( "$db:stats:job-insert" );
-                       $wgMemc->delete( "$db:stats:job-pop" );
-               }
-       }
-}
-
-$maintClass = "clear_stats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
index ad5333f..81fbbb3 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
+ * @author Pablo Castellano <pablo@anche.no>
  */
 
 require_once( __DIR__ . '/Maintenance.php' );
@@ -31,50 +32,82 @@ require_once( __DIR__ . '/Maintenance.php' );
  */
 class CreateAndPromote extends Maintenance {
 
+       static $permitRoles = array( 'sysop', 'bureaucrat' );
+
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Create a new user account";
-               $this->addOption( "sysop", "Grant the account sysop rights" );
-               $this->addOption( "bureaucrat", "Grant the account bureaucrat rights" );
+               $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." );
+               foreach( self::$permitRoles as $role ) {
+                       $this->addOption( $role, "Add the account to the {$role} group" );
+               }
                $this->addArg( "username", "Username of new user" );
-               $this->addArg( "password", "Password to set);
+               $this->addArg( "password", "Password to set (not required if --force is used)", false);
        }
 
        public function execute() {
                $username = $this->getArg( 0 );
                $password = $this->getArg( 1 );
-
-               $this->output( wfWikiID() . ": Creating and promoting User:{$username}..." );
+               $force = $this->hasOption( 'force' );
+               $inGroups = array();
 
                $user = User::newFromName( $username );
                if ( !is_object( $user ) ) {
                        $this->error( "invalid username.", true );
-               } elseif ( 0 != $user->idForName() ) {
-                       $this->error( "account exists.", true );
                }
 
-               # Try to set the password
-               try {
-                       $user->setPassword( $password );
-               } catch ( PasswordError $pwe ) {
-                       $this->error( $pwe->getText(), true );
+               $exists = ( 0 !== $user->idForName() );
+
+               if ( $exists && !$force ) {
+                       $this->error( "Account exists. Perhaps you want the --force option?", true );
+               } else if ( !$exists && !$password ) {
+                       $this->error( "Argument <password> required!", false );
+                       $this->maybeHelp( true );
+               } else if ( $exists ) {
+                       $inGroups = $user->getGroups();
                }
 
-               # Insert the account into the database
-               $user->addToDatabase();
-               $user->saveSettings();
+               $promotions = array_diff( array_filter( self::$permitRoles, array( $this, 'hasOption' ) ), $inGroups );
 
-               # Promote user
-               if ( $this->hasOption( 'sysop' ) ) {
-                       $user->addGroup( 'sysop' );
+               if ( $exists && !$password && count( $promotions ) === 0 ) {
+                       $this->output( "Account exists and nothing to do.\n" );
+                       return;
+               } else if ( count( $promotions ) !== 0 ) {
+                       $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
+                       if ( $exists ) {
+                               $this->output( wfWikiID() . ": Promoting $promoText" );
+                       } else {
+                               $this->output( wfWikiID() . ": Creating and promoting $promoText" );
+                       }
                }
-               if ( $this->hasOption( 'bureaucrat' ) ) {
-                       $user->addGroup( 'bureaucrat' );
+
+               if ( $password ) {
+                       # Try to set the password
+                       try {
+                               $user->setPassword( $password );
+                               if ( $exists ) {
+                                       $this->output( "Password set.\n" );
+                                       $user->saveSettings();
+                               }
+                       } catch ( PasswordError $pwe ) {
+                               $this->error( $pwe->getText(), true );
+                       }
                }
 
-               # Increment site_stats.ss_users
-               $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
-               $ssu->doUpdate();
+               if ( !$exists ) {
+                       # Insert the account into the database
+                       $user->addToDatabase();
+                       $user->saveSettings();
+               }
+
+               # Promote user
+               array_map( array( $user, 'addGroup' ), $promotions );
+
+               if ( !$exists ) {
+                       # Increment site_stats.ss_users
+                       $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+                       $ssu->doUpdate();
+               }
 
                $this->output( "done.\n" );
        }
diff --git a/maintenance/ibm_db2/foreignkeys.sql b/maintenance/ibm_db2/foreignkeys.sql
deleted file mode 100644 (file)
index 4f1450d..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
--- good
-ALTER TABLE user_groups ADD CONSTRAINT USER_GROUPS_FK1 FOREIGN KEY (ug_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE user_newtalk ADD CONSTRAINT USER_NEWTALK_FK1 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_PAGE_FK FOREIGN KEY (rev_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_USER_FK FOREIGN KEY (rev_user) REFERENCES user(user_id) ON DELETE RESTRICT
-;
-
--- good
-ALTER TABLE page_restrictions ADD CONSTRAINT PAGE_RESTRICTIONS_PAGE_FK FOREIGN KEY (pr_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE page_props ADD CONSTRAINT PAGE_PROPS_PAGE_FK FOREIGN KEY (pp_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE archive ADD CONSTRAINT ARCHIVE_USER_FK FOREIGN KEY (ar_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- referenced value not found
-ALTER TABLE redirect ADD CONSTRAINT REDIRECT_FROM_FK FOREIGN KEY (rd_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE pagelinks ADD CONSTRAINT PAGELINKS_FROM_FK FOREIGN KEY (pl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE templatelinks ADD CONSTRAINT TEMPLATELINKS_FROM_FK FOREIGN KEY (tl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE imagelinks ADD CONSTRAINT IMAGELINKS_FROM_FK FOREIGN KEY (il_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE categorylinks ADD CONSTRAINT CATEGORYLINKS_FROM_FK FOREIGN KEY (cl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE externallinks ADD CONSTRAINT EXTERNALLINKS_FROM_FK FOREIGN KEY (el_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE langlinks ADD CONSTRAINT LANGLINKS_FROM_FK FOREIGN KEY (ll_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_USER_FK FOREIGN KEY (ipb_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_BY_FK FOREIGN KEY (ipb_by) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE image ADD CONSTRAINT IMAGE_USER_FK FOREIGN KEY (img_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_USER_FK FOREIGN KEY (oi_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_NAME_FK FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_DELETED_USER_FK FOREIGN KEY (fa_deleted_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_USER_FK FOREIGN KEY (fa_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_USER_FK FOREIGN KEY (rc_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_CUR_ID_FK FOREIGN KEY (rc_cur_id) REFERENCES page(page_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE watchlist ADD CONSTRAINT WATCHLIST_USER_FK FOREIGN KEY (wl_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE protected_titles ADD CONSTRAINT PROTECTED_TITLES_USER_FK FOREIGN KEY (pt_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE logging ADD CONSTRAINT LOGGING_USER_FK FOREIGN KEY (log_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
\ No newline at end of file
diff --git a/maintenance/ibm_db2/patch-categorylinks-better-collation.sql b/maintenance/ibm_db2/patch-categorylinks-better-collation.sql
deleted file mode 100644 (file)
index 568d5cd..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
---
--- patch-categorylinks-better-collation.sql
---
---
--- Track category inclusions *used inline*
--- This tracks a single level of category membership
--- (folksonomic tagging, really).
---
-CREATE TABLE categorylinks (
-  cl_from       BIGINT      NOT NULL  DEFAULT 0,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  cl_to         VARCHAR(255)         NOT NULL,
-  -- cl_sortkey has to be at least 86 wide
-  -- in order to be compatible with the old MySQL schema from MW 1.10
-  --cl_sortkey    VARCHAR(86),
-  cl_sortkey VARCHAR(230) FOR BIT DATA  NOT NULL ,
-  cl_sortkey_prefix VARCHAR(255) FOR BIT DATA  NOT NULL ,
-  cl_timestamp  TIMESTAMP(3)  NOT NULL,
-  cl_collation VARCHAR(32) FOR BIT DATA  NOT NULL ,
-  cl_type VARCHAR(6) FOR BIT DATA  NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-change_tag-indexes.sql b/maintenance/ibm_db2/patch-change_tag-indexes.sql
deleted file mode 100644 (file)
index 1621a03..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag ON change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag (ct_rev_id,ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id ON change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/ibm_db2/patch-change_tag.sql b/maintenance/ibm_db2/patch-change_tag.sql
deleted file mode 100644 (file)
index 3b6f9d5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
-  ct_rc_id INTEGER,
-  ct_log_id INTEGER,
-  ct_rev_id INTEGER,
-  ct_tag varchar(255) NOT NULL,
-  ct_params CLOB(64K) INLINE LENGTH 4096
-);
diff --git a/maintenance/ibm_db2/patch-change_tag_summary.sql b/maintenance/ibm_db2/patch-change_tag_summary.sql
deleted file mode 100644 (file)
index 768cbfa..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
-  ts_rc_id INTEGER,
-  ts_log_id INTEGER,
-  ts_rev_id INTEGER,
-  ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-change_valid_tag.sql b/maintenance/ibm_db2/patch-change_valid_tag.sql
deleted file mode 100644 (file)
index 9bdcbc9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE valid_tag (
-  vt_tag varchar(255) NOT NULL PRIMARY KEY
-);
diff --git a/maintenance/ibm_db2/patch-cl_collation-field.sql b/maintenance/ibm_db2/patch-cl_collation-field.sql
deleted file mode 100644 (file)
index 6999dac..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_collation VARCHAR(32) FOR BIT DATA  NOT NULL
diff --git a/maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql b/maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql
deleted file mode 100644 (file)
index 58b7814..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_sortkey_prefix VARCHAR(255) FOR BIT DATA  NOT NULL
diff --git a/maintenance/ibm_db2/patch-cl_type-field.sql b/maintenance/ibm_db2/patch-cl_type-field.sql
deleted file mode 100644 (file)
index 5952c98..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_type VARCHAR(6) FOR BIT DATA  NOT NULL
diff --git a/maintenance/ibm_db2/patch-external_user.sql b/maintenance/ibm_db2/patch-external_user.sql
deleted file mode 100644 (file)
index 96cb823..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE TABLE external_user (
-  -- Foreign key to user_id
-  eu_local_id                  BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id               VARCHAR(255) NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-ipb_allow_usertalk.sql b/maintenance/ibm_db2/patch-ipb_allow_usertalk.sql
deleted file mode 100644 (file)
index 6274bb2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE ipblocks (
-  ipb_id                INTEGER      NOT NULL  PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  --DEFAULT nextval('ipblocks_ipb_id_val'),
-  ipb_address           VARCHAR(1024),
-  ipb_user              BIGINT NOT NULL DEFAULT 0,
-  --           REFERENCES user(user_id) ON DELETE SET NULL,
-  ipb_by                BIGINT      NOT NULL DEFAULT 0,
-  --  REFERENCES user(user_id) ON DELETE CASCADE,
-  ipb_by_text           VARCHAR(255)         NOT NULL  DEFAULT '',
-  ipb_reason            VARCHAR(1024)         NOT NULL,
-  ipb_timestamp         TIMESTAMP(3)  NOT NULL,
-  ipb_auto              SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_anon_only         SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_create_account    SMALLINT     NOT NULL  DEFAULT 1,
-  ipb_enable_autoblock  SMALLINT     NOT NULL  DEFAULT 1,
-  ipb_expiry            TIMESTAMP(3)  NOT NULL,
-  ipb_range_start       VARCHAR(1024),
-  ipb_range_end         VARCHAR(1024),
-  ipb_deleted           SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_block_email       SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0
-
-);
diff --git a/maintenance/ibm_db2/patch-iw_api-field.sql b/maintenance/ibm_db2/patch-iw_api-field.sql
deleted file mode 100644 (file)
index dd732a5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE interwiki ADD iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL
diff --git a/maintenance/ibm_db2/patch-iw_api_and_wikiid.sql b/maintenance/ibm_db2/patch-iw_api_and_wikiid.sql
deleted file mode 100644 (file)
index 1b1e359..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE interwiki (
-  iw_prefix  VARCHAR(32)      NOT NULL  UNIQUE,
-  iw_url     CLOB(64K) INLINE LENGTH 4096      NOT NULL,
-  iw_api     CLOB(64K) INLINE LENGTH 4096      NOT NULL,
-  iw_wikiid  varchar(64) NOT NULL,
-  iw_local   SMALLINT  NOT NULL,
-  iw_trans   SMALLINT  NOT NULL  DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-iw_wikiid-field.sql b/maintenance/ibm_db2/patch-iw_wikiid-field.sql
deleted file mode 100644 (file)
index fe49e3c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE interwiki ADD iw_wikiid varchar(64) NOT NULL
diff --git a/maintenance/ibm_db2/patch-iwlinks.sql b/maintenance/ibm_db2/patch-iwlinks.sql
deleted file mode 100644 (file)
index 2902512..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE  TABLE "IWLINKS"
-(
-"IWL_FROM" INT  NOT NULL ,
-"IWL_PREFIX" VARCHAR(20) FOR BIT DATA  NOT NULL ,
-"IWL_TITLE" VARCHAR(255) FOR BIT DATA  NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-l10n_cache.sql b/maintenance/ibm_db2/patch-l10n_cache.sql
deleted file mode 100644 (file)
index 49ebed2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE l10n_cache (
-  -- Language code
-  lc_lang                      VARCHAR(32) NOT NULL,
-  -- Cache key
-  lc_key                       VARCHAR(255) NOT NULL,
-  -- Value
-  lc_value                     CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-log_search-rename-index.sql b/maintenance/ibm_db2/patch-log_search-rename-index.sql
deleted file mode 100644 (file)
index a6a696e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE log_search (
-  -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
-  ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
-  -- The value of the ID
-  ls_value varchar(255) NOT NULL,
-  -- Key to log_id
-  ls_log_id BIGINT NOT NULL default 0
-);
diff --git a/maintenance/ibm_db2/patch-log_search.sql b/maintenance/ibm_db2/patch-log_search.sql
deleted file mode 100644 (file)
index a6a696e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE log_search (
-  -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
-  ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
-  -- The value of the ID
-  ls_value varchar(255) NOT NULL,
-  -- Key to log_id
-  ls_log_id BIGINT NOT NULL default 0
-);
diff --git a/maintenance/ibm_db2/patch-log_user_text.sql b/maintenance/ibm_db2/patch-log_user_text.sql
deleted file mode 100644 (file)
index 3534057..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-CREATE TABLE logging (
-  log_id                       BIGINT      NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  --PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
-  log_type                     VARCHAR(32)         NOT NULL,
-  log_action           VARCHAR(32)         NOT NULL,
-  log_timestamp                TIMESTAMP(3)  NOT NULL,
-  log_user                     BIGINT NOT NULL DEFAULT 0,
-  --                REFERENCES user(user_id) ON DELETE SET NULL,
-  -- Name of the user who performed this action
-  log_user_text                VARCHAR(255) NOT NULL default '',
-  log_namespace                SMALLINT     NOT NULL,
-  log_title                    VARCHAR(255)         NOT NULL,
-  log_page                     BIGINT,
-  log_comment          VARCHAR(255),
-  log_params           CLOB(64K) INLINE LENGTH 4096,
-  log_deleted          SMALLINT     NOT NULL DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-module_deps.sql b/maintenance/ibm_db2/patch-module_deps.sql
deleted file mode 100644 (file)
index 5058d1f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE  TABLE "MODULE_DEPS" (
-"MD_MODULE" VARCHAR(255) FOR BIT DATA  NOT NULL ,
-"MD_SKIN" VARCHAR(32) FOR BIT DATA  NOT NULL ,
-"MD_DEPS" CLOB(16M) INLINE LENGTH 4096 NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-msg_resource.sql b/maintenance/ibm_db2/patch-msg_resource.sql
deleted file mode 100644 (file)
index 58b3dd6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE  TABLE "MSG_RESOURCE"
-(
-"MR_RESOURCE" VARCHAR(255) FOR BIT DATA  NOT NULL ,
-"MR_LANG" VARCHAR(32) FOR BIT DATA  NOT NULL ,
-"MR_BLOB" BLOB NOT NULL ,
-"MR_TIMESTAMP" TIMESTAMP(3)  NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-msg_resource_links.sql b/maintenance/ibm_db2/patch-msg_resource_links.sql
deleted file mode 100644 (file)
index 4c0ff91..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE  TABLE "MSG_RESOURCE_LINKS"
-(
-"MRL_RESOURCE" VARCHAR(255) FOR BIT DATA  NOT NULL ,
-"MRL_MESSAGE" VARCHAR(255) FOR BIT DATA  NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-rd_interwiki.sql b/maintenance/ibm_db2/patch-rd_interwiki.sql
deleted file mode 100644 (file)
index c162548..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE redirect (
-  rd_from       BIGINT  NOT NULL  PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  --REFERENCES page(page_id) ON DELETE CASCADE,
-  rd_namespace  SMALLINT NOT NULL  DEFAULT 0,
-  rd_title      VARCHAR(255)     NOT NULL DEFAULT '',
-  rd_interwiki  varchar(32),
-  rd_fragment   VARCHAR(255)
-);
diff --git a/maintenance/ibm_db2/patch-ss_active_users.sql b/maintenance/ibm_db2/patch-ss_active_users.sql
deleted file mode 100644 (file)
index f0e6d14..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-CREATE TABLE site_stats (
-  ss_row_id         BIGINT       NOT NULL  UNIQUE,
-  ss_total_views    BIGINT            DEFAULT 0,
-  ss_total_edits    BIGINT            DEFAULT 0,
-  ss_good_articles  BIGINT             DEFAULT 0,
-  ss_total_pages    INTEGER            DEFAULT -1,
-  ss_users          INTEGER            DEFAULT -1,
-  ss_active_users   INTEGER            DEFAULT -1,
-  ss_admins         INTEGER            DEFAULT -1,
-  ss_images         INTEGER            DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-ul_value.sql b/maintenance/ibm_db2/patch-ul_value.sql
deleted file mode 100644 (file)
index cd00f8e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE updatelog (
-  ul_key VARCHAR(255) NOT NULL PRIMARY KEY
-);
diff --git a/maintenance/ibm_db2/patch-uq61_msg_resource_links.sql b/maintenance/ibm_db2/patch-uq61_msg_resource_links.sql
deleted file mode 100644 (file)
index d9185c0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ61_MSG_RESOURCE_LINKS" ON "MSG_RESOURCE_LINKS"
-(
-"MRL_MESSAGE",
-"MRL_RESOURCE"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-uq81_msg_resource.sql b/maintenance/ibm_db2/patch-uq81_msg_resource.sql
deleted file mode 100644 (file)
index 8ed8537..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ81_MSG_RESOURCE" ON "MSG_RESOURCE"
-(
-"MR_RESOURCE"
-,"MR_LANG"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-uq96_module_deps.sql b/maintenance/ibm_db2/patch-uq96_module_deps.sql
deleted file mode 100644 (file)
index e0cc879..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ96_MODULE_DEPS" ON "MODULE_DEPS"
-(
-"MD_MODULE"
-,"MD_SKIN"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-user_properties.sql b/maintenance/ibm_db2/patch-user_properties.sql
deleted file mode 100644 (file)
index 6798604..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE user_properties (
-  -- Foreign key to user.user_id
-  up_user BIGINT NOT NULL,
-
-  -- Name of the option being saved. This is indexed for bulk lookup.
-  up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-
-  -- Property value as a string.
-  up_value CLOB(64K) INLINE LENGTH 4096
-);
diff --git a/maintenance/ibm_db2/tables.sql b/maintenance/ibm_db2/tables.sql
deleted file mode 100644 (file)
index 2edb7f0..0000000
+++ /dev/null
@@ -1,929 +0,0 @@
--- IBM DB2
-
--- SQL to create the initial tables for the MediaWiki database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
-
--- Notes:
---  * DB2 will convert all table and column names to all caps internally.
---  * DB2 has a 32k limit on SQL filesize, so it may be necessary
---     to split this into two files soon.
-
-
-CREATE TABLE user (
-  -- Needs to start with 0
-  user_id                   BIGINT
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
-  user_name                 VARCHAR(255) NOT NULL UNIQUE,
-  user_real_name            VARCHAR(255),
-  user_password             VARCHAR(1024),
-  user_newpassword          VARCHAR(1024),
-  user_newpass_time         TIMESTAMP(3),
-  user_token                VARCHAR(255),
-  user_email                VARCHAR(1024),
-  user_email_token          VARCHAR(255),
-  user_email_token_expires  TIMESTAMP(3),
-  user_email_authenticated  TIMESTAMP(3),
-  -- obsolete, replace by user_properties table
-  -- user_options              CLOB(64K) INLINE LENGTH 4096,
-  user_touched              TIMESTAMP(3),
-  user_registration         TIMESTAMP(3),
-  user_editcount            INTEGER
-);
-CREATE INDEX user_email_token_idx
-  ON user (user_email_token);
-CREATE UNIQUE INDEX user_include_idx
-  ON user (user_id)
-  INCLUDE (user_name, user_real_name, user_password, user_newpassword,
-    user_newpass_time, user_token,
-    user_email, user_email_token, user_email_token_expires,
-    user_email_authenticated,
-    user_touched, user_registration, user_editcount);
-CREATE UNIQUE INDEX user_email
-  ON user (user_email);
-
-
-
--- Create a dummy user to satisfy fk contraints especially with revisions
-INSERT INTO user(
-  user_name,    user_real_name,           user_password,  user_newpassword,   user_newpass_time,
-  user_email,   user_email_authenticated, user_token,     user_registration,  user_editcount
-)
-VALUES (
-  'Anonymous',  '',                       NULL,           NULL,               CURRENT_TIMESTAMP,
-  NULL,         NULL,                     NULL,           CURRENT_TIMESTAMP,  0
-);
-
-
-
-CREATE TABLE user_groups (
-  ug_user   BIGINT NOT NULL DEFAULT 0,
-  --    REFERENCES user(user_id) ON DELETE CASCADE,
-  ug_group  VARCHAR(255) NOT NULL
-);
-CREATE INDEX user_groups_unique
-  ON user_groups (ug_user, ug_group);
-
-
-
-CREATE TABLE user_newtalk (
-  -- registered users key
-  user_id              BIGINT NOT NULL DEFAULT 0,
-  --  REFERENCES user(user_id) ON DELETE CASCADE,
-  -- anonymous users key
-  user_ip              VARCHAR(40),
-  user_last_timestamp  TIMESTAMP(3)
-);
-CREATE INDEX user_newtalk_id_idx
-  ON user_newtalk (user_id);
-CREATE INDEX user_newtalk_ip_idx
-  ON user_newtalk (user_ip);
-CREATE UNIQUE INDEX user_newtalk_include_idx
-  ON user_newtalk (user_id, user_ip)
-  INCLUDE (user_last_timestamp);
-
-
-
-CREATE TABLE page (
-  page_id            BIGINT
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  page_namespace     SMALLINT NOT NULL,
-  page_title         VARCHAR(255) NOT NULL,
-  page_restrictions  VARCHAR(1024),
-  page_counter       BIGINT NOT NULL DEFAULT 0,
-  page_is_redirect   SMALLINT NOT NULL DEFAULT 0,
-  page_is_new        SMALLINT NOT NULL DEFAULT 0,
-  page_random        NUMERIC(15,14) NOT NULL,
-  page_touched       TIMESTAMP(3),
-  page_latest        BIGINT NOT NULL, -- FK?
-  page_len           BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX page_unique_name
-  ON page (page_namespace, page_title);
-CREATE INDEX page_random_idx
-  ON page (page_random);
-CREATE INDEX page_len_idx
-  ON page (page_len);
-CREATE UNIQUE INDEX page_id_include
-  ON page (page_id)
-  INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-CREATE UNIQUE INDEX page_name_include
-  ON page (page_namespace, page_title)
-  INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-
-
-
-CREATE TABLE revision (
-  rev_id            BIGINT
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  rev_page          BIGINT NOT NULL DEFAULT 0,
-  --      REFERENCES page (page_id) ON DELETE CASCADE,
-  rev_text_id       BIGINT, -- FK
-  rev_comment       VARCHAR(1024),
-  rev_user          BIGINT NOT NULL DEFAULT 0,
-  --  REFERENCES user(user_id) ON DELETE RESTRICT,
-  rev_user_text     VARCHAR(255) NOT NULL,
-  rev_timestamp     TIMESTAMP(3) NOT NULL,
-  rev_minor_edit    SMALLINT NOT NULL DEFAULT 0,
-  rev_deleted       SMALLINT NOT NULL DEFAULT 0,
-  rev_len           BIGINT,
-  rev_parent_id     BIGINT DEFAULT NULL,
-  rev_sha1          VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX revision_unique
-  ON revision (rev_page, rev_id);
-CREATE INDEX rev_text_id_idx
-  ON revision (rev_text_id);
-CREATE INDEX rev_timestamp_idx
-  ON revision (rev_timestamp);
-CREATE INDEX rev_user_idx
-  ON revision (rev_user);
-CREATE INDEX rev_user_text_idx
-  ON revision (rev_user_text);
-
-
-
-CREATE TABLE text ( -- replaces reserved word 'text'
-  old_id     INTEGER
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  old_text   CLOB(16M) INLINE LENGTH 4096,
-  old_flags  VARCHAR(1024)
-);
-
-
-
-CREATE TABLE page_restrictions (
-  pr_id      BIGINT
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  pr_page    INTEGER NOT NULL DEFAULT 0,
-  --(used to be nullable)
-  --  REFERENCES page (page_id) ON DELETE CASCADE,
-  pr_type    VARCHAR(60) NOT NULL,
-  pr_level   VARCHAR(60) NOT NULL,
-  pr_cascade SMALLINT NOT NULL,
-  pr_user    INTEGER,
-  pr_expiry  TIMESTAMP(3)
-  --PRIMARY KEY (pr_page, pr_type)
-);
---ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page, pr_type);
-CREATE UNIQUE INDEX pr_pagetype
-  ON page_restrictions (pr_page, pr_type);
-CREATE INDEX pr_typelevel
-  ON page_restrictions (pr_type, pr_level);
-CREATE INDEX pr_level
-  ON page_restrictions (pr_level);
-CREATE INDEX pr_cascade
-  ON page_restrictions (pr_cascade);
-
-
-
-CREATE TABLE page_props (
-  pp_page      INTEGER NOT NULL DEFAULT 0,
-  -- REFERENCES page (page_id) ON DELETE CASCADE,
-  pp_propname  VARCHAR(255) NOT NULL,
-  pp_value     CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  PRIMARY KEY (pp_page, pp_propname)
-);
-CREATE INDEX page_props_propname
-  ON page_props (pp_propname);
-
-
-
-CREATE TABLE archive (
-  ar_namespace   SMALLINT NOT NULL,
-  ar_title       VARCHAR(255) NOT NULL,
-  ar_text        CLOB(16M) INLINE LENGTH 4096,
-  ar_comment     VARCHAR(1024),
-  ar_user        BIGINT NOT NULL,
-  -- no foreign keys in MySQL
-  -- REFERENCES user(user_id) ON DELETE SET NULL,
-  ar_user_text   VARCHAR(255) NOT NULL,
-  ar_timestamp   TIMESTAMP(3) NOT NULL,
-  ar_minor_edit  SMALLINT NOT NULL DEFAULT 0,
-  ar_flags       VARCHAR(1024),
-  ar_rev_id      INTEGER,
-  ar_text_id     INTEGER,
-  ar_deleted     SMALLINT NOT NULL DEFAULT 0,
-  ar_len         INTEGER,
-  ar_page_id     INTEGER,
-  ar_parent_id   INTEGER,
-  ar_sha1        VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX archive_name_title_timestamp
-  ON archive (ar_namespace, ar_title, ar_timestamp);
-CREATE INDEX archive_user_text
-  ON archive (ar_user_text);
-
-
-
-CREATE TABLE redirect (
-  rd_from       BIGINT NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  --REFERENCES page(page_id) ON DELETE CASCADE,
-  rd_namespace  SMALLINT NOT NULL DEFAULT 0,
-  rd_title      VARCHAR(255) NOT NULL DEFAULT '',
-  rd_interwiki  VARCHAR(32),
-  rd_fragment   VARCHAR(255)
-);
-CREATE INDEX redirect_ns_title
-  ON redirect (rd_namespace, rd_title, rd_from);
-
-
-CREATE TABLE pagelinks (
-  pl_from       BIGINT NOT NULL DEFAULT 0,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  pl_namespace  SMALLINT NOT NULL,
-  pl_title      VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX pagelink_unique
-  ON pagelinks (pl_from, pl_namespace, pl_title);
-
-
-
-CREATE TABLE templatelinks (
-  tl_from       BIGINT NOT NULL DEFAULT 0,
-  --  REFERENCES page(page_id) ON DELETE CASCADE,
-  tl_namespace  SMALLINT NOT NULL,
-  tl_title      VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX templatelinks_unique
-  ON templatelinks (tl_namespace, tl_title, tl_from);
-CREATE UNIQUE INDEX tl_from_idx
-  ON templatelinks (tl_from, tl_namespace, tl_title);
-
-
-
-CREATE TABLE imagelinks (
-  il_from  BIGINT NOT NULL DEFAULT 0,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  il_to    VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX il_from_idx
-  ON imagelinks (il_to, il_from);
-CREATE UNIQUE INDEX il_to_idx
-  ON imagelinks (il_from, il_to);
-
-
-
-CREATE TABLE categorylinks (
-  cl_from           BIGINT NOT NULL DEFAULT 0,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  cl_to             VARCHAR(255) NOT NULL,
-  -- cl_sortkey has to be at least 86 wide
-  -- in order to be compatible with the old MySQL schema from MW 1.10
-  --cl_sortkey    VARCHAR(86),
-  cl_sortkey        VARCHAR(230) FOR BIT DATA NOT NULL,
-  cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL,
-  cl_timestamp      TIMESTAMP(3) NOT NULL,
-  cl_collation      VARCHAR(32) FOR BIT DATA NOT NULL,
-  cl_type           VARCHAR(6) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX cl_from
-  ON categorylinks (cl_from, cl_to);
-CREATE INDEX cl_sortkey
-  ON categorylinks (cl_to, cl_sortkey, cl_from);
-
-
-
-CREATE TABLE externallinks (
-  el_from   BIGINT NOT NULL DEFAULT 0,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  el_to     VARCHAR(1024) NOT NULL,
-  el_index  VARCHAR(1024) NOT NULL
-);
-CREATE INDEX externallinks_from_to
-  ON externallinks (el_from, el_to);
-CREATE INDEX externallinks_index
-  ON externallinks (el_index);
-
-
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE external_user (
-  -- Foreign key to user_id
-  eu_local_id      BIGINT NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id    VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX eu_external_id_idx
-  ON external_user (eu_external_id)
-  INCLUDE (eu_local_id);
-CREATE UNIQUE INDEX eu_local_id_idx
-  ON external_user (eu_local_id)
-  INCLUDE (eu_external_id);
-
-
-
-CREATE TABLE langlinks (
-  ll_from    BIGINT NOT NULL DEFAULT 0,
-  -- REFERENCES page (page_id) ON DELETE CASCADE,
-  ll_lang    VARCHAR(20),
-  ll_title   VARCHAR(255)
-);
-CREATE UNIQUE INDEX langlinks_unique
-  ON langlinks (ll_from, ll_lang);
-CREATE INDEX langlinks_lang_title
-  ON langlinks (ll_lang, ll_title);
-
-
-
-CREATE TABLE site_stats (
-  ss_row_id         BIGINT NOT NULL UNIQUE,
-  ss_total_views    BIGINT DEFAULT 0,
-  ss_total_edits    BIGINT DEFAULT 0,
-  ss_good_articles  BIGINT DEFAULT 0,
-  ss_total_pages    INTEGER DEFAULT -1,
-  ss_users          INTEGER DEFAULT -1,
-  ss_active_users   INTEGER DEFAULT -1,
-  ss_admins         INTEGER DEFAULT -1,
-  ss_images         INTEGER DEFAULT 0
-);
-
-
-
-CREATE TABLE hitcounter (
-  hc_id  BIGINT NOT NULL
-);
-
-
-
-CREATE TABLE ipblocks (
-  ipb_id                INTEGER NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  ipb_address           VARCHAR(1024),
-  ipb_user              BIGINT NOT NULL DEFAULT 0,
-  --           REFERENCES user(user_id) ON DELETE SET NULL,
-  ipb_by                BIGINT NOT NULL DEFAULT 0,
-  --  REFERENCES user(user_id) ON DELETE CASCADE,
-  ipb_by_text           VARCHAR(255) NOT NULL DEFAULT '',
-  ipb_reason            VARCHAR(1024) NOT NULL,
-  ipb_timestamp         TIMESTAMP(3) NOT NULL,
-  ipb_auto              SMALLINT NOT NULL DEFAULT 0,
-  ipb_anon_only         SMALLINT NOT NULL DEFAULT 0,
-  ipb_create_account    SMALLINT NOT NULL DEFAULT 1,
-  ipb_enable_autoblock  SMALLINT NOT NULL DEFAULT 1,
-  ipb_expiry            TIMESTAMP(3) NOT NULL,
-  ipb_range_start       VARCHAR(1024),
-  ipb_range_end         VARCHAR(1024),
-  ipb_deleted           SMALLINT NOT NULL DEFAULT 0,
-  ipb_block_email       SMALLINT NOT NULL DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT NOT NULL DEFAULT 0,
-  ipb_parent_block_id             INTEGER DEFAULT NULL
-  -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
-
-);
-CREATE INDEX ipb_address
-  ON ipblocks (ipb_address);
-CREATE INDEX ipb_user
-  ON ipblocks (ipb_user);
-CREATE INDEX ipb_range
-  ON ipblocks (ipb_range_start, ipb_range_end);
-
-
-
-CREATE TABLE image (
-  img_name         VARCHAR(255) NOT NULL
-    PRIMARY KEY,
-  img_size         BIGINT NOT NULL,
-  img_width        INTEGER NOT NULL,
-  img_height       INTEGER NOT NULL,
-  img_metadata     CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
-  img_bits         SMALLINT,
-  img_media_type   VARCHAR(255),
-  img_major_mime   VARCHAR(255) DEFAULT 'unknown',
-  img_minor_mime   VARCHAR(32) DEFAULT 'unknown',
-  img_description  VARCHAR(1024) NOT NULL DEFAULT '',
-  img_user         BIGINT NOT NULL DEFAULT 0,
-  --         REFERENCES user(user_id) ON DELETE SET NULL,
-  img_user_text    VARCHAR(255) NOT NULL DEFAULT '',
-  img_timestamp    TIMESTAMP(3),
-  img_sha1         VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX img_size_idx
-  ON image (img_size);
-CREATE INDEX img_timestamp_idx
-  ON image (img_timestamp);
-CREATE INDEX img_sha1
-  ON image (img_sha1);
-
-
-CREATE TABLE oldimage (
-  oi_name          VARCHAR(255) NOT NULL DEFAULT '',
-  oi_archive_name  VARCHAR(255) NOT NULL,
-  oi_size          BIGINT NOT NULL,
-  oi_width         INTEGER NOT NULL,
-  oi_height        INTEGER NOT NULL,
-  oi_bits          SMALLINT NOT NULL,
-  oi_description   VARCHAR(1024),
-  oi_user          BIGINT NOT NULL DEFAULT 0,
-  --            REFERENCES user(user_id) ON DELETE SET NULL,
-  oi_user_text     VARCHAR(255) NOT NULL,
-  oi_timestamp     TIMESTAMP(3) NOT NULL,
-  oi_metadata      CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
-  oi_media_type    VARCHAR(255),
-  oi_major_mime    VARCHAR(255) NOT NULL DEFAULT 'unknown',
-  oi_minor_mime    VARCHAR(255) NOT NULL DEFAULT 'unknown',
-  oi_deleted       SMALLINT NOT NULL DEFAULT 0,
-  oi_sha1          VARCHAR(255) NOT NULL DEFAULT ''
-  --FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-);
-CREATE INDEX oi_name_timestamp
-  ON oldimage (oi_name, oi_timestamp);
-CREATE INDEX oi_name_archive_name
-  ON oldimage (oi_name, oi_archive_name);
-CREATE INDEX oi_sha1
-  ON oldimage (oi_sha1);
-
-
-
-CREATE TABLE filearchive (
-  fa_id                 INTEGER NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  fa_name               VARCHAR(255) NOT NULL,
-  fa_archive_name       VARCHAR(255),
-  fa_storage_group      VARCHAR(255),
-  fa_storage_key        VARCHAR(64) DEFAULT '',
-  fa_deleted_user       BIGINT NOT NULL DEFAULT 0,
-  --            REFERENCES user(user_id) ON DELETE SET NULL,
-  fa_deleted_timestamp  TIMESTAMP(3) NOT NULL,
-  fa_deleted_reason     VARCHAR(255),
-  fa_size               BIGINT NOT NULL,
-  fa_width              INTEGER NOT NULL,
-  fa_height             INTEGER NOT NULL,
-  fa_metadata           CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
-  fa_bits               SMALLINT,
-  fa_media_type         VARCHAR(255),
-  fa_major_mime         VARCHAR(255) DEFAULT 'unknown',
-  fa_minor_mime         VARCHAR(255) DEFAULT 'unknown',
-  fa_description        VARCHAR(1024) NOT NULL,
-  fa_user               BIGINT NOT NULL DEFAULT 0,
-  --            REFERENCES user(user_id) ON DELETE SET NULL,
-  fa_user_text          VARCHAR(255) NOT NULL,
-  fa_timestamp          TIMESTAMP(3),
-  fa_deleted            SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX fa_name_time
-  ON filearchive (fa_name, fa_timestamp);
-CREATE INDEX fa_dupe
-  ON filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX fa_notime
-  ON filearchive (fa_deleted_timestamp);
-CREATE INDEX fa_nouser
-  ON filearchive (fa_deleted_user);
-
-
-
-CREATE TABLE recentchanges (
-  rc_id              INTEGER NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  rc_timestamp       TIMESTAMP(3) NOT NULL,
-  rc_cur_time        TIMESTAMP(3) NOT NULL,
-  rc_user            BIGINT NOT NULL DEFAULT 0,
-  --        REFERENCES user(user_id) ON DELETE SET NULL,
-  rc_user_text       VARCHAR(255) NOT NULL,
-  rc_namespace       SMALLINT NOT NULL,
-  rc_title           VARCHAR(255) NOT NULL,
-  rc_comment         VARCHAR(255),
-  rc_minor           SMALLINT NOT NULL DEFAULT 0,
-  rc_bot             SMALLINT NOT NULL DEFAULT 0,
-  rc_new             SMALLINT NOT NULL DEFAULT 0,
-  rc_cur_id          BIGINT NOT NULL DEFAULT 0,
-  --            REFERENCES page(page_id) ON DELETE SET NULL,
-  rc_this_oldid      BIGINT NOT NULL,
-  rc_last_oldid      BIGINT NOT NULL,
-  rc_type            SMALLINT NOT NULL DEFAULT 0,
-  rc_moved_to_ns     SMALLINT,
-  rc_moved_to_title  VARCHAR(255),
-  rc_patrolled       SMALLINT NOT NULL DEFAULT 0,
-  rc_ip              VARCHAR(40),  -- was CIDR type
-  rc_old_len         INTEGER,
-  rc_new_len         INTEGER,
-  rc_deleted         SMALLINT NOT NULL DEFAULT 0,
-  rc_logid           BIGINT NOT NULL DEFAULT 0,
-  rc_log_type        VARCHAR(255),
-  rc_log_action      VARCHAR(255),
-  rc_params          CLOB(64K) INLINE LENGTH 4096
-);
-CREATE INDEX rc_timestamp
-  ON recentchanges (rc_timestamp);
-CREATE INDEX rc_namespace_title
-  ON recentchanges (rc_namespace, rc_title);
-CREATE INDEX rc_cur_id
-  ON recentchanges (rc_cur_id);
-CREATE INDEX new_name_timestamp
-  ON recentchanges (rc_new, rc_namespace, rc_timestamp);
-CREATE INDEX rc_ip
-  ON recentchanges (rc_ip);
-
-
-
-CREATE TABLE watchlist (
-  wl_user                   BIGINT NOT NULL DEFAULT 0,
-  --  REFERENCES user(user_id) ON DELETE CASCADE,
-  wl_namespace              SMALLINT NOT NULL DEFAULT 0,
-  wl_title                  VARCHAR(255) NOT NULL,
-  wl_notificationtimestamp  TIMESTAMP(3)
-);
-CREATE UNIQUE INDEX wl_user_namespace_title
-  ON watchlist (wl_namespace, wl_title, wl_user);
-
-
-
-CREATE TABLE interwiki (
-  iw_prefix  VARCHAR(32) NOT NULL UNIQUE,
-  iw_url     CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  iw_api     CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  iw_wikiid  VARCHAR(64) NOT NULL,
-  iw_local   SMALLINT NOT NULL,
-  iw_trans   SMALLINT NOT NULL DEFAULT 0
-);
-
-
-
-CREATE TABLE querycache (
-  qc_type       VARCHAR(255) NOT NULL,
-  qc_value      BIGINT NOT NULL,
-  qc_namespace  INTEGER NOT NULL,
-  qc_title      VARCHAR(255) NOT NULL
-);
-CREATE INDEX querycache_type_value
-  ON querycache (qc_type, qc_value);
-
-
-
-CREATE TABLE querycache_info (
-  qci_type        VARCHAR(255) UNIQUE NOT NULL,
-  qci_timestamp   TIMESTAMP(3)
-);
-
-
-
-CREATE TABLE querycachetwo (
-  qcc_type          VARCHAR(255) NOT NULL,
-  qcc_value         BIGINT NOT NULL DEFAULT 0,
-  qcc_namespace     INTEGER NOT NULL DEFAULT 0,
-  qcc_title         VARCHAR(255) NOT NULL DEFAULT '',
-  qcc_namespacetwo  INTEGER NOT NULL DEFAULT 0,
-  qcc_titletwo      VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX querycachetwo_type_value
-  ON querycachetwo (qcc_type, qcc_value);
-CREATE INDEX querycachetwo_title
-  ON querycachetwo (qcc_type, qcc_namespace, qcc_title);
-CREATE INDEX querycachetwo_titletwo
-  ON querycachetwo (qcc_type, qcc_namespacetwo, qcc_titletwo);
-
-
-
-CREATE TABLE objectcache (
-  keyname   VARCHAR(255) NOT NULL UNIQUE, -- was nullable
-  value     CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
-  exptime   TIMESTAMP(3) NOT NULL
-);
-CREATE INDEX objectcacache_exptime
-  ON objectcache (exptime);
-
-
-
-CREATE TABLE transcache (
-  tc_url       VARCHAR(255) NOT NULL UNIQUE,
-  tc_contents  CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  tc_time      TIMESTAMP(3) NOT NULL
-);
-
-
-
-CREATE TABLE logging (
-  log_id          BIGINT NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  log_type        VARCHAR(32) NOT NULL,
-  log_action      VARCHAR(32) NOT NULL,
-  log_timestamp   TIMESTAMP(3) NOT NULL,
-  log_user        BIGINT NOT NULL DEFAULT 0,
-  --                REFERENCES user(user_id) ON DELETE SET NULL,
-  -- Name of the user who performed this action
-  log_user_text   VARCHAR(255) NOT NULL DEFAULT '',
-  log_namespace   SMALLINT NOT NULL,
-  log_title       VARCHAR(255) NOT NULL,
-  log_page        BIGINT,
-  log_comment     VARCHAR(255),
-  log_params      CLOB(64K) INLINE LENGTH 4096,
-  log_deleted     SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX logging_type_name
-  ON logging (log_type, log_timestamp);
-CREATE INDEX logging_user_time
-  ON logging (log_timestamp, log_user);
-CREATE INDEX logging_page_time
-  ON logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX log_user_type_time
-  ON logging (log_user, log_type, log_timestamp);
-CREATE INDEX log_page_id_time
-  ON logging (log_page, log_timestamp);
-CREATE UNIQUE INDEX type_action
-  ON logging (log_type, log_action, log_timestamp);
-
-
-
-CREATE TABLE trackbacks (
-  tb_id     INTEGER NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  -- foreign key also in MySQL
-  tb_page   INTEGER,
-  -- REFERENCES page(page_id) ON DELETE CASCADE,
-  tb_title  VARCHAR(255) NOT NULL,
-  tb_url    CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  tb_ex     CLOB(64K) INLINE LENGTH 4096,
-  tb_name   VARCHAR(255)
-);
-CREATE INDEX trackback_page
-  ON trackbacks (tb_page);
-
-
-
-CREATE TABLE job (
-  job_id         BIGINT NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  job_cmd        VARCHAR(255) NOT NULL,
-  job_namespace  SMALLINT NOT NULL,
-  job_title      VARCHAR(255) NOT NULL,
-  job_params     CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX job_cmd_namespace_title
-  ON job (job_cmd, job_namespace, job_title);
-
-
-
---TODO
---CREATE FUNCTION add_interwiki (TEXT, INT, SMALLINT) RETURNS INT LANGUAGE SQL AS
---$mw$
---  INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES ($1,$2,$3);
---  SELECT 1;
---$mw$;
-
-
-
--- hack implementation
--- should be replaced with OmniFind, Contains(), etc
-CREATE TABLE searchindex (
-  si_page   BIGINT NOT NULL,
-  si_title  VARCHAR(255) NOT NULL DEFAULT '',
-  si_text   CLOB NOT NULL
-);
-
-
-
--- This table is not used unless profiling is turned on
-CREATE TABLE profiling (
-  pf_count   INTEGER NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10) NOT NULL DEFAULT 0,
-  pf_memory  NUMERIC(18,10) NOT NULL DEFAULT 0,
-  pf_name    VARCHAR(255) NOT NULL,
-  pf_server  VARCHAR(255)
-);
-CREATE UNIQUE INDEX pf_name_server
-  ON profiling (pf_name, pf_server);
-
-
-
-CREATE TABLE protected_titles (
-  pt_namespace   INTEGER NOT NULL,
-  pt_title       VARCHAR(255) NOT NULL,
-  pt_user        BIGINT NOT NULL DEFAULT 0,
-  --       REFERENCES user(user_id) ON DELETE SET NULL,
-  pt_reason      VARCHAR(1024),
-  pt_timestamp   TIMESTAMP(3) NOT NULL,
-  pt_expiry      TIMESTAMP(3),
-  pt_create_perm VARCHAR(60) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX protected_titles_unique
-  ON protected_titles (pt_namespace, pt_title);
-
-
-
-CREATE TABLE updatelog (
-  ul_key VARCHAR(255) NOT NULL
-    PRIMARY KEY
-);
-
-
-
-CREATE TABLE category (
-  cat_id       INTEGER NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  cat_title    VARCHAR(255) NOT NULL,
-  cat_pages    INTEGER NOT NULL DEFAULT 0,
-  cat_subcats  INTEGER NOT NULL DEFAULT 0,
-  cat_files    INTEGER NOT NULL DEFAULT 0,
-  cat_hidden   SMALLINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX category_title
-  ON category (cat_title);
-CREATE INDEX category_pages
-  ON category (cat_pages);
-
-
-
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
-  ct_rc_id    INTEGER,
-  ct_log_id   INTEGER,
-  ct_rev_id   INTEGER,
-  ct_tag      VARCHAR(255) NOT NULL,
-  ct_params   CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX change_tag_rc_tag
-  ON change_tag (ct_rc_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag
-  ON change_tag (ct_log_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag
-  ON change_tag (ct_rev_id, ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id
-  ON change_tag (ct_tag, ct_rc_id, ct_rev_id, ct_log_id);
-
-
-
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
-  ts_rc_id  INTEGER,
-  ts_log_id INTEGER,
-  ts_rev_id INTEGER,
-  ts_tags   CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id
-  ON tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id
-  ON tag_summary (ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id
-  ON tag_summary (ts_rev_id);
-
-
-
-CREATE TABLE valid_tag (
-  vt_tag VARCHAR(255) NOT NULL
-    PRIMARY KEY
-);
-
-
-
---
--- User preferences and perhaps other fun stuff. :)
--- Replaces the old user.user_options blob, with a couple nice properties:
---
--- 1) We only store non-default settings, so changes to the DEFAULTs
---    are now reflected for everybody, not just new accounts.
--- 2) We can more easily do bulk lookups, statistics, or modifications of
---    saved options since it's a sane table structure.
---
-CREATE TABLE user_properties (
-  -- Foreign key to user.user_id
-  up_user       BIGINT NOT NULL,
-  -- Name of the option being saved. This is indexed for bulk lookup.
-  up_property   VARCHAR(255) FOR BIT DATA NOT NULL,
-  -- Property value as a string.
-  up_value      CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX user_properties_user_property
-  ON user_properties (up_user, up_property);
-CREATE INDEX user_properties_property
-  ON user_properties (up_property);
-
-CREATE TABLE log_search (
-  -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
-  ls_field    VARCHAR(32) FOR BIT DATA NOT NULL,
-  -- The value of the ID
-  ls_value    VARCHAR(255) NOT NULL,
-  -- Key to log_id
-  ls_log_id   BIGINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX ls_field_val
-  ON log_search (ls_field, ls_value, ls_log_id);
-CREATE INDEX ls_log_id
-  ON log_search (ls_log_id);
-
-
-
--- Table for storing localisation data
-CREATE TABLE l10n_cache (
-  -- Language code
-  lc_lang       VARCHAR(32) NOT NULL,
-  -- Cache key
-  lc_key        VARCHAR(255) NOT NULL,
-  -- Value
-  lc_value      CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX lc_lang_key
-  ON l10n_cache (lc_lang, lc_key);
-
-
-
-CREATE TABLE msg_resource_links
-(
-  mrl_resource  VARCHAR(255) FOR BIT DATA NOT NULL,
-  mrl_message   VARCHAR(255) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX uq61_msg_resource_links
-  ON msg_resource_links (mrl_message, mrl_resource);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE msg_resource
-(
-  mr_resource   VARCHAR(255) FOR BIT DATA NOT NULL,
-  mr_lang       VARCHAR(32) FOR BIT DATA NOT NULL,
-  mr_blob       CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  mr_timestamp  TIMESTAMP(3) NOT NULL
-);
-CREATE UNIQUE INDEX uq81_msg_resource
-  ON msg_resource (mr_resource, mr_lang);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE module_deps (
-  md_module VARCHAR(255) FOR BIT DATA NOT NULL,
-  md_skin   VARCHAR(32) FOR BIT DATA NOT NULL,
-  md_deps   CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX uq96_module_deps
-  ON module_deps (md_module, md_skin);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE iwlinks
-(
-  iwl_from    INTEGER NOT NULL,
-  iwl_prefix  VARCHAR(20) FOR BIT DATA NOT NULL,
-  iwl_title   VARCHAR(255) FOR BIT DATA NOT NULL
-);
-
-
-
---
--- Store information about newly uploaded files before they're
--- moved into the actual filestore
---
-CREATE TABLE uploadstash (
-  us_id           BIGINT NOT NULL
-    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-  -- the user who uploaded the file.
-  us_user         BIGINT NOT NULL,
-  -- file key. this is how applications actually search for the file.
-  -- this might go away, or become the primary key.
-  us_key          VARCHAR(255) NOT NULL,
-  -- the original path
-  us_orig_path    VARCHAR(255) NOT NULL,
-  -- the temporary path at which the file is actually stored
-  us_path         VARCHAR(255) NOT NULL,
-  -- which type of upload the file came from (sometimes)
-  us_source_type  VARCHAR(50),
-  -- the date/time on which the file was added
-  us_timestamp    TIMESTAMP(3) NOT NULL,
-  us_status       VARCHAR(50) NOT NULL,
-  -- file properties from File::getPropsFromPath.  these may prove unnecessary.
-  --
-  us_size         BIGINT NOT NULL,
-  -- this hash comes from File::sha1Base36(), and is 31 characters
-  us_sha1         VARCHAR(31) NOT NULL,
-  us_mime         VARCHAR(255),
-  -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
-  us_media_type   VARCHAR(30)
-    CONSTRAINT my_constraint
-      CHECK (
-        us_media_type in (
-          'UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA',
-          'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'
-      )
-    ) DEFAULT NULL,
-  -- image-specific properties
-  us_image_width  BIGINT,
-  us_image_height BIGINT,
-  us_image_bits   INTEGER
-);
--- sometimes there's a delete for all of a user's stuff.
-CREATE INDEX us_user
-  ON uploadstash (us_user);
--- pick out files by key, enforce key UNIQUEness
-CREATE UNIQUE INDEX us_key
-  ON uploadstash (us_key);
--- the abandoned upload cleanup script needs this
-CREATE INDEX us_timestamp
-  ON uploadstash (us_timestamp);
-
-
-
--- Stores the groups the user has once belonged to.
--- The user may still belong these groups. Check user_groups.
-CREATE TABLE user_former_groups (
-  ufg_user   BIGINT NOT NULL DEFAULT 0,
-  ufg_group  VARCHAR(16) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX ufg_user_group
-  ON user_former_groups (ufg_user, ufg_group);
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
new file mode 100644 (file)
index 0000000..1990659
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Re-initialise or update the site statistics table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to re-initialise or update the site statistics table
+ *
+ * @ingroup Maintenance
+ */
+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( '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' );
+       }
+
+       public function execute() {
+               $this->output( "Refresh Site Statistics\n\n" );
+               $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
+
+               $this->output( "Counting total edits..." );
+               $edits = $counter->edits();
+               $this->output( "{$edits}\nCounting number of articles..." );
+
+               $good  = $counter->articles();
+               $this->output( "{$good}\nCounting total pages..." );
+
+               $pages = $counter->pages();
+               $this->output( "{$pages}\nCounting number of users..." );
+
+               $users = $counter->users();
+               $this->output( "{$users}\nCounting number of images..." );
+
+               $image = $counter->files();
+               $this->output( "{$image}\n" );
+
+               if ( !$this->hasOption( 'noviews' ) ) {
+                       $this->output( "Counting total page views..." );
+                       $views = $counter->views();
+                       $this->output( "{$views}\n" );
+               }
+
+               if ( $this->hasOption( 'active' ) ) {
+                       $this->output( "Counting active users..." );
+                       $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
+                       $this->output( "{$active}\n" );
+               }
+
+               $this->output( "\nUpdating site statistics..." );
+
+               if ( $this->hasOption( 'update' ) ) {
+                       $counter->update();
+               } else {
+                       $counter->refresh();
+               }
+
+               $this->output( "done.\n" );
+       }
+}
+
+$maintClass = "InitSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/initStats.php b/maintenance/initStats.php
deleted file mode 100644 (file)
index 5d8b886..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Re-initialise or update the site statistics table.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to re-initialise or update the site statistics table
- *
- * @ingroup Maintenance
- */
-class InitStats 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( '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' );
-       }
-
-       public function execute() {
-               $this->output( "Refresh Site Statistics\n\n" );
-               $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
-
-               $this->output( "Counting total edits..." );
-               $edits = $counter->edits();
-               $this->output( "{$edits}\nCounting number of articles..." );
-
-               $good  = $counter->articles();
-               $this->output( "{$good}\nCounting total pages..." );
-
-               $pages = $counter->pages();
-               $this->output( "{$pages}\nCounting number of users..." );
-
-               $users = $counter->users();
-               $this->output( "{$users}\nCounting number of images..." );
-
-               $image = $counter->files();
-               $this->output( "{$image}\n" );
-
-               if ( !$this->hasOption( 'noviews' ) ) {
-                       $this->output( "Counting total page views..." );
-                       $views = $counter->views();
-                       $this->output( "{$views}\n" );
-               }
-
-               if ( $this->hasOption( 'active' ) ) {
-                       $this->output( "Counting active users..." );
-                       $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
-                       $this->output( "{$active}\n" );
-               }
-
-               $this->output( "\nUpdating site statistics..." );
-
-               if ( $this->hasOption( 'update' ) ) {
-                       $counter->update();
-               } else {
-                       $counter->refresh();
-               }
-
-               $this->output( "done.\n" );
-       }
-}
-
-$maintClass = "InitStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
index 420e842..dcd9b9b 100644 (file)
@@ -739,9 +739,8 @@ class extensionLanguages extends languages {
        function __construct( MessageGroup $group ) {
                $this->mMessageGroup = $group;
 
-               $bools = $this->mMessageGroup->getBools();
-               $this->mIgnoredMessages = $bools['ignored'];
-               $this->mOptionalMessages = $bools['optional'];
+               $this->mIgnoredMessages = $this->mMessageGroup->getIgnored();
+               $this->mOptionalMessages = $this->mMessageGroup->getOptional();
        }
 
        /**
index 0d6de10..7c16df6 100644 (file)
@@ -1640,9 +1640,10 @@ $wgMessageStructure = array(
        'pageswithprop' => array(
                'pageswithprop',
                'pageswithprop-summary',
+               'pageswithprop-legend',
                'pageswithprop-text',
                'pageswithprop-prop',
-               'pageswithprop-ok',
+               'pageswithprop-submit',
        ),
        'doubleredirects' => array(
                'doubleredirects',
@@ -3851,13 +3852,16 @@ $wgMessageStructure = array(
                'duration-centuries',
                'duration-millennia'
        ),
+       'rotation' => array(
+               'rotate-comment',
+       ),
 );
 
 /** 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 behaviour for
+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
 XHTML id it should only appear once and include characters that are legal
 XHTML id names.",
@@ -3880,7 +3884,7 @@ XHTML id names.",
        'errors'              => 'General errors',
        'virus'               => 'Virus scanner',
        'login'               => 'Login and logout pages',
-       'mail'                => 'E-mail sending',
+       'mail'                => 'Email sending',
        'passwordstrength'    => 'JavaScript password checks',
        'resetpass'           => 'Change password dialog',
        'passwordreset'       => 'Special:PasswordReset',
@@ -3902,7 +3906,7 @@ XHTML id names.",
        'opensearch'          => 'OpenSearch description',
        'quickbar'            => 'Quickbar',
        'preferences'         => 'Preferences page',
-       'preferences-email'   => 'User preference: e-mail validation using jQuery',
+       'preferences-email'   => 'User preference: email validation using jQuery',
        'userrights'          => 'User rights',
        'group'               => 'Groups',
        'group-member'        => '',
@@ -3952,7 +3956,7 @@ XHTML id names.",
        'activeusers'         => 'Special:ActiveUsers',
        'newuserlog'          => 'Special:Log/newusers',
        'listgrouprights'     => 'Special:ListGroupRights',
-       'emailuser'           => 'E-mail user',
+       'emailuser'           => 'Email user',
        'usermessage'         => 'User Messenger',
        'watchlist'           => 'Watchlist',
        'watching'            => 'Displayed when you click the "watch" button and it is in the process of watching',
@@ -4054,7 +4058,7 @@ Variants for Chinese language",
        'exif-urgency'                   => '',
        'edit-externally'       => 'External editor support',
        'all'                   => "'all' in various places, this might be different for inflected languages",
-       'confirmemail'          => 'E-mail address confirmation',
+       'confirmemail'          => 'Email address confirmation',
        'scarytransclusion'     => 'Scary transclusion',
        'deleteconflict'        => 'Delete conflict',
        'unit-pixel'            => '',
@@ -4094,4 +4098,5 @@ Variants for Chinese language",
        'apierrors'             => 'API errors',
        'duration'              => 'Durations',
        'cachedspecial'         => 'SpecialCachedPage',
+       'rotation'              => 'Image rotation',
 );
index 4e0f291..6ff8a17 100644 (file)
 /** */
 require_once( __DIR__ . '/commandLine.inc' );
 
-$debug = in_array( '--debug', $argv );
-$help = in_array( '--help', $argv );
+$options = getopt( '', array( 'debug', 'help', 'cache:' ) );
 
-if( $help ) {
+$debug = isset( $options['debug'] );
+$help = isset( $options['help'] );
+$cache = isset( $options['cache'] ) ? $options['cache'] : null;
+
+if ( $help ) {
        mccShowUsage();
        exit( 0 );
 }
@@ -37,9 +40,15 @@ $mcc = new MWMemcached( array(
        'debug' => $debug,
 ) );
 
-if ( $wgMainCacheType === CACHE_MEMCACHED ) {
+if ( $cache ) {
+       if ( !isset( $wgObjectCaches[$cache] ) ) {
+               print "MediaWiki isn't configured with a cache named '$cache'";
+               exit( 1 );
+       }
+       $servers = $wgObjectCaches[$cache]['servers'];
+} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
        $mcc->set_servers( $wgMemCachedServers );
-} elseif( isset( $wgObjectCaches[$wgMainCacheType] ) ) {
+} elseif( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
        $mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
 } else {
        print "MediaWiki isn't configured for Memcached usage\n";
index 42461c5..469feca 100644 (file)
@@ -36,19 +36,26 @@ class mcTest extends Maintenance {
                $this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
                                                          . " memcached server and shows a report";
                $this->addOption( 'i', 'Number of iterations', false, true );
+               $this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
                $this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
        }
 
        public function execute() {
                global $wgMainCacheType, $wgMemCachedTimeout, $wgObjectCaches;
 
+               $cache = $this->getOption( 'cache' );
                $iterations = $this->getOption( 'i', 100 );
-               if ( $this->hasArg() ) {
+               if ( $cache ) {
+                       if ( !isset( $wgObjectCaches[$cache] ) ) {
+                               $this->error( "MediaWiki isn't configured with a cache named '$cache'", 1 );
+                       }
+                       $servers = $wgObjectCaches[$cache]['servers'];
+               } elseif ( $this->hasArg() ) {
                        $servers = array( $this->getArg() );
                } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
                        global $wgMemCachedServers;
                        $servers = $wgMemCachedServers ;
-               } elseif( isset( $wgObjectCaches[$wgMainCacheType] ) ) {
+               } elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
                        $servers = $wgObjectCaches[$wgMainCacheType]['servers'];
                } else {
                        $this->error( "MediaWiki isn't configured for Memcached usage", 1 );
index ab05a3e..6eeb48d 100644 (file)
  * @file
  */
 
+if ( PHP_SAPI != 'cli' ) {
+       die( "This filter can only be run from the command line.\n" );
+}
+
 $source = file_get_contents( $argv[1] );
 $regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
 $replac = '${2} */ ${3} ${1} ${4}';
index 5e505eb..4fad7a7 100644 (file)
@@ -63,6 +63,8 @@ $doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
 /** where Phpdoc should output documentation */
 $doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
 
+$doxyVersion = 'master';
+
 /** MediaWiki subpaths */
 $mwPathI = $mwPath . 'includes/';
 $mwPathL = $mwPath . 'languages/';
@@ -164,6 +166,12 @@ if ( is_array( $argv ) ) {
                                $doxyOutput = realpath( $argv[$i] );
                        }
                        break;
+               case '--version':
+                       $i++;
+                       if ( isset( $argv[$i] ) ) {
+                               $doxyVersion = $argv[$i];
+                       }
+                       break;
                case '--generate-man':
                        $doxyGenerateMan = true;
                        break;
@@ -183,8 +191,9 @@ Commands:
 If no command is given, you will be prompted.
 
 Other options:
-    --output <dir>  Set output directory (default $doxyOutput)
+    --output <dir>  Set output directory (default: $doxyOutput)
     --generate-man  Generates man page documentation
+    --version       Project version to display in the outut (default: $doxyVersion)
     --help          Show this help and exit.
 
 
@@ -234,14 +243,11 @@ case 6:
        $excludePatterns = 'extensions';
 }
 
-// @todo FIXME to work on git
-$version = 'master';
-
 // Generate path exclusions
 $excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
 print "EXCLUDE: $excludedPaths\n\n";
 
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $version, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
+$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
 $command = $doxygenBin . ' ' . $generatedConf;
 
 echo <<<TEXT
@@ -254,7 +260,8 @@ $command
 
 TEXT;
 
-passthru( $command );
+$exitcode = 1;
+passthru( $command, $exitcode );
 
 echo <<<TEXT
 ---------------------------------------------------
@@ -264,3 +271,5 @@ Check above for possible errors.
 You might want to delete the temporary file $generatedConf
 
 TEXT;
+
+exit( $exitcode );
index 6cc8566..1be5146 100644 (file)
@@ -37,10 +37,9 @@ class nextJobDB extends Maintenance {
        }
 
        public function execute() {
-               global $wgMemc, $wgJobTypesExcludedFromDefaultQueue;
-
-               $type = false; // job type required/picked
+               global $wgJobTypesExcludedFromDefaultQueue;
 
+               // job type required/picked
                if ( $this->hasOption( 'types' ) ) {
                        $types = explode( ' ', $this->getOption( 'types' ) );
                } elseif ( $this->hasOption( 'type' ) ) {
@@ -78,10 +77,9 @@ class nextJobDB extends Maintenance {
                                return; // no jobs for this type
                        }
 
-                       list( $type, $db ) = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
-                       if ( !$this->checkJob( $type, $db ) ) { // queue is actually empty?
-                               $pendingDBs[$type] = array_diff( $pendingDBs[$type], $db );
-                               JobQueueAggregator::singleton()->notifyQueueEmpty( $db, $type );
+                       list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
+                       if ( JobQueueGroup::singleton( $db )->isQueueDeprioritized( $type ) ) {
+                               $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
                                $again = true;
                        }
                } while ( $again );
@@ -93,17 +91,6 @@ class nextJobDB extends Maintenance {
                }
        }
 
-       /**
-        * Check if the specified database has a job of the specified type in it.
-        * The type may be false to indicate "all".
-        * @param $type string
-        * @param $dbName string
-        * @return bool
-        */
-       private function checkJob( $type, $dbName ) {
-               return !JobQueueGroup::singleton( $dbName )->get( $type )->isEmpty();
-       }
-
        /**
         * Do all ready periodic jobs for all databases every 5 minutes (and .1% of the time)
         * @return integer
diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php
new file mode 100644 (file)
index 0000000..2ccf703
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Command line script to check for an open proxy at a specified location.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+if( PHP_SAPI != 'cli' ) {
+       die( 1 );
+}
+
+/**
+ *
+ */
+$output = '';
+
+/**
+ * Exit if there are not enough parameters, or if it's not command line mode
+ */
+if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
+       $output .= "Incorrect parameters\n";
+} else {
+       /**
+        * Get parameters
+        */
+       $ip = $argv[1];
+       $port = $argv[2];
+       $url = $argv[3];
+       $host = trim(`hostname`);
+       $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
+
+       # Open socket
+       $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
+       if ($errno == 0 ) {
+               $output .= "Connected\n";
+               # Send payload
+               $request = "GET $url HTTP/1.0\r\n";
+#              $request .= "Proxy-Connection: Keep-Alive\r\n";
+#              $request .= "Pragma: no-cache\r\n";
+#              $request .= "Host: ".$url."\r\n";
+#              $request .= "User-Agent: MediaWiki open proxy check\r\n";
+               $request .= "\r\n";
+               @fputs($sock, $request);
+               $response = fgets($sock, 65536);
+               $output .= $response;
+               @fclose($sock);
+       } else {
+               $output .= "No connection\n";
+       }
+}
+
+$output = escapeshellarg( $output );
+
+#`echo $output >> /home/tstarling/open/proxy.log`;
diff --git a/maintenance/proxy_check.php b/maintenance/proxy_check.php
deleted file mode 100644 (file)
index 2ccf703..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Command line script to check for an open proxy at a specified location.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-if( PHP_SAPI != 'cli' ) {
-       die( 1 );
-}
-
-/**
- *
- */
-$output = '';
-
-/**
- * Exit if there are not enough parameters, or if it's not command line mode
- */
-if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
-       $output .= "Incorrect parameters\n";
-} else {
-       /**
-        * Get parameters
-        */
-       $ip = $argv[1];
-       $port = $argv[2];
-       $url = $argv[3];
-       $host = trim(`hostname`);
-       $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
-
-       # Open socket
-       $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
-       if ($errno == 0 ) {
-               $output .= "Connected\n";
-               # Send payload
-               $request = "GET $url HTTP/1.0\r\n";
-#              $request .= "Proxy-Connection: Keep-Alive\r\n";
-#              $request .= "Pragma: no-cache\r\n";
-#              $request .= "Host: ".$url."\r\n";
-#              $request .= "User-Agent: MediaWiki open proxy check\r\n";
-               $request .= "\r\n";
-               @fputs($sock, $request);
-               $response = fgets($sock, 65536);
-               $output .= $response;
-               @fclose($sock);
-       } else {
-               $output .= "No connection\n";
-       }
-}
-
-$output = escapeshellarg( $output );
-
-#`echo $output >> /home/tstarling/open/proxy.log`;
index f067dc6..e21dd17 100644 (file)
@@ -52,21 +52,19 @@ class PurgeParserCache extends Maintenance {
                        global $wgParserCacheExpireTime;
                        $date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
                } else {
-                       echo "Must specify either --expiredate or --age\n";
-                       exit( 1 );
+                       $this->error( "Must specify either --expiredate or --age", 1 );
                }
 
                $english = Language::factory( 'en' );
-               echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
+               $this->output( "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n" );
 
                $pc = wfGetParserCacheStorage();
                $success = $pc->deleteObjectsExpiringBefore( $date, array( $this, 'showProgress' ) );
                if ( !$success ) {
-                       echo "\nCannot purge this kind of parser cache.\n";
-                       exit( 1 );
+                       $this->error( "\nCannot purge this kind of parser cache.", 1 );
                }
                $this->showProgress( 100 );
-               echo "\nDone\n";
+               $this->output( "\nDone\n" );
        }
 
        function showProgress( $percent ) {
@@ -77,8 +75,8 @@ class PurgeParserCache extends Maintenance {
                $this->lastProgress = $percentString;
 
                $stars = floor( $percent / 2 );
-               echo '[' . str_repeat( '*', $stars ), str_repeat( '.', 50 - $stars ) . '] ' .
-                       "$percentString%\r";
+               $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
+                       "$percentString%\r" );
 
        }
 }
index f9557ce..b1be714 100644 (file)
@@ -73,7 +73,7 @@ class RunJobs extends Maintenance {
                $type = $this->getOption( 'type', false );
                $wgTitle = Title::newFromText( 'RunJobs.php' );
                $dbw = wfGetDB( DB_MASTER );
-               $n = 0;
+               $jobsRun = 0; // counter
 
                $group = JobQueueGroup::singleton();
                // Handle any required periodic queue maintenance
@@ -82,11 +82,13 @@ class RunJobs extends Maintenance {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
+               $lastTime = time();
                do {
                        $job = ( $type === false )
                                ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
                                : $group->pop( $type ); // job from a single queue
                        if ( $job ) { // found a job
+                               ++$jobsRun;
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Run the job...
@@ -112,14 +114,21 @@ class RunJobs extends Maintenance {
                                }
 
                                // Break out if we hit the job count or wall time limits...
-                               if ( $maxJobs && ++$n >= $maxJobs ) {
+                               if ( $maxJobs && $jobsRun >= $maxJobs ) {
                                        break;
                                } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
                                        break;
                                }
 
-                               // Don't let any slaves/backups fall behind...
-                               $group->get( $job->getType() )->waitForBackups();
+                               // Don't let any of the main DB slaves get backed up
+                               $timePassed = time() - $lastTime;
+                               if ( $timePassed >= 5 || $timePassed < 0 ) {
+                                       wfWaitForSlaves();
+                               }
+                               // Don't let any queue slaves/backups fall behind
+                               if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
+                                       $group->waitForBackups();
+                               }
                        }
                } while ( $job ); // stop when there are no jobs
        }
diff --git a/maintenance/showCacheStats.php b/maintenance/showCacheStats.php
new file mode 100644 (file)
index 0000000..8f23868
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Show statistics from the cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that shows statistics from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ShowCacheStats extends Maintenance {
+
+       public function __construct() {
+               $this->mDescription = "Show statistics from the cache";
+               parent::__construct();
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               global $wgMemc;
+
+               // Can't do stats if
+               if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
+                       $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
+               }
+               $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
+               $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
+               $total = $session + $noSession;
+               if ( $total == 0 ) {
+                       $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
+               }
+               $this->output( "Requests\n" );
+               $this->output( sprintf( "with session:      %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
+               $this->output( sprintf( "without session:   %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
+               $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
+
+
+               $this->output( "\nParser cache\n" );
+               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
+               $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
+               $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
+               $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
+               $total = $hits + $expired + $absent + $stub;
+               if ( $total ) {
+                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+                       $this->output( sprintf( "expired:           %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
+                       $this->output( sprintf( "absent:            %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
+                       $this->output( sprintf( "stub threshold:    %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
+                       $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
+               } else {
+                       $this->output( "no statistics available\n" );
+               }
+
+               $this->output( "\nImage cache\n" );
+               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
+               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
+               $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
+               $total = $hits + $misses;
+               if ( $total ) {
+                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+                       $this->output( sprintf( "updates:           %-10d\n", $updates ) );
+               } else {
+                       $this->output( "no statistics available\n" );
+               }
+
+               $this->output( "\nDiff cache\n" );
+               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
+               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
+               $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
+               $total = $hits + $misses + $uncacheable;
+               if ( $total ) {
+                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+                       $this->output( sprintf( "uncacheable:       %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
+               } else {
+                       $this->output( "no statistics available\n" );
+               }
+       }
+}
+
+$maintClass = "ShowCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
new file mode 100644 (file)
index 0000000..e7359b2
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * Show the cached statistics.
+ * Give out the same output as [[Special:Statistics]]
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Antoine Musso <hashar at free dot fr>
+ * Based on initSiteStats.php by:
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ *
+ * @license GNU General Public License 2.0 or later
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to show the cached statistics.
+ *
+ * @ingroup Maintenance
+ */
+class ShowSiteStats extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Show the cached statistics";
+       }
+       public function execute() {
+               $fields = array(
+                       'ss_total_views' => 'Total views',
+                       'ss_total_edits' => 'Total edits',
+                       'ss_good_articles' => 'Number of articles',
+                       'ss_total_pages' => 'Total pages',
+                       'ss_users' => 'Number of users',
+                       'ss_images' => 'Number of images',
+               );
+
+               // Get cached stats from slave database
+               $dbr = wfGetDB( DB_SLAVE );
+               $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
+
+               // Get maximum size for each column
+               $max_length_value = $max_length_desc = 0;
+               foreach ( $fields as $field => $desc ) {
+                       $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
+                       $max_length_desc  = max( $max_length_desc,  strlen( $desc ) ) ;
+               }
+
+               // Show them
+               foreach ( $fields as $field => $desc ) {
+                       $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
+               }
+       }
+}
+
+$maintClass = "ShowSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showStats.php b/maintenance/showStats.php
deleted file mode 100644 (file)
index 3036406..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * Show the cached statistics.
- * Give out the same output as [[Special:Statistics]]
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Antoine Musso <hashar at free dot fr>
- * Based on initStats.php by:
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- *
- * @license GNU General Public License 2.0 or later
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to show the cached statistics.
- *
- * @ingroup Maintenance
- */
-class ShowStats extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Show the cached statistics";
-       }
-       public function execute() {
-               $fields = array(
-                       'ss_total_views' => 'Total views',
-                       'ss_total_edits' => 'Total edits',
-                       'ss_good_articles' => 'Number of articles',
-                       'ss_total_pages' => 'Total pages',
-                       'ss_users' => 'Number of users',
-                       'ss_images' => 'Number of images',
-               );
-
-               // Get cached stats from slave database
-               $dbr = wfGetDB( DB_SLAVE );
-               $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
-
-               // Get maximum size for each column
-               $max_length_value = $max_length_desc = 0;
-               foreach ( $fields as $field => $desc ) {
-                       $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
-                       $max_length_desc  = max( $max_length_desc,  strlen( $desc ) ) ;
-               }
-
-               // Show them
-               foreach ( $fields as $field => $desc ) {
-                       $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
-               }
-       }
-}
-
-$maintClass = "ShowStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/stats.php b/maintenance/stats.php
deleted file mode 100644 (file)
index be448f9..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Show statistics from the cache.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that shows statistics from the cache.
- *
- * @ingroup Maintenance
- */
-class CacheStats extends Maintenance {
-
-       public function __construct() {
-               $this->mDescription = "Show statistics from the cache";
-               parent::__construct();
-       }
-
-       public function getDbType() {
-               return Maintenance::DB_NONE;
-       }
-
-       public function execute() {
-               global $wgMemc;
-
-               // Can't do stats if
-               if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
-                       $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
-               }
-               $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
-               $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
-               $total = $session + $noSession;
-               if ( $total == 0 ) {
-                       $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
-               }
-               $this->output( "Requests\n" );
-               $this->output( sprintf( "with session:      %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
-               $this->output( sprintf( "without session:   %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
-               $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
-
-
-               $this->output( "\nParser cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
-               $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
-               $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
-               $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
-               $total = $hits + $expired + $absent + $stub;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "expired:           %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
-                       $this->output( sprintf( "absent:            %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
-                       $this->output( sprintf( "stub threshold:    %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
-                       $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-
-               $this->output( "\nImage cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
-               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
-               $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
-               $total = $hits + $misses;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
-                       $this->output( sprintf( "updates:           %-10d\n", $updates ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-
-               $this->output( "\nDiff cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
-               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
-               $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
-               $total = $hits + $misses + $uncacheable;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
-                       $this->output( sprintf( "uncacheable:       %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-       }
-}
-
-$maintClass = "CacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
index 5e5cc8f..030a147 100644 (file)
@@ -523,7 +523,7 @@ class RecompressTracked {
         *
         * Write the new URL to the text table and set the bt_moved flag.
         *
-        * This is done in a single transaction to provide restartable behaviour
+        * This is done in a single transaction to provide restartable behavior
         * without data loss.
         *
         * The transaction is kept short to reduce locking.
index e279ccb..158019b 100644 (file)
@@ -39,6 +39,7 @@ class SyncFileBackend extends Maintenance {
                $this->addOption( 'end', 'Ending journal ID', false, true );
                $this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
                $this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
+               $this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
                $this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
                $this->setBatchSize( 50 );
        }
@@ -54,8 +55,13 @@ class SyncFileBackend extends Maintenance {
                        if ( !$this->hasOption( 'posdir' ) ) {
                                $this->error( "Param posdir required!", 1 );
                        }
-                       $id = (int)$src->getJournal()->getCurrentPosition(); // default to 0
-                       $this->output( "Current journal position is $id.\n" );
+                       if ( $this->hasOption( 'postime' ) ) {
+                               $id = (int)$src->getJournal()->getPositionAtTime( $this->getOption( 'postime' ) );
+                               $this->output( "Requested journal position is $id.\n" );
+                       } else {
+                               $id = (int)$src->getJournal()->getCurrentPosition();
+                               $this->output( "Current journal position is $id.\n" );
+                       }
                        if ( file_put_contents( $posFile, $id, LOCK_EX ) !== false ) {
                                $this->output( "Saved journal position file.\n" );
                        } else {
@@ -90,8 +96,15 @@ class SyncFileBackend extends Maintenance {
                        $this->output( "Ending journal position is $end.\n" );
                }
 
+               // Periodically update the position file
+               $callback = function( $pos ) use ( $startFromPosFile, $posFile, $start ) {
+                       if ( $startFromPosFile && $pos >= $start ) { // successfully advanced
+                               file_put_contents( $posFile, $pos, LOCK_EX );
+                       }
+               };
+
                // Actually sync the dest backend with the reference backend
-               $lastOKPos = $this->syncBackends( $src, $dst, $start, $end );
+               $lastOKPos = $this->syncBackends( $src, $dst, $start, $end, $callback );
 
                // Update the sync position file
                if ( $startFromPosFile && $lastOKPos >= $start ) { // successfully advanced
@@ -125,9 +138,12 @@ class SyncFileBackend extends Maintenance {
         * @param $dst FileBackend
         * @param $start integer Starting journal position
         * @param $end integer Starting journal position
+        * @param $callback Closure Callback to update any position file
         * @return integer|false Journal entry ID or false if there are none
         */
-       protected function syncBackends( FileBackend $src, FileBackend $dst, $start, $end ) {
+       protected function syncBackends(
+               FileBackend $src, FileBackend $dst, $start, $end, Closure $callback
+       ) {
                $lastOKPos = 0; // failed
                $first = true; // first batch
 
@@ -158,6 +174,7 @@ class SyncFileBackend extends Maintenance {
                        $status = $this->syncFileBatch( array_keys( $pathsInBatch ), $src, $dst );
                        if ( $status->isOK() ) {
                                $lastOKPos = max( $lastOKPos, $lastPosInBatch );
+                               $callback( $lastOKPos ); // update position file
                        } else {
                                $this->error( print_r( $status->getErrorsArray(), true ) );
                                break; // no gaps; everything up to $lastPos must be OK
index 97d6ff2..4307c0c 100644 (file)
@@ -86,10 +86,12 @@ CREATE TABLE /*_*/user (
   -- Same with passwords.
   user_email tinytext NOT NULL,
 
-  -- This is a timestamp which is updated when a user
-  -- logs in, logs out, changes preferences, or performs
-  -- some other action requiring HTML cache invalidation
-  -- to ensure that the UI is updated.
+  -- If the browser sends an If-Modified-Since header, a 304 response is
+  -- suppressed if the value in this field for the current user is later than
+  -- the value in the IMS header. That is, this field is an invalidation timestamp
+  -- for the browser cache of logged-in users. Among other things, it is used
+  -- to prevent pages generated for a previously logged in user from being
+  -- displayed after a session expiry followed by a fresh login.
   user_touched binary(14) NOT NULL default '',
 
   -- A pseudorandomly generated value that is stored in
@@ -560,10 +562,10 @@ CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
 -- callers won't be using an index: fix this?
 CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
 
--- Not really used?
+-- Used by the API (and some extensions)
 CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
 
--- For finding rows with outdated collation
+-- FIXME: Not used, delete this
 CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
 
 --
index 04a2d47..0e2791c 100644 (file)
@@ -35,7 +35,7 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class UpdateCollation extends Maintenance {
-       const BATCH_SIZE = 50; // Number of rows to process in one batch
+       const BATCH_SIZE = 10000; // Number of rows to process in one batch
        const SYNC_INTERVAL = 20; // Wait for slaves after this many batches
 
        public $sizeHistogram = array();
@@ -82,10 +82,13 @@ TEXT;
                        $collation = Collation::singleton();
                }
 
-               $options = array( 'LIMIT' => self::BATCH_SIZE, 'STRAIGHT_JOIN' );
+               $options = array(
+                       'LIMIT' => self::BATCH_SIZE,
+                       'ORDER BY' => 'cl_to, cl_type, cl_from',
+                       'STRAIGHT_JOIN',
+               );
 
                if ( $force || $dryRun ) {
-                       $options['ORDER BY'] = 'cl_from, cl_to';
                        $collationConds = array();
                } else {
                        if ( $this->hasOption( 'previous-collation' ) ) {
@@ -96,20 +99,20 @@ TEXT;
                                );
                        }
 
-                       if ( !$wgMiserMode ) {
+                       $count = $dbw->estimateRowCount(
+                               'categorylinks',
+                               '*',
+                               $collationConds,
+                               __METHOD__
+                       );
+                       // Improve estimate if feasible
+                       if ( $count < 1000000 ) {
                                $count = $dbw->selectField(
                                        'categorylinks',
                                        'COUNT(*)',
                                        $collationConds,
                                        __METHOD__
                                );
-                       } else {
-                               $count = $dbw->estimateRowCount(
-                                       'categorylinks',
-                                       '*',
-                                       $collationConds,
-                                       __METHOD__
-                               );
                        }
                        if ( $count == 0 ) {
                                $this->output( "Collations up-to-date.\n" );
@@ -126,7 +129,7 @@ TEXT;
                        $res = $dbw->select(
                                array( 'categorylinks', 'page' ),
                                array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
-                                       'cl_sortkey', 'page_namespace', 'page_title'
+                                       'cl_sortkey', 'cl_type', 'page_namespace', 'page_title'
                                ),
                                array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
                                __METHOD__,
@@ -186,12 +189,8 @@ TEXT;
                                $dbw->commit( __METHOD__ );
                        }
 
-                       if ( ( $force || $dryRun ) && $row ) {
-                               $encFrom = $dbw->addQuotes( $row->cl_from );
-                               $encTo = $dbw->addQuotes( $row->cl_to );
-                               $batchConds = array(
-                                       "(cl_from = $encFrom AND cl_to > $encTo) " .
-                                       " OR cl_from > $encFrom" );
+                       if ( $row ) {
+                               $batchConds = array( $this->getBatchCondition( $row ) );
                        }
 
                        $count += $res->numRows();
@@ -212,6 +211,32 @@ TEXT;
                }
        }
 
+       /**
+        * Return an SQL expression selecting rows which sort above the given row,
+        * assuming an ordering of cl_to, cl_type, cl_from
+        */
+       function getBatchCondition( $row ) {
+               $dbw = $this->getDB( DB_MASTER );
+               $fields = array( 'cl_to', 'cl_type', 'cl_from' );
+               $first = true;
+               $cond = false;
+               $prefix = false;
+               foreach ( $fields as $field ) {
+                       $encValue = $dbw->addQuotes( $row->$field );
+                       $inequality = "$field > $encValue";
+                       $equality = "$field = $encValue";
+                       if ( $first ) {
+                               $cond = $inequality;
+                               $prefix = $equality;
+                               $first = false;
+                       } else {
+                               $cond .= " OR ($prefix AND $inequality)";
+                               $prefix .= " AND $equality";
+                       }
+               }
+               return $cond;
+       }
+
        function updateSortKeySizeHistogram( $key ) {
                $length = strlen( $key );
                if ( !isset( $this->sizeHistogram[$length] ) ) {
index 8e9c368..bc9e891 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of mw-config/index.php to used in web server requiring .php5
- * extension to execute scripts with PHP5 egine.
+ * extension to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 58bd351..0c499a4 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of opensearch_desc.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ae29c4c..b65f69a 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c2df86d..f5a31fd 100644 (file)
@@ -26,7 +26,9 @@ if( !defined( 'MEDIAWIKI' ) ) {
 
 return array(
 
-       /* Special modules who have their own classes */
+       /**
+        * Special modules who have their own classes
+        */
 
        // Scripts managed by the local wiki (stored in the MediaWiki namespace)
        'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
@@ -48,7 +50,16 @@ return array(
        // Scripts for the dynamic language specific data, like grammar forms.
        'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
 
-       /* Skins */
+       /**
+        * Skins
+        * Be careful not to add 'scripts' to these modules,
+        * since they are loaded with OutputPage::addModuleStyles so that the skin styles
+        * apply without javascript.
+        * If a skin needs custom js in the interface, register a separate module
+        * and add it to the load queue with OutputPage::addModules.
+        *
+        * See Vector for an example.
+        */
 
        'skins.chick' => array(
                'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
@@ -102,6 +113,10 @@ return array(
                        'vector/screen.css' => array( 'media' => 'screen' ),
                        'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
                ),
+               'remoteBasePath' => $GLOBALS['wgStylePath'],
+               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+       ),
+       'skins.vector.js' => array(
                'scripts' => 'vector/vector.js',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -134,6 +149,7 @@ return array(
        'jquery.badge' => array(
                'scripts' => 'resources/jquery/jquery.badge.js',
                'styles' => 'resources/jquery/jquery.badge.css',
+               'dependencies' => 'mediawiki.language',
        ),
        'jquery.byteLength' => array(
                'scripts' => 'resources/jquery/jquery.byteLength.js',
@@ -580,13 +596,6 @@ return array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
        ),
-       'mediawiki.api.titleblacklist' => array(
-               'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
-               'dependencies' => array(
-                       'mediawiki.api',
-                       'mediawiki.Title',
-               ),
-       ),
        'mediawiki.api.watch' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
                'dependencies' => array(
@@ -735,6 +744,10 @@ return array(
                        'metadata-collapse',
                ),
        ),
+       'mediawiki.action.view.postEdit' => array(
+               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
+               'dependencies' => 'jquery.cookie'
+       ),
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
@@ -945,6 +958,7 @@ return array(
        'mediawiki.tests.qunit.testrunner' => array(
                'scripts' => 'tests/qunit/data/testrunner.js',
                'dependencies' => array(
+                       'jquery.getAttrs',
                        'jquery.qunit',
                        'jquery.qunit.completenessTest',
                        'mediawiki.page.startup',
index 0dc9857..cd2dbb6 100644 (file)
  *
  * http://docs.jquery.com/UI/Button#theming
  */
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; } 
-button.ui-button-icons-only { width: 3.7em; } 
+
+.ui-button {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin-right: .1em;
+       text-decoration: none !important;
+       cursor: pointer;
+       text-align: center;
+       zoom: 1;
+       overflow: visible; /* the overflow property removes extra width in IE */
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+       width: 2.2em;
+}
+
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+       width: 2.4em;
+}
+.ui-button-icons-only {
+       width: 3.4em;
+}
+button.ui-button-icons-only {
+       width: 3.7em;
+}
 
 /*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4;  }
-.ui-button-text-only .ui-button-text { padding: .4em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+.ui-button .ui-button-text {
+       display: block;
+       line-height: 1.4;
+}
+.ui-button-text-only .ui-button-text {
+       padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+       padding: .4em;
+       text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+       padding-left: 2.1em;
+       padding-right: 2.1em;
+}
 /* no icon support for input elements, provide padding by default */
-input.ui-button { padding: .4em 1em; }
+       input.ui-button {
+       padding: .4em 1em;
+}
 
 /*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+       position: absolute;
+       top: 50%;
+       margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+       left: 50%;
+       margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+       left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: .5em;
+}
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: .5em;
+}
 
 /*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+.ui-buttonset {
+       margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+       margin-left: 0;
+       margin-right: -.3em;
+}
 
 /* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+button.ui-button::-moz-focus-inner {
+       border: 0;
+       padding: 0; /* reset extra padding in Firefox */
+}
index 006bbea..a6a1b54 100644 (file)
 /* Button
 ----------------------------------*/
 
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; }
-button.ui-button-icons-only { width: 3.7em; }
+.ui-button {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin-right: .1em;
+       text-decoration: none !important;
+       cursor: pointer;
+       text-align: center;
+       zoom: 1;
+       overflow: visible; /* the overflow property removes extra width in IE */
+}
+.ui-button-icon-only {
+       width: 2.2em; /* to make room for the icon, a width needs to be set here */
+}
+button.ui-button-icon-only {
+       width: 2.4em; /* button elements seem to need a little more width */
+}
+.ui-button-icons-only {
+       width: 3.4em;
+}
+button.ui-button-icons-only {
+       width: 3.7em;
+}
 
 /*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4;  }
-.ui-button-text-only .ui-button-text { padding: 0.3em 1em 0.25em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: 0.3em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 1em 0.25em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 2.1em 0.25em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+.ui-button .ui-button-text {
+       display: block;
+       line-height: 1.4;
+}
+.ui-button-text-only .ui-button-text {
+       padding: 0.3em 1em 0.25em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+       padding: 0.3em;
+       text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 1em 0.25em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+       padding: 0.3em 2.1em 0.25em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+       padding-left: 2.1em;
+       padding-right: 2.1em;
+}
 
 /* no icon support for input elements, provide padding by default */
-input.ui-button { padding: 0.3em 1em; }
+input.ui-button {
+       padding: 0.3em 1em;
+}
 
 /*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: 0.5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icon .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: 0.5em; }
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-text-icon .ui-icon,
+.ui-button-icons-only .ui-icon {
+       position: absolute;
+       top: 50%;
+       margin-top: -9px;
+}
+.ui-button-icon-only .ui-icon {
+       left: 50%;
+       margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icon .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+       left: 0.5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icon .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+       right: 0.5em;
+}
 
 /*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+.ui-buttonset {
+       margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+       margin-left: 0;
+       margin-right: -.3em;
+}
 
 /* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+button.ui-button::-moz-focus-inner {
+       border: 0;
+       padding: 0; /* reset extra padding in Firefox */
+}
 
 body .ui-button {
        margin: 0.5em 0 0.5em 0.4em;
@@ -46,10 +114,38 @@ body .ui-button {
 /* Corner radius */
 /* This is normally handled in jquery.ui.theme.css, but in our case, the corner
    styling of our buttons doesn't match our default widget corner styling */
-.ui-button.ui-corner-all, .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, .ui-button.ui-corner-top, .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; }
+.ui-button.ui-corner-all,
+.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,
+.ui-button.ui-corner-top,
+.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;
+}
 
 body .ui-button:hover {
        border-color: #6e7273;
@@ -66,11 +162,11 @@ body .ui-button.disabled {
        color: #7f7f7f;
        border-color: #cccccc;
        /* @embed */
-       background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;        
+       background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
 }
 /* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner { 
-       border: 0; 
+body button.ui-button::-moz-focus-inner {
+       border: 0;
 }
 /* Give large buttons some extra padding */
 body .ui-button-large {
index 8dda42e..d961bf3 100644 (file)
@@ -3,10 +3,7 @@
        -moz-border-radius: 2px;
        -webkit-border-radius: 2px;
        border-radius: 2px;
-       -moz-box-shadow: 0px 1px 4px #ccc;
-       -webkit-box-shadow: 0px 1px 4px #ccc;
-       box-shadow: 0px 1px 4px #ccc;
-       padding: 0 3px;
+       padding: 1px 4px;
        text-align: center;
        font-size: 12px;
        line-height: 12px;
index 16e7196..9404e81 100644 (file)
  *
  * This program is distributed WITHOUT ANY WARRANTY.
  */
-( function ( $ ) {
+( function ( $, mw ) {
        /**
         * Allows you to put a "badge" on an item on the page. The badge container
         * will be appended to the selected element(s).
         * See mediawiki.org/wiki/ResourceLoader/Default_modules#jQuery.badge
         *
         * @param {number|string} text The value to display in the badge. If the value is falsey (0,
-        *   null, false, '', etc.), any existing badge will be removed.
+        *  null, false, '', etc.), any existing badge will be removed.
         * @param {boolean} inline True if the badge should be displayed inline, false
-        *   if the badge should overlay the parent element (default is inline)
+        *  if the badge should overlay the parent element (default is inline)
         * @param {boolean} displayZero True if the number zero should be displayed,
-        *   false if the number zero should result in the badge being hidden
-        *   (default is zero will result in the badge being hidden)
+        *  false if the number zero should result in the badge being hidden
+        *  (default is zero will result in the badge being hidden)
         */
        $.fn.badge = function ( text, inline, displayZero ) {
                var $badge = this.find( '.mw-badge' ),
                        badgeStyleClass = 'mw-badge-' + ( inline ? 'inline' : 'overlay' ),
-                       isImportant = true;
+                       isImportant = true, displayBadge = true;
 
                // If we're displaying zero, ensure style to be non-important
-               if ( text === 0 && displayZero ) {
+               if ( mw.language.convertNumber( text, true ) === 0 ) {
                        isImportant = false;
-                       text = '0';
+                       if ( !displayZero ) {
+                               displayBadge = false;
+                       }
+               // If text is falsey (besides 0), hide the badge
+               } else if ( !text ) {
+                       displayBadge = false;
                }
 
-               if ( text ) {
+               if ( displayBadge ) {
                        // If a badge already exists, reuse it
                        if ( $badge.length ) {
                                $badge
@@ -59,7 +64,7 @@
                                        .addClass( badgeStyleClass )
                                        .toggleClass( 'mw-badge-important', isImportant )
                                        .append(
-                                               $( '<span class="mw-badge-content"></span>' ).text ( text )
+                                               $( '<span class="mw-badge-content"></span>' ).text( text )
                                        )
                                        .appendTo( this );
                        }
@@ -68,4 +73,4 @@
                }
                return this;
        };
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
index 5d32b6b..40f3d44 100644 (file)
@@ -43,12 +43,12 @@ $.fn.extend( {
                                        $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
                                } );
                        }
-                       
+
                        // Bottom half
                        $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
                } );
        },
-       
+
        /**
         * Cancel the timers for delayed events on the selected elements.
         */
@@ -61,7 +61,7 @@ $.fn.extend( {
                        }
                } );
        },
-       
+
        /**
         * Unbind an event bound with delayedBind()
         */
index ace4a55..b369584 100644 (file)
@@ -33,226 +33,209 @@ $.fn.makeCollapsible = function () {
                        $firstItem,
                        collapsibleId,
                        $customTogglers,
-                       firstval,
-                       /**
-                        * @param {jQuery} $collapsible
-                        * @param {string} action The action this function will take ('expand' or 'collapse').
-                        * @param {jQuery|null} [optional] $defaultToggle
-                        * @param {Object|undefined} options
-                        */
-                       toggleElement = function ( $collapsible, action, $defaultToggle, options ) {
-                               var $collapsibleContent, $containers;
-                               options = options || {};
-
-                               // Validate parameters
-
-                               // $collapsible must be an instance of jQuery
-                               if ( !$collapsible.jquery ) {
-                                       return;
-                               }
-                               if ( action !== 'expand' && action !== 'collapse' ) {
-                                       // action must be string with 'expand' or 'collapse'
-                                       return;
-                               }
-                               if ( $defaultToggle === undefined ) {
-                                       $defaultToggle = null;
-                               }
-                               if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
-                                       // is optional (may be undefined), but if defined it must be an instance of jQuery.
-                                       // If it's not, abort right away.
-                                       // After this $defaultToggle is either null or a valid jQuery instance.
-                                       return;
-                               }
-
-                               if ( action === 'collapse' ) {
-
-                                       // Collapse the element
-                                       if ( $collapsible.is( 'table' ) ) {
-                                               // Hide all table rows of this table
-                                               // Slide doens't work with tables, but fade does as of jQuery 1.1.3
-                                               // http://stackoverflow.com/questions/467336#920480
-                                               $containers = $collapsible.find( '> tbody > tr' );
-                                               if ( $defaultToggle ) {
-                                                       // Exclude tablerow containing togglelink
-                                                       $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
-                                               }
-
-                                               if ( options.instantHide ) {
-                                                       $containers.hide();
-                                               } else {
-                                                       $containers.stop( true, true ).fadeOut();
-                                               }
+                       firstval;
+
+               /**
+                * @param {jQuery} $collapsible
+                * @param {string} action The action this function will take ('expand' or 'collapse').
+                * @param {jQuery|null} [optional] $defaultToggle
+                * @param {Object|undefined} options
+                */
+               function toggleElement( $collapsible, action, $defaultToggle, options ) {
+                       var $collapsibleContent, $containers;
+                       options = options || {};
+
+                       // Validate parameters
+
+                       // $collapsible must be an instance of jQuery
+                       if ( !$collapsible.jquery ) {
+                               return;
+                       }
+                       if ( action !== 'expand' && action !== 'collapse' ) {
+                               // action must be string with 'expand' or 'collapse'
+                               return;
+                       }
+                       if ( $defaultToggle === undefined ) {
+                               $defaultToggle = null;
+                       }
+                       if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
+                               // is optional (may be undefined), but if defined it must be an instance of jQuery.
+                               // If it's not, abort right away.
+                               // After this $defaultToggle is either null or a valid jQuery instance.
+                               return;
+                       }
 
-                                       } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
-                                               $containers = $collapsible.find( '> li' );
-                                               if ( $defaultToggle ) {
-                                                       // Exclude list-item containing togglelink
-                                                       $containers = $containers.not( $defaultToggle.parent() );
-                                               }
+                       // Handle different kinds of elements
 
-                                               if ( options.instantHide ) {
-                                                       $containers.hide();
-                                               } else {
-                                                       $containers.stop( true, true ).slideUp();
-                                               }
+                       if ( $collapsible.is( 'table' ) ) {
+                               // Tables
+                               $containers = $collapsible.find( '> tbody > tr' );
+                               if ( $defaultToggle ) {
+                                       // Exclude table row containing togglelink
+                                       $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
+                               }
 
+                               if ( action === 'collapse' ) {
+                                       // Hide all table rows of this table
+                                       // Slide doesn't work with tables, but fade does as of jQuery 1.1.3
+                                       // http://stackoverflow.com/questions/467336#920480
+                                       if ( options.instantHide ) {
+                                               $containers.hide();
                                        } else {
-                                               // <div>, <p> etc.
-                                               $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
+                                               $containers.stop( true, true ).fadeOut();
+                                       }
+                               } else {
+                                       $containers.stop( true, true ).fadeIn();
+                               }
 
-                                               // If a collapsible-content is defined, collapse it
-                                               if ( $collapsibleContent.length ) {
-                                                       if ( options.instantHide ) {
-                                                               $collapsibleContent.hide();
-                                                       } else {
-                                                               $collapsibleContent.slideUp();
-                                                       }
+                       } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
+                               // Lists
+                               $containers = $collapsible.find( '> li' );
+                               if ( $defaultToggle ) {
+                                       // Exclude list-item containing togglelink
+                                       $containers = $containers.not( $defaultToggle.parent() );
+                               }
 
-                                               // Otherwise assume this is a customcollapse with a remote toggle
-                                               // .. and there is no collapsible-content because the entire element should be toggled
-                                               } else {
-                                                       if ( options.instantHide ) {
-                                                               $collapsible.hide();
-                                                       } else {
-                                                               if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                                       $collapsible.fadeOut();
-                                                               } else {
-                                                                       $collapsible.slideUp();
-                                                               }
-                                                       }
-                                               }
+                               if ( action === 'collapse' ) {
+                                       if ( options.instantHide ) {
+                                               $containers.hide();
+                                       } else {
+                                               $containers.stop( true, true ).slideUp();
                                        }
-
                                } else {
+                                       $containers.stop( true, true ).slideDown();
+                               }
 
-                                       // Expand the element
-                                       if ( $collapsible.is( 'table' ) ) {
-                                               $containers = $collapsible.find( '>tbody>tr' );
-                                               if ( $defaultToggle ) {
-                                                       // Exclude tablerow containing togglelink
-                                                       $containers.not( $defaultToggle.parent().parent() ).stop(true, true).fadeIn();
-                                               } else {
-                                                       $containers.stop( true, true ).fadeIn();
-                                               }
+                       } else {
+                               // Everything else: <div>, <p> etc.
+                               $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
-                                       } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
-                                               $containers = $collapsible.find( '> li' );
-                                               if ( $defaultToggle ) {
-                                                       // Exclude list-item containing togglelink
-                                                       $containers.not( $defaultToggle.parent() ).stop( true, true ).slideDown();
+                               // If a collapsible-content is defined, act on it
+                               if ( $collapsibleContent.length ) {
+                                       if ( action === 'collapse' ) {
+                                               if ( options.instantHide ) {
+                                                       $collapsibleContent.hide();
                                                } else {
-                                                       $containers.stop( true, true ).slideDown();
+                                                       $collapsibleContent.slideUp();
                                                }
-
                                        } else {
-                                               // <div>, <p> etc.
-                                               $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
-
-                                               // If a collapsible-content is defined, collapse it
-                                               if ( $collapsibleContent.length ) {
-                                                       $collapsibleContent.slideDown();
+                                               $collapsibleContent.slideDown();
+                                       }
 
-                                               // Otherwise assume this is a customcollapse with a remote toggle
-                                               // .. and there is no collapsible-content because the entire element should be toggled
+                               // Otherwise assume this is a customcollapse with a remote toggle
+                               // .. and there is no collapsible-content because the entire element should be toggled
+                               } else {
+                                       if ( action === 'collapse' ) {
+                                               if ( options.instantHide ) {
+                                                       $collapsible.hide();
                                                } else {
                                                        if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                               $collapsible.fadeIn();
+                                                               $collapsible.fadeOut();
                                                        } else {
-                                                               $collapsible.slideDown();
+                                                               $collapsible.slideUp();
                                                        }
                                                }
-                                       }
-                               }
-                       },
-                       /**
-                        * Toggles collapsible and togglelink class and updates text label.
-                        *
-                        * @param {jQuery} $that
-                        * @param {jQuery.Event} e
-                        * @param {Object|undefined} options
-                        */
-                       toggleLinkDefault = function ( $that, e, options ) {
-                               var $collapsible = $that.closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
-                               e.preventDefault();
-                               e.stopPropagation();
-
-                               // It's expanded right now
-                               if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
-                                       // Change link to "Show"
-                                       $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
-                                       if ( $that.find( '> a' ).length ) {
-                                               $that.find( '> a' ).text( expandtext );
                                        } else {
-                                               $that.text( expandtext );
+                                               if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
+                                                       $collapsible.fadeIn();
+                                               } else {
+                                                       $collapsible.slideDown();
+                                               }
                                        }
-                                       // Collapse element
-                                       toggleElement( $collapsible, 'collapse', $that, options );
+                               }
+                       }
+               }
 
-                               // It's collapsed right now
+               /**
+                * Toggles collapsible and togglelink class and updates text label.
+                *
+                * @param {jQuery} $that
+                * @param {jQuery.Event} e
+                * @param {Object|undefined} options
+                */
+               function toggleLinkDefault( $that, e, options ) {
+                       var $collapsible = $that.closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       // It's expanded right now
+                       if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
+                               // Change link to "Show"
+                               $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
+                               if ( $that.find( '> a' ).length ) {
+                                       $that.find( '> a' ).text( expandtext );
                                } else {
-                                       // Change link to "Hide"
-                                       $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
-                                       if ( $that.find( '> a' ).length ) {
-                                               $that.find( '> a' ).text( collapsetext );
-                                       } else {
-                                               $that.text( collapsetext );
-                                       }
-                                       // Expand element
-                                       toggleElement( $collapsible, 'expand', $that, options );
-                               }
-                               return;
-                       },
-                       /**
-                        * Toggles collapsible and togglelink class.
-                        *
-                        * @param {jQuery} $that
-                        * @param {jQuery.Event} e
-                        * @param {Object|undefined} options
-                        */
-                       toggleLinkPremade = function ( $that, e, options ) {
-                               var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
-                               if ( $.nodeName( e.target, 'a' ) ) {
-                                       return true;
+                                       $that.text( expandtext );
                                }
-                               e.preventDefault();
-                               e.stopPropagation();
-
-                               // It's expanded right now
-                               if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
-                                       // Change toggle to collapsed
-                                       $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
-                                       // Collapse element
-                                       toggleElement( $collapsible, 'collapse', $that, options );
+                               // Collapse element
+                               toggleElement( $collapsible, 'collapse', $that, options );
 
-                               // It's collapsed right now
+                       // It's collapsed right now
+                       } else {
+                               // Change link to "Hide"
+                               $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
+                               if ( $that.find( '> a' ).length ) {
+                                       $that.find( '> a' ).text( collapsetext );
                                } else {
-                                       // Change toggle to expanded
-                                       $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
-                                       // Expand element
-                                       toggleElement( $collapsible, 'expand', $that, options );
-                               }
-                               return;
-                       },
-                       /**
-                        * Toggles customcollapsible.
-                        *
-                        * @param {jQuery} $that
-                        * @param {jQuery.Event} e
-                        * @param {Object|undefined} options
-                        * @param {jQuery} $collapsible
-                        */
-                       toggleLinkCustom = function ( $that, e, options, $collapsible ) {
-                               // For the initial state call of customtogglers there is no event passed
-                               if ( e ) {
-                                       e.preventDefault();
-                                       e.stopPropagation();
+                                       $that.text( collapsetext );
                                }
-                               // Get current state and toggle to the opposite
-                               var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
-                               $collapsible.toggleClass( 'mw-collapsed' );
-                               toggleElement( $collapsible, action, $that, options );
+                               // Expand element
+                               toggleElement( $collapsible, 'expand', $that, options );
+                       }
+                       return;
+               }
+
+               /**
+                * Toggles collapsible and togglelink class.
+                *
+                * @param {jQuery} $that
+                * @param {jQuery.Event} e
+                * @param {Object|undefined} options
+                */
+               function toggleLinkPremade( $that, e, options ) {
+                       var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
+                       if ( $.nodeName( e.target, 'a' ) ) {
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
 
-                       };
+                       // It's expanded right now
+                       if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
+                               // Change toggle to collapsed
+                               $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
+                               // Collapse element
+                               toggleElement( $collapsible, 'collapse', $that, options );
+
+                       // It's collapsed right now
+                       } else {
+                               // Change toggle to expanded
+                               $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
+                               // Expand element
+                               toggleElement( $collapsible, 'expand', $that, options );
+                       }
+                       return;
+               }
+
+               /**
+                * Toggles customcollapsible.
+                *
+                * @param {jQuery} $that
+                * @param {jQuery.Event} e
+                * @param {Object|undefined} options
+                * @param {jQuery} $collapsible
+                */
+               function toggleLinkCustom( $that, e, options, $collapsible ) {
+                       // For the initial state call of customtogglers there is no event passed
+                       if ( e ) {
+                               e.preventDefault();
+                               e.stopPropagation();
+                       }
+                       // Get current state and toggle to the opposite
+                       var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
+                       $collapsible.toggleClass( 'mw-collapsed' );
+                       toggleElement( $collapsible, action, $that, options );
+               }
 
                // Return if it has been enabled already.
                if ( $collapsible.data( 'mw-made-collapsible' ) ) {
index ef28948..20e6678 100644 (file)
@@ -12,8 +12,6 @@
  *
  * @author Timo Tijhof, 2011-2012
  */
-/*global jQuery, QUnit */
-/*jshint eqeqeq:false, eqnull:false, forin:false */
 ( function ( $ ) {
        'use strict';
 
index 8320304..e252ba5 100644 (file)
                }
        }
 
-       function getTextFromRowAndCellIndex( rows, rowIndex, cellIndex ) {
-               if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
-                       return $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
-               } else {
-                       return '';
-               }
-       }
-
        function detectParserForColumn( table, rows, cellIndex ) {
                var l = parsers.length,
                        nodeValue,
                        concurrent = 0,
                        needed = ( rows.length > 4 ) ? 5 : rows.length;
 
-               while( i < l ) {
-                       nodeValue = getTextFromRowAndCellIndex( rows, rowIndex, cellIndex );
+               while ( i < l ) {
+                       if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
+                               nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
+                       } else {
+                               nodeValue = '';
+                       }
+
                        if ( nodeValue !== '') {
                                if ( parsers[i].is( nodeValue, table ) ) {
                                        concurrent++;
index 55f799e..e9d320c 100644 (file)
@@ -119,7 +119,7 @@ jQuery( document ).ready( function ( $ ) {
                        e.preventDefault();
                        return false; // Because the submit is special, return false as well.
                }
-               
+
                // Continue natural browser handling other wise
                return true;
        } );
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
new file mode 100644 (file)
index 0000000..a11233f
--- /dev/null
@@ -0,0 +1,15 @@
+( function ( mw, $ ) {
+       // Only a view can be a post-edit.
+       if ( mw.config.get( 'wgAction' ) !== 'view' ) {
+               return;
+       }
+
+       // Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
+       var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+
+       if ( $.cookie( cookieKey ) === '1' ) {
+               // We just saved this page
+               $.cookie( cookieKey, null, { path: '/' } );
+               mw.config.set( 'wgPostEdit', true );
+       }
+} ( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.titleblacklist.js b/resources/mediawiki.api/mediawiki.api.titleblacklist.js
deleted file mode 100644 (file)
index 8c46717..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @class mw.Api.plugin.titleblacklist
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convinience method for `action=titleblacklist`.
-                * Note: This action is not provided by MediaWiki core, but as part of the TitleBlacklist extension.
-                *
-                * @param {mw.Title|string} title
-                * @param {Function} [ok] Success callback (deprecated)
-                * @param {Function} [err] Error callback (deprecated)
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {Object|boolean} return.done.result False if title wasn't blacklisted, an object with 'reason', 'line'
-                *  and 'message' properties if title was blacklisted.
-                */
-               isBlacklisted: function ( title, ok, err ) {
-                       var d = $.Deferred();
-                       // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
-
-                       this.get( {
-                                       action: 'titleblacklist',
-                                       tbaction: 'create',
-                                       tbtitle: title.toString()
-                               } )
-                               .done( function ( data ) {
-                                       var result;
-
-                                       // this fails open (if nothing valid is returned by the api, allows the title)
-                                       // also fails open when the API is not present, which will be most of the time
-                                       // as this API module is part of the TitleBlacklist extension.
-                                       if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted' ) {
-                                               if ( data.titleblacklist.reason ) {
-                                                       result = {
-                                                               reason: data.titleblacklist.reason,
-                                                               line: data.titleblacklist.line,
-                                                               message: data.titleblacklist.message
-                                                       };
-                                               } else {
-                                                       mw.log( 'mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug' );
-                                                       result = {
-                                                               reason: 'Blacklisted, but no reason supplied',
-                                                               line: 'Unknown',
-                                                               message: null
-                                                       };
-                                               }
-                                               d.resolve( result );
-                                       } else {
-                                               d.resolve( false );
-                                       }
-                               } )
-                               .fail( d.reject );
-
-                       return d.promise();
-               }
-
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.titleblacklist
-        */
-
-}( mediaWiki, jQuery ) );
index 76f0259..183b525 100644 (file)
                                                $span.append( childNode );
                                        } );
                                } else {
-                                       // strings, integers, anything else
-                                       // (will soon switch to createTextNode() for non-objects)
-                                       $span.append( node );
+                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
+                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                                       $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
                                }
                        } );
                        return $span;
index b5b42e1..2ceb3ea 100644 (file)
@@ -42,22 +42,22 @@ var mw = ( function ( $, undefined ) {
                 */
                get: function ( selection, fallback ) {
                        var results, i;
+                       // If we only do this in the `return` block, it'll fail for the
+                       // call to get() from the mutli-selection block.
+                       fallback = arguments.length > 1 ? fallback : null;
 
                        if ( $.isArray( selection ) ) {
                                selection = slice.call( selection );
                                results = {};
-                               for ( i = 0; i < selection.length; i += 1 ) {
+                               for ( i = 0; i < selection.length; i++ ) {
                                        results[selection[i]] = this.get( selection[i], fallback );
                                }
                                return results;
                        }
 
                        if ( typeof selection === 'string' ) {
-                               if ( this.values[selection] === undefined ) {
-                                       if ( fallback !== undefined ) {
-                                               return fallback;
-                                       }
-                                       return null;
+                               if ( !hasOwn.call( this.values, selection ) ) {
+                                       return fallback;
                                }
                                return this.values[selection];
                        }
@@ -86,7 +86,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return true;
                        }
-                       if ( typeof selection === 'string' && value !== undefined ) {
+                       if ( typeof selection === 'string' && arguments.length > 1 ) {
                                this.values[selection] = value;
                                return true;
                        }
@@ -103,14 +103,14 @@ var mw = ( function ( $, undefined ) {
                        var s;
 
                        if ( $.isArray( selection ) ) {
-                               for ( s = 0; s < selection.length; s += 1 ) {
-                                       if ( this.values[selection[s]] === undefined ) {
+                               for ( s = 0; s < selection.length; s++ ) {
+                                       if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
                                                return false;
                                        }
                                }
                                return true;
                        }
-                       return this.values[selection] !== undefined;
+                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
                }
        };
 
@@ -391,7 +391,9 @@ var mw = ( function ( $, undefined ) {
                                // List of callback functions waiting for modules to be ready to be called
                                jobs = [],
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
-                               $marker = null;
+                               $marker = null,
+                               // Buffer for addEmbeddedCSS.
+                               cssBuffer = '';
 
                        /* Private methods */
 
@@ -452,52 +454,82 @@ var mw = ( function ( $, undefined ) {
                        }
 
                        /**
-                        * Checks if certain cssText is safe to append to
-                        * a stylesheet.
+                        * Checks whether it is safe to add this css to a stylesheet.
                         *
-                        * Right now it only makes sure that cssText containing `@import`
-                        * rules will end up in a new stylesheet (as those only work when
-                        * placed at the start of a stylesheet; bug 35562).
-                        * This could later be extended to take care of other bugs, such as
-                        * the IE cssRules limit - not the same as the IE styleSheets limit).
                         * @private
-                        * @param {jQuery} $style
                         * @param {string} cssText
-                        * @return {boolean}
+                        * @return {boolean} False if a new one must be created.
                         */
-                       function canExpandStylesheetWith( $style, cssText ) {
+                       function canExpandStylesheetWith( cssText ) {
+                               // Makes sure that cssText containing `@import`
+                               // rules will end up in a new stylesheet (as those only work when
+                               // placed at the start of a stylesheet; bug 35562).
                                return cssText.indexOf( '@import' ) === -1;
                        }
 
+                       /**
+                        * @param {string} [cssText=cssBuffer] If called without cssText,
+                        * the internal buffer will be inserted instead.
+                        */
                        function addEmbeddedCSS( cssText ) {
                                var $style, styleEl;
-                               $style = getMarker().prev();
-                               // Re-use `<style>` tags if possible, this to try to stay
-                               // under the IE stylesheet limit (bug 31676).
-                               // Also verify that the the element before Marker actually is one
-                               // that came from ResourceLoader, and not a style tag that some
-                               // other script inserted before our marker, or, more importantly,
-                               // it may not be a style tag at all (could be `<meta>` or `<script>`).
-                               if (
-                                       $style.data( 'ResourceLoaderDynamicStyleTag' ) === true &&
-                                       canExpandStylesheetWith( $style, cssText )
-                               ) {
-                                       // There's already a dynamic <style> tag present and
-                                       // canExpandStylesheetWith() gave a green light to append more to it.
-                                       styleEl = $style.get( 0 );
-                                       if ( styleEl.styleSheet ) {
-                                               try {
-                                                       styleEl.styleSheet.cssText += cssText; // IE
-                                               } catch ( e ) {
-                                                       log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
-                                               }
-                                       } else {
-                                               styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+
+                               // Yield once before inserting the <style> tag. There are likely
+                               // more calls coming up which we can combine this way.
+                               // Appending a stylesheet and waiting for the browser to repaint
+                               // is fairly expensive, this reduces it (bug 45810)
+                               if ( cssText ) {
+                                       // Be careful not to extend the buffer with css that needs a new stylesheet
+                                       if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
+                                               // Linebreak for somewhat distinguishable sections
+                                               // (the rl-cachekey comment separating each)
+                                               cssBuffer += '\n' + cssText;
+                                               // TODO: Use requestAnimationFrame in the future which will
+                                               // perform even better by not injecting styles while the browser
+                                               // is paiting.
+                                               setTimeout( addEmbeddedCSS );
+                                               return;
                                        }
+
+                               // This is a delayed call and we got a buffer still
+                               } else if ( cssBuffer ) {
+                                       cssText = cssBuffer;
+                                       cssBuffer = '';
                                } else {
-                                       $( addStyleTag( cssText, getMarker() ) )
-                                               .data( 'ResourceLoaderDynamicStyleTag', true );
+                                       // This is a delayed call, but buffer is already cleared by
+                                       // another delayed call.
+                                       return;
+                               }
+
+                               // By default, always create a new <style>. Appending text
+                               // to a <style> tag means the contents have to be re-parsed (bug 45810).
+                               // Except, of course, in IE below 9, in there we default to
+                               // re-using and appending to a <style> tag due to the
+                               // IE stylesheet limit (bug 31676).
+                               if ( 'documentMode' in document && document.documentMode <= 9 ) {
+
+                                       $style = getMarker().prev();
+                                       // Verify that the the element before Marker actually is a
+                                       // <style> tag and one that came from ResourceLoader
+                                       // (not some other style tag or even a `<meta>` or `<script>`).
+                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                                               // There's already a dynamic <style> tag present and
+                                               // canExpandStylesheetWith() gave a green light to append more to it.
+                                               styleEl = $style.get( 0 );
+                                               if ( styleEl.styleSheet ) {
+                                                       try {
+                                                               styleEl.styleSheet.cssText += cssText; // IE
+                                                       } catch ( e ) {
+                                                               log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+                                                       }
+                                               } else {
+                                                       styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+                                               }
+                                               return;
+                                       }
                                }
+
+                               $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
                        }
 
                        /**
@@ -970,8 +1002,8 @@ var mw = ( function ( $, undefined ) {
                         *
                         * @private
                         * @param {string|string[]} dependencies Module name or array of string module names
-                        * @param {Function} ready Callback to execute when all dependencies are ready
-                        * @param {Function} error Callback to execute when any dependency fails
+                        * @param {Function} [ready] Callback to execute when all dependencies are ready
+                        * @param {Function} [error] Callback to execute when any dependency fails
                         * @param {boolean} [async] If true, load modules asynchronously even if
                         *  document ready has not yet occurred.
                         */
@@ -1447,7 +1479,7 @@ var mw = ( function ( $, undefined ) {
                                                return;
                                        }
                                        // Since some modules are not yet ready, queue up a request.
-                                       request( filtered, null, null, async );
+                                       request( filtered, undefined, undefined, async );
                                },
 
                                /**
index 4ea1a88..ee08b12 100644 (file)
@@ -41,7 +41,7 @@
                                 ':' + ( 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( {
                                                overflow: 'auto',
index 3b2a59c..308e4ad 100644 (file)
                        return this.getName();
                };
 
+               /**
+                * Get date user registered, if available.
+                *
+                * @return {Date|false|null} date user registered, or false for anonymous users, or
+                *  null when data is not available
+                */
+               this.getRegistration = function () {
+                       var registration = mw.config.get( 'wgUserRegistration' );
+                       if ( this.isAnon() ) {
+                               return false;
+                       } else if ( registration === null ) {
+                               // Information may not be available if they signed up before
+                               // MW began storing this.
+                               return null;
+                       } else {
+                               return new Date( registration );
+                       }
+               };
+
                /**
                 * Checks if the current user is anonymous.
                 *
index cb7dd63..5211b0d 100644 (file)
 
                                // If the jQuery selector isn't found within the <ul>,
                                // or if nextnode was invalid or not passed at all,
-                               // then just append it at the end of the <ul> (this is the default behaviour)
+                               // then just append it at the end of the <ul> (this is the default behavior)
                                } else {
                                        $ul.append( $item );
                                }
index ee68abb..d0f9995 100644 (file)
@@ -57,7 +57,7 @@ class SkinVector extends SkinTemplate {
                                "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
                );
 
-               $out->addModuleScripts( 'skins.vector' );
+               $out->addModules( 'skins.vector.js' );
        }
 
        /**
@@ -194,7 +194,7 @@ class VectorTemplate extends BaseTemplate {
                                <!-- jumpto -->
                                <div id="jump-to-nav" class="mw-jump">
                                        <?php $this->msg( 'jumpto' ) ?>
-                                       <a href="#mw-head"><?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>
                                <!-- /jumpto -->
index 79911fe..2fa0cba 100644 (file)
@@ -189,7 +189,7 @@ blockquote {
 pre, code, tt, kbd, samp, .mw-code {
        /*
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
-        * Specifying any valid, second value will trigger correct behaviour without forcing a different font.
+        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
         */
        font-family: monospace, Courier;
 }
index 1fe750e..6e1c94f 100644 (file)
@@ -232,6 +232,9 @@ td.mw-label {
 .prefsection table {
        width: 100%;
 }
+.prefsection table.mw-htmlform-matrix {
+       width: auto;
+}
 td.mw-submit {
        white-space: nowrap;
 }
@@ -254,6 +257,11 @@ tr.mw-htmlform-vertical-label td.mw-label {
        white-space: nowrap;
 }
 
+.mw-htmlform-matrix td {
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
 input#wpSummary {
        width: 80%;
        margin-bottom: 1em;
index 6e212eb..b7320cb 100644 (file)
@@ -37,7 +37,7 @@ if ( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
        # PHPUnit 3.5.0 introduced a nice autoloader based on class name
        require_once( 'PHPUnit/Autoload.php' );
 } else {
-       # Keep the old pre PHPUnit 3.5.0 behaviour for compatibility
+       # Keep the old pre PHPUnit 3.5.0 behavior for compatibility
        require_once( 'PHPUnit/TextUI/Command.php' );
 }
 
index 13217e2..ce621f4 100644 (file)
@@ -131,6 +131,7 @@ class ParserTest {
                }
 
                $this->runDisabled = isset( $options['run-disabled'] );
+               $this->runParsoid = isset( $options['run-parsoid'] );
 
                $this->hooks = array();
                $this->functionHooks = array();
index 9e0b6a4..e9218de 100644 (file)
@@ -21,6 +21,8 @@
 # language=XXX  set content language to XXX for this test
 # variant=XXX   set the variant of language for this test (eg zh-tw)
 # disabled      do not run test
+# parsoid       parsoid-only test (not run by PHP parser)
+# php           php-only test (not run by the parsoid parser)
 # showtitle     make the first line the title
 # comment       run through Linker::formatComment() instead of main parser
 # local         format section links in edit comment text as local links
@@ -491,7 +493,6 @@ Italics and bold: other quote tests: (3,2,3,3)
 !!end
 
 
-
 !! test
 Italics and bold: other quote tests: (3,(2,2),3)
 !! input
@@ -501,6 +502,37 @@ Italics and bold: other quote tests: (3,(2,2),3)
 </p>
 !!end
 
+
+!! test
+Italicized possessive
+!! input
+The ''[[Main Page]]'''s talk page.
+!! result
+<p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
+</p>
+!! end
+
+###
+### Non-html5 tags
+###
+
+!! test
+Non-html5 tags should be accepted
+!! input
+<center>''foo''</center>
+<big>''foo''</big>
+<font>''foo''</font>
+<strike>''foo''</strike>
+<tt>''foo''</tt>
+!! result
+<center><i>foo</i></center>
+<p><big><i>foo</i></big>
+<font><i>foo</i></font>
+<strike><i>foo</i></strike>
+<tt><i>foo</i></tt>
+</p>
+!! end
+
 ###
 ### <nowiki> test cases
 ###
@@ -1798,7 +1830,7 @@ Table / list interaction: lists nested in tables nested in indented lists
 !! test
 Definition Lists: Nesting: Multi-level (Parsoid only)
 !! options
-disabled
+parsoid
 !! input
 ;t1 :d1
 ;;t2 ::d2
@@ -1828,7 +1860,7 @@ disabled
 !! test
 Definition Lists: Nesting: Test 2 (Parsoid only)
 !! options
-disabled
+parsoid
 !! input
 ;t1
 ::d2
@@ -1848,7 +1880,7 @@ disabled
 !! test
 Definition Lists: Nesting: Test 3 (Parsoid only)
 !! options
-disabled
+parsoid
 !! input
 :;t1
 ::::d2
@@ -2488,6 +2520,17 @@ External links: multiple legal whitespace is fine, Magnus. Don't break it please
 </p>
 !! end
 
+!! test
+External links: link text with spaces
+!! input
+[http://www.example.com a b c]
+[http://www.example.com ''a'' ''b'']
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.example.com">a b c</a>
+<a rel="nofollow" class="external text" href="http://www.example.com"><i>a</i> <i>b</i></a>
+</p>
+!! end
+
 !! test
 External links: wiki links within external link (Bug 3695)
 !! input
@@ -2648,21 +2691,6 @@ External link containing double-single-quotes with no space separating the url f
 </p>
 !! end
 
-!!test
-Text in square brackets that is not a link should parse as text
-!!input
-[foo]
-[{{echo|foo}}]
-[url={{echo|foo}}]
-[url=http://example.com]
-!!result
-<p>[foo]
-[foo]
-[url=foo]
-[url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>]
-</p>
-!!end
-
 !! test
 URL-encoding in URL functions (single parameter)
 !! input
@@ -2717,6 +2745,8 @@ Non-extlinks in brackets
 [{{echo|foo}} ''bar'']
 [{{echo|foo}}l's] errand
 [{{echo|foo}}l's errand]
+[url={{echo|foo}}]
+[url=http://example.com]
 !! result
 <p>[foo]
 [foo bar]
@@ -2728,6 +2758,8 @@ Non-extlinks in brackets
 [foo <i>bar</i>]
 [fool's] errand
 [fool's errand]
+[url=foo]
+[url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>]
 </p>
 !! end
 
@@ -4287,7 +4319,7 @@ disabled
 List embedded in a non-block tag
 (Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
 !! options
-disabled
+parsoid
 !!input
 <small>
 * foo
@@ -5829,7 +5861,7 @@ Templates: HTML Tables: 4f. Generating a single tag of a HTML table
 !!end
 
 !!test
-Templates: Wiki Tables: 1. Fostering of entire template content
+Templates: Wiki Tables: 1a. Fostering of entire template content
 !!input
 {|
 {{echo|a}}
@@ -5841,6 +5873,24 @@ a
 
 !!end
 
+!!test
+Templates: Wiki Tables: 1b. Fostering of entire template content
+!!input
+{|
+{{echo|<div>}}
+foo
+{{echo|</div>}}
+|}
+!!result
+<table>
+<div>
+<p>foo
+</p>
+</div>
+<tr><td></td></tr></table>
+
+!!end
+
 !!test
 Templates: Wiki Tables: 2. Fostering of partial template content
 !!input
@@ -5882,7 +5932,7 @@ Templates: Wiki Tables: 4. Templated tags, no content
 !!end
 
 !!test
-Templates: Wiki Tables: 4. Templated tags, regular td-tags
+Templates: Wiki Tables: 5. Templated tags, regular td-tags
 !!input
 {{tbl-start}}
 |foo
@@ -5896,7 +5946,7 @@ Templates: Wiki Tables: 4. Templated tags, regular td-tags
 !!end
 
 !!test
-Templates: Wiki Tables: 4. Templated tags, templated td-tags
+Templates: Wiki Tables: 6. Templated tags, templated td-tags
 !!input
 {{tbl-start}}
 {{!}}foo
@@ -5969,7 +6019,7 @@ a<div>bc</div>de
 Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
 (Parsoid-centric)
 !! options
-disabled
+parsoid
 !!input
 {|
 |{{echo|foo</table>}}
@@ -5986,7 +6036,7 @@ bar</span><span about="#mwt1">
 Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
 (Parsoid-centric)
 !! options
-disabled
+parsoid
 !!input
 <table>
   <tr>
@@ -7093,6 +7143,37 @@ Custom class
 </p>
 !! end
 
+!! test
+Localized image handling (1).
+!! options
+language=es
+!! input
+[[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]]
+!! result
+<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Localized image handling (2).
+!! options
+language=es
+!! input
+[[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
+!! result
+<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/Foo" title="Foo"><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/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+
+!! end
+
+!! test
+"border", "frameless" and "class" attributes on an image.
+!! input
+[[File:Foobar.jpg|frameless|border|class=extra|caption]]
+!! result
+<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" class="extra thumbborder" 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>
+!! end
+
 !! article
 File:Barfoo.jpg
 !! text
@@ -7692,7 +7773,7 @@ http://example.com [[Image:foobar.jpg]]
 !!end
 
 !! test
-Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
+Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
 !! input
 === 
 The line above must have a trailing space!
@@ -9803,7 +9884,7 @@ section=1
 ==marked==
 !!end
 
-# Test behaviour of bug 19910
+# Test behavior of bug 19910
 !! test
 Sectiion with all-equals
 !! options
@@ -13647,7 +13728,7 @@ HTML tag with broken attribute value quoting
 !! test
 Parsoid-only: HTML tag with broken attribute value quoting
 !! options
-disabled
+parsoid
 !! input
 <span title="Hello world>Foo</span>
 !! result
@@ -13689,7 +13770,7 @@ Table with broken attribute value quoting on consecutive lines
 !! test
 Parsoid-only: Table with broken attribute value quoting on consecutive lines
 !! options
-disabled
+parsoid
 !! input
 {|
 | title="Hello world|Foo
@@ -13699,7 +13780,7 @@ disabled
 <table>
 <tr>
 <td title="Hello world">Foo
-</td><td style="color: red;">Bar
+</td><td style="color: red">Bar
 </td></tr></table>
 
 !! end
@@ -13749,6 +13830,27 @@ Accept empty attributes in th-cells
 
 !!end
 
+!!test
+Empty table rows go away
+!!input
+{|
+| Hello
+| there
+|- class="foo"
+|-
+|}
+!! result
+<table>
+<tr>
+<td> Hello
+</td>
+<td> there
+</td></tr>
+
+</table>
+
+!! end
+
 TODO:
 more images
 more tables
index 4d2c402..804a30c 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Testing
  */
 
-$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
+$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
 require_once( __DIR__ . '/../maintenance/commandLine.inc' );
@@ -53,6 +53,7 @@ Options:
   --seed <n>       Start the fuzz test from the specified seed
   --help           Show this help message
   --run-disabled   run disabled tests
+  --run-parsoid    run parsoid tests (normally disabled)
 
 ENDS;
        exit( 0 );
index f16d06c..51fbff1 100644 (file)
@@ -128,7 +128,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * The obtained filename is enlisted to be removed upon tearDown
         *
-        * @returns string: absolute name of the temporary file
+        * @return string: absolute name of the temporary file
         */
        protected function getNewTempFile() {
                $fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
@@ -142,7 +142,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * The obtained directory is enlisted to be removed (recursively with all its contained
         * files) upon tearDown.
         *
-        * @returns string: absolute name of the temporary directory
+        * @return string: absolute name of the temporary directory
         */
        protected function getNewTempDirectory() {
                // Starting of with a temporary /file/.
index e3e2138..a942098 100644 (file)
@@ -18,6 +18,8 @@ class StructureTest extends MediaWikiTestCase {
                $testClassRegex = implode( '|', array(
                        'ApiFormatTestBase',
                        'ApiTestCase',
+                       'ApiQueryTestBase',
+                       'ApiQueryContinueTestBase',
                        'MediaWikiLangTestCase',
                        'MediaWikiTestCase',
                        'PHPUnit_Framework_TestCase',
index b64a54e..00eba30 100644 (file)
@@ -48,7 +48,7 @@ class EditPageTest extends MediaWikiTestCase {
                $dbw = wfGetDB( DB_MASTER );
 
                $dbw->update( 'revision',
-                       array( 'rev_timestamp' => $timestamp ),
+                       array( 'rev_timestamp' => $dbw->timestamp( $timestamp ) ),
                        array( 'rev_id' => $page->getLatest() ) );
 
                $page->clear();
index b6e23ab..590664e 100644 (file)
@@ -443,7 +443,7 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * Test out Html::element drops or enforces default value
-        * @cover Html::dropDefaults
+        * @covers Html::dropDefaults
         * @dataProvider provideElementsWithAttributesHavingDefaultValues
         */
        function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
index 90de96d..e353c46 100644 (file)
@@ -4,7 +4,7 @@ class LinkerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideCasesForUserLink
-        * @cover Linker::userLink
+        * @covers Linker::userLink
         */
        function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
                $this->setMwGlobals( array(
index 244e4a8..a79b3a2 100644 (file)
@@ -85,6 +85,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        public function testUpdate_categorylinks() {
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
                $po->addCategory( "Foo", "FOO" );
index 48cf6dc..f587171 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group Database
+ */
 class RequestContextTest extends MediaWikiTestCase {
 
        /**
@@ -25,4 +28,42 @@ class RequestContextTest extends MediaWikiTestCase {
 
        }
 
+       public function testImportScopedSession() {
+               $context = RequestContext::getMain();
+
+               $oInfo = $context->exportSession();
+               $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
+               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
+
+               $user = User::newFromName( 'UnitTestContextUser' );
+               $user->addToDatabase();
+
+               $sinfo = array(
+                       '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' )
+               );
+               $sc = RequestContext::importScopedSession( $sinfo ); // load new context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $sinfo['ip'], $info['ip'], "Correct IP address." );
+               $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['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." );
+
+               unset ( $sc ); // restore previous context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct initial IP address." );
+               $this->assertEquals( $oInfo['headers'], $info['headers'], "Correct initial headers." );
+               $this->assertEquals( $oInfo['sessionId'], $info['sessionId'], "Correct initial session ID." );
+               $this->assertEquals( $oInfo['userId'], $info['userId'], "Correct initial user ID." );
+       }
 }
index 9707f49..c0ed4a5 100644 (file)
@@ -63,7 +63,7 @@ class SanitizerTest extends MediaWikiTestCase {
        }
 
        /**
-        * @cover Sanitizer::removeHTMLtags
+        * @covers Sanitizer::removeHTMLtags
         * @dataProvider provideHtml5Tags
         *
         * @param String $tag Name of an HTML5 element (ie: 'video')
@@ -116,7 +116,7 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideTagAttributesToDecode
-        * @cover Sanitizer::decodeTagAttributes
+        * @covers Sanitizer::decodeTagAttributes
         */
        function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
                $this->assertEquals( $expected,
@@ -165,7 +165,7 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDeprecatedAttributes
-        * @cover Sanitizer::fixTagAttributes
+        * @covers Sanitizer::fixTagAttributes
         */
        function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
                $this->assertEquals( " $inputAttr",
@@ -193,7 +193,7 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideCssCommentsFixtures
-        * @cover Sanitizer::checkCss
+        * @covers Sanitizer::checkCss
         */
        function testCssCommentsChecking( $expected, $css, $message = '' ) {
                $this->assertEquals( $expected,
index 31216b3..db3d265 100644 (file)
@@ -6,7 +6,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * This test StringUtils::isUtf8 whenever we have mbstring extension
         * loaded.
         *
-        * @cover StringUtils::isUtf8
+        * @covers StringUtils::isUtf8
         * @dataProvider provideStringsForIsUtf8Check
         */
        function testIsUtf8WithMbstring( $expected, $string ) {
@@ -24,7 +24,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * implementation used as a fallback when mb_check_encoding() is
         * not available.
         *
-        * @cover StringUtils::isUtf8
+        * @covers StringUtils::isUtf8
         * @dataProvider provideStringsForIsUtf8Check
         */
        function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
index 91c23ec..0690683 100644 (file)
@@ -78,7 +78,6 @@ class TimestampTest extends MediaWikiTestCase {
                        array( TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ),
                        array( TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ),
                        array( TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ),
-                       array( TS_DB2, '2012-07-31 19:01:08', '20120731190108' ),
                        // Some extremes and weird values
                        array( TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ),
                        array( TS_UNIX, '-62135596801', '00001231235959' )
index 3dc5e82..a906785 100644 (file)
@@ -96,7 +96,7 @@ class TitleTest extends MediaWikiTestCase {
         * @param string $action
         * @param array|string|true $expected Required error
         *
-        * @covers Title::checkReadPermission
+        * @covers Title::checkReadPermissions
         * @dataProvider dataWgWhitelistReadRegexp
         */
        function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
index af499d1..94082e5 100644 (file)
@@ -7,14 +7,9 @@
  */
 class ApiCreateAccountTest extends ApiTestCase {
        function setUp() {
-               global $wgHooks;
                parent::setUp();
                LoginForm::setCreateaccountToken();
-
-               $hooks = $wgHooks;
-               Hooks::clear( 'AlternateUserMailer' );
-               $hooks['AlternateUserMailer'] = array( function () { return false; } );
-               $this->setMwGlobals( array( 'wgHooks' => $hooks ) );
+               $this->setMwGlobals( array( 'wgEnableEmail' => true ) );
        }
 
        /**
@@ -147,10 +142,6 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testInvalidEmail() {
-               global $wgEnableEmail;
-               if ( !$wgEnableEmail ) {
-                       $this->markTestSkipped( 'email is not enabled, so createaccount does not check it' );
-               }
                $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'name' => 'Test User',
index da5eb33..1efbaea 100644 (file)
@@ -344,7 +344,7 @@ class ApiEditPageTest extends ApiTestCase {
                $dbw = wfGetDB( DB_MASTER );
 
                $dbw->update( 'revision',
-                       array( 'rev_timestamp' => $timestamp ),
+                       array( 'rev_timestamp' => $dbw->timestamp( $timestamp ) ),
                        array( 'rev_id' => $page->getLatest() ) );
 
                $page->clear();
index a5ca256..6d4e371 100644 (file)
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- *
- * These tests validate basic functionality of the api query module
+ */
+
+require_once( 'ApiQueryTestBase.php' );
+
+/** These tests validate basic functionality of the api query module
  *
  * @group API
  * @group Database
  * @group medium
  */
-class ApiQueryBasicTest extends ApiTestCase {
+class ApiQueryBasicTest extends ApiQueryTestBase {
        /**
         * Create a set of pages. These must not change, otherwise the tests might give wrong results.
         * @see MediaWikiTestCase::addDBData()
@@ -296,20 +299,6 @@ class ApiQueryBasicTest extends ApiTestCase {
                        self::$categorymembers ) );
        }
 
-       /**
-        * Merges all requests (parameter arrays) into one
-        * @return array
-        */
-       private function merge( /*...*/ ) {
-               $request = array();
-               $expected = array();
-               foreach ( func_get_args() as $v ) {
-                       $request = array_merge_recursive( $request, $v[0] );
-                       $this->mergeExpected( $expected, $v[1] );
-               }
-               return array( $request, $expected );
-       }
-
        /**
         * Recursively merges the expected values in the $item into the $all
         */
@@ -327,38 +316,6 @@ class ApiQueryBasicTest extends ApiTestCase {
                }
        }
 
-       /**
-        * Checks that the request's result matches the expected results.
-        * @param $values array is a two element array( request, expected_results )
-        * @throws Exception
-        */
-       private function check( $values ) {
-               $request = $values[0];
-               $expected = $values[1];
-               if ( !array_key_exists( 'action', $request ) ) {
-                       $request['action'] = 'query';
-               }
-               foreach ( $request as &$val ) {
-                       if ( is_array( $val ) ) {
-                               $val = implode( '|', array_unique( $val ) );
-                       }
-               }
-               $result = $this->doApiRequest( $request );
-               $result = $result[0];
-               $expected = array( 'query' => $expected );
-               try {
-                       $this->assertQueryResults( $expected, $result );
-               } catch ( Exception $e ) {
-                       print( "\nRequest:\n" );
-                       print_r( $request );
-                       print( "\nExpected:\n" );
-                       print_r( $expected );
-                       print( "\nResult:\n" );
-                       print_r( $result );
-                       throw $e; // rethrow it
-               }
-       }
-
        /**
         * Recursively compare arrays, ignoring mismatches in numeric key and pageids.
         * @param $expected array expected values
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php b/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
new file mode 100644 (file)
index 0000000..0a3ac1d
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once( 'ApiQueryContinueTestBase.php' );
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ */
+class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
+       /**
+        * Create a set of pages. These must not change, otherwise the tests might give wrong results.
+        * @see MediaWikiTestCase::addDBData()
+        */
+       function addDBData() {
+               try {
+                       $this->editPage( 'AQCT73462-A', '**AQCT73462-A**  [[AQCT73462-B]] [[AQCT73462-C]]' );
+                       $this->editPage( 'AQCT73462-B', '[[AQCT73462-A]]  **AQCT73462-B** [[AQCT73462-C]]' );
+                       $this->editPage( 'AQCT73462-C', '[[AQCT73462-A]]  [[AQCT73462-B]] **AQCT73462-C**' );
+                       $this->editPage( 'AQCT73462-A', '**AQCT73462-A**  [[AQCT73462-B]] [[AQCT73462-C]]' );
+                       $this->editPage( 'AQCT73462-B', '[[AQCT73462-A]]  **AQCT73462-B** [[AQCT73462-C]]' );
+                       $this->editPage( 'AQCT73462-C', '[[AQCT73462-A]]  [[AQCT73462-B]] **AQCT73462-C**' );
+               } catch ( Exception $e ) {
+                       $this->exceptionFromAddDBData = $e;
+               }
+       }
+
+       /**
+        * @medium
+        */
+       public function testA() {
+               $this->mVerbose = false;
+               $mk = function( $g, $p, $gDir ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT73462-',
+                               'prop' => 'links',
+                               'gaplimit' => "$g",
+                               'pllimit' => "$p",
+                               'gapdir' => $gDir ? "ascending" : "descending",
+                       );
+               };
+               // generator + 1 prop + 1 list
+               $data = $this->query( $mk(99,99,true), 1, 'g1p', false );
+               $this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
+               $this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
+               $this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
+               $this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+       }
+}
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTest.php b/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
new file mode 100644 (file)
index 0000000..cb8f181
--- /dev/null
@@ -0,0 +1,313 @@
+<?php
+/**
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once( 'ApiQueryContinueTestBase.php' );
+
+/**
+ * These tests validate the new continue functionality of the api query module by
+ * doing multiple requests with varying parameters, merging the results, and checking
+ * that the result matches the full data received in one no-limits call.
+ *
+ * @group API
+ * @group Database
+ * @group medium
+ */
+class ApiQueryContinueTest extends ApiQueryContinueTestBase {
+       /**
+        * Create a set of pages. These must not change, otherwise the tests might give wrong results.
+        * @see MediaWikiTestCase::addDBData()
+        */
+       function addDBData() {
+               try {
+                       $this->editPage( 'Template:AQCT-T1', '**Template:AQCT-T1**' );
+                       $this->editPage( 'Template:AQCT-T2', '**Template:AQCT-T2**' );
+                       $this->editPage( 'Template:AQCT-T3', '**Template:AQCT-T3**' );
+                       $this->editPage( 'Template:AQCT-T4', '**Template:AQCT-T4**' );
+                       $this->editPage( 'Template:AQCT-T5', '**Template:AQCT-T5**' );
+
+                       $this->editPage( 'AQCT-1', '**AQCT-1** {{AQCT-T2}} {{AQCT-T3}} {{AQCT-T4}} {{AQCT-T5}}' );
+                       $this->editPage( 'AQCT-2', '[[AQCT-1]] **AQCT-2** {{AQCT-T3}} {{AQCT-T4}} {{AQCT-T5}}' );
+                       $this->editPage( 'AQCT-3', '[[AQCT-1]] [[AQCT-2]] **AQCT-3** {{AQCT-T4}} {{AQCT-T5}}' );
+                       $this->editPage( 'AQCT-4', '[[AQCT-1]] [[AQCT-2]] [[AQCT-3]] **AQCT-4** {{AQCT-T5}}' );
+                       $this->editPage( 'AQCT-5', '[[AQCT-1]] [[AQCT-2]] [[AQCT-3]] [[AQCT-4]] **AQCT-5**' );
+               } catch ( Exception $e ) {
+                       $this->exceptionFromAddDBData = $e;
+               }
+       }
+
+       /**
+        * Test smart continue - list=allpages
+        * @medium
+        */
+       public function test1List() {
+               $this->mVerbose = false;
+               $mk = function( $l ) {
+                       return array(
+                               'list' => 'allpages',
+                               'apprefix' => 'AQCT-',
+                               'aplimit' => "$l",
+                       );
+               };
+               $data = $this->query( $mk(99), 1, '1L', false );
+
+               // 1 list
+               $this->checkC( $data, $mk(1), 5, '1L-1' );
+               $this->checkC( $data, $mk(2), 3, '1L-2' );
+               $this->checkC( $data, $mk(3), 2, '1L-3' );
+               $this->checkC( $data, $mk(4), 2, '1L-4' );
+               $this->checkC( $data, $mk(5), 1, '1L-5' );
+       }
+
+       /**
+        * Test smart continue - list=allpages|alltransclusions
+        * @medium
+        */
+       public function test2Lists() {
+               $this->mVerbose = false;
+               $mk = function( $l1, $l2 ) {
+                       return array(
+                               'list' => 'allpages|alltransclusions',
+                               'apprefix' => 'AQCT-',
+                               'atprefix' => 'AQCT-',
+                               'atunique' => '',
+                               'aplimit' => "$l1",
+                               'atlimit' => "$l2",
+                       );
+               };
+               // 2 lists
+               $data = $this->query( $mk(99,99), 1, '2L', false );
+               $this->checkC( $data, $mk(1,1), 5, '2L-11' );
+               $this->checkC( $data, $mk(2,2), 3, '2L-22' );
+               $this->checkC( $data, $mk(3,3), 2, '2L-33' );
+               $this->checkC( $data, $mk(4,4), 2, '2L-44' );
+               $this->checkC( $data, $mk(5,5), 1, '2L-55' );
+       }
+
+       /**
+        * Test smart continue - generator=allpages, prop=links
+        * @medium
+        */
+       public function testGen1Prop() {
+               $this->mVerbose = false;
+               $mk = function( $g, $p ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT-',
+                               'gaplimit' => "$g",
+                               'prop' => 'links',
+                               'pllimit' => "$p",
+                       );
+               };
+               // generator + 1 prop
+               $data = $this->query( $mk(99,99), 1, 'G1P', false );
+               $this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
+               $this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
+               $this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
+               $this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
+               $this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+       }
+
+       /**
+        * Test smart continue - generator=allpages, prop=links|templates
+        * @medium
+        */
+       public function testGen2Prop() {
+               $this->mVerbose = false;
+               $mk = function( $g, $p1, $p2 ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT-',
+                               'gaplimit' => "$g",
+                               'prop' => 'links|templates',
+                               'pllimit' => "$p1",
+                               'tllimit' => "$p2",
+                       );
+               };
+               // generator + 2 props
+               $data = $this->query( $mk(99,99,99), 1, 'G2P', false );
+               $this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
+               $this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
+               $this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
+               $this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
+               $this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
+               $this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
+               $this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
+               $this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
+               $this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
+               $this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+       }
+
+       /**
+        * Test smart continue - generator=allpages, prop=links, list=alltransclusions
+        * @medium
+        */
+       public function testGen1Prop1List() {
+               $this->mVerbose = false;
+               $mk = function( $g, $p, $l ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT-',
+                               'gaplimit' => "$g",
+                               'prop' => 'links',
+                               'pllimit' => "$p",
+                               'list' => 'alltransclusions',
+                               'atprefix' => 'AQCT-',
+                               'atunique' => '',
+                               'atlimit' => "$l",
+                       );
+               };
+               // generator + 1 prop + 1 list
+               $data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
+               $this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
+               $this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
+               $this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
+               $this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
+               $this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
+               $this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
+               $this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+       }
+
+       /**
+        * Test smart continue - generator=allpages, prop=links|templates,
+        *                                         list=alllinks|alltransclusions, meta=siteinfo
+        * @medium
+        */
+       public function testGen2Prop2List1Meta() {
+               $this->mVerbose = false;
+               $mk = function( $g, $p1, $p2, $l1, $l2 ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT-',
+                               'gaplimit' => "$g",
+                               'prop' => 'links|templates',
+                               'pllimit' => "$p1",
+                               'tllimit' => "$p2",
+                               'list' => 'alllinks|alltransclusions',
+                               'alprefix' => 'AQCT-',
+                               'alunique' => '',
+                               'allimit' => "$l1",
+                               'atprefix' => 'AQCT-',
+                               'atunique' => '',
+                               'atlimit' => "$l2",
+                               'meta' => 'siteinfo',
+                               'siprop' => 'namespaces',
+                       );
+               };
+               // generator + 1 prop + 1 list
+               $data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
+               $this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
+               $this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
+               $this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
+               $this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
+               $this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
+               $this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
+               $this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
+               $this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
+               $this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+       }
+
+       /**
+        * Test smart continue - generator=templates, prop=templates
+        * @medium
+        */
+       public function testSameGenAndProp() {
+               $this->mVerbose = false;
+               $mk = function( $g, $gDir, $p, $pDir ) {
+                       return array(
+                               'titles' => 'AQCT-1',
+                               'generator' => 'templates',
+                               'gtllimit' => "$g",
+                               'gtldir' => $gDir ? 'ascending' : 'descending',
+                               'prop' => 'templates',
+                               'tllimit' => "$p",
+                               'tldir' => $pDir ? 'ascending' : 'descending',
+                       );
+               };
+               // generator + 1 prop
+               $data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+
+               $this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
+               $this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
+               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
+               $this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
+               $this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+
+               $this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
+               $this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
+               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
+               $this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
+               $this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+
+               $this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
+               $this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
+               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
+               $this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
+               $this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+
+               $this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
+               $this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
+               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
+               $this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
+               $this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+       }
+
+       /**
+        * Test smart continue - generator=allpages, list=allpages
+        * @medium
+        */
+       public function testSameGenList() {
+               $this->mVerbose = false;
+               $mk = function( $g, $gDir, $l, $pDir ) {
+                       return array(
+                               'generator' => 'allpages',
+                               'gapprefix' => 'AQCT-',
+                               'gaplimit' => "$g",
+                               'gapdir' => $gDir ? 'ascending' : 'descending',
+                               'list' => 'allpages',
+                               'apprefix' => 'AQCT-',
+                               'aplimit' => "$l",
+                               'apdir' => $pDir ? 'ascending' : 'descending',
+                       );
+               };
+               // generator + 1 list
+               $data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+
+               $this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
+               $this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
+               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
+               $this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
+               $this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
+               $this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
+               $this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
+               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
+               $this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
+               $this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
+               $this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
+               $this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
+               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
+               $this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
+               $this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
+               $this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
+               $this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
+               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
+               $this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
+               $this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+       }
+}
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
new file mode 100644 (file)
index 0000000..4717479
--- /dev/null
@@ -0,0 +1,203 @@
+<?php
+/**
+ *
+ *
+ * Created on Jan 1, 2013
+ *
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+require_once( 'ApiQueryTestBase.php' );
+
+abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
+
+       /**
+        * Enable to print in-depth debugging info during the test run
+        */
+       protected $mVerbose = false;
+
+       /**
+        * Run query() and compare against expected values
+        */
+       protected function checkC( $expected, $params, $expectedCount, $id, $continue = true  ) {
+               $result = $this->query( $params, $expectedCount, $id, $continue );
+               $this->assertResult( $expected, $result, $id );
+       }
+
+       /**
+        * Run query in a loop until no more values are available
+        * @param array $params api parameters
+        * @param int $expectedCount max number of iterations
+        * @param string $id unit test id
+        * @param boolean $useContinue true to use smart continue
+        * @return mixed: merged results data array
+        * @throws Exception
+        */
+       protected function query( $params, $expectedCount, $id, $useContinue = true ) {
+               if ( isset( $params['action'] ) ) {
+                       $this->assertEquals( 'query', $params['action'], 'Invalid query action');
+               } else {
+                       $params['action'] = 'query';
+               }
+               if ( $useContinue && !isset( $params['continue'] ) ) {
+                       $params['continue'] = '';
+               }
+               $count = 0;
+               $result = array();
+               $continue = array();
+               do {
+                       $request = array_merge( $params, $continue );
+                       uksort( $request, function( $a, $b ) {
+                               // put 'continue' params at the end - lazy method
+                               $a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
+                               $b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+                               return strcmp( $a, $b );
+                       } );
+                       $reqStr = http_build_query( $request );
+                       //$reqStr = str_replace( '&', ' & ', $reqStr );
+                       $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
+                       if ( $this->mVerbose ) {
+                               print ("$id (#$count): $reqStr\n");
+                       }
+                       try {
+                               $data = $this->doApiRequest( $request );
+                       } catch ( Exception $e ) {
+                               throw new Exception( "$id on $count", 0, $e );
+                       }
+                       $data = $data[0];
+                       if ( isset( $data['warnings'] ) ) {
+                               $warnings = json_encode( $data['warnings'] );
+                               $this->fail( "$id Warnings on #$count in $reqStr\n$warnings" );
+                       }
+                       $this->assertArrayHasKey( 'query', $data, "$id no 'query' on #$count in $reqStr" );
+                       if ( isset( $data['continue'] ) ) {
+                               $continue = $data['continue'];
+                               unset( $data['continue'] );
+                       } else {
+                               $continue = array();
+                       }
+                       if ( $this->mVerbose ) {
+                               $this->printResult( $data );
+                       }
+                       $this->mergeResult( $result, $data );
+                       $count++;
+                       if ( empty( $continue ) ) {
+                               // $this->assertEquals( $expectedCount, $count, "$id finished early" );
+                               if ( $expectedCount > $count ) {
+                                       print "***** $id Finished early in $count turns. $expectedCount was expected\n";
+                               }
+                               return $result;
+                       } elseif ( !$useContinue ) {
+                               $this->assertFalse( 'Non-smart query must be requested all at once' );
+                       }
+               } while( true );
+       }
+
+       private function printResult( $data ) {
+               $q = $data['query'];
+               $print = array();
+               if (isset($q['pages'])) {
+                       foreach ($q['pages'] as $p) {
+                               $m = $p['title'];
+                               if (isset($p['links'])) {
+                                       $m .= '/[' . implode(',', array_map(
+                                               function ($v) {
+                                                       return $v['title'];
+                                               },
+                                               $p['links'])) . ']';
+                               }
+                               if (isset($p['categories'])) {
+                                       $m .= '/(' . implode(',', array_map(
+                                               function ($v) {
+                                                       return str_replace('Category:', '', $v['title']);
+                                               },
+                                               $p['categories'])) . ')';
+                               }
+                               $print[] = $m;
+                       }
+               }
+               if (isset($q['allcategories'])) {
+                       $print[] = '*Cats/(' . implode(',', array_map(
+                               function ($v) { return $v['*']; },
+                               $q['allcategories'])) . ')';
+               }
+               self::GetItems( $q, 'allpages', 'Pages', $print );
+               self::GetItems( $q, 'alllinks', 'Links', $print );
+               self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
+               print(' ' . implode('  ', $print) . "\n");
+       }
+
+       private static function GetItems( $q, $moduleName, $name, &$print ) {
+               if (isset($q[$moduleName])) {
+                       $print[] = "*$name/[" . implode(',',
+                               array_map( function ($v) { return $v['title']; },
+                                               $q[$moduleName])) . ']';
+               }
+       }
+
+       /**
+        * Recursively merge the new result returned from the query to the previous results.
+        * @param mixed $results
+        * @param mixed $newResult
+        * @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' );
+               if ( !is_array( $results ) ) {
+                       $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
+               } else {
+                       $sort = null;
+                       foreach( $newResult as $key => $value ) {
+                               if ( !$numericIds && $sort === null ) {
+                                       if ( !is_array( $value ) ) {
+                                               $sort = false;
+                                       } elseif ( array_key_exists( 'title', $value ) ) {
+                                               $sort = function( $a, $b ) {
+                                                       return strcmp( $a['title'], $b['title'] );
+                                               };
+                                       } else {
+                                               $sort = false;
+                                       }
+                               }
+                               $keyExists = array_key_exists( $key, $results );
+                               if ( is_numeric( $key ) ) {
+                                       if ( $numericIds ) {
+                                               if ( !$keyExists ) {
+                                                       $results[$key] = $value;
+                                               } else {
+                                                       $this->mergeResult( $results[$key], $value );
+                                               }
+                                       } else {
+                                               $results[] = $value;
+                                       }
+                               } elseif ( !$keyExists ) {
+                                       $results[$key] = $value;
+                               } else {
+                                       $this->mergeResult( $results[$key], $value, $key === 'pages' );
+                               }
+                       }
+                       if ( $numericIds ) {
+                               ksort( $results, SORT_NUMERIC );
+                       } elseif ( $sort !== null && $sort !== false ) {
+                               uasort( $results, $sort );
+                       }
+               }
+       }
+}
diff --git a/tests/phpunit/includes/api/query/ApiQueryTestBase.php b/tests/phpunit/includes/api/query/ApiQueryTestBase.php
new file mode 100644 (file)
index 0000000..7b9f8ed
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+/**
+ *
+ *
+ * Created on Feb 10, 2013
+ *
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+
+/** This class has some common functionality for testing query module
+ */
+abstract class ApiQueryTestBase extends ApiTestCase {
+
+       const PARAM_ASSERT = <<<STR
+Each parameter must be an array of two elements,
+first - an array of params to the API call,
+and the second array - expected results as returned by the API
+STR;
+
+       /**
+        * Merges all requests parameter + expected values into one
+        * @param ... list of arrays, each of which contains exactly two
+        * @return array
+        */
+       protected function merge( /*...*/ ) {
+               $request = array();
+               $expected = array();
+               foreach ( func_get_args() as $v ) {
+                       list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
+                       $request = array_merge_recursive( $request, $req );
+                       $this->mergeExpected( $expected, $exp );
+               }
+               return array( $request, $expected );
+       }
+
+       /**
+        * Check that the parameter is a valid two element array,
+        * with the first element being API request and the second - expected result
+        */
+       private function validateRequestExpectedPair( $v ) {
+               $this->assertType( 'array', $v, self::PARAM_ASSERT );
+               $this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+               $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
+               $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
+               $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
+               $this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+               return $v;
+       }
+
+       /**
+        * Recursively merges the expected values in the $item into the $all
+        */
+       private function mergeExpected( &$all, $item ) {
+               foreach ( $item as $k => $v ) {
+                       if ( array_key_exists( $k, $all ) ) {
+                               if ( is_array ( $all[$k] ) ) {
+                                       $this->mergeExpected( $all[$k], $v );
+                               } else {
+                                       $this->assertEquals( $all[$k], $v );
+                               }
+                       } else {
+                               $all[$k] = $v;
+                       }
+               }
+       }
+
+       /**
+        * Checks that the request's result matches the expected results.
+        * @param $values array is a two element array( request, expected_results )
+        * @throws Exception
+        */
+       protected function check( $values ) {
+               list( $req, $exp ) = $this->validateRequestExpectedPair( $values );
+               if ( !array_key_exists( 'action', $req ) ) {
+                       $req['action'] = 'query';
+               }
+               foreach ( $req as &$val ) {
+                       if ( is_array( $val ) ) {
+                               $val = implode( '|', array_unique( $val ) );
+                       }
+               }
+               $result = $this->doApiRequest( $req );
+               $this->assertResult( array( 'query' => $exp ), $result[0], $req );
+       }
+
+       protected function assertResult( $exp, $result, $message = '' ) {
+               try {
+                       $this->assertResultRecursive( $exp, $result );
+               } catch ( Exception $e ) {
+                       if ( is_array( $message ) ) {
+                               $message = http_build_query( $message );
+                       }
+                       print( "\nRequest: $message\n" );
+                       print( "\nExpected:\n" );
+                       print_r( $exp );
+                       print( "\nResult:\n" );
+                       print_r( $result );
+                       throw $e; // rethrow it
+               }
+       }
+
+       /**
+        * Recursively compare arrays, ignoring mismatches in numeric key and pageids.
+        * @param $expected array expected values
+        * @param $result array returned values
+        */
+       private function assertResultRecursive( $expected, $result ) {
+               reset( $expected );
+               reset( $result );
+               while ( true ) {
+                       $e = each( $expected );
+                       $r = each( $result );
+                       // If either of the arrays is shorter, abort. If both are done, success.
+                       $this->assertEquals( (bool)$e, (bool)$r );
+                       if ( !$e ) {
+                               break; // done
+                       }
+                       // continue only if keys are identical or both keys are numeric
+                       $this->assertTrue( $e['key'] === $r['key'] || ( is_numeric( $e['key'] ) && is_numeric( $r['key'] ) ) );
+                       // don't compare pageids
+                       if ( $e['key'] !== 'pageid' ) {
+                               // If values are arrays, compare recursively, otherwise compare with ===
+                               if ( is_array( $e['value'] ) && is_array( $r['value'] ) ) {
+                                       $this->assertResultRecursive( $e['value'], $r['value'] );
+                               } else {
+                                       $this->assertEquals( $e['value'], $r['value'] );
+                               }
+                       }
+               }
+       }
+}
diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php
new file mode 100644 (file)
index 0000000..4cc8bd2
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class MessageCacheTest extends MediaWikiLangTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               MessageCache::singleton()->enable();
+       }
+
+       function addDBData() {
+               // be sure english messages under $key, not $key/en
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+               ) );
+
+               // Set up messages and fallbacks ab -> ru -> en
+               $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'en' );
+
+               // Fallbacks where ab does not exist
+               $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Partial', 'en' );
+
+               // Fallback to english
+               $this->makePage( 'FallbackLanguageTest-English', 'en' );
+
+               // Full key tests -- always want russian
+               $this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
+               $this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
+       }
+
+       /**
+        * Helper function for addDBData -- adds a simple page to the database
+        *
+        * @param string $title Title of page to be created
+        * @param string $lang  Language and content of the created page
+        */
+       protected function makePage( $title, $lang ) {
+               global $wgContLang;
+
+               $title = Title::newFromText(
+                       ($lang == $wgContLang->getCode()) ? $title : "$title/$lang",
+                       NS_MEDIAWIKI
+               );
+               $wikiPage = new WikiPage( $title );
+               $content = ContentHandler::makeContent( $lang, $title );
+               $wikiPage->doEditContent( $content, "$lang translation test case" );
+       }
+
+       /**
+        * Test message fallbacks, bug #1495
+        *
+        * @dataProvider provideMessagesForFallback
+        */
+       function testMessageFallbacks( $message, $lang, $expectedContent ) {
+               $result = MessageCache::singleton()->get( $message, true, $lang );
+               $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
+       }
+
+       function provideMessagesForFallback() {
+               return array(
+                       array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
+                       array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+                       array( 'FallbackLanguageTest-English', 'ab', 'en' ),
+                       array( 'FallbackLanguageTest-None', 'ab', false ),
+               );
+       }
+
+       /**
+        * There's a fallback case where the message key is given as fully qualified -- this
+        * should ignore the passed $lang and use the language from the key
+        *
+        * @dataProvider provideMessagesForFullKeys
+        */
+       function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+               $result = MessageCache::singleton()->get( $message, true, $lang, true );
+               $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
+       }
+
+       function provideMessagesForFullKeys() {
+               return array(
+                       array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
+                       array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
+                       array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
+               );
+       }
+
+}
index 9739f4c..263553a 100644 (file)
@@ -107,6 +107,22 @@ class TestORMRowTest extends ORMRowTest {
                );
        }
 
+       /**
+        * @since 1.21
+        * @return array
+        */
+       protected function getMockValues() {
+               return array(
+                       'id' => 1,
+                       'str' => 'foobar4645645',
+                       'int' => 42,
+                       'float' => 4.2,
+                       'bool' => '',
+                       'array' => array( 42, 'foobar' ),
+                       'blob' => new stdClass()
+               );
+       }
+
 }
 
 class TestORMRow extends ORMRow {}
index dac5edb..9fbf7bb 100644 (file)
@@ -387,6 +387,14 @@ class FileBackendTest extends MediaWikiTestCase {
                        $dest, // dest
                );
 
+               $op2 = $op;
+               $op2['ignoreMissingSource'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       self::baseStorePath() . '/unittest-cont-bad/e/file.txt', // source
+                       $dest, // dest
+               );
+
                return $cases;
        }
 
@@ -499,6 +507,14 @@ class FileBackendTest extends MediaWikiTestCase {
                        $dest, // dest
                );
 
+               $op2 = $op;
+               $op2['ignoreMissingSource'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       self::baseStorePath() . '/unittest-cont-bad/e/file.txt', // source
+                       $dest, // dest
+               );
+
                return $cases;
        }
 
@@ -582,6 +598,14 @@ class FileBackendTest extends MediaWikiTestCase {
                        true // succeeds
                );
 
+               $op['ignoreMissingSource'] = true;
+               $op['src'] = self::baseStorePath() . '/unittest-cont-bad/e/file.txt';
+               $cases[] = array(
+                       $op, // operation
+                       false, // without source
+                       true // succeeds
+               );
+
                return $cases;
        }
 
@@ -2024,54 +2048,97 @@ class FileBackendTest extends MediaWikiTestCase {
        private function doTestLockCalls() {
                $backendName = $this->backendClass();
 
-               for ( $i=0; $i<50; $i++ ) {
-                       $paths = array(
-                               "test1.txt",
-                               "test2.txt",
-                               "test3.txt",
-                               "subdir1",
-                               "subdir1", // duplicate
-                               "subdir1/test1.txt",
-                               "subdir1/test2.txt",
-                               "subdir2",
-                               "subdir2", // duplicate
-                               "subdir2/test3.txt",
-                               "subdir2/test4.txt",
-                               "subdir2/subdir",
-                               "subdir2/subdir/test1.txt",
-                               "subdir2/subdir/test2.txt",
-                               "subdir2/subdir/test3.txt",
-                               "subdir2/subdir/test4.txt",
-                               "subdir2/subdir/test5.txt",
-                               "subdir2/subdir/sub",
-                               "subdir2/subdir/sub/test0.txt",
-                               "subdir2/subdir/sub/120-px-file.txt",
-                       );
+               $paths = array(
+                       "test1.txt",
+                       "test2.txt",
+                       "test3.txt",
+                       "subdir1",
+                       "subdir1", // duplicate
+                       "subdir1/test1.txt",
+                       "subdir1/test2.txt",
+                       "subdir2",
+                       "subdir2", // duplicate
+                       "subdir2/test3.txt",
+                       "subdir2/test4.txt",
+                       "subdir2/subdir",
+                       "subdir2/subdir/test1.txt",
+                       "subdir2/subdir/test2.txt",
+                       "subdir2/subdir/test3.txt",
+                       "subdir2/subdir/test4.txt",
+                       "subdir2/subdir/test5.txt",
+                       "subdir2/subdir/sub",
+                       "subdir2/subdir/sub/test0.txt",
+                       "subdir2/subdir/sub/120-px-file.txt",
+               );
 
+               for ( $i=0; $i<25; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
                        $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
 
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
                        $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
 
                        $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName). ($i)" );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
+
+                       ## Flip the acquire/release ordering around ##
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
                        $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
 
                        $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName). ($i)" );
                        $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
+                               "Locking of files succeeded ($backendName) ($i)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName) ($i)." );
                }
+
+               $status = Status::newGood();
+               $sl = $this->backend->getScopedFileLocks( $paths, LockManager::LOCK_EX, $status );
+               $this->assertType( 'ScopedLock', $sl,
+                       "Scoped locking of files succeeded ($backendName)." );
+               $this->assertEquals( array(), $status->errors,
+                       "Scoped locking of files succeeded ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Scoped locking of files succeeded with OK status ($backendName)." );
+
+               ScopedLock::release( $sl );
+               $this->assertEquals( null, $sl,
+                       "Scoped unlocking of files succeeded ($backendName)." );
+               $this->assertEquals( array(), $status->errors,
+                       "Scoped unlocking of files succeeded ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Scoped unlocking of files succeeded with OK status ($backendName)." );
        }
 
        // test helper wrapper for backend prepare() function
index 86fd95c..99ec05d 100644 (file)
@@ -29,6 +29,7 @@
  * Requires PHPUnit.
  *
  * @ingroup UtfNormal
+ * @group Large
  */
 class CleanUpTest extends MediaWikiTestCase {
        /** @todo document */
index f3dd0a0..88b07f0 100644 (file)
@@ -15,6 +15,7 @@ class BagOStuffTest extends MediaWikiTestCase {
                        $name = $this->getCliArg( 'use-bagostuff=' );
 
                        $this->cache = ObjectCache::newFromId( $name );
+
                } else {
                        // no type defined - use simple hash
                        $this->cache = new HashBagOStuff;
@@ -104,4 +105,34 @@ class BagOStuffTest extends MediaWikiTestCase {
                        }
                }
        }
+
+       public function testAdd() {
+               $key = wfMemcKey( 'test' );
+               $this->assertTrue( $this->cache->add( $key, 'test' ) );
+       }
+
+       public function testGet() {
+               $value = array( 'this' => 'is', 'a' => 'test' );
+
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, $value );
+               $this->assertEquals( $this->cache->get( $key ), $value );
+       }
+
+       public function testGetMulti() {
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+               $key1 = wfMemcKey( 'test1' );
+               $key2 = wfMemcKey( 'test2' );
+
+               $this->cache->add( $key1, $value1 );
+               $this->cache->add( $key2, $value2 );
+
+               $this->assertEquals( $this->cache->getMulti( array( $key1, $key2 ) ), array( $key1 => $value1, $key2 => $value2 ) );
+
+               // cleanup
+               $this->cache->delete( $key1 );
+               $this->cache->delete( $key2 );
+       }
 }
index f8d0c37..bf6931a 100644 (file)
@@ -16,6 +16,7 @@ class NewParserTest extends MediaWikiTestCase {
 
        public $keepUploads = false;
        public $runDisabled = false;
+       public $runParsoid = false;
        public $regex = '';
        public $showProgress = true;
        public $savedInitialGlobals = array();
index efb6de6..bd0c759 100644 (file)
@@ -10,13 +10,13 @@ class LanguageLvTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
+               $forms = array( 'zero', 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
                return array(
-                       array( 'other', 0 ), #this must be zero form as per CLDR
+                       array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
                        array( 'one', 21 ),
index 9de6722..7647144 100644 (file)
@@ -902,57 +902,57 @@ class LanguageTest extends LanguageClassesTestCase {
                return array(
                        array(
                                0,
-                               "0bps",
+                               "0 bps",
                                "0 bits per second"
                        ),
                        array(
                                999,
-                               "999bps",
+                               "999 bps",
                                "999 bits per second"
                        ),
                        array(
                                1000,
-                               "1kbps",
+                               "1 kbps",
                                "1 kilobit per second"
                        ),
                        array(
                                1000 * 1000,
-                               "1Mbps",
+                               "1 Mbps",
                                "1 megabit per second"
                        ),
                        array(
                                pow( 10, 9 ),
-                               "1Gbps",
+                               "1 Gbps",
                                "1 gigabit per second"
                        ),
                        array(
                                pow( 10, 12 ),
-                               "1Tbps",
+                               "1 Tbps",
                                "1 terabit per second"
                        ),
                        array(
                                pow( 10, 15 ),
-                               "1Pbps",
+                               "1 Pbps",
                                "1 petabit per second"
                        ),
                        array(
                                pow( 10, 18 ),
-                               "1Ebps",
+                               "1 Ebps",
                                "1 exabit per second"
                        ),
                        array(
                                pow( 10, 21 ),
-                               "1Zbps",
+                               "1 Zbps",
                                "1 zetabit per second"
                        ),
                        array(
                                pow( 10, 24 ),
-                               "1Ybps",
+                               "1 Ybps",
                                "1 yottabit per second"
                        ),
                        array(
                                pow( 10, 27 ),
-                               "1,000Ybps",
+                               "1,000 Ybps",
                                "1,000 yottabits per second"
                        ),
                );
@@ -1226,6 +1226,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        function providePluralData() {
+               // Params are: [expected text, number given, [the plural forms]]
                return array(
                        array( 'plural', 0, array(
                                'singular', 'plural'
@@ -1242,8 +1243,8 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'plural', 3, array(
                                '0=explicit zero', '1=explicit one', 'singular', 'plural'
                        ) ),
-                       array( 'explicit elevan', 11, array(
-                               'singular', 'plural', '11=explicit elevan',
+                       array( 'explicit eleven', 11, array(
+                               'singular', 'plural', '11=explicit eleven',
                        ) ),
                        array( 'plural', 12, array(
                                'singular', 'plural', '11=explicit twelve',
@@ -1251,6 +1252,9 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'plural', 12, array(
                                'singular', 'plural', '=explicit form',
                        ) ),
+                       array( 'other', 2, array(
+                               'kissa=kala', '1=2=3', 'other',
+                       ) ),
                );
        }
 
index 235e9ad..741f8b7 100644 (file)
@@ -92,7 +92,7 @@ class MaintenanceFixup extends Maintenance {
                        // Someone generated a MaintenanceFixup instance without calling
                        // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
                        // flag this illegal usage. However, we are already in a destruktor, which
-                       // would trigger undefined behaviour. Hence, we can only report to the
+                       // would trigger undefined behavior. Hence, we can only report to the
                        // error output :( Hopefully people read the PHPUnit output.
                        $name = $this->testCase->getName();
                        fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " for test $name "
@@ -184,7 +184,7 @@ class MaintenanceTest extends MediaWikiTestCase {
        // Although the following tests do not seem to be too consistent (compare for
        // example the newlines within the test.*StringString tests, or the
        // test.*Intermittent.* tests), the objective of these tests is not to describe
-       // consistent behaviour, but rather currently existing behaviour.
+       // consistent behavior, but rather currently existing behavior.
 
 
        function testOutputEmpty() {
index cce5dde..2ec0744 100755 (executable)
@@ -47,6 +47,12 @@ class PHPUnitMaintClass extends Maintenance {
                $wgLocaltimezone = 'UTC';
 
                $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+
+               // Bug 44192 Do not attempt to send a real e-mail
+               Hooks::clear( 'AlternateUserMailer' );
+               Hooks::register( 'AlternateUserMailer',
+                       function() { return false; }
+               );
        }
 
        public function execute() {
index 77db213..62dd81a 100644 (file)
@@ -5,7 +5,9 @@
 
        var mwTestIgnore, mwTester,
                addons,
-               envExecCount;
+               envExecCount,
+               ELEMENT_NODE = 1,
+               TEXT_NODE = 3;
 
        /**
         * Add bogus to url to prevent IE crazy caching
                return $.when.apply( $, altPromises );
        };
 
+       /**
+        * Recursively convert a node to a plain object representing its structure.
+        * Only considers attributes and contents (elements and text nodes).
+        * Attribute values are compared strictly and not normalised.
+        *
+        * @param {Node} node
+        * @return {Object|string} Plain JavaScript value representing the node.
+        */
+       function getDomStructure( node ) {
+               var $node, children, processedChildren, i, len, el;
+               $node = $( node );
+               if ( node.nodeType === ELEMENT_NODE ) {
+                       children = $node.contents();
+                       processedChildren = [];
+                       for ( i = 0, len = children.length; i < len; i++ ) {
+                               el = children[i];
+                               if ( el.nodeType === ELEMENT_NODE || el.nodeType === TEXT_NODE ) {
+                                       processedChildren.push( getDomStructure( el ) );
+                               }
+                       }
+
+                       return {
+                               tagName: node.tagName,
+                               attributes: $node.getAttrs(),
+                               contents: processedChildren
+                       };
+               } else {
+                       // Should be text node
+                       return $node.text();
+               }
+       }
+
+       /**
+        * Gets structure of node for this HTML.
+        *
+        * @param {string} html HTML markup for one or more nodes.
+        */
+       function getHtmlStructure( html ) {
+               var el = $( '<div>' ).append( html )[0];
+               return getDomStructure( el );
+       }
+
        /**
         * Add-on assertion helpers
         */
                // Expect numerical value greater than or equal to X
                gtOrEq: function ( actual, expected, message ) {
                        QUnit.push( actual >= expected, actual, 'greater than or equal to ' + expected, message );
+               },
+
+               /**
+                * Asserts that two HTML strings are structurally equivalent.
+                *
+                * @param {string} actualHtml Actual HTML markup.
+                * @param {string} expectedHtml Expected HTML markup
+                * @param {string} message Assertion message.
+                */
+               htmlEqual: function ( actualHtml, expectedHtml, message ) {
+                       var actual = getHtmlStructure( actualHtml ),
+                               expected = getHtmlStructure( expectedHtml );
+
+                       QUnit.push(
+                               QUnit.equiv(
+                                       actual,
+                                       expected
+                               ),
+                               actual,
+                               expected,
+                               message
+                       );
+               },
+
+               /**
+                * Asserts that two HTML strings are not structurally equivalent.
+                *
+                * @param {string} actualHtml Actual HTML markup.
+                * @param {string} expectedHtml Expected HTML markup.
+                * @param {string} message Assertion message.
+                */
+               notHtmlEqual: function ( actualHtml, expectedHtml, message ) {
+                       var actual = getHtmlStructure( actualHtml ),
+                               expected = getHtmlStructure( expectedHtml );
+
+                       QUnit.push(
+                               !QUnit.equiv(
+                                       actual,
+                                       expected
+                               ),
+                               actual,
+                               expected,
+                               message
+                       );
                }
        };
 
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
 
+       QUnit.test( 'htmlEqual', 8, function ( assert ) {
+               assert.htmlEqual(
+                       '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
+                       '<div><p data-length=\'10\'  class=\'some classes\'>Child paragraph with <a href=\'http://example.com\' >A link</a></p>Regular text<span>A span</span></div>',
+                       'Attribute order, spacing and quotation marks (equal)'
+               );
+
+               assert.notHtmlEqual(
+                       '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
+                       '<div><p data-length=\'10\'  class=\'some more classes\'>Child paragraph with <a href=\'http://example.com\' >A link</a></p>Regular text<span>A span</span></div>',
+                       'Attribute order, spacing and quotation marks (not equal)'
+               );
+
+               assert.htmlEqual(
+                       '<label for="firstname" accesskey="f" class="important">First</label><input id="firstname" /><label for="lastname" accesskey="l" class="minor">Last</label><input id="lastname" />',
+                       '<label for="firstname" accesskey="f" class="important">First</label><input id="firstname" /><label for="lastname" accesskey="l" class="minor">Last</label><input id="lastname" />',
+                       'Multiple root nodes (equal)'
+               );
+
+               assert.notHtmlEqual(
+                       '<label for="firstname" accesskey="f" class="important">First</label><input id="firstname" /><label for="lastname" accesskey="l" class="minor">Last</label><input id="lastname" />',
+                       '<label for="firstname" accesskey="f" class="important">First</label><input id="firstname" /><label for="lastname" accesskey="l" class="important" >Last</label><input id="lastname" />',
+                       'Multiple root nodes (not equal, last label node is different)'
+               );
+
+               assert.htmlEqual(
+                       'fo&quot;o<br/>b&gt;ar',
+                       'fo"o<br/>b>ar',
+                       'Extra escaping is equal'
+               );
+               assert.notHtmlEqual(
+                       'foo&lt;br/&gt;bar',
+                       'foo<br/>bar',
+                       'Text escaping (not equal)'
+               );
+
+               assert.htmlEqual(
+                       'foo<a href="http://example.com">example</a>bar',
+                       'foo<a href="http://example.com">example</a>bar',
+                       'Outer text nodes are compared (equal)'
+               );
+
+               assert.notHtmlEqual(
+                       'foo<a href="http://example.com">example</a>bar',
+                       'foo<a href="http://example.com">example</a>quux',
+                       'Outer text nodes are compared (last text node different)'
+               );
+
+       } );
+
        QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Teardown', 3, function ( assert ) {
index 97e0533..39ae363 100644 (file)
@@ -17,7 +17,7 @@
                assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
                assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
 
-               // Perhaps this is a bug in colorUtil, but it is the current behaviour so, let's keep
+               // Perhaps this is a bug in colorUtil, but it is the current behavior so, let's keep
                // track of it, so we will know in case it would ever change.
                assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
 
index 5fae065..7571b92 100644 (file)
@@ -40,7 +40,7 @@
                assert.strictEqual( $.isEmpty( [] ), true, 'isEmpty: []' );
                assert.strictEqual( $.isEmpty( {} ), true, 'isEmpty: {}' );
 
-               // Documented behaviour
+               // Documented behavior
                assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
        } );
 
index f23964c..0a9df96 100644 (file)
@@ -81,7 +81,7 @@
                        } );
        }
 
-       QUnit.test( 'Replace', 7, function ( assert ) {
+       QUnit.test( 'Replace', 9, function ( assert ) {
                var parser = mw.jqueryMsg.getMessageFunction();
 
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
@@ -90,7 +90,6 @@
                assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
                assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
 
-               /* Temporarily disabling until 2013-03 --Kaldari
                mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
 
                assert.equal(
                        'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
                        'Replacement is not considered html'
                );
-               */
 
                mw.messages.set( 'object-replace', 'Foo $1' );
 
index 45c3c5a..e8663f8 100644 (file)
                assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
        } );
 
-       QUnit.test( 'mw.Map', 17, function ( assert ) {
+       QUnit.test( 'mw.Map', 27, function ( assert ) {
                var arry, conf, funky, globalConf, nummy, someValues;
 
-               assert.ok( mw.Map, 'mw.Map defined' );
-
                conf = new mw.Map();
                // Dummy variables
                funky = function () {};
                arry = [];
                nummy = 7;
 
-               // Tests for input validation
-               assert.strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
-               assert.strictEqual( conf.set( 'myKey', 'myValue' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
+               // Single get and set
+
+               assert.strictEqual( conf.set( 'foo', 'Bar' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
+               assert.equal( conf.get( 'foo' ), 'Bar', 'Map.get returns a single value value correctly' );
+
+               assert.strictEqual( conf.get( 'example' ), null, 'Map.get returns null if selection was a string and the key was not found' );
+               assert.strictEqual( conf.get( 'example', arry ), arry, 'Map.get returns fallback by reference if the key was not found' );
+               assert.strictEqual( conf.get( 'example', undefined ), undefined, 'Map.get supports `undefined` as fallback instead of `null`' );
+
+               assert.strictEqual( conf.get( 'constructor' ), null, 'Map.get does not look at Object.prototype of internal storage (constructor)' );
+               assert.strictEqual( conf.get( 'hasOwnProperty' ), null, 'Map.get does not look at Object.prototype of internal storage (hasOwnProperty)' );
+
+               conf.set( 'hasOwnProperty', function () { return true; } );
+               assert.strictEqual( conf.get( 'example', 'missing' ), 'missing', 'Map.get uses neutral hasOwnProperty method (positive)' );
+
+               conf.set( 'example', 'Foo' );
+               conf.set( 'hasOwnProperty', function () { return false; } );
+               assert.strictEqual( conf.get( 'example' ), 'Foo', 'Map.get uses neutral hasOwnProperty method (negative)' );
+
+               assert.strictEqual( conf.set( 'constructor', 42 ), true, 'Map.set for key "constructor"' );
+               assert.strictEqual( conf.get( 'constructor' ), 42, 'Map.get for key "constructor"' );
+
+               assert.strictEqual( conf.set( 'ImUndefined', undefined ), true, 'Map.set allows setting value to `undefined`' );
+               assert.equal( conf.get( 'ImUndefined', 'fallback' ), undefined , 'Map.get supports retreiving value of `undefined`' );
+
                assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
-               assert.equal( conf.get( 'myKey' ), 'myValue', 'Map.get returns a single value value correctly' );
-               assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
+
                assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
+               assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
+
+               conf.set( String( nummy ), 'I used to be a number' );
+
+               assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
+               assert.strictEqual( conf.exists( 'ImUndefined' ), true, 'Map.exists where value is `undefined`' );
+               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists where key is invalid but looks like an existing key' );
 
                // Multiple values at once
                someValues = {
                        'notExist': null
                }, 'Map.get return includes keys that were not found as null values' );
 
-               assert.strictEqual( conf.exists( 'foo' ), true, 'Map.exists returns boolean true if a key exists' );
-               assert.strictEqual( conf.exists( 'notExist' ), false, 'Map.exists returns boolean false if a key does not exists' );
 
                // Interacting with globals and accessing the values object
                assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
 
                conf.set( 'globalMapChecker', 'Hi' );
 
-               assert.ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
+               assert.ok( 'globalMapChecker' in window === false, 'new mw.Map did not store its values in the global window object by default' );
 
                globalConf = new mw.Map( true );
                globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
                mw.loader.implement(
                        'test.implement.a',
                        function () {
-                               assert.equal(
-                                       $element.css( 'float' ),
-                                       'right',
-                                       'style is applied'
-                               );
+                               QUnit.stop();
+                               setTimeout(function () {
+                                       assert.equal(
+                                               $element.css( 'float' ),
+                                               'right',
+                                               'style is applied'
+                                       );
+                                       QUnit.start();
+                               });
                        },
                        {
                                'all': '.mw-test-implement-a { float: right; }'
                mw.loader.implement(
                        'test.implement.c',
                        function () {
-                               assert.equal(
-                                       $element.css( 'float' ),
-                                       'right',
-                                       'style is applied'
-                               );
+                               QUnit.stop();
+                               setTimeout(function () {
+                                       assert.equal(
+                                               $element.css( 'float' ),
+                                               'right',
+                                               'style is applied'
+                                       );
+                                       QUnit.start();
+                               });
                        },
                        {
                                'all': '.mw-test-implement-c { float: right; }'
index 3fbc831..9efa509 100644 (file)
@@ -21,8 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
  */
 
 class SeleniumServerManager {
index d6b7cb8..4583360 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiButtonsAvailabilityTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
-
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
@@ -35,7 +30,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  * Test Case Name :'Back' and 'Continue' button availability
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 76a794c..6375d66 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiDifferentDatabaseAccountTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
-
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
@@ -35,7 +30,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  * Test Case Name : Install MediaWiki with different Database accounts for web access.
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiDifferentDatabaseAccountTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 2c879c3..fad4e06 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiDifferntDatabasePrefixTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
@@ -35,7 +31,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  *                  database prefixes(Share one database between multiple wikis).
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiDifferntDatabasePrefixTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 7eb6d38..37f5af2 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiErrorsConnectToDatabasePageTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index e3d4266..536ceb6 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiErrorsNamepageTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+
 /**
  * Test Case ID   : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
  * Test Case Name : Invalid/ blank values for fields in 'Name' page.
  * Version        : MediaWiki 1.18alpha
  */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
 class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 961f692..f0efce6 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiHelpFieldHintTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+
 /**
  * Test Case ID   : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
  * Test Case Name : Help field hint availability for the fields.
  * Version        : MediaWiki 1.18alpha
  */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
 class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 06bad30..a9a8fc3 100644 (file)
@@ -21,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
index 2663f65..86a4624 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiInstallationConfig
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index f63c2eb..2b7d48e 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiInstallationConfig
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index b271c7e..3d7996b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiInstallationConfig
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index f179113..6946cc7 100644 (file)
@@ -21,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 if ( PHP_SAPI != 'cli' ) {
index 0aa9d41..92f26d0 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiOnAlreadyInstalledTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
index aa307b7..e9be370 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiMySQLiteataBaseTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index 7f6dfe3..ce27500 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 
index 325ee1a..f34210c 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiRestartInstallationTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
-
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
@@ -35,7 +30,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  * Test Case Name : Install mediawiki on a already installed Mediawiki.
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiRestartInstallationTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 87e7ee3..039d71a 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiRightFrameworkLinksTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
@@ -37,7 +33,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  *                  User selects 'Upgrading' link.
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiRightFrameworkLinksTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index 56634ec..cd901d1 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiUpgradeExistingDatabaseTestCase
  *
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
-
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
@@ -35,7 +30,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  * Test Case Name : Install Mediawiki by updating the existing database.
  * Version        : MediaWiki 1.18alpha
  */
-
 class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index b2fa7e6..9733152 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * MediaWikiUserInterfaceTestCase
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
  */
 
 require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
@@ -35,8 +31,6 @@ require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
  * Database settings/ Name/ Options/ Install/ Complete/ Restart Inslation pages
  * Version        : MediaWiki 1.18alpha
  */
-
-
 class MediaWikiUserInterfaceTestCase extends MediaWikiInstallationCommonFunction {
        function setUp() {
                parent::setUp();
index a74efc5..2803ff2 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class AddContentToNewPageTestCase extends SeleniumTestCase {
index 19dc927..c70af33 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class AddNewPageTestCase extends SeleniumTestCase {
index e29f2c7..a603f99 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 Class CreateAccountTestCase extends SeleniumTestCase {
index eb25f8b..f0005cd 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class DeletePageAdminTestCase extends SeleniumTestCase {
index 81310b1..77282e4 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class EmailPasswordTestCase extends SeleniumTestCase {
index aeb2315..7fd8e07 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class MediaWikiEditorConfig {
index 3964dc1..d2eaa40 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class MovePageTestCase extends SeleniumTestCase {
index 730323d..81e3a4d 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
index bc7c768..842108f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
index bde1b57..5fdc5c8 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class PageSearchTestCase extends SeleniumTestCase {
index 615c23c..036201f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class PreviewPageTestCase extends SeleniumTestCase {
index 80eacc5..1e4cc2d 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class SavePageTestCase extends SeleniumTestCase {
index a68ea97..c70e38f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Selenium server manager
  *
@@ -22,9 +21,6 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
  */
 
 class UserPreferencesTestCase extends SeleniumTestCase {
index 1e51d80..02fcf24 100644 (file)
@@ -450,6 +450,7 @@ class TestFileIterator implements Iterator {
                                        }
 
                                        if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+                                               || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runParsoid )
                                                || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
                                        ) {
                                                # disabled test
index db388d2..2a57d4a 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of thumb.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 20d681b..f160c87 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Version of thumb_handler.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by