Merge "Make TOC hideable"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 24 Oct 2013 19:22:32 +0000 (19:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 24 Oct 2013 19:22:32 +0000 (19:22 +0000)
514 files changed:
RELEASE-NOTES-1.22
RELEASE-NOTES-1.23 [new file with mode: 0644]
cache/.htaccess [changed mode: 0644->0755]
docs/hooks.txt
includes/AutoLoader.php
includes/ChangesList.php [deleted file]
includes/DefaultSettings.php
includes/EditPage.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/Linker.php
includes/Message.php
includes/OutputPage.php
includes/ProxyTools.php
includes/RecentChange.php [deleted file]
includes/Revision.php
includes/SkinTemplate.php
includes/SpecialPageFactory.php
includes/Status.php
includes/Title.php
includes/WikiPage.php
includes/cache/MessageCache.php
includes/changes/ChangesList.php [new file with mode: 0644]
includes/changes/EnhancedChangesList.php [new file with mode: 0644]
includes/changes/OldChangesList.php [new file with mode: 0644]
includes/changes/RCCacheEntry.php [new file with mode: 0644]
includes/changes/RecentChange.php [new file with mode: 0644]
includes/db/Database.php
includes/diff/DairikiDiff.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/QuorumLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php
includes/filerepo/file/LocalFile.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerPage.php
includes/job/JobQueue.php
includes/job/JobQueueFederated.php
includes/limit.sh
includes/objectcache/RedisBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/rcfeed/RedisPubSubFeedEngine.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/specials/SpecialBlockme.php [deleted file]
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWatchlist.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
languages/LanguageConverter.php
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDv.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.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/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLi.php
languages/messages/MessagesLoz.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNah.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTo.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/archives/patch-change_tag.sql
maintenance/archives/patch-tag_summary.sql [new file with mode: 0644]
maintenance/archives/patch-valid_tag.sql [new file with mode: 0644]
maintenance/deleteEqualMessages.php
maintenance/fuzz-tester.php
maintenance/importImages.php
maintenance/jsduck/categories.json
maintenance/language/messages.inc
maintenance/proxyCheck.php [deleted file]
resources/Resources.php
resources/jquery/jquery.tablesorter.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki/mediawiki.inspect.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.notification.js
resources/mediawiki/mediawiki.notify.js
resources/mediawiki/mediawiki.util.js
tests/TestsAutoLoader.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/ArticleTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExternalStoreTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FallbackTest.php [new file with mode: 0644]
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HTMLCheckMatrixTest.php
tests/phpunit/includes/HashRingTest.php
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/IPTest.php
tests/phpunit/includes/LanguageConverterTest.php
tests/phpunit/includes/LicensesTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LocalFileTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/Providers.php [deleted file]
tests/phpunit/includes/RecentChangeTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/ResourceLoaderTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SanitizerValidateEmailTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TimestampTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UIDGeneratorTest.php
tests/phpunit/includes/UserMailerTest.php [new file with mode: 0644]
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
tests/phpunit/includes/XmlJsTest.php
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/XmlTypeCheckTest.php
tests/phpunit/includes/ZipDirectoryReaderTest.php
tests/phpunit/includes/api/ApiAccountCreationTest.php [deleted file]
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiCreateAccountTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestContext.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiUnblockTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/MockApi.php [new file with mode: 0644]
tests/phpunit/includes/api/PrefixUniquenessTest.php
tests/phpunit/includes/api/UserWrapper.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatJsonTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatTestBase.php
tests/phpunit/includes/api/format/ApiFormatWddxTest.php [new file with mode: 0644]
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/FileRepoTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/installer/OracleInstallerTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/IEUrlExtensionTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/FakeDimensionFile.php [new file with mode: 0644]
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/GIFMetadataExtractorTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/MediaHandlerTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/media/XMPValidateTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchUpdateTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/site/SiteSQLStoreTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/languages/LanguageAmTest.php
tests/phpunit/languages/LanguageArTest.php
tests/phpunit/languages/LanguageBeTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageBhoTest.php
tests/phpunit/languages/LanguageBsTest.php
tests/phpunit/languages/LanguageClassesTestCase.php
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageDsbTest.php
tests/phpunit/languages/LanguageFrTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHiTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHsbTest.php
tests/phpunit/languages/LanguageHuTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLnTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMgTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMlTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.php
tests/phpunit/languages/LanguageNlTest.php
tests/phpunit/languages/LanguageNsoTest.php
tests/phpunit/languages/LanguagePlTest.php
tests/phpunit/languages/LanguageRoTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageSeTest.php
tests/phpunit/languages/LanguageSgsTest.php
tests/phpunit/languages/LanguageShTest.php
tests/phpunit/languages/LanguageSkTest.php
tests/phpunit/languages/LanguageSlTest.php
tests/phpunit/languages/LanguageSmaTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTiTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/LanguageUkTest.php
tests/phpunit/languages/LanguageUzTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_LogTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/maintenance/getSlaveServerTest.php
tests/phpunit/skins/SideBarTest.php
tests/qunit/suites/resources/jquery/jquery.localize.test.js

index b988294..091a04a 100644 (file)
@@ -61,6 +61,9 @@ production.
 * The precise format of metric datagrams produced by the UDP profiler and stats counter
   may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
   respectively.
+* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and
+  $wgProxyMemcExpiry have been removed, along with the open proxy scanner
+  script they were added for.
 
 === New features in 1.22 ===
 * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
@@ -73,6 +76,8 @@ production.
   version of the Vector extension as this feature may conflict.
 * New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
   compact vertical form layout.
+* HTMLForm supports a new display format 'vform' which applies this compact vertical
+  layout and button styling. Special:PasswordReset uses this format.
 * New versions of login (Special:UserLogin) and create account
   (Special:UserLogin/signup) forms using the "vform" compact vertical form layout.
   These forms use new messages that assume a "Help logging in" link, see
@@ -246,6 +251,14 @@ production.
   tables.
 * Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
   output in a HTML comment.
+* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object
+  instead of just a boolean return value to abort the hook.
+* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions
+  with custom recentchanges entries to hook into the Watchlist without 
+  clobbering each other.
+* A hidden, empty input field was added to the edit form, and any edit that fills
+  it in will be rejected. This prevents against the simplest form of spambots.
+  Previously in the "SimpleAntiSpam" extension by Ryan Schmidt.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
@@ -331,6 +344,8 @@ production.
 * (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
   MySQL error when installing using the binary character set option.
 * (bug 45288) Support mysqli PHP extension
+* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
+  This resolves an infinite loop when using $wgDebugFunctionEntry = true.
 
 === API changes in 1.22 ===
 * (bug 25553) The JSON output formatter now leaves forward slashes unescaped
@@ -369,7 +384,7 @@ production.
   user blocks.
 * (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
   rather than using the content model of the page "API".
-* action=watch may now return errors.
+* action=watch no longer silently ignores hook abort.
 * (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks
   jobs in the job queue for link table updates of pages that use the given page
   as a template. Instead, forcerecursivelinkupdate=1 is introduced and should
@@ -498,6 +513,8 @@ changes to languages because of Bugzilla reports.
   to the Vector skin in core.
 * SpecialRecentChanges::addRecentChangesJS() function has been renamed
   to addModules() and made protected.
+* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status
+  object instead of a boolean.
 
 == Compatibility ==
 
diff --git a/RELEASE-NOTES-1.23 b/RELEASE-NOTES-1.23
new file mode 100644 (file)
index 0000000..372170a
--- /dev/null
@@ -0,0 +1,89 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.23 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.23 ===
+
+=== New features in 1.23 ===
+
+=== Bug fixes in 1.23 ===
+
+=== API changes in 1.23 ===
+
+=== Languages updated in 1.23===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+=== Other changes in 1.23 ===
+
+== Compatibility ==
+
+MediaWiki 1.23 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
+Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.23 has several database changes since 1.22, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.21.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
old mode 100644 (file)
new mode 100755 (executable)
index 53993de..5aaf596 100644 (file)
@@ -866,10 +866,6 @@ etc.
 'DatabaseOraclePostInit': Called after initialising an Oracle database
 &$db: the DatabaseOracle object
 
-'Debug': Called when outputting a debug log line via wfDebug() or wfDebugLog()
-$text: plaintext string to be output
-$group: null or a string naming a logging group (as defined in $wgDebugLogGroups)
-
 'NewDifferenceEngine': Called when a new DifferenceEngine object is made
 $title: the diff page title (nullable)
 &$oldId: the actual old Id to use in the diff
@@ -2369,6 +2365,11 @@ $special: the special page object
 &$fields: array of query fields
 $values: array of variables with watchlist options
 
+'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
+SpecialWatchlist. Allows extensions to register custom values they have 
+inserted to rc_type so they can be returned as part of the watchlist.
+&$nonRevisionTypes: array of values in the rc_type field of recentchanges table
+
 'TestCanonicalRedirect': Called when about to force a redirect to a canonical
 URL for a title when we have no other parameters on the URL. Gives a chance for
 extensions that alter page view behavior radically to abort that redirect or
index 652fa54..0706fe3 100644 (file)
@@ -55,7 +55,6 @@ $wgAutoloadLocalClasses = array(
        'CdbWriter_DBA' => 'includes/Cdb.php',
        'CdbWriter_PHP' => 'includes/Cdb_PHP.php',
        'ChangesFeed' => 'includes/ChangesFeed.php',
-       'ChangesList' => 'includes/ChangesList.php',
        'ChangeTags' => 'includes/ChangeTags.php',
        'ChannelFeed' => 'includes/Feed.php',
        'Collation' => 'includes/Collation.php',
@@ -87,7 +86,6 @@ $wgAutoloadLocalClasses = array(
        'DumpPipeOutput' => 'includes/Export.php',
        'EditPage' => 'includes/EditPage.php',
        'EmailNotification' => 'includes/UserMailer.php',
-       'EnhancedChangesList' => 'includes/ChangesList.php',
        'ErrorPageError' => 'includes/Exception.php',
        'ExplodeIterator' => 'includes/StringUtils.php',
        'FakeTitle' => 'includes/FakeTitle.php',
@@ -178,7 +176,6 @@ $wgAutoloadLocalClasses = array(
        'MWHttpRequest' => 'includes/HttpFunctions.php',
        'MWInit' => 'includes/Init.php',
        'MWNamespace' => 'includes/Namespace.php',
-       'OldChangesList' => 'includes/ChangesList.php',
        'OutputPage' => 'includes/OutputPage.php',
        'Page' => 'includes/WikiPage.php',
        'PageQueryPage' => 'includes/PageQueryPage.php',
@@ -200,10 +197,8 @@ $wgAutoloadLocalClasses = array(
        'QueryPage' => 'includes/QueryPage.php',
        'QuickTemplate' => 'includes/SkinTemplate.php',
        'RawMessage' => 'includes/Message.php',
-       'RCCacheEntry' => 'includes/ChangesList.php',
        'RdfMetaData' => 'includes/Metadata.php',
        'ReadOnlyError' => 'includes/Exception.php',
-       'RecentChange' => 'includes/RecentChange.php',
        'RedirectSpecialArticle' => 'includes/SpecialPage.php',
        'RedirectSpecialPage' => 'includes/SpecialPage.php',
        'RegexlikeReplacer' => 'includes/StringUtils.php',
@@ -457,6 +452,13 @@ $wgAutoloadLocalClasses = array(
        'TitleDependency' => 'includes/cache/CacheDependency.php',
        'TitleListDependency' => 'includes/cache/CacheDependency.php',
 
+       # includes/changes
+       'ChangesList' => 'includes/changes/ChangesList.php',
+       'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
+       'OldChangesList' => 'includes/changes/OldChangesList.php',
+       'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
+       'RecentChange' => 'includes/changes/RecentChange.php',
+
        # includes/clientpool
        'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
        'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
@@ -849,6 +851,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/rcfeed
        'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
+       'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php',
        'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php',
        'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
        'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
@@ -971,7 +974,6 @@ $wgAutoloadLocalClasses = array(
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => 'includes/specials/SpecialBlock.php',
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
-       'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
        'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
        'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
        'SpecialCategories' => 'includes/specials/SpecialCategories.php',
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
deleted file mode 100644 (file)
index 9c441af..0000000
+++ /dev/null
@@ -1,1334 +0,0 @@
-<?php
-/**
- * Classes to show lists of changes.
- *
- * These can be:
- * - watchlist
- * - related changes
- * - recent changes
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @todo document
- */
-class RCCacheEntry extends RecentChange {
-       var $secureName, $link;
-       var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
-       var $userlink, $timestamp, $watched;
-
-       /**
-        * @param $rc RecentChange
-        * @return RCCacheEntry
-        */
-       static function newFromParent( $rc ) {
-               $rc2 = new RCCacheEntry;
-               $rc2->mAttribs = $rc->mAttribs;
-               $rc2->mExtra = $rc->mExtra;
-               return $rc2;
-       }
-}
-
-/**
- * Base class for all changes lists
- */
-class ChangesList extends ContextSource {
-
-       /**
-        * @var Skin
-        */
-       public $skin;
-
-       protected $watchlist = false;
-
-       protected $message;
-
-       /**
-        * Changeslist constructor
-        *
-        * @param $obj Skin or IContextSource
-        */
-       public function __construct( $obj ) {
-               if ( $obj instanceof IContextSource ) {
-                       $this->setContext( $obj );
-                       $this->skin = $obj->getSkin();
-               } else {
-                       $this->setContext( $obj->getContext() );
-                       $this->skin = $obj;
-               }
-               $this->preCacheMessages();
-       }
-
-       /**
-        * Fetch an appropriate changes list class for the main context
-        * This first argument used to be an User object.
-        *
-        * @deprecated in 1.18; use newFromContext() instead
-        * @param string|User $unused Unused
-        * @return ChangesList|EnhancedChangesList|OldChangesList derivative
-        */
-       public static function newFromUser( $unused ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return self::newFromContext( RequestContext::getMain() );
-       }
-
-       /**
-        * Fetch an appropriate changes list class for the specified context
-        * Some users might want to use an enhanced list format, for instance
-        *
-        * @param $context IContextSource to use
-        * @return ChangesList|EnhancedChangesList|OldChangesList derivative
-        */
-       public static function newFromContext( IContextSource $context ) {
-               $user = $context->getUser();
-               $sk = $context->getSkin();
-               $list = null;
-               if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
-                       $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
-                       return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
-               } else {
-                       return $list;
-               }
-       }
-
-       /**
-        * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
-        * @param $value Boolean
-        */
-       public function setWatchlistDivs( $value = true ) {
-               $this->watchlist = $value;
-       }
-
-       /**
-        * As we use the same small set of messages in various methods and that
-        * they are called often, we call them once and save them in $this->message
-        */
-       private function preCacheMessages() {
-               if ( !isset( $this->message ) ) {
-                       foreach ( array(
-                               'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history',
-                               'semicolon-separator', 'pipe-separator' ) as $msg
-                       ) {
-                               $this->message[$msg] = $this->msg( $msg )->escaped();
-                       }
-               }
-       }
-
-       /**
-        * Returns the appropriate flags for new page, minor change and patrolling
-        * @param array $flags Associative array of 'flag' => Bool
-        * @param string $nothing to use for empty space
-        * @return String
-        */
-       public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
-               global $wgRecentChangesFlags;
-               $f = '';
-               foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
-                       $f .= isset( $flags[$flag] ) && $flags[$flag]
-                               ? self::flag( $flag )
-                               : $nothing;
-               }
-               return $f;
-       }
-
-       /**
-        * Provide the "<abbr>" element appropriate to a given abbreviated flag,
-        * namely the flag indicating a new page, a minor edit, a bot edit, or an
-        * unpatrolled edit.  By default in English it will contain "N", "m", "b",
-        * "!" respectively, plus it will have an appropriate title and class.
-        *
-        * @param string $flag One key of $wgRecentChangesFlags
-        * @return String: Raw HTML
-        */
-       public static function flag( $flag ) {
-               static $flagInfos = null;
-               if ( is_null( $flagInfos ) ) {
-                       global $wgRecentChangesFlags;
-                       $flagInfos = array();
-                       foreach ( $wgRecentChangesFlags as $key => $value ) {
-                               $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
-                               $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
-                               // Allow customized class name, fall back to flag name
-                               $flagInfos[$key]['class'] = Sanitizer::escapeClass(
-                                       isset( $value['class'] ) ? $value['class'] : $key );
-                       }
-               }
-
-               // Inconsistent naming, bleh, kepted for b/c
-               $map = array(
-                       'minoredit' => 'minor',
-                       'botedit' => 'bot',
-               );
-               if ( isset( $map[$flag] ) ) {
-                       $flag = $map[$flag];
-               }
-
-               return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" . $flagInfos[$flag]['title'] . "'>" .
-                       $flagInfos[$flag]['letter'] .
-                       '</abbr>';
-       }
-
-       /**
-        * Returns text for the start of the tabular part of RC
-        * @return String
-        */
-       public function beginRecentChangesList() {
-               $this->rc_cache = array();
-               $this->rcMoveIndex = 0;
-               $this->rcCacheIndex = 0;
-               $this->lastdate = '';
-               $this->rclistOpen = false;
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
-               return '';
-       }
-
-       /**
-        * Show formatted char difference
-        * @param $old Integer: bytes
-        * @param $new Integer: bytes
-        * @param $context IContextSource context to use
-        * @return String
-        */
-       public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
-               global $wgRCChangedSizeThreshold, $wgMiserMode;
-
-               if ( !$context ) {
-                       $context = RequestContext::getMain();
-               }
-
-               $new = (int)$new;
-               $old = (int)$old;
-               $szdiff = $new - $old;
-
-               $lang = $context->getLanguage();
-               $code = $lang->getCode();
-               static $fastCharDiff = array();
-               if ( !isset( $fastCharDiff[$code] ) ) {
-                       $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
-               }
-
-               $formattedSize = $lang->formatNum( $szdiff );
-
-               if ( !$fastCharDiff[$code] ) {
-                       $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
-               }
-
-               if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
-                       $tag = 'strong';
-               } else {
-                       $tag = 'span';
-               }
-
-               if ( $szdiff === 0 ) {
-                       $formattedSizeClass = 'mw-plusminus-null';
-               }
-               if ( $szdiff > 0 ) {
-                       $formattedSize = '+' . $formattedSize;
-                       $formattedSizeClass = 'mw-plusminus-pos';
-               }
-               if ( $szdiff < 0 ) {
-                       $formattedSizeClass = 'mw-plusminus-neg';
-               }
-
-               $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
-
-               return Html::element( $tag,
-                       array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
-                       $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
-       }
-
-       /**
-        * Format the character difference of one or several changes.
-        *
-        * @param $old RecentChange
-        * @param $new RecentChange last change to use, if not provided, $old will be used
-        * @return string HTML fragment
-        */
-       public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
-               $oldlen = $old->mAttribs['rc_old_len'];
-
-               if ( $new ) {
-                       $newlen = $new->mAttribs['rc_new_len'];
-               } else {
-                       $newlen = $old->mAttribs['rc_new_len'];
-               }
-
-               if ( $oldlen === null || $newlen === null ) {
-                       return '';
-               }
-
-               return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
-       }
-
-       /**
-        * Returns text for the end of RC
-        * @return String
-        */
-       public function endRecentChangesList() {
-               if ( $this->rclistOpen ) {
-                       return "</ul>\n";
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param string $s HTML to update
-        * @param $rc_timestamp mixed
-        */
-       public function insertDateHeader( &$s, $rc_timestamp ) {
-               # Make date header if necessary
-               $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
-               if ( $date != $this->lastdate ) {
-                       if ( $this->lastdate != '' ) {
-                               $s .= "</ul>\n";
-                       }
-                       $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
-                       $this->lastdate = $date;
-                       $this->rclistOpen = true;
-               }
-       }
-
-       /**
-        * @param string $s HTML to update
-        * @param $title Title
-        * @param $logtype string
-        */
-       public function insertLog( &$s, $title, $logtype ) {
-               $page = new LogPage( $logtype );
-               $logname = $page->getName()->escaped();
-               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
-       }
-
-       /**
-        * @param string $s HTML to update
-        * @param $rc RecentChange
-        * @param $unpatrolled
-        */
-       public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
-               # Diff link
-               if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       $diffLink = $this->message['diff'];
-               } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       $diffLink = $this->message['diff'];
-               } else {
-                       $query = array(
-                               'curid' => $rc->mAttribs['rc_cur_id'],
-                               'diff' => $rc->mAttribs['rc_this_oldid'],
-                               'oldid' => $rc->mAttribs['rc_last_oldid']
-                       );
-
-                       $diffLink = Linker::linkKnown(
-                               $rc->getTitle(),
-                               $this->message['diff'],
-                               array( 'tabindex' => $rc->counter ),
-                               $query
-                       );
-               }
-               $diffhist = $diffLink . $this->message['pipe-separator'];
-               # History link
-               $diffhist .= Linker::linkKnown(
-                       $rc->getTitle(),
-                       $this->message['hist'],
-                       array(),
-                       array(
-                               'curid' => $rc->mAttribs['rc_cur_id'],
-                               'action' => 'history'
-                       )
-               );
-               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
-       }
-
-       /**
-        * @param string $s HTML to update
-        * @param $rc RecentChange
-        * @param $unpatrolled
-        * @param $watched
-        */
-       public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
-               $params = array();
-
-               $articlelink = Linker::linkKnown(
-                       $rc->getTitle(),
-                       null,
-                       array( 'class' => 'mw-changeslist-title' ),
-                       $params
-               );
-               if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
-                       $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
-               }
-               # To allow for boldening pages watched by this user
-               $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
-               # RTL/LTR marker
-               $articlelink .= $this->getLanguage()->getDirMark();
-
-               wfRunHooks( 'ChangesListInsertArticleLink',
-                       array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
-
-               $s .= " $articlelink";
-       }
-
-       /**
-        * Get the timestamp from $rc formatted with current user's settings
-        * and a separator
-        *
-        * @param $rc RecentChange
-        * @return string HTML fragment
-        */
-       public function getTimestamp( $rc ) {
-               return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
-                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
-       }
-
-       /**
-        * Insert time timestamp string from $rc into $s
-        *
-        * @param string $s HTML to update
-        * @param $rc RecentChange
-        */
-       public function insertTimestamp( &$s, $rc ) {
-               $s .= $this->getTimestamp( $rc );
-       }
-
-       /**
-        * Insert links to user page, user talk page and eventually a blocking link
-        *
-        * @param &$s String HTML to update
-        * @param &$rc RecentChange
-        */
-       public function insertUserRelatedLinks( &$s, &$rc ) {
-               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
-                               $rc->mAttribs['rc_user_text'] );
-                       $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-               }
-       }
-
-       /**
-        * Insert a formatted action
-        *
-        * @param $rc RecentChange
-        * @return string
-        */
-       public function insertLogEntry( $rc ) {
-               $formatter = LogFormatter::newFromRow( $rc->mAttribs );
-               $formatter->setContext( $this->getContext() );
-               $formatter->setShowUserToolLinks( true );
-               $mark = $this->getLanguage()->getDirMark();
-               return $formatter->getActionText() . " $mark" . $formatter->getComment();
-       }
-
-       /**
-        * Insert a formatted comment
-        * @param $rc RecentChange
-        * @return string
-        */
-       public function insertComment( $rc ) {
-               if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
-                       if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
-                               return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
-                       } else {
-                               return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
-                       }
-               }
-               return '';
-       }
-
-       /**
-        * Check whether to enable recent changes patrol features
-        *
-        * @deprecated since 1.22
-        * @return Boolean
-        */
-       public static function usePatrol() {
-               global $wgUser;
-
-               wfDeprecated( __METHOD__, '1.22' );
-
-               return $wgUser->useRCPatrol();
-       }
-
-       /**
-        * Returns the string which indicates the number of watching users
-        * @return string
-        */
-       protected function numberofWatchingusers( $count ) {
-               static $cache = array();
-               if ( $count > 0 ) {
-                       if ( !isset( $cache[$count] ) ) {
-                               $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
-                       }
-                       return $cache[$count];
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Determine if said field of a revision is hidden
-        * @param $rc RCCacheEntry
-        * @param $field Integer: one of DELETED_* bitfield constants
-        * @return Boolean
-        */
-       public static function isDeleted( $rc, $field ) {
-               return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
-       }
-
-       /**
-        * Determine if the current user is allowed to view a particular
-        * field of this revision, if it's marked as deleted.
-        * @param $rc RCCacheEntry
-        * @param $field Integer
-        * @param $user User object to check, or null to use $wgUser
-        * @return Boolean
-        */
-       public static function userCan( $rc, $field, User $user = null ) {
-               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
-               } else {
-                       return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
-               }
-       }
-
-       /**
-        * @param $link string
-        * @param $watched bool
-        * @return string
-        */
-       protected function maybeWatchedLink( $link, $watched = false ) {
-               if ( $watched ) {
-                       return '<strong class="mw-watched">' . $link . '</strong>';
-               } else {
-                       return '<span class="mw-rc-unwatched">' . $link . '</span>';
-               }
-       }
-
-       /** Inserts a rollback link
-        *
-        * @param $s string
-        * @param $rc RecentChange
-        */
-       public function insertRollback( &$s, &$rc ) {
-               if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
-                       $page = $rc->getTitle();
-                       /** Check for rollback and edit permissions, disallow special pages, and only
-                         * show a link on the top-most revision */
-                       if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
-                       {
-                               $rev = new Revision( array(
-                                       'title' => $page,
-                                       'id' => $rc->mAttribs['rc_this_oldid'],
-                                       'user' => $rc->mAttribs['rc_user'],
-                                       'user_text' => $rc->mAttribs['rc_user_text'],
-                                       'deleted' => $rc->mAttribs['rc_deleted']
-                               ) );
-                               $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
-                       }
-               }
-       }
-
-       /**
-        * @param $s string
-        * @param $rc RecentChange
-        * @param $classes
-        */
-       public function insertTags( &$s, &$rc, &$classes ) {
-               if ( empty( $rc->mAttribs['ts_tags'] ) ) {
-                       return;
-               }
-
-               list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
-               $classes = array_merge( $classes, $newClasses );
-               $s .= ' ' . $tagSummary;
-       }
-
-       public function insertExtra( &$s, &$rc, &$classes ) {
-               // Empty, used for subclasses to add anything special.
-       }
-
-       protected function showAsUnpatrolled( RecentChange $rc ) {
-               $unpatrolled = false;
-               if ( !$rc->mAttribs['rc_patrolled'] ) {
-                       if ( $this->getUser()->useRCPatrol() ) {
-                               $unpatrolled = true;
-                       } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
-                               $unpatrolled = true;
-                       }
-               }
-               return $unpatrolled;
-       }
-}
-
-/**
- * Generate a list of changes using the good old system (no javascript)
- */
-class OldChangesList extends ChangesList {
-       /**
-        * Format a line using the old system (aka without any javascript).
-        *
-        * @param $rc RecentChange, passed by reference
-        * @param bool $watched (default false)
-        * @param int $linenumber (default null)
-        *
-        * @return string|bool
-        */
-       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
-               global $wgRCShowChangedSize;
-               wfProfileIn( __METHOD__ );
-
-               # Should patrol-related stuff be shown?
-               $unpatrolled = $this->showAsUnpatrolled( $rc );
-
-               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
-               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
-               $s = '';
-               $classes = array();
-               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
-               if ( $linenumber ) {
-                       if ( $linenumber & 1 ) {
-                               $classes[] = 'mw-line-odd';
-                       } else {
-                               $classes[] = 'mw-line-even';
-                       }
-               }
-
-               // Indicate watched status on the line to allow for more
-               // comprehensive styling.
-               $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
-                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-
-               // Moved pages (very very old, not supported anymore)
-               if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
-               // Log entries
-               } elseif ( $rc->mAttribs['rc_log_type'] ) {
-                       $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-                       $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
-               // Log entries (old format) or log targets, and special pages
-               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
-                       if ( $name == 'Log' ) {
-                               $this->insertLog( $s, $rc->getTitle(), $subpage );
-                       }
-               // Regular entries
-               } else {
-                       $this->insertDiffHist( $s, $rc, $unpatrolled );
-                       # M, N, b and ! (minor, new, bot and unpatrolled)
-                       $s .= $this->recentChangesFlags(
-                               array(
-                                       'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
-                                       'minor' => $rc->mAttribs['rc_minor'],
-                                       'unpatrolled' => $unpatrolled,
-                                       'bot' => $rc->mAttribs['rc_bot']
-                               ),
-                               ''
-                       );
-                       $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
-               }
-               # Edit/log timestamp
-               $this->insertTimestamp( $s, $rc );
-               # Bytes added or removed
-               if ( $wgRCShowChangedSize ) {
-                       $cd = $this->formatCharacterDifference( $rc );
-                       if ( $cd !== '' ) {
-                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
-                       }
-               }
-
-               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       $s .= $this->insertLogEntry( $rc );
-               } else {
-                       # User tool links
-                       $this->insertUserRelatedLinks( $s, $rc );
-                       # LTR/RTL direction mark
-                       $s .= $this->getLanguage()->getDirMark();
-                       $s .= $this->insertComment( $rc );
-               }
-
-               # Tags
-               $this->insertTags( $s, $rc, $classes );
-               # Rollback
-               $this->insertRollback( $s, $rc );
-               # For subclasses
-               $this->insertExtra( $s, $rc, $classes );
-
-               # How many users watch this page
-               if ( $rc->numberofWatchingusers > 0 ) {
-                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
-               }
-
-               if ( $this->watchlist ) {
-                       $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
-               }
-
-               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
-       }
-}
-
-/**
- * Generate a list of changes using an Enhanced system (uses javascript).
- */
-class EnhancedChangesList extends ChangesList {
-
-       protected $rc_cache;
-
-       /**
-        * Add the JavaScript file for enhanced changeslist
-        * @return String
-        */
-       public function beginRecentChangesList() {
-               $this->rc_cache = array();
-               $this->rcMoveIndex = 0;
-               $this->rcCacheIndex = 0;
-               $this->lastdate = '';
-               $this->rclistOpen = false;
-               $this->getOutput()->addModuleStyles( array(
-                       'mediawiki.special.changeslist',
-                       'mediawiki.special.changeslist.enhanced',
-               ) );
-               $this->getOutput()->addModules( array(
-                       'jquery.makeCollapsible',
-                       'mediawiki.icon',
-               ) );
-               return '';
-       }
-       /**
-        * Format a line for enhanced recentchange (aka with javascript and block of lines).
-        *
-        * @param $baseRC RecentChange
-        * @param $watched bool
-        *
-        * @return string
-        */
-       public function recentChangesLine( &$baseRC, $watched = false ) {
-               wfProfileIn( __METHOD__ );
-
-               # Create a specialised object
-               $rc = RCCacheEntry::newFromParent( $baseRC );
-
-               $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
-
-               # If it's a new day, add the headline and flush the cache
-               $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
-               $ret = '';
-               if ( $date != $this->lastdate ) {
-                       # Process current cache
-                       $ret = $this->recentChangesBlock();
-                       $this->rc_cache = array();
-                       $ret .= Xml::element( 'h4', null, $date ) . "\n";
-                       $this->lastdate = $date;
-               }
-
-               # Should patrol-related stuff be shown?
-               $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
-
-               $showdifflinks = true;
-               # Make article link
-               $type = $rc->mAttribs['rc_type'];
-               $logType = $rc->mAttribs['rc_log_type'];
-               // Page moves, very old style, not supported anymore
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-               // New unpatrolled pages
-               } elseif ( $rc->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $rc->getTitle() );
-               // Log entries
-               } elseif ( $type == RC_LOG ) {
-                       if ( $logType ) {
-                               $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
-                               $logpage = new LogPage( $logType );
-                               $logname = $logpage->getName()->escaped();
-                               $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
-                       } else {
-                               $clink = Linker::link( $rc->getTitle() );
-                       }
-                       $watched = false;
-               // Log entries (old format) and special pages
-               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       wfDebug( "Unexpected special page in recentchanges\n" );
-                       $clink = '';
-               // Edits
-               } else {
-                       $clink = Linker::linkKnown( $rc->getTitle() );
-               }
-
-               # Don't show unusable diff links
-               if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                       $showdifflinks = false;
-               }
-
-               $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
-               $rc->watched = $watched;
-               $rc->link = $clink;
-               $rc->timestamp = $time;
-               $rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
-               # Make "cur" and "diff" links.  Do not use link(), it is too slow if
-               # called too many times (50% of CPU time on RecentChanges!).
-               $thisOldid = $rc->mAttribs['rc_this_oldid'];
-               $lastOldid = $rc->mAttribs['rc_last_oldid'];
-
-               $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
-               $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
-
-               if ( !$showdifflinks ) {
-                       $curLink = $this->message['cur'];
-                       $diffLink = $this->message['diff'];
-               } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-                       if ( $type != RC_NEW ) {
-                               $curLink = $this->message['cur'];
-                       } else {
-                               $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
-                               $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-                       }
-                       $diffLink = $this->message['diff'];
-               } else {
-                       $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
-                       $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
-                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
-                       $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-               }
-
-               # Make "last" link
-               if ( !$showdifflinks || !$lastOldid ) {
-                       $lastLink = $this->message['last'];
-               } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-                       $lastLink = $this->message['last'];
-               } else {
-                       $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
-                               array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
-               }
-
-               # Make user links
-               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-                       $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-               }
-
-               $rc->lastlink = $lastLink;
-               $rc->curlink = $curLink;
-               $rc->difflink = $diffLink;
-
-               # Put accumulated information into the cache, for later display
-               # Page moves go on their own line
-               $title = $rc->getTitle();
-               $secureName = $title->getPrefixedDBkey();
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       # Use an @ character to prevent collision with page names
-                       $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc );
-               } else {
-                       # Logs are grouped by type
-                       if ( $type == RC_LOG ) {
-                               $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
-                       }
-                       if ( !isset( $this->rc_cache[$secureName] ) ) {
-                               $this->rc_cache[$secureName] = array();
-                       }
-
-                       array_push( $this->rc_cache[$secureName], $rc );
-               }
-
-               wfProfileOut( __METHOD__ );
-
-               return $ret;
-       }
-
-       /**
-        * Enhanced RC group
-        * @return string
-        */
-       protected function recentChangesBlockGroup( $block ) {
-               global $wgRCShowChangedSize;
-
-               wfProfileIn( __METHOD__ );
-
-               # Add the namespace and title of the block as part of the class
-               $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
-               if ( $block[0]->mAttribs['rc_log_type'] ) {
-                       # Log entry
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-                                       . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
-               } else {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
-                                       . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
-               }
-               $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
-                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-                       Html::openElement( 'tr' );
-
-               # Collate list of users
-               $userlinks = array();
-               # Other properties
-               $unpatrolled = false;
-               $isnew = false;
-               $allBots = true;
-               $allMinors = true;
-               $curId = $currentRevision = 0;
-               # Some catalyst variables...
-               $namehidden = true;
-               $allLogs = true;
-               foreach ( $block as $rcObj ) {
-                       $oldid = $rcObj->mAttribs['rc_last_oldid'];
-                       if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
-                               $isnew = true;
-                       }
-                       // If all log actions to this page were hidden, then don't
-                       // give the name of the affected page for this block!
-                       if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
-                               $namehidden = false;
-                       }
-                       $u = $rcObj->userlink;
-                       if ( !isset( $userlinks[$u] ) ) {
-                               $userlinks[$u] = 0;
-                       }
-                       if ( $rcObj->unpatrolled ) {
-                               $unpatrolled = true;
-                       }
-                       if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
-                               $allLogs = false;
-                       }
-                       # Get the latest entry with a page_id and oldid
-                       # since logs may not have these.
-                       if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
-                               $curId = $rcObj->mAttribs['rc_cur_id'];
-                       }
-                       if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
-                               $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
-                       }
-
-                       if ( !$rcObj->mAttribs['rc_bot'] ) {
-                               $allBots = false;
-                       }
-                       if ( !$rcObj->mAttribs['rc_minor'] ) {
-                               $allMinors = false;
-                       }
-
-                       $userlinks[$u]++;
-               }
-
-               # Sort the list and convert to text
-               krsort( $userlinks );
-               asort( $userlinks );
-               $users = array();
-               foreach ( $userlinks as $userlink => $count ) {
-                       $text = $userlink;
-                       $text .= $this->getLanguage()->getDirMark();
-                       if ( $count > 1 ) {
-                               $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
-                       }
-                       array_push( $users, $text );
-               }
-
-               $users = ' <span class="changedby">'
-                       . $this->msg( 'brackets' )->rawParams(
-                               implode( $this->message['semicolon-separator'], $users )
-                       )->escaped() . '</span>';
-
-               $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
-               $r .= "<td>$tl</td>";
-
-               # Main line
-               $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
-                       'newpage' => $isnew, # show, when one have this flag
-                       'minor' => $allMinors, # show only, when all have this flag
-                       'unpatrolled' => $unpatrolled, # show, when one have this flag
-                       'bot' => $allBots, # show only, when all have this flag
-               ) );
-
-               # Timestamp
-               $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
-
-               # Article link
-               if ( $namehidden ) {
-                       $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
-               } elseif ( $allLogs ) {
-                       $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
-               } else {
-                       $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
-               }
-
-               $r .= $this->getLanguage()->getDirMark();
-
-               $queryParams['curid'] = $curId;
-
-               # Changes message
-               static $nchanges = array();
-               static $sinceLastVisitMsg = array();
-
-               $n = count( $block );
-               if ( !isset( $nchanges[$n] ) ) {
-                       $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
-               }
-
-               $sinceLast = 0;
-               $unvisitedOldid = null;
-               foreach ( $block as $rcObj ) {
-                       // Same logic as below inside main foreach
-                       if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) {
-                               $sinceLast++;
-                               $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid'];
-                       }
-               }
-               if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) {
-                       $sinceLastVisitMsg[$sinceLast] =
-                               $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped();
-               }
-
-               # Total change link
-               $r .= ' ';
-               $logtext = '';
-               if ( !$allLogs ) {
-                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $logtext .= $nchanges[$n];
-                       } elseif ( $isnew ) {
-                               $logtext .= $nchanges[$n];
-                       } else {
-                               $logtext .= Linker::link(
-                                       $block[0]->getTitle(),
-                                       $nchanges[$n],
-                                       array(),
-                                       $queryParams + array(
-                                               'diff' => $currentRevision,
-                                               'oldid' => $oldid,
-                                       ),
-                                       array( 'known', 'noclasses' )
-                               );
-                               if ( $sinceLast > 0 && $sinceLast < $n ) {
-                                       $logtext .= $this->message['pipe-separator'] . Linker::link(
-                                               $block[0]->getTitle(),
-                                               $sinceLastVisitMsg[$sinceLast],
-                                               array(),
-                                               $queryParams + array(
-                                                       'diff' => $currentRevision,
-                                                       'oldid' => $unvisitedOldid,
-                                               ),
-                                               array( 'known', 'noclasses' )
-                                       );
-                               }
-                       }
-               }
-
-               # History
-               if ( $allLogs ) {
-                       // don't show history link for logs
-               } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) {
-                       $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history'];
-               } else {
-                       $params = $queryParams;
-                       $params['action'] = 'history';
-
-                       $logtext .= $this->message['pipe-separator'] .
-                               Linker::linkKnown(
-                                       $block[0]->getTitle(),
-                                       $this->message['enhancedrc-history'],
-                                       array(),
-                                       $params
-                               );
-               }
-
-               if ( $logtext !== '' ) {
-                       $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
-               }
-
-               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
-               # Character difference (does not apply if only log items)
-               if ( $wgRCShowChangedSize && !$allLogs ) {
-                       $last = 0;
-                       $first = count( $block ) - 1;
-                       # Some events (like logs) have an "empty" size, so we need to skip those...
-                       while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
-                               $last++;
-                       }
-                       while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
-                               $first--;
-                       }
-                       # Get net change
-                       $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
-
-                       if ( $chardiff == '' ) {
-                               $r .= ' ';
-                       } else {
-                               $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
-                       }
-               }
-
-               $r .= $users;
-               $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
-
-               # Sub-entries
-               foreach ( $block as $rcObj ) {
-                       # Classes to apply -- TODO implement
-                       $classes = array();
-                       $type = $rcObj->mAttribs['rc_type'];
-
-                       $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-                               ? ' class="mw-enhanced-watched"' : '';
-
-                       $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
-                       $r .= $this->recentChangesFlags( array(
-                               'newpage' => $type == RC_NEW,
-                               'minor' => $rcObj->mAttribs['rc_minor'],
-                               'unpatrolled' => $rcObj->unpatrolled,
-                               'bot' => $rcObj->mAttribs['rc_bot'],
-                       ) );
-                       $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
-
-                       $params = $queryParams;
-
-                       if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
-                               $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
-                       }
-
-                       # Log timestamp
-                       if ( $type == RC_LOG ) {
-                               $link = $rcObj->timestamp;
-                       # Revision link
-                       } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
-                       } else {
-
-                               $link = Linker::linkKnown(
-                                               $rcObj->getTitle(),
-                                               $rcObj->timestamp,
-                                               array(),
-                                               $params
-                                       );
-                               if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
-                                       $link = '<span class="history-deleted">' . $link . '</span> ';
-                               }
-                       }
-                       $r .= $link . '</span>';
-
-                       if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
-                       }
-                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
-                       # Character diff
-                       if ( $wgRCShowChangedSize ) {
-                               $cd = $this->formatCharacterDifference( $rcObj );
-                               if ( $cd !== '' ) {
-                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
-                               }
-                       }
-
-                       if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-                               $r .= $this->insertLogEntry( $rcObj );
-                       } else {
-                               # User links
-                               $r .= $rcObj->userlink;
-                               $r .= $rcObj->usertalklink;
-                               $r .= $this->insertComment( $rcObj );
-                       }
-
-                       # Rollback
-                       $this->insertRollback( $r, $rcObj );
-                       # Tags
-                       $this->insertTags( $r, $rcObj, $classes );
-
-                       $r .= "</td></tr>\n";
-               }
-               $r .= "</table>\n";
-
-               $this->rcCacheIndex++;
-
-               wfProfileOut( __METHOD__ );
-
-               return $r;
-       }
-
-       /**
-        * Generate HTML for an arrow or placeholder graphic
-        * @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 = '' ) {
-               global $wgStylePath;
-               $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
-               $encAlt = htmlspecialchars( $alt );
-               $encTitle = htmlspecialchars( $title );
-               return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
-       }
-
-       /**
-        * Generate HTML for a right- or left-facing arrow,
-        * depending on language direction.
-        * @return String: HTML "<img>" tag
-        */
-       protected function sideArrow() {
-               $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
-               return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
-       }
-
-       /**
-        * Generate HTML for a down-facing arrow
-        * depending on language direction.
-        * @return String: HTML "<img>" tag
-        */
-       protected function downArrow() {
-               return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
-       }
-
-       /**
-        * Generate HTML for a spacer image
-        * @return String: HTML "<img>" tag
-        */
-       protected function spacerArrow() {
-               return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
-       }
-
-       /**
-        * Enhanced RC ungrouped line.
-        *
-        * @param $rcObj RecentChange
-        * @return String: a HTML formatted line (generated using $r)
-        */
-       protected function recentChangesBlockLine( $rcObj ) {
-               global $wgRCShowChangedSize;
-
-               wfProfileIn( __METHOD__ );
-               $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
-
-               $type = $rcObj->mAttribs['rc_type'];
-               $logType = $rcObj->mAttribs['rc_log_type'];
-               $classes = array( 'mw-enhanced-rc' );
-               if ( $logType ) {
-                       # Log entry
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-                                       . $logType . '-' . $rcObj->mAttribs['rc_title'] );
-               } else {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
-                                       $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
-               }
-               $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-                       Html::openElement( 'tr' );
-
-               $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
-               # Flag and Timestamp
-               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
-               } else {
-                       $r .= $this->recentChangesFlags( array(
-                               'newpage' => $type == RC_NEW,
-                               'minor' => $rcObj->mAttribs['rc_minor'],
-                               'unpatrolled' => $rcObj->unpatrolled,
-                               'bot' => $rcObj->mAttribs['rc_bot'],
-                       ) );
-               }
-               $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
-               # Article or log link
-               if ( $logType ) {
-                       $logPage = new LogPage( $logType );
-                       $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
-                       $logName = $logPage->getName()->escaped();
-                       $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
-               } else {
-                       $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
-               }
-               # Diff and hist links
-               if ( $type != RC_LOG ) {
-                       $query['action'] = 'history';
-                       $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
-                               $rcObj->getTitle(),
-                               $this->message['hist'],
-                               array(),
-                               $query
-                       ) )->escaped();
-               }
-               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
-               # Character diff
-               if ( $wgRCShowChangedSize ) {
-                       $cd = $this->formatCharacterDifference( $rcObj );
-                       if ( $cd !== '' ) {
-                               $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
-                       }
-               }
-
-               if ( $type == RC_LOG ) {
-                       $r .= $this->insertLogEntry( $rcObj );
-               } else {
-                       $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
-                       $r .= $this->insertComment( $rcObj );
-                       $this->insertRollback( $r, $rcObj );
-               }
-
-               # Tags
-               $this->insertTags( $r, $rcObj, $classes );
-               # Show how many people are watching this if enabled
-               $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
-
-               $r .= "</td></tr></table>\n";
-
-               wfProfileOut( __METHOD__ );
-
-               return $r;
-       }
-
-       /**
-        * If enhanced RC is in use, this function takes the previously cached
-        * RC lines, arranges them, and outputs the HTML
-        *
-        * @return string
-        */
-       protected function recentChangesBlock() {
-               if ( count ( $this->rc_cache ) == 0 ) {
-                       return '';
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               $blockOut = '';
-               foreach ( $this->rc_cache as $block ) {
-                       if ( count( $block ) < 2 ) {
-                               $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
-                       } else {
-                               $blockOut .= $this->recentChangesBlockGroup( $block );
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-
-               return '<div>' . $blockOut . '</div>';
-       }
-
-       /**
-        * Returns text for the end of RC
-        * If enhanced RC is in use, returns pretty much all the text
-        * @return string
-        */
-       public function endRecentChangesList() {
-               return $this->recentChangesBlock() . parent::endRecentChangesList();
-       }
-
-}
index a0a1b3e..8215bd8 100644 (file)
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.22alpha';
+$wgVersion = '1.23alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -3936,7 +3936,7 @@ $wgReservedUsernames = array(
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
-       'msg:proxyblocker', // For Special:Blockme
+       'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
 );
 
 /**
@@ -4365,6 +4365,20 @@ $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
  */
 $wgCascadingRestrictionLevels = array( 'sysop' );
 
+/**
+ * Restriction levels that should be considered "semiprotected"
+ *
+ * Certain places in the interface recognize a dichotomy between "protected"
+ * and "semiprotected", without further distinguishing the specific levels. In
+ * general, if anyone can be eligible to edit a protection level merely by
+ * reaching some condition in $wgAutopromote, it should probably be considered
+ * "semiprotected".
+ *
+ * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility.
+ * 'sysop' is not changed, since it really shouldn't be here.
+ */
+$wgSemiprotectedRestrictionLevels = array( 'autoconfirmed' );
+
 /**
  * Set the minimum permissions required to edit pages in each
  * namespace.  If you list more than one permission, a user must
@@ -4695,31 +4709,6 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
  * @{
  */
 
-/**
- * If you enable this, every editor's IP address will be scanned for open HTTP
- * proxies.
- *
- * @warning Don't enable this. Many sysops will report "hostile TCP port scans"
- * to your ISP and ask for your server to be shut down.
- * You have been warned.
- */
-$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/proxyCheck.php";
-
-/**
- * Expiration time for cached proxy IPs
- */
-$wgProxyMemcExpiry = 86400;
-
 /**
  * This should always be customised in LocalSettings.php
  */
@@ -5584,6 +5573,7 @@ $wgRCFeeds = array();
  * Keys are scheme names, values are names of engine classes.
  */
 $wgRCEngines = array(
+       'redis' => 'RedisPubSubFeedEngine',
        'udp' => 'UDPRCFeedEngine',
 );
 
index 12cd4b3..530e267 100644 (file)
@@ -840,7 +840,6 @@ class EditPage {
                if ( $this->textbox1 === false ) {
                        return false;
                }
-               wfProxyCheck();
                return true;
        }
 
@@ -1382,6 +1381,24 @@ class EditPage {
                        return $status;
                }
 
+               $spam = $wgRequest->getText( 'wpAntispam' );
+               if ( $spam !== '' ) {
+                       wfDebugLog(
+                               'SimpleAntiSpam',
+                               $wgUser->getName() .
+                               ' editing "' .
+                               $this->mTitle->getPrefixedText() .
+                               '" submitted bogus field "' .
+                               $spam .
+                               '"'
+                       );
+                       $status->fatal( 'spamprotectionmatch', false );
+                       $status->value = self::AS_SPAM_ERROR;
+                       wfProfileOut( __METHOD__ . '-checks' );
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
                try {
                        # Construct Content object
                        $textbox_content = $this->toEditContent( $this->textbox1 );
@@ -2191,6 +2208,14 @@ class EditPage {
                        call_user_func_array( $formCallback, array( &$wgOut ) );
                }
 
+               // Add an empty field to trip up spambots
+               $wgOut->addHTML(
+                       Xml::openElement( 'div', array( 'id' => 'antispam-container', 'style' => 'display: none;' ) )
+                       . Html::rawElement( 'label', array( 'for' => 'wpAntiSpam' ), wfMessage( 'simpleantispam-label' )->parse() )
+                       . Xml::element( 'input', array( 'type' => 'text', 'name' => 'wpAntispam', 'id' => 'wpAntispam', 'value' => '' ) )
+                       . Xml::closeElement( 'div' )
+               );
+
                wfRunHooks( 'EditPage::showEditForm:fields', array( &$this, &$wgOut ) );
 
                // Put these up at the top to ensure they aren't lost on early form submission
@@ -2859,7 +2884,15 @@ HTML
                return self::getCopyrightWarning( $this->mTitle );
        }
 
-       public static function getCopyrightWarning( $title ) {
+       /**
+        * Get the copyright warning, by default returns wikitext
+        *
+        * @param Title $title
+        * @param string $format output format, valid values are any function of
+        *                       a Message object
+        * @return string
+        */
+       public static function getCopyrightWarning( $title, $format = 'plain' ) {
                global $wgRightsText;
                if ( $wgRightsText ) {
                        $copywarnMsg = array( 'copyrightwarning',
@@ -2873,7 +2906,7 @@ HTML
                wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) );
 
                return "<div id=\"editpage-copywarn\">\n" .
-                       call_user_func_array( 'wfMessage', $copywarnMsg )->plain() . "\n</div>";
+                       call_user_func_array( 'wfMessage', $copywarnMsg )->$format() . "\n</div>";
        }
 
        /**
index eff1756..54822e3 100644 (file)
@@ -144,10 +144,10 @@ class FormOptions implements ArrayAccess {
        /**
         * Use to set the value of an option.
         *
-        * @param string $name option name
-        * @param mixed $value value for the option
-        * @param bool $force Whether to set the value when it is equivalent to
-        * the default value for this option (default false).
+        * @param string $name Option name
+        * @param mixed $value Value for the option
+        * @param bool $force Whether to set the value when it is equivalent to the default value for this
+        *     option (default false).
         */
        public function setValue( $name, $value, $force = false ) {
                $this->validateName( $name, true );
@@ -161,10 +161,9 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * Get the value for the given option name.
-        * Internally use getValueReal()
+        * Get the value for the given option name. Uses getValueReal() internally.
         *
-        * @param string $name option name
+        * @param string $name Option name
         * @return mixed
         */
        public function getValue( $name ) {
@@ -174,9 +173,10 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * @todo Document
-        * @param array $option array structure describing the option
-        * @return mixed Value or the default value if it is null
+        * Return current option value, based on a structure taken from $options.
+        *
+        * @param array $option Array structure describing the option
+        * @return mixed Value, or the default value if it is null
         */
        protected function getValueReal( $option ) {
                if ( $option['value'] !== null ) {
index 8241d81..77c09e5 100644 (file)
@@ -931,14 +931,12 @@ function wfDebug( $text, $logonly = false ) {
                MWDebug::debugMsg( $text );
        }
 
-       if ( wfRunHooks( 'Debug', array( $text, null /* no log group */ ) ) ) {
-               if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
-                       # Strip unprintables; they can switch terminal modes when binary data
-                       # gets dumped, which is pretty annoying.
-                       $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
-                       $text = $wgDebugLogPrefix . $text;
-                       wfErrorLog( $text, $wgDebugLogFile );
-               }
+       if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
+               # Strip unprintables; they can switch terminal modes when binary data
+               # gets dumped, which is pretty annoying.
+               $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
+               $text = $wgDebugLogPrefix . $text;
+               wfErrorLog( $text, $wgDebugLogFile );
        }
 }
 
@@ -1013,9 +1011,7 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
                $time = wfTimestamp( TS_DB );
                $wiki = wfWikiID();
                $host = wfHostname();
-               if ( wfRunHooks( 'Debug', array( $text, $logGroup ) ) ) {
-                       wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
-               }
+               wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
        } elseif ( $public === true ) {
                wfDebug( "[$logGroup] $text", false );
        }
@@ -2773,10 +2769,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
        $cmd = $envcmd . $cmd;
 
        if ( php_uname( 's' ) == 'Linux' ) {
-               $stderrDuplication = '';
-               if ( $includeStderr ) {
-                       $stderrDuplication = 'exec 2>&1; ';
-               }
                $time = intval ( isset( $limits['time'] ) ? $limits['time'] : $wgMaxShellTime );
                if ( isset( $limits['walltime'] ) ) {
                        $wallTime = intval( $limits['walltime'] );
@@ -2792,14 +2784,14 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
                        $cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
                                escapeshellarg( $cmd ) . ' ' .
                                escapeshellarg(
-                                       $stderrDuplication .
+                                       "MW_INCLUDE_STDERR=" . ( $includeStderr ? '1' : '' ) . ';' .
                                        "MW_CPU_LIMIT=$time; " .
                                        'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
                                        "MW_MEM_LIMIT=$mem; " .
                                        "MW_FILE_SIZE_LIMIT=$filesize; " .
                                        "MW_WALL_CLOCK_LIMIT=$wallTime"
                                );
-               } else {
+               } elseif ( $includeStderr ) {
                        $cmd .= ' 2>&1';
                }
        } elseif ( $includeStderr ) {
index 5bb9230..23ece75 100644 (file)
@@ -1960,6 +1960,7 @@ class Linker {
         * @return String: HTML output
         */
        public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
+               global $wgLang;
                wfProfileIn( __METHOD__ );
 
                $outText = '';
@@ -1987,13 +1988,28 @@ class Linker {
 
                        usort( $templates, 'Title::compare' );
                        foreach ( $templates as $titleObj ) {
-                               $r = $titleObj->getRestrictions( 'edit' );
-                               if ( in_array( 'sysop', $r ) ) {
-                                       $protected = wfMessage( 'template-protected' )->parse();
-                               } elseif ( in_array( 'autoconfirmed', $r ) ) {
-                                       $protected = wfMessage( 'template-semiprotected' )->parse();
-                               } else {
-                                       $protected = '';
+                               $protected = '';
+                               $restrictions = $titleObj->getRestrictions( 'edit' );
+                               if ( $restrictions ) {
+                                       // Check backwards-compatible messages
+                                       $msg = null;
+                                       if ( $restrictions === array( 'sysop' ) ) {
+                                               $msg = wfMessage( 'template-protected' );
+                                       } elseif ( $restrictions === array( 'autoconfirmed' ) ) {
+                                               $msg = wfMessage( 'template-semiprotected' );
+                                       }
+                                       if ( $msg && !$msg->isDisabled() ) {
+                                               $protected = $msg->parse();
+                                       } else {
+                                               // Construct the message from restriction-level-*
+                                               // e.g. restriction-level-sysop, restriction-level-autoconfirmed
+                                               $msgs = array();
+                                               foreach ( $restrictions as $r ) {
+                                                       $msgs[] = wfMessage( "restriction-level-$r" )->parse();
+                                               }
+                                               $protected = wfMessage( 'parentheses' )
+                                                       ->rawParams( $wgLang->commaList( $msgs ) )->escaped();
+                                       }
                                }
                                if ( $titleObj->quickUserCan( 'edit' ) ) {
                                        $editLink = self::link(
index 73e0af2..57c6264 100644 (file)
@@ -356,6 +356,96 @@ class Message {
                return $this;
        }
 
+       /**
+        * Add parameters that are durations of time and will be passed through
+        * Language::formatDuration before substitution
+        * @since 1.22
+        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+        * @return Message: $this
+        */
+       public function durationParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::durationParam( $param );
+               }
+               return $this;
+       }
+
+       /**
+        * Add parameters that are expiration times and will be passed through
+        * Language::formatExpiry before substitution
+        * @since 1.22
+        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+        * @return Message: $this
+        */
+       public function expiryParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::expiryParam( $param );
+               }
+               return $this;
+       }
+
+       /**
+        * Add parameters that are time periods and will be passed through
+        * Language::formatTimePeriod before substitution
+        * @since 1.22
+        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+        * @return Message: $this
+        */
+       public function timeperiodParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::timeperiodParam( $param );
+               }
+               return $this;
+       }
+
+       /**
+        * Add parameters that are file sizes and will be passed through
+        * Language::formatSize before substitution
+        * @since 1.22
+        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+        * @return Message: $this
+        */
+       public function sizeParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::sizeParam( $param );
+               }
+               return $this;
+       }
+
+       /**
+        * Add parameters that are bitrates and will be passed through
+        * Language::formatBitrate before substitution
+        * @since 1.22
+        * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+        * @return Message: $this
+        */
+       public function bitrateParams( /*...*/ ) {
+               $params = func_get_args();
+               if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+               foreach ( $params as $param ) {
+                       $this->parameters[] = self::bitrateParam( $param );
+               }
+               return $this;
+       }
+
        /**
         * Set the language and the title from a context object
         * @since 1.19
@@ -638,6 +728,51 @@ class Message {
                return array( 'num' => $value );
        }
 
+       /**
+        * @since 1.22
+        * @param $value
+        * @return array
+        */
+       public static function durationParam( $value ) {
+               return array( 'duration' => $value );
+       }
+
+       /**
+        * @since 1.22
+        * @param $value
+        * @return array
+        */
+       public static function expiryParam( $value ) {
+               return array( 'expiry' => $value );
+       }
+
+       /**
+        * @since 1.22
+        * @param $value
+        * @return array
+        */
+       public static function timeperiodParam( $value ) {
+               return array( 'period' => $value );
+       }
+
+       /**
+        * @since 1.22
+        * @param $value
+        * @return array
+        */
+       public static function sizeParam( $value ) {
+               return array( 'size' => $value );
+       }
+
+       /**
+        * @since 1.22
+        * @param $value
+        * @return array
+        */
+       public static function bitrateParam( $value ) {
+               return array( 'bitrate' => $value );
+       }
+
        /**
         * Substitutes any parameters into the message text.
         * @since 1.17
@@ -664,20 +799,37 @@ class Message {
         * @return Tuple(type, value)
         */
        protected function extractParam( $param ) {
-               if ( is_array( $param ) && isset( $param['raw'] ) ) {
-                       return array( 'after', $param['raw'] );
-               } elseif ( is_array( $param ) && isset( $param['num'] ) ) {
-                       // Replace number params always in before step for now.
-                       // No support for combined raw and num params
-                       return array( 'before', $this->language->formatNum( $param['num'] ) );
-               } elseif ( !is_array( $param ) ) {
-                       return array( 'before', $param );
+               if ( is_array( $param ) ) {
+                       if ( isset( $param['raw'] ) ) {
+                               return array( 'after', $param['raw'] );
+                       } elseif ( isset( $param['num'] ) ) {
+                               // Replace number params always in before step for now.
+                               // No support for combined raw and num params
+                               return array( 'before', $this->language->formatNum( $param['num'] ) );
+                       } elseif ( isset( $param['duration'] ) ) {
+                               return array( 'before', $this->language->formatDuration( $param['duration'] ) );
+                       } elseif ( isset( $param['expiry'] ) ) {
+                               return array( 'before', $this->language->formatExpiry( $param['expiry'] ) );
+                       } elseif ( isset( $param['period'] ) ) {
+                               return array( 'before', $this->language->formatTimePeriod( $param['period'] ) );
+                       } elseif ( isset( $param['size'] ) ) {
+                               return array( 'before', $this->language->formatSize( $param['size'] ) );
+                       } elseif ( isset( $param['bitrate'] ) ) {
+                               return array( 'before', $this->language->formatBitrate( $param['bitrate'] ) );
+                       } else {
+                               trigger_error(
+                                       "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
+                                       E_USER_WARNING
+                               );
+                               return array( 'before', '[INVALID]' );
+                       }
+               } elseif ( $param instanceof Message ) {
+                       // Message objects should not be before parameters because
+                       // then they'll get double escaped. If the message needs to be
+                       // escaped, it'll happen right here when we call toString().
+                       return array( 'after', $param->toString() );
                } else {
-                       trigger_error(
-                               "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
-                               E_USER_WARNING
-                       );
-                       return array( 'before', '[INVALID]' );
+                       return array( 'before', $param );
                }
        }
 
index ffaf77d..7f0454f 100644 (file)
@@ -674,7 +674,7 @@ class OutputPage extends ContextSource {
         *
         * @param $timestamp string
         *
-        * @return Boolean: true iff cache-ok headers was sent.
+        * @return Boolean: true if cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
                global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
index b54a9a3..bf1c405 100644 (file)
@@ -84,43 +84,3 @@ function wfIsConfiguredProxy( $ip ) {
                in_array( $ip, $wgSquidServersNoPurge );
        return $trusted;
 }
-
-/**
- * Forks processes to scan the originating IP for an open proxy server
- * MemCached can be used to skip IPs that have already been scanned
- */
-function wfProxyCheck() {
-       global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
-       global $wgMemc, $wgProxyMemcExpiry, $wgRequest;
-       global $wgProxyKey;
-
-       if ( !$wgBlockOpenProxies ) {
-               return;
-       }
-
-       $ip = $wgRequest->getIP();
-
-       # Get MemCached key
-       $mcKey = wfMemcKey( 'proxy', 'ip', $ip );
-       $mcValue = $wgMemc->get( $mcKey );
-       $skip = (bool)$mcValue;
-
-       # Fork the processes
-       if ( !$skip ) {
-               $title = SpecialPage::getTitleFor( 'Blockme' );
-               $iphash = md5( $ip . $wgProxyKey );
-               $url = wfExpandUrl( $title->getFullURL( 'ip=' . $iphash ), PROTO_HTTP );
-
-               foreach ( $wgProxyPorts as $port ) {
-                       $params = implode( ' ', array(
-                                               escapeshellarg( $wgProxyScriptPath ),
-                                               escapeshellarg( $ip ),
-                                               escapeshellarg( $port ),
-                                               escapeshellarg( $url )
-                                               ));
-                       exec( "php $params >" . wfGetNull() . " 2>&1 &" );
-               }
-               # Set MemCached key
-               $wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
-       }
-}
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
deleted file mode 100644 (file)
index 980bd0a..0000000
+++ /dev/null
@@ -1,846 +0,0 @@
-<?php
-/**
- * Utility class for creating and accessing recent change entries.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Utility class for creating new RC entries
- *
- * mAttribs:
- *  rc_id           id of the row in the recentchanges table
- *  rc_timestamp    time the entry was made
- *  rc_cur_time     timestamp on the cur row
- *  rc_namespace    namespace #
- *  rc_title        non-prefixed db key
- *  rc_type         is new entry, used to determine whether updating is necessary
- *  rc_minor        is minor
- *  rc_cur_id       page_id of associated page entry
- *  rc_user         user id who made the entry
- *  rc_user_text    user name who made the entry
- *  rc_comment      edit summary
- *  rc_this_oldid   rev_id associated with this entry (or zero)
- *  rc_last_oldid   rev_id associated with the entry before this one (or zero)
- *  rc_bot          is bot, hidden
- *  rc_ip           IP address of the user in dotted quad notation
- *  rc_new          obsolete, use rc_type==RC_NEW
- *  rc_patrolled    boolean whether or not someone has marked this edit as patrolled
- *  rc_old_len      integer byte length of the text before the edit
- *  rc_new_len      the same after the edit
- *  rc_deleted      partial deletion
- *  rc_logid        the log_id value for this log entry (or zero)
- *  rc_log_type     the log type (or null)
- *  rc_log_action   the log action (or null)
- *  rc_params       log params
- *
- * mExtra:
- *  prefixedDBkey   prefixed db key, used by external app via msg queue
- *  lastTimestamp   timestamp of previous entry, used in WHERE clause during update
- *  lang            the interwiki prefix, automatically set in save()
- *  oldSize         text size before the change
- *  newSize         text size after the change
- *  pageStatus      status of the page: created, deleted, moved, restored, changed
- *
- * temporary:       not stored in the database
- *      notificationtimestamp
- *      numberofWatchingusers
- *
- * @todo document functions and variables
- */
-class RecentChange {
-       var $mAttribs = array(), $mExtra = array();
-
-       /**
-        * @var Title
-        */
-       var $mTitle = false;
-
-       /**
-        * @var User
-        */
-       private $mPerformer = false;
-
-       /**
-        * @var Title
-        */
-       var $mMovedToTitle = false;
-       var $numberofWatchingusers = 0; # Dummy to prevent error message in SpecialRecentchangeslinked
-       var $notificationtimestamp;
-
-       # Factory methods
-
-       /**
-        * @param $row
-        * @return RecentChange
-        */
-       public static function newFromRow( $row ) {
-               $rc = new RecentChange;
-               $rc->loadFromRow( $row );
-               return $rc;
-       }
-
-       /**
-        * @deprecated in 1.22
-        * @param $row
-        * @return RecentChange
-        */
-       public static function newFromCurRow( $row ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               $rc = new RecentChange;
-               $rc->loadFromCurRow( $row );
-               $rc->notificationtimestamp = false;
-               $rc->numberofWatchingusers = false;
-               return $rc;
-       }
-
-       /**
-        * Obtain the recent change with a given rc_id value
-        *
-        * @param int $rcid rc_id value to retrieve
-        * @return RecentChange
-        */
-       public static function newFromId( $rcid ) {
-               return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
-       }
-
-       /**
-        * Find the first recent change matching some specific conditions
-        *
-        * @param array $conds of conditions
-        * @param $fname Mixed: override the method name in profiling/logs
-        * @param $options Array Query options
-        * @return RecentChange
-        */
-       public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
-               if ( $row !== false ) {
-                       return self::newFromRow( $row );
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Return the list of recentchanges fields that should be selected to create
-        * a new recentchanges object.
-        * @return array
-        */
-       public static function selectFields() {
-               return array(
-                       'rc_id',
-                       'rc_timestamp',
-                       'rc_cur_time',
-                       'rc_user',
-                       'rc_user_text',
-                       'rc_namespace',
-                       'rc_title',
-                       'rc_comment',
-                       'rc_minor',
-                       'rc_bot',
-                       'rc_new',
-                       'rc_cur_id',
-                       'rc_this_oldid',
-                       'rc_last_oldid',
-                       'rc_type',
-                       'rc_patrolled',
-                       'rc_ip',
-                       'rc_old_len',
-                       'rc_new_len',
-                       'rc_deleted',
-                       'rc_logid',
-                       'rc_log_type',
-                       'rc_log_action',
-                       'rc_params',
-               );
-       }
-
-       # Accessors
-
-       /**
-        * @param $attribs array
-        */
-       public function setAttribs( $attribs ) {
-               $this->mAttribs = $attribs;
-       }
-
-       /**
-        * @param $extra array
-        */
-       public function setExtra( $extra ) {
-               $this->mExtra = $extra;
-       }
-
-       /**
-        *
-        * @return Title
-        */
-       public function &getTitle() {
-               if ( $this->mTitle === false ) {
-                       $this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
-               }
-               return $this->mTitle;
-       }
-
-       /**
-        * Get the User object of the person who performed this change.
-        *
-        * @return User
-        */
-       public function getPerformer() {
-               if ( $this->mPerformer === false ) {
-                       if ( $this->mAttribs['rc_user'] ) {
-                               $this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] );
-                       } else {
-                               $this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
-                       }
-               }
-               return $this->mPerformer;
-       }
-
-       /**
-        * Writes the data in this object to the database
-        * @param $noudp bool
-        */
-       public function save( $noudp = false ) {
-               global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
-
-               $dbw = wfGetDB( DB_MASTER );
-               if ( !is_array( $this->mExtra ) ) {
-                       $this->mExtra = array();
-               }
-               $this->mExtra['lang'] = $wgLocalInterwiki;
-
-               if ( !$wgPutIPinRC ) {
-                       $this->mAttribs['rc_ip'] = '';
-               }
-
-               # If our database is strict about IP addresses, use NULL instead of an empty string
-               if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
-                       unset( $this->mAttribs['rc_ip'] );
-               }
-
-               # Trim spaces on user supplied text
-               $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
-
-               # Make sure summary is truncated (whole multibyte characters)
-               $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
-
-               # Fixup database timestamps
-               $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
-               $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
-               $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
-
-               ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
-               if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
-                       unset( $this->mAttribs['rc_cur_id'] );
-               }
-
-               # Insert new row
-               $dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ );
-
-               # Set the ID
-               $this->mAttribs['rc_id'] = $dbw->insertId();
-
-               # Notify extensions
-               wfRunHooks( 'RecentChange_save', array( &$this ) );
-
-               # Notify external application via UDP
-               if ( !$noudp ) {
-                       $this->notifyRCFeeds();
-               }
-
-               # E-mail notifications
-               if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
-                       $editor = $this->getPerformer();
-                       $title = $this->getTitle();
-
-                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
-                               # @todo FIXME: This would be better as an extension hook
-                               $enotif = new EmailNotification();
-                               $enotif->notifyOnPageChange( $editor, $title,
-                                       $this->mAttribs['rc_timestamp'],
-                                       $this->mAttribs['rc_comment'],
-                                       $this->mAttribs['rc_minor'],
-                                       $this->mAttribs['rc_last_oldid'],
-                                       $this->mExtra['pageStatus'] );
-                       }
-               }
-       }
-
-       /**
-        * @deprecated since 1.22, use notifyRCFeeds instead.
-        */
-       public function notifyRC2UDP() {
-               wfDeprecated( __METHOD__, '1.22' );
-               $this->notifyRCFeeds();
-       }
-
-       /**
-        * Send some text to UDP.
-        * @deprecated since 1.22
-        */
-       public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
-               global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix;
-
-               wfDeprecated( __METHOD__, '1.22' );
-
-               # Assume default for standard RC case
-               $address = $address ? $address : $wgRC2UDPAddress;
-               $prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
-               $port = $port ? $port : $wgRC2UDPPort;
-
-               $engine = new UDPRCFeedEngine();
-               $feed = array(
-                       'uri' => "udp://$address:$port/$prefix",
-                       'formatter' => 'IRCColourfulRCFeedFormatter',
-                       'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix,
-               );
-
-               return $engine->send( $feed, $line );
-       }
-
-       /**
-        * Notify all the feeds about the change.
-        */
-       public function notifyRCFeeds() {
-               global $wgRCFeeds;
-
-               foreach ( $wgRCFeeds as $feed ) {
-                       $engine = self::getEngine( $feed['uri'] );
-
-                       if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
-                               $actionComment = $this->mExtra['actionCommentIRC'];
-                       } else {
-                               $actionComment = null;
-                       }
-
-                       $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
-
-                       if (
-                               ( $omitBots && $this->mAttribs['rc_bot'] ) ||
-                               $this->mAttribs['rc_type'] == RC_EXTERNAL
-                       ) {
-                               continue;
-                       }
-
-                       $formatter = new $feed['formatter']();
-                       $line = $formatter->getLine( $feed, $this, $actionComment );
-
-                       $engine->send( $feed, $line );
-               }
-       }
-
-       /**
-        * Gets the stream engine object for a given URI from $wgRCEngines
-        *
-        * @param $uri string URI to get the engine object for
-        * @return object The engine object
-        */
-       private static function getEngine( $uri ) {
-               global $wgRCEngines;
-
-               $scheme = parse_url( $uri, PHP_URL_SCHEME );
-               if ( !$scheme ) {
-                       throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
-               }
-
-               if ( !isset( $wgRCEngines[$scheme] ) ) {
-                       throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
-               }
-
-               return new $wgRCEngines[$scheme];
-       }
-
-       /**
-        * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter
-        */
-       public static function cleanupForIRC( $text ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               return IRCColourfulRCFeedFormatter::cleanupForIRC( $text );
-       }
-
-       /**
-        * Mark a given change as patrolled
-        *
-        * @param $change Mixed: RecentChange or corresponding rc_id
-        * @param $auto Boolean: for automatic patrol
-        * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
-        */
-       public static function markPatrolled( $change, $auto = false ) {
-               global $wgUser;
-
-               $change = $change instanceof RecentChange
-                       ? $change
-                       : RecentChange::newFromId( $change );
-
-               if ( !$change instanceof RecentChange ) {
-                       return null;
-               }
-               return $change->doMarkPatrolled( $wgUser, $auto );
-       }
-
-       /**
-        * Mark this RecentChange as patrolled
-        *
-        * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors
-        * @param $user User object doing the action
-        * @param $auto Boolean: for automatic patrol
-        * @return array of permissions errors, see Title::getUserPermissionsErrors()
-        */
-       public function doMarkPatrolled( User $user, $auto = false ) {
-               global $wgUseRCPatrol, $wgUseNPPatrol;
-               $errors = array();
-               // If recentchanges patrol is disabled, only new pages
-               // can be patrolled
-               if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
-                       $errors[] = array( 'rcpatroldisabled' );
-               }
-               // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
-               $right = $auto ? 'autopatrol' : 'patrol';
-               $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
-               if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
-                       $errors[] = array( 'hookaborted' );
-               }
-               // Users without the 'autopatrol' right can't patrol their
-               // own revisions
-               if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
-                       $errors[] = array( 'markedaspatrollederror-noautopatrol' );
-               }
-               if ( $errors ) {
-                       return $errors;
-               }
-               // If the change was patrolled already, do nothing
-               if ( $this->getAttribute( 'rc_patrolled' ) ) {
-                       return array();
-               }
-               // Actually set the 'patrolled' flag in RC
-               $this->reallyMarkPatrolled();
-               // Log this patrol event
-               PatrolLog::record( $this, $auto, $user );
-               wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
-               return array();
-       }
-
-       /**
-        * Mark this RecentChange patrolled, without error checking
-        * @return Integer: number of affected rows
-        */
-       public function reallyMarkPatrolled() {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->update(
-                       'recentchanges',
-                       array(
-                               'rc_patrolled' => 1
-                       ),
-                       array(
-                               'rc_id' => $this->getAttribute( 'rc_id' )
-                       ),
-                       __METHOD__
-               );
-               // Invalidate the page cache after the page has been patrolled
-               // to make sure that the Patrol link isn't visible any longer!
-               $this->getTitle()->invalidateCache();
-               return $dbw->affectedRows();
-       }
-
-       /**
-        * Makes an entry in the database corresponding to an edit
-        *
-        * @param $timestamp
-        * @param $title Title
-        * @param $minor
-        * @param $user User
-        * @param $comment
-        * @param $oldId
-        * @param $lastTimestamp
-        * @param $bot
-        * @param $ip string
-        * @param $oldSize int
-        * @param $newSize int
-        * @param $newId int
-        * @param $patrol int
-        * @return RecentChange
-        */
-       public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
-               $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
-               $rc = new RecentChange;
-               $rc->mTitle = $title;
-               $rc->mPerformer = $user;
-               $rc->mAttribs = array(
-                       'rc_timestamp'  => $timestamp,
-                       'rc_cur_time'   => $timestamp,
-                       'rc_namespace'  => $title->getNamespace(),
-                       'rc_title'      => $title->getDBkey(),
-                       'rc_type'       => RC_EDIT,
-                       'rc_minor'      => $minor ? 1 : 0,
-                       'rc_cur_id'     => $title->getArticleID(),
-                       'rc_user'       => $user->getId(),
-                       'rc_user_text'  => $user->getName(),
-                       'rc_comment'    => $comment,
-                       'rc_this_oldid' => $newId,
-                       'rc_last_oldid' => $oldId,
-                       'rc_bot'        => $bot ? 1 : 0,
-                       'rc_ip'         => self::checkIPAddress( $ip ),
-                       'rc_patrolled'  => intval( $patrol ),
-                       'rc_new'        => 0,  # obsolete
-                       'rc_old_len'    => $oldSize,
-                       'rc_new_len'    => $newSize,
-                       'rc_deleted'    => 0,
-                       'rc_logid'      => 0,
-                       'rc_log_type'   => null,
-                       'rc_log_action' => '',
-                       'rc_params'     => ''
-               );
-
-               $rc->mExtra = array(
-                       'prefixedDBkey' => $title->getPrefixedDBkey(),
-                       'lastTimestamp' => $lastTimestamp,
-                       'oldSize'       => $oldSize,
-                       'newSize'       => $newSize,
-                       'pageStatus'   => 'changed'
-               );
-               $rc->save();
-               return $rc;
-       }
-
-       /**
-        * Makes an entry in the database corresponding to page creation
-        * Note: the title object must be loaded with the new id using resetArticleID()
-        * @todo Document parameters and return
-        *
-        * @param $timestamp
-        * @param $title Title
-        * @param $minor
-        * @param $user User
-        * @param $comment
-        * @param $bot
-        * @param $ip string
-        * @param $size int
-        * @param $newId int
-        * @param $patrol int
-        * @return RecentChange
-        */
-       public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
-               $ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
-               $rc = new RecentChange;
-               $rc->mTitle = $title;
-               $rc->mPerformer = $user;
-               $rc->mAttribs = array(
-                       'rc_timestamp'      => $timestamp,
-                       'rc_cur_time'       => $timestamp,
-                       'rc_namespace'      => $title->getNamespace(),
-                       'rc_title'          => $title->getDBkey(),
-                       'rc_type'           => RC_NEW,
-                       'rc_minor'          => $minor ? 1 : 0,
-                       'rc_cur_id'         => $title->getArticleID(),
-                       'rc_user'           => $user->getId(),
-                       'rc_user_text'      => $user->getName(),
-                       'rc_comment'        => $comment,
-                       'rc_this_oldid'     => $newId,
-                       'rc_last_oldid'     => 0,
-                       'rc_bot'            => $bot ? 1 : 0,
-                       'rc_ip'             => self::checkIPAddress( $ip ),
-                       'rc_patrolled'      => intval( $patrol ),
-                       'rc_new'            => 1, # obsolete
-                       'rc_old_len'        => 0,
-                       'rc_new_len'        => $size,
-                       'rc_deleted'        => 0,
-                       'rc_logid'          => 0,
-                       'rc_log_type'       => null,
-                       'rc_log_action'     => '',
-                       'rc_params'         => ''
-               );
-
-               $rc->mExtra = array(
-                       'prefixedDBkey' => $title->getPrefixedDBkey(),
-                       'lastTimestamp' => 0,
-                       'oldSize' => 0,
-                       'newSize' => $size,
-                       'pageStatus' => 'created'
-               );
-               $rc->save();
-               return $rc;
-       }
-
-       /**
-        * @param $timestamp
-        * @param $title
-        * @param $user
-        * @param $actionComment
-        * @param $ip string
-        * @param $type
-        * @param $action
-        * @param $target
-        * @param $logComment
-        * @param $params
-        * @param $newId int
-        * @param $actionCommentIRC string
-        * @return bool
-        */
-       public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
-               $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
-       {
-               global $wgLogRestrictions;
-               # Don't add private logs to RC!
-               if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
-                       return false;
-               }
-               $rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
-                       $target, $logComment, $params, $newId, $actionCommentIRC );
-               $rc->save();
-               return true;
-       }
-
-       /**
-        * @param $timestamp
-        * @param $title Title
-        * @param $user User
-        * @param $actionComment
-        * @param $ip string
-        * @param $type
-        * @param $action
-        * @param $target Title
-        * @param $logComment
-        * @param $params
-        * @param $newId int
-        * @param $actionCommentIRC string
-        * @return RecentChange
-        */
-       public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
-               $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
-               global $wgRequest;
-
-               ## Get pageStatus for email notification
-               switch ( $type . '-' . $action ) {
-                       case 'delete-delete':
-                               $pageStatus = 'deleted';
-                               break;
-                       case 'move-move':
-                       case 'move-move_redir':
-                               $pageStatus = 'moved';
-                               break;
-                       case 'delete-restore':
-                               $pageStatus = 'restored';
-                               break;
-                       case 'upload-upload':
-                               $pageStatus = 'created';
-                               break;
-                       case 'upload-overwrite':
-                       default:
-                               $pageStatus = 'changed';
-                               break;
-               }
-
-               $rc = new RecentChange;
-               $rc->mTitle = $target;
-               $rc->mPerformer = $user;
-               $rc->mAttribs = array(
-                       'rc_timestamp'  => $timestamp,
-                       'rc_cur_time'   => $timestamp,
-                       'rc_namespace'  => $target->getNamespace(),
-                       'rc_title'      => $target->getDBkey(),
-                       'rc_type'       => RC_LOG,
-                       'rc_minor'      => 0,
-                       'rc_cur_id'     => $target->getArticleID(),
-                       'rc_user'       => $user->getId(),
-                       'rc_user_text'  => $user->getName(),
-                       'rc_comment'    => $logComment,
-                       'rc_this_oldid' => 0,
-                       'rc_last_oldid' => 0,
-                       'rc_bot'        => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
-                       'rc_ip'         => self::checkIPAddress( $ip ),
-                       'rc_patrolled'  => 1,
-                       'rc_new'        => 0, # obsolete
-                       'rc_old_len'    => null,
-                       'rc_new_len'    => null,
-                       'rc_deleted'    => 0,
-                       'rc_logid'      => $newId,
-                       'rc_log_type'   => $type,
-                       'rc_log_action' => $action,
-                       'rc_params'     => $params
-               );
-
-               $rc->mExtra = array(
-                       'prefixedDBkey' => $title->getPrefixedDBkey(),
-                       'lastTimestamp' => 0,
-                       'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
-                       'pageStatus'    => $pageStatus,
-                       'actionCommentIRC' => $actionCommentIRC
-               );
-               return $rc;
-       }
-
-       /**
-        * Initialises the members of this object from a mysql row object
-        *
-        * @param $row
-        */
-       public function loadFromRow( $row ) {
-               $this->mAttribs = get_object_vars( $row );
-               $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
-               $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
-       }
-
-       /**
-        * Makes a pseudo-RC entry from a cur row
-        *
-        * @deprected in 1.22
-        * @param $row
-        */
-       public function loadFromCurRow( $row ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               $this->mAttribs = array(
-                       'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
-                       'rc_cur_time' => $row->rev_timestamp,
-                       'rc_user' => $row->rev_user,
-                       'rc_user_text' => $row->rev_user_text,
-                       'rc_namespace' => $row->page_namespace,
-                       'rc_title' => $row->page_title,
-                       'rc_comment' => $row->rev_comment,
-                       'rc_minor' => $row->rev_minor_edit ? 1 : 0,
-                       'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
-                       'rc_cur_id' => $row->page_id,
-                       'rc_this_oldid' => $row->rev_id,
-                       'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
-                       'rc_bot' => 0,
-                       'rc_ip' => '',
-                       'rc_id' => $row->rc_id,
-                       'rc_patrolled' => $row->rc_patrolled,
-                       'rc_new' => $row->page_is_new, # obsolete
-                       'rc_old_len' => $row->rc_old_len,
-                       'rc_new_len' => $row->rc_new_len,
-                       'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
-                       'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
-                       'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
-                       'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
-                       'rc_deleted' => $row->rc_deleted // MUST be set
-               );
-       }
-
-       /**
-        * Get an attribute value
-        *
-        * @param string $name Attribute name
-        * @return mixed
-        */
-       public function getAttribute( $name ) {
-               return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
-       }
-
-       /**
-        * @return array
-        */
-       public function getAttributes() {
-               return $this->mAttribs;
-       }
-
-       /**
-        * Gets the end part of the diff URL associated with this object
-        * Blank if no diff link should be displayed
-        * @param $forceCur
-        * @return string
-        */
-       public function diffLinkTrail( $forceCur ) {
-               if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
-                       $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
-                               "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
-                       if ( $forceCur ) {
-                               $trail .= '&diff=0';
-                       } else {
-                               $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
-                       }
-               } else {
-                       $trail = '';
-               }
-               return $trail;
-       }
-
-       /**
-        * Returns the change size (HTML).
-        * The lengths can be given optionally.
-        * @param $old int
-        * @param $new int
-        * @return string
-        */
-       public function getCharacterDifference( $old = 0, $new = 0 ) {
-               if ( $old === 0 ) {
-                       $old = $this->mAttribs['rc_old_len'];
-               }
-               if ( $new === 0 ) {
-                       $new = $this->mAttribs['rc_new_len'];
-               }
-               if ( $old === null || $new === null ) {
-                       return '';
-               }
-               return ChangesList::showCharacterDifference( $old, $new );
-       }
-
-       /**
-        * Purge expired changes from the recentchanges table
-        * @since 1.22
-        */
-       public static function purgeExpiredChanges() {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               $method = __METHOD__;
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
-                       global $wgRCMaxAge;
-
-                       $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
-                       $dbw->delete(
-                               'recentchanges',
-                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
-                               $method
-                       );
-               } );
-       }
-
-       private static function checkIPAddress( $ip ) {
-               global $wgRequest;
-               if ( $ip ) {
-                       if ( !IP::isIPAddress( $ip ) ) {
-                               throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" );
-                       }
-               } else {
-                       $ip = $wgRequest->getIP();
-                       if ( !$ip ) {
-                               $ip = '';
-                       }
-               }
-               return $ip;
-       }
-
-       /**
-        * Check whether the given timestamp is new enough to have a RC row with a given tolerance
-        * as the recentchanges table might not be cleared out regularly (so older entries might exist)
-        * or rows which will be deleted soon shouldn't be included.
-        *
-        * @param $timestamp mixed MWTimestamp compatible timestamp
-        * @param $tolerance integer Tolerance in seconds
-        * @return bool
-        */
-       public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
-               global $wgRCMaxAge;
-               return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge;
-       }
-}
index 305c8ff..233eac0 100644 (file)
@@ -116,11 +116,13 @@ class Revision implements IDBAccessObject {
                if ( $id ) {
                        // Use the specified ID
                        $conds['rev_id'] = $id;
+                       return self::newFromConds( $conds, (int)$flags );
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
+                       $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+                       return self::loadFromConds( $db, $conds, $flags );
                }
-               return self::newFromConds( $conds, (int)$flags );
        }
 
        /**
index 44cafe9..e5b8872 100644 (file)
@@ -1717,6 +1717,10 @@ abstract class BaseTemplate extends QuickTemplate {
         * on the link) is present it will be used to generate a tooltip and
         * accesskey for the link.
         *
+        * The keys "context" and "primary" are ignored; these keys are used
+        * internally by skins and are not supposed to be included in the HTML
+        * output.
+        *
         * If you don't want an accesskey, set $item['tooltiponly'] = true;
         *
         * @param array $options can be used to affect the output of a link.
@@ -1757,7 +1761,7 @@ abstract class BaseTemplate extends QuickTemplate {
 
                if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) {
                        $attrs = $item;
-                       foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly' ) as $k ) {
+                       foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) {
                                unset( $attrs[$k] );
                        }
 
index c03f1ba..11edc8a 100644 (file)
@@ -155,7 +155,6 @@ class SpecialPageFactory {
 
                // Unlisted / redirects
                'Blankpage'                 => 'SpecialBlankpage',
-               'Blockme'                   => 'SpecialBlockme',
                'Emailuser'                 => 'SpecialEmailUser',
                'Movepage'                  => 'MovePageForm',
                'Mycontributions'           => 'SpecialMycontributions',
index 7a84fed..ab24201 100644 (file)
@@ -188,15 +188,18 @@ class Status {
                        }
                }
                if ( count( $this->errors ) == 1 ) {
-                       $s = $this->getErrorMessage( $this->errors[0] );
+                       $s = $this->getErrorMessage( $this->errors[0] )->plain();
                        if ( $shortContext ) {
                                $s = wfMessage( $shortContext, $s )->plain();
                        } elseif ( $longContext ) {
                                $s = wfMessage( $longContext, "* $s\n" )->plain();
                        }
                } else {
-                       $s = '* ' . implode( "\n* ",
-                               $this->getErrorMessageArray( $this->errors ) ) . "\n";
+                       $errors = $this->getErrorMessageArray( $this->errors );
+                       foreach ( $errors as &$error ) {
+                               $error = $error->plain();
+                       }
+                       $s = '* ' . implode( "\n* ", $errors ) . "\n";
                        if ( $longContext ) {
                                $s = wfMessage( $longContext, $s )->plain();
                        } elseif ( $shortContext ) {
@@ -206,6 +209,49 @@ class Status {
                return $s;
        }
 
+       /**
+        * Get the error list as a Message object
+        *
+        * @param string $shortContext a short enclosing context message name, to
+        *        be used when there is a single error
+        * @param string $longContext a long enclosing context message name, for a list
+        * @return Message
+        */
+       function getMessage( $shortContext = false, $longContext = false ) {
+               if ( count( $this->errors ) == 0 ) {
+                       if ( $this->ok ) {
+                               $this->fatal( 'internalerror_info',
+                                       __METHOD__ . " called for a good result, this is incorrect\n" );
+                       } else {
+                               $this->fatal( 'internalerror_info',
+                                       __METHOD__ . ": Invalid result object: no error text but not OK\n" );
+                       }
+               }
+               if ( count( $this->errors ) == 1 ) {
+                       $s = $this->getErrorMessage( $this->errors[0] );
+                       if ( $shortContext ) {
+                               $s = wfMessage( $shortContext, $s );
+                       } elseif ( $longContext ) {
+                               $wrapper = new RawMessage( "* \$1\n" );
+                               $wrapper->params( $s )->parse();
+                               $s = wfMessage( $longContext, $wrapper );
+                       }
+               } else {
+                       $msgs =  $this->getErrorMessageArray( $this->errors );
+                       $wrapper = new RawMessage( '* $' . implode( "\n* \$", range( 1, count( $msgs ) + 1 ) ) );
+                       $wrapper->params( $msgs )->parse();
+
+                       if ( $longContext ) {
+                               $s = wfMessage( $longContext, $wrapper );
+                       } elseif ( $shortContext ) {
+                               $wrapper = new RawMessage( "\n\$1\n", $wrapper );
+                               $wrapper->parse();
+                               $s = wfMessage( $shortContext, $wrapper );
+                       }
+               }
+               return $s;
+       }
+
        /**
         * Return the message for a single error.
         * @param $error Mixed With an array & two values keyed by
@@ -230,7 +276,7 @@ class Status {
                } else {
                        $msg = wfMessage( $error );
                }
-               return $msg->plain();
+               return $msg;
        }
 
        /**
@@ -371,15 +417,6 @@ class Status {
                return $replaced;
        }
 
-       /**
-        * Backward compatibility function for WikiError -> Status migration
-        *
-        * @return String
-        */
-       public function getMessage() {
-               return $this->getWikiText();
-       }
-
        /**
         * @return mixed
         */
index 56e9b44..21872e4 100644 (file)
@@ -2458,31 +2458,31 @@ class Title {
        }
 
        /**
-        * Is this page "semi-protected" - the *only* protection is autoconfirm?
+        * Is this page "semi-protected" - the *only* protection levels are listed
+        * in $wgSemiprotectedRestrictionLevels?
         *
         * @param string $action Action to check (default: edit)
         * @return Bool
         */
        public function isSemiProtected( $action = 'edit' ) {
-               if ( $this->exists() ) {
-                       $restrictions = $this->getRestrictions( $action );
-                       if ( count( $restrictions ) > 0 ) {
-                               foreach ( $restrictions as $restriction ) {
-                                       if ( strtolower( $restriction ) != 'editsemiprotected' &&
-                                               strtolower( $restriction ) != 'autoconfirmed' // BC
-                                       ) {
-                                               return false;
-                                       }
-                               }
-                       } else {
-                               # Not protected
-                               return false;
-                       }
-                       return true;
-               } else {
-                       # If it doesn't exist, it can't be protected
+               global $wgSemiprotectedRestrictionLevels;
+
+               $restrictions = $this->getRestrictions( $action );
+               $semi = $wgSemiprotectedRestrictionLevels;
+               if ( !$restrictions || !$semi ) {
+                       // Not protected, or all protection is full protection
                        return false;
                }
+
+               // Remap autoconfirmed to editsemiprotected for BC
+               foreach ( array_keys( $semi, 'autoconfirmed' ) as $key ) {
+                       $semi[$key] = 'editsemiprotected';
+               }
+               foreach ( array_keys( $restrictions, 'autoconfirmed' ) as $key ) {
+                       $restrictions[$key] = 'editsemiprotected';
+               }
+
+               return !array_diff( $restrictions, $semi );
        }
 
        /**
@@ -3903,7 +3903,12 @@ class Title {
                        __METHOD__
                );
 
-               $this->resetArticleID( 0 );
+               // clean up the old title before reset article id - bug 45348
+               if ( !$redirectContent ) {
+                       WikiPage::onArticleDelete( $this );
+               }
+
+               $this->resetArticleID( 0 ); // 0 == non existing
                $nt->resetArticleID( $oldid );
                $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
 
@@ -3919,13 +3924,12 @@ class Title {
                }
 
                # Recreate the redirect, this time in the other direction.
-               if ( !$redirectContent ) {
-                       WikiPage::onArticleDelete( $this );
-               } else {
+               if ( $redirectContent ) {
                        $redirectArticle = WikiPage::factory( $this );
                        $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
+                               $this->resetArticleID( $newid );
                                $redirectRevision = new Revision( array(
                                        'title' => $this, // for determining the default content model
                                        'page' => $newid,
index 1965982..7c3dc93 100644 (file)
@@ -1457,7 +1457,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Returns true iff this page's content model supports sections.
+        * Returns true if this page's content model supports sections.
         *
         * @return boolean whether sections are supported.
         *
index 6ab1012..a92c87f 100644 (file)
@@ -865,7 +865,7 @@ class MessageCache {
         *
         * @param string $title Message cache key with initial uppercase letter.
         * @param string $code Code denoting the language to try.
-        * @return string|bool The message, or false iff it does not exist or on error
+        * @return string|bool The message, or false if it does not exist or on error
         */
        function getMsgFromNamespace( $title, $code ) {
                $this->load( $code );
diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php
new file mode 100644 (file)
index 0000000..bf800c4
--- /dev/null
@@ -0,0 +1,552 @@
+<?php
+/**
+ * Base class for all changes lists.
+ *
+ * The class is used for formatting recent changes, related changes and watchlist.
+ *
+ * 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 ChangesList extends ContextSource {
+
+       /**
+        * @var Skin
+        */
+       public $skin;
+
+       protected $watchlist = false;
+
+       protected $message;
+
+       /**
+        * Changeslist constructor
+        *
+        * @param $obj Skin or IContextSource
+        */
+       public function __construct( $obj ) {
+               if ( $obj instanceof IContextSource ) {
+                       $this->setContext( $obj );
+                       $this->skin = $obj->getSkin();
+               } else {
+                       $this->setContext( $obj->getContext() );
+                       $this->skin = $obj;
+               }
+               $this->preCacheMessages();
+       }
+
+       /**
+        * Fetch an appropriate changes list class for the main context
+        * This first argument used to be an User object.
+        *
+        * @deprecated in 1.18; use newFromContext() instead
+        * @param string|User $unused Unused
+        * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+        */
+       public static function newFromUser( $unused ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return self::newFromContext( RequestContext::getMain() );
+       }
+
+       /**
+        * Fetch an appropriate changes list class for the specified context
+        * Some users might want to use an enhanced list format, for instance
+        *
+        * @param $context IContextSource to use
+        * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+        */
+       public static function newFromContext( IContextSource $context ) {
+               $user = $context->getUser();
+               $sk = $context->getSkin();
+               $list = null;
+               if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
+                       $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
+                       return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
+               } else {
+                       return $list;
+               }
+       }
+
+       /**
+        * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
+        * @param $value Boolean
+        */
+       public function setWatchlistDivs( $value = true ) {
+               $this->watchlist = $value;
+       }
+
+       /**
+        * As we use the same small set of messages in various methods and that
+        * they are called often, we call them once and save them in $this->message
+        */
+       private function preCacheMessages() {
+               if ( !isset( $this->message ) ) {
+                       foreach ( array(
+                               'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history',
+                               'semicolon-separator', 'pipe-separator' ) as $msg
+                       ) {
+                               $this->message[$msg] = $this->msg( $msg )->escaped();
+                       }
+               }
+       }
+
+       /**
+        * Returns the appropriate flags for new page, minor change and patrolling
+        * @param array $flags Associative array of 'flag' => Bool
+        * @param string $nothing to use for empty space
+        * @return String
+        */
+       public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+               global $wgRecentChangesFlags;
+               $f = '';
+               foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
+                       $f .= isset( $flags[$flag] ) && $flags[$flag]
+                               ? self::flag( $flag )
+                               : $nothing;
+               }
+               return $f;
+       }
+
+       /**
+        * Provide the "<abbr>" element appropriate to a given abbreviated flag,
+        * namely the flag indicating a new page, a minor edit, a bot edit, or an
+        * unpatrolled edit.  By default in English it will contain "N", "m", "b",
+        * "!" respectively, plus it will have an appropriate title and class.
+        *
+        * @param string $flag One key of $wgRecentChangesFlags
+        * @return String: Raw HTML
+        */
+       public static function flag( $flag ) {
+               static $flagInfos = null;
+               if ( is_null( $flagInfos ) ) {
+                       global $wgRecentChangesFlags;
+                       $flagInfos = array();
+                       foreach ( $wgRecentChangesFlags as $key => $value ) {
+                               $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
+                               $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
+                               // Allow customized class name, fall back to flag name
+                               $flagInfos[$key]['class'] = Sanitizer::escapeClass(
+                                       isset( $value['class'] ) ? $value['class'] : $key );
+                       }
+               }
+
+               // Inconsistent naming, bleh, kepted for b/c
+               $map = array(
+                       'minoredit' => 'minor',
+                       'botedit' => 'bot',
+               );
+               if ( isset( $map[$flag] ) ) {
+                       $flag = $map[$flag];
+               }
+
+               return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" . $flagInfos[$flag]['title'] . "'>" .
+                       $flagInfos[$flag]['letter'] .
+                       '</abbr>';
+       }
+
+       /**
+        * Returns text for the start of the tabular part of RC
+        * @return String
+        */
+       public function beginRecentChangesList() {
+               $this->rc_cache = array();
+               $this->rcMoveIndex = 0;
+               $this->rcCacheIndex = 0;
+               $this->lastdate = '';
+               $this->rclistOpen = false;
+               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+               return '';
+       }
+
+       /**
+        * Show formatted char difference
+        * @param $old Integer: bytes
+        * @param $new Integer: bytes
+        * @param $context IContextSource context to use
+        * @return String
+        */
+       public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
+               global $wgRCChangedSizeThreshold, $wgMiserMode;
+
+               if ( !$context ) {
+                       $context = RequestContext::getMain();
+               }
+
+               $new = (int)$new;
+               $old = (int)$old;
+               $szdiff = $new - $old;
+
+               $lang = $context->getLanguage();
+               $code = $lang->getCode();
+               static $fastCharDiff = array();
+               if ( !isset( $fastCharDiff[$code] ) ) {
+                       $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
+               }
+
+               $formattedSize = $lang->formatNum( $szdiff );
+
+               if ( !$fastCharDiff[$code] ) {
+                       $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
+               }
+
+               if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
+                       $tag = 'strong';
+               } else {
+                       $tag = 'span';
+               }
+
+               if ( $szdiff === 0 ) {
+                       $formattedSizeClass = 'mw-plusminus-null';
+               }
+               if ( $szdiff > 0 ) {
+                       $formattedSize = '+' . $formattedSize;
+                       $formattedSizeClass = 'mw-plusminus-pos';
+               }
+               if ( $szdiff < 0 ) {
+                       $formattedSizeClass = 'mw-plusminus-neg';
+               }
+
+               $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
+
+               return Html::element( $tag,
+                       array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
+                       $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
+       }
+
+       /**
+        * Format the character difference of one or several changes.
+        *
+        * @param $old RecentChange
+        * @param $new RecentChange last change to use, if not provided, $old will be used
+        * @return string HTML fragment
+        */
+       public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
+               $oldlen = $old->mAttribs['rc_old_len'];
+
+               if ( $new ) {
+                       $newlen = $new->mAttribs['rc_new_len'];
+               } else {
+                       $newlen = $old->mAttribs['rc_new_len'];
+               }
+
+               if ( $oldlen === null || $newlen === null ) {
+                       return '';
+               }
+
+               return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
+       }
+
+       /**
+        * Returns text for the end of RC
+        * @return String
+        */
+       public function endRecentChangesList() {
+               if ( $this->rclistOpen ) {
+                       return "</ul>\n";
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param string $s HTML to update
+        * @param $rc_timestamp mixed
+        */
+       public function insertDateHeader( &$s, $rc_timestamp ) {
+               # Make date header if necessary
+               $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
+               if ( $date != $this->lastdate ) {
+                       if ( $this->lastdate != '' ) {
+                               $s .= "</ul>\n";
+                       }
+                       $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
+                       $this->lastdate = $date;
+                       $this->rclistOpen = true;
+               }
+       }
+
+       /**
+        * @param string $s HTML to update
+        * @param $title Title
+        * @param $logtype string
+        */
+       public function insertLog( &$s, $title, $logtype ) {
+               $page = new LogPage( $logtype );
+               $logname = $page->getName()->escaped();
+               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+       }
+
+       /**
+        * @param string $s HTML to update
+        * @param $rc RecentChange
+        * @param $unpatrolled
+        */
+       public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
+               # Diff link
+               if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
+                       $diffLink = $this->message['diff'];
+               } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       $diffLink = $this->message['diff'];
+               } else {
+                       $query = array(
+                               'curid' => $rc->mAttribs['rc_cur_id'],
+                               'diff' => $rc->mAttribs['rc_this_oldid'],
+                               'oldid' => $rc->mAttribs['rc_last_oldid']
+                       );
+
+                       $diffLink = Linker::linkKnown(
+                               $rc->getTitle(),
+                               $this->message['diff'],
+                               array( 'tabindex' => $rc->counter ),
+                               $query
+                       );
+               }
+               $diffhist = $diffLink . $this->message['pipe-separator'];
+               # History link
+               $diffhist .= Linker::linkKnown(
+                       $rc->getTitle(),
+                       $this->message['hist'],
+                       array(),
+                       array(
+                               'curid' => $rc->mAttribs['rc_cur_id'],
+                               'action' => 'history'
+                       )
+               );
+               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
+       }
+
+       /**
+        * @param string $s HTML to update
+        * @param $rc RecentChange
+        * @param $unpatrolled
+        * @param $watched
+        */
+       public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
+               $params = array();
+
+               $articlelink = Linker::linkKnown(
+                       $rc->getTitle(),
+                       null,
+                       array( 'class' => 'mw-changeslist-title' ),
+                       $params
+               );
+               if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+                       $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
+               }
+               # To allow for boldening pages watched by this user
+               $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
+               # RTL/LTR marker
+               $articlelink .= $this->getLanguage()->getDirMark();
+
+               wfRunHooks( 'ChangesListInsertArticleLink',
+                       array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
+
+               $s .= " $articlelink";
+       }
+
+       /**
+        * Get the timestamp from $rc formatted with current user's settings
+        * and a separator
+        *
+        * @param $rc RecentChange
+        * @return string HTML fragment
+        */
+       public function getTimestamp( $rc ) {
+               return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
+       }
+
+       /**
+        * Insert time timestamp string from $rc into $s
+        *
+        * @param string $s HTML to update
+        * @param $rc RecentChange
+        */
+       public function insertTimestamp( &$s, $rc ) {
+               $s .= $this->getTimestamp( $rc );
+       }
+
+       /**
+        * Insert links to user page, user talk page and eventually a blocking link
+        *
+        * @param &$s String HTML to update
+        * @param &$rc RecentChange
+        */
+       public function insertUserRelatedLinks( &$s, &$rc ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+                       $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+               } else {
+                       $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
+                               $rc->mAttribs['rc_user_text'] );
+                       $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+               }
+       }
+
+       /**
+        * Insert a formatted action
+        *
+        * @param $rc RecentChange
+        * @return string
+        */
+       public function insertLogEntry( $rc ) {
+               $formatter = LogFormatter::newFromRow( $rc->mAttribs );
+               $formatter->setContext( $this->getContext() );
+               $formatter->setShowUserToolLinks( true );
+               $mark = $this->getLanguage()->getDirMark();
+               return $formatter->getActionText() . " $mark" . $formatter->getComment();
+       }
+
+       /**
+        * Insert a formatted comment
+        * @param $rc RecentChange
+        * @return string
+        */
+       public function insertComment( $rc ) {
+               if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
+                       if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+                               return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
+                       } else {
+                               return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
+                       }
+               }
+               return '';
+       }
+
+       /**
+        * Check whether to enable recent changes patrol features
+        *
+        * @deprecated since 1.22
+        * @return Boolean
+        */
+       public static function usePatrol() {
+               global $wgUser;
+
+               wfDeprecated( __METHOD__, '1.22' );
+
+               return $wgUser->useRCPatrol();
+       }
+
+       /**
+        * Returns the string which indicates the number of watching users
+        * @return string
+        */
+       protected function numberofWatchingusers( $count ) {
+               static $cache = array();
+               if ( $count > 0 ) {
+                       if ( !isset( $cache[$count] ) ) {
+                               $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
+                       }
+                       return $cache[$count];
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Determine if said field of a revision is hidden
+        * @param $rc RCCacheEntry
+        * @param $field Integer: one of DELETED_* bitfield constants
+        * @return Boolean
+        */
+       public static function isDeleted( $rc, $field ) {
+               return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
+       }
+
+       /**
+        * Determine if the current user is allowed to view a particular
+        * field of this revision, if it's marked as deleted.
+        * @param $rc RCCacheEntry
+        * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
+        * @return Boolean
+        */
+       public static function userCan( $rc, $field, User $user = null ) {
+               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+                       return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+               } else {
+                       return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+               }
+       }
+
+       /**
+        * @param $link string
+        * @param $watched bool
+        * @return string
+        */
+       protected function maybeWatchedLink( $link, $watched = false ) {
+               if ( $watched ) {
+                       return '<strong class="mw-watched">' . $link . '</strong>';
+               } else {
+                       return '<span class="mw-rc-unwatched">' . $link . '</span>';
+               }
+       }
+
+       /** Inserts a rollback link
+        *
+        * @param $s string
+        * @param $rc RecentChange
+        */
+       public function insertRollback( &$s, &$rc ) {
+               if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
+                       $page = $rc->getTitle();
+                       /** Check for rollback and edit permissions, disallow special pages, and only
+                         * show a link on the top-most revision */
+                       if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
+                       {
+                               $rev = new Revision( array(
+                                       'title' => $page,
+                                       'id' => $rc->mAttribs['rc_this_oldid'],
+                                       'user' => $rc->mAttribs['rc_user'],
+                                       'user_text' => $rc->mAttribs['rc_user_text'],
+                                       'deleted' => $rc->mAttribs['rc_deleted']
+                               ) );
+                               $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+                       }
+               }
+       }
+
+       /**
+        * @param $s string
+        * @param $rc RecentChange
+        * @param $classes
+        */
+       public function insertTags( &$s, &$rc, &$classes ) {
+               if ( empty( $rc->mAttribs['ts_tags'] ) ) {
+                       return;
+               }
+
+               list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
+               $classes = array_merge( $classes, $newClasses );
+               $s .= ' ' . $tagSummary;
+       }
+
+       public function insertExtra( &$s, &$rc, &$classes ) {
+               // Empty, used for subclasses to add anything special.
+       }
+
+       protected function showAsUnpatrolled( RecentChange $rc ) {
+               $unpatrolled = false;
+               if ( !$rc->mAttribs['rc_patrolled'] ) {
+                       if ( $this->getUser()->useRCPatrol() ) {
+                               $unpatrolled = true;
+                       } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
+                               $unpatrolled = true;
+                       }
+               }
+               return $unpatrolled;
+       }
+}
diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php
new file mode 100644 (file)
index 0000000..433adb3
--- /dev/null
@@ -0,0 +1,662 @@
+<?php
+/**
+ * Generates a list of changes using an Enhanced system (uses javascript).
+ *
+ * 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 EnhancedChangesList extends ChangesList {
+
+       protected $rc_cache;
+
+       /**
+        * Add the JavaScript file for enhanced changeslist
+        * @return String
+        */
+       public function beginRecentChangesList() {
+               $this->rc_cache = array();
+               $this->rcMoveIndex = 0;
+               $this->rcCacheIndex = 0;
+               $this->lastdate = '';
+               $this->rclistOpen = false;
+               $this->getOutput()->addModuleStyles( array(
+                       'mediawiki.special.changeslist',
+                       'mediawiki.special.changeslist.enhanced',
+               ) );
+               $this->getOutput()->addModules( array(
+                       'jquery.makeCollapsible',
+                       'mediawiki.icon',
+               ) );
+               return '';
+       }
+       /**
+        * Format a line for enhanced recentchange (aka with javascript and block of lines).
+        *
+        * @param $baseRC RecentChange
+        * @param $watched bool
+        *
+        * @return string
+        */
+       public function recentChangesLine( &$baseRC, $watched = false ) {
+               wfProfileIn( __METHOD__ );
+
+               # Create a specialised object
+               $rc = RCCacheEntry::newFromParent( $baseRC );
+
+               $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
+
+               # If it's a new day, add the headline and flush the cache
+               $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+               $ret = '';
+               if ( $date != $this->lastdate ) {
+                       # Process current cache
+                       $ret = $this->recentChangesBlock();
+                       $this->rc_cache = array();
+                       $ret .= Xml::element( 'h4', null, $date ) . "\n";
+                       $this->lastdate = $date;
+               }
+
+               # Should patrol-related stuff be shown?
+               $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
+
+               $showdifflinks = true;
+               # Make article link
+               $type = $rc->mAttribs['rc_type'];
+               $logType = $rc->mAttribs['rc_log_type'];
+               // Page moves, very old style, not supported anymore
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+               // New unpatrolled pages
+               } elseif ( $rc->unpatrolled && $type == RC_NEW ) {
+                       $clink = Linker::linkKnown( $rc->getTitle() );
+               // Log entries
+               } elseif ( $type == RC_LOG ) {
+                       if ( $logType ) {
+                               $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
+                               $logpage = new LogPage( $logType );
+                               $logname = $logpage->getName()->escaped();
+                               $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+                       } else {
+                               $clink = Linker::link( $rc->getTitle() );
+                       }
+                       $watched = false;
+               // Log entries (old format) and special pages
+               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+                       wfDebug( "Unexpected special page in recentchanges\n" );
+                       $clink = '';
+               // Edits
+               } else {
+                       $clink = Linker::linkKnown( $rc->getTitle() );
+               }
+
+               # Don't show unusable diff links
+               if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       $showdifflinks = false;
+               }
+
+               $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+               $rc->watched = $watched;
+               $rc->link = $clink;
+               $rc->timestamp = $time;
+               $rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
+
+               # Make "cur" and "diff" links.  Do not use link(), it is too slow if
+               # called too many times (50% of CPU time on RecentChanges!).
+               $thisOldid = $rc->mAttribs['rc_this_oldid'];
+               $lastOldid = $rc->mAttribs['rc_last_oldid'];
+
+               $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
+               $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
+
+               if ( !$showdifflinks ) {
+                       $curLink = $this->message['cur'];
+                       $diffLink = $this->message['diff'];
+               } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+                       if ( $type != RC_NEW ) {
+                               $curLink = $this->message['cur'];
+                       } else {
+                               $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+                               $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+                       }
+                       $diffLink = $this->message['diff'];
+               } else {
+                       $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
+                       $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
+                       $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+               }
+
+               # Make "last" link
+               if ( !$showdifflinks || !$lastOldid ) {
+                       $lastLink = $this->message['last'];
+               } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+                       $lastLink = $this->message['last'];
+               } else {
+                       $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
+                               array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
+               }
+
+               # Make user links
+               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+                       $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+               } else {
+                       $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+                       $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+               }
+
+               $rc->lastlink = $lastLink;
+               $rc->curlink = $curLink;
+               $rc->difflink = $diffLink;
+
+               # Put accumulated information into the cache, for later display
+               # Page moves go on their own line
+               $title = $rc->getTitle();
+               $secureName = $title->getPrefixedDBkey();
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+                       # Use an @ character to prevent collision with page names
+                       $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc );
+               } else {
+                       # Logs are grouped by type
+                       if ( $type == RC_LOG ) {
+                               $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
+                       }
+                       if ( !isset( $this->rc_cache[$secureName] ) ) {
+                               $this->rc_cache[$secureName] = array();
+                       }
+
+                       array_push( $this->rc_cache[$secureName], $rc );
+               }
+
+               wfProfileOut( __METHOD__ );
+
+               return $ret;
+       }
+
+       /**
+        * Enhanced RC group
+        * @return string
+        */
+       protected function recentChangesBlockGroup( $block ) {
+               global $wgRCShowChangedSize;
+
+               wfProfileIn( __METHOD__ );
+
+               # Add the namespace and title of the block as part of the class
+               $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
+               if ( $block[0]->mAttribs['rc_log_type'] ) {
+                       # Log entry
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+                                       . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+               } else {
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
+                                       . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+               }
+               $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+                       Html::openElement( 'tr' );
+
+               # Collate list of users
+               $userlinks = array();
+               # Other properties
+               $unpatrolled = false;
+               $isnew = false;
+               $allBots = true;
+               $allMinors = true;
+               $curId = $currentRevision = 0;
+               # Some catalyst variables...
+               $namehidden = true;
+               $allLogs = true;
+               foreach ( $block as $rcObj ) {
+                       $oldid = $rcObj->mAttribs['rc_last_oldid'];
+                       if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
+                               $isnew = true;
+                       }
+                       // If all log actions to this page were hidden, then don't
+                       // give the name of the affected page for this block!
+                       if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
+                               $namehidden = false;
+                       }
+                       $u = $rcObj->userlink;
+                       if ( !isset( $userlinks[$u] ) ) {
+                               $userlinks[$u] = 0;
+                       }
+                       if ( $rcObj->unpatrolled ) {
+                               $unpatrolled = true;
+                       }
+                       if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
+                               $allLogs = false;
+                       }
+                       # Get the latest entry with a page_id and oldid
+                       # since logs may not have these.
+                       if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
+                               $curId = $rcObj->mAttribs['rc_cur_id'];
+                       }
+                       if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
+                               $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
+                       }
+
+                       if ( !$rcObj->mAttribs['rc_bot'] ) {
+                               $allBots = false;
+                       }
+                       if ( !$rcObj->mAttribs['rc_minor'] ) {
+                               $allMinors = false;
+                       }
+
+                       $userlinks[$u]++;
+               }
+
+               # Sort the list and convert to text
+               krsort( $userlinks );
+               asort( $userlinks );
+               $users = array();
+               foreach ( $userlinks as $userlink => $count ) {
+                       $text = $userlink;
+                       $text .= $this->getLanguage()->getDirMark();
+                       if ( $count > 1 ) {
+                               $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
+                       }
+                       array_push( $users, $text );
+               }
+
+               $users = ' <span class="changedby">'
+                       . $this->msg( 'brackets' )->rawParams(
+                               implode( $this->message['semicolon-separator'], $users )
+                       )->escaped() . '</span>';
+
+               $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
+               $r .= "<td>$tl</td>";
+
+               # Main line
+               $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
+                       'newpage' => $isnew, # show, when one have this flag
+                       'minor' => $allMinors, # show only, when all have this flag
+                       'unpatrolled' => $unpatrolled, # show, when one have this flag
+                       'bot' => $allBots, # show only, when all have this flag
+               ) );
+
+               # Timestamp
+               $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
+
+               # Article link
+               if ( $namehidden ) {
+                       $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
+               } elseif ( $allLogs ) {
+                       $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
+               } else {
+                       $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
+               }
+
+               $r .= $this->getLanguage()->getDirMark();
+
+               $queryParams['curid'] = $curId;
+
+               # Changes message
+               static $nchanges = array();
+               static $sinceLastVisitMsg = array();
+
+               $n = count( $block );
+               if ( !isset( $nchanges[$n] ) ) {
+                       $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
+               }
+
+               $sinceLast = 0;
+               $unvisitedOldid = null;
+               foreach ( $block as $rcObj ) {
+                       // Same logic as below inside main foreach
+                       if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) {
+                               $sinceLast++;
+                               $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid'];
+                       }
+               }
+               if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) {
+                       $sinceLastVisitMsg[$sinceLast] =
+                               $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped();
+               }
+
+               # Total change link
+               $r .= ' ';
+               $logtext = '';
+               if ( !$allLogs ) {
+                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                               $logtext .= $nchanges[$n];
+                       } elseif ( $isnew ) {
+                               $logtext .= $nchanges[$n];
+                       } else {
+                               $logtext .= Linker::link(
+                                       $block[0]->getTitle(),
+                                       $nchanges[$n],
+                                       array(),
+                                       $queryParams + array(
+                                               'diff' => $currentRevision,
+                                               'oldid' => $oldid,
+                                       ),
+                                       array( 'known', 'noclasses' )
+                               );
+                               if ( $sinceLast > 0 && $sinceLast < $n ) {
+                                       $logtext .= $this->message['pipe-separator'] . Linker::link(
+                                               $block[0]->getTitle(),
+                                               $sinceLastVisitMsg[$sinceLast],
+                                               array(),
+                                               $queryParams + array(
+                                                       'diff' => $currentRevision,
+                                                       'oldid' => $unvisitedOldid,
+                                               ),
+                                               array( 'known', 'noclasses' )
+                                       );
+                               }
+                       }
+               }
+
+               # History
+               if ( $allLogs ) {
+                       // don't show history link for logs
+               } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) {
+                       $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history'];
+               } else {
+                       $params = $queryParams;
+                       $params['action'] = 'history';
+
+                       $logtext .= $this->message['pipe-separator'] .
+                               Linker::linkKnown(
+                                       $block[0]->getTitle(),
+                                       $this->message['enhancedrc-history'],
+                                       array(),
+                                       $params
+                               );
+               }
+
+               if ( $logtext !== '' ) {
+                       $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
+               }
+
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+               # Character difference (does not apply if only log items)
+               if ( $wgRCShowChangedSize && !$allLogs ) {
+                       $last = 0;
+                       $first = count( $block ) - 1;
+                       # Some events (like logs) have an "empty" size, so we need to skip those...
+                       while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
+                               $last++;
+                       }
+                       while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
+                               $first--;
+                       }
+                       # Get net change
+                       $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
+
+                       if ( $chardiff == '' ) {
+                               $r .= ' ';
+                       } else {
+                               $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
+                       }
+               }
+
+               $r .= $users;
+               $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
+
+               # Sub-entries
+               foreach ( $block as $rcObj ) {
+                       # Classes to apply -- TODO implement
+                       $classes = array();
+                       $type = $rcObj->mAttribs['rc_type'];
+
+                       $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                               ? ' class="mw-enhanced-watched"' : '';
+
+                       $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+                       $r .= $this->recentChangesFlags( array(
+                               'newpage' => $type == RC_NEW,
+                               'minor' => $rcObj->mAttribs['rc_minor'],
+                               'unpatrolled' => $rcObj->unpatrolled,
+                               'bot' => $rcObj->mAttribs['rc_bot'],
+                       ) );
+                       $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
+
+                       $params = $queryParams;
+
+                       if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+                               $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
+                       }
+
+                       # Log timestamp
+                       if ( $type == RC_LOG ) {
+                               $link = $rcObj->timestamp;
+                       # Revision link
+                       } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                               $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
+                       } else {
+
+                               $link = Linker::linkKnown(
+                                               $rcObj->getTitle(),
+                                               $rcObj->timestamp,
+                                               array(),
+                                               $params
+                                       );
+                               if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                                       $link = '<span class="history-deleted">' . $link . '</span> ';
+                               }
+                       }
+                       $r .= $link . '</span>';
+
+                       if ( !$type == RC_LOG || $type == RC_NEW ) {
+                               $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
+                       }
+                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+                       # Character diff
+                       if ( $wgRCShowChangedSize ) {
+                               $cd = $this->formatCharacterDifference( $rcObj );
+                               if ( $cd !== '' ) {
+                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+                               }
+                       }
+
+                       if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
+                               $r .= $this->insertLogEntry( $rcObj );
+                       } else {
+                               # User links
+                               $r .= $rcObj->userlink;
+                               $r .= $rcObj->usertalklink;
+                               $r .= $this->insertComment( $rcObj );
+                       }
+
+                       # Rollback
+                       $this->insertRollback( $r, $rcObj );
+                       # Tags
+                       $this->insertTags( $r, $rcObj, $classes );
+
+                       $r .= "</td></tr>\n";
+               }
+               $r .= "</table>\n";
+
+               $this->rcCacheIndex++;
+
+               wfProfileOut( __METHOD__ );
+
+               return $r;
+       }
+
+       /**
+        * Generate HTML for an arrow or placeholder graphic
+        * @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 = '' ) {
+               global $wgStylePath;
+               $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
+               $encAlt = htmlspecialchars( $alt );
+               $encTitle = htmlspecialchars( $title );
+               return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
+       }
+
+       /**
+        * Generate HTML for a right- or left-facing arrow,
+        * depending on language direction.
+        * @return String: HTML "<img>" tag
+        */
+       protected function sideArrow() {
+               $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
+               return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
+       }
+
+       /**
+        * Generate HTML for a down-facing arrow
+        * depending on language direction.
+        * @return String: HTML "<img>" tag
+        */
+       protected function downArrow() {
+               return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
+       }
+
+       /**
+        * Generate HTML for a spacer image
+        * @return String: HTML "<img>" tag
+        */
+       protected function spacerArrow() {
+               return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
+       }
+
+       /**
+        * Enhanced RC ungrouped line.
+        *
+        * @param $rcObj RecentChange
+        * @return String: a HTML formatted line (generated using $r)
+        */
+       protected function recentChangesBlockLine( $rcObj ) {
+               global $wgRCShowChangedSize;
+
+               wfProfileIn( __METHOD__ );
+               $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
+
+               $type = $rcObj->mAttribs['rc_type'];
+               $logType = $rcObj->mAttribs['rc_log_type'];
+               $classes = array( 'mw-enhanced-rc' );
+               if ( $logType ) {
+                       # Log entry
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+                                       . $logType . '-' . $rcObj->mAttribs['rc_title'] );
+               } else {
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
+                                       $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+               }
+               $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+                       Html::openElement( 'tr' );
+
+               $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
+               # Flag and Timestamp
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+                       $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
+               } else {
+                       $r .= $this->recentChangesFlags( array(
+                               'newpage' => $type == RC_NEW,
+                               'minor' => $rcObj->mAttribs['rc_minor'],
+                               'unpatrolled' => $rcObj->unpatrolled,
+                               'bot' => $rcObj->mAttribs['rc_bot'],
+                       ) );
+               }
+               $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
+               # Article or log link
+               if ( $logType ) {
+                       $logPage = new LogPage( $logType );
+                       $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
+                       $logName = $logPage->getName()->escaped();
+                       $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+               } else {
+                       $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
+               }
+               # Diff and hist links
+               if ( $type != RC_LOG ) {
+                       $query['action'] = 'history';
+                       $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                               $rcObj->getTitle(),
+                               $this->message['hist'],
+                               array(),
+                               $query
+                       ) )->escaped();
+               }
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+               # Character diff
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rcObj );
+                       if ( $cd !== '' ) {
+                               $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+                       }
+               }
+
+               if ( $type == RC_LOG ) {
+                       $r .= $this->insertLogEntry( $rcObj );
+               } else {
+                       $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
+                       $r .= $this->insertComment( $rcObj );
+                       $this->insertRollback( $r, $rcObj );
+               }
+
+               # Tags
+               $this->insertTags( $r, $rcObj, $classes );
+               # Show how many people are watching this if enabled
+               $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
+
+               $r .= "</td></tr></table>\n";
+
+               wfProfileOut( __METHOD__ );
+
+               return $r;
+       }
+
+       /**
+        * If enhanced RC is in use, this function takes the previously cached
+        * RC lines, arranges them, and outputs the HTML
+        *
+        * @return string
+        */
+       protected function recentChangesBlock() {
+               if ( count ( $this->rc_cache ) == 0 ) {
+                       return '';
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               $blockOut = '';
+               foreach ( $this->rc_cache as $block ) {
+                       if ( count( $block ) < 2 ) {
+                               $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
+                       } else {
+                               $blockOut .= $this->recentChangesBlockGroup( $block );
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+
+               return '<div>' . $blockOut . '</div>';
+       }
+
+       /**
+        * Returns text for the end of RC
+        * If enhanced RC is in use, returns pretty much all the text
+        * @return string
+        */
+       public function endRecentChangesList() {
+               return $this->recentChangesBlock() . parent::endRecentChangesList();
+       }
+
+}
diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php
new file mode 100644 (file)
index 0000000..a7fe934
--- /dev/null
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Generate a list of changes using the good old system (no javascript).
+ *
+ * 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 OldChangesList extends ChangesList {
+
+       /**
+        * Format a line using the old system (aka without any javascript).
+        *
+        * @param $rc RecentChange, passed by reference
+        * @param bool $watched (default false)
+        * @param int $linenumber (default null)
+        *
+        * @return string|bool
+        */
+       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
+               global $wgRCShowChangedSize;
+               wfProfileIn( __METHOD__ );
+
+               # Should patrol-related stuff be shown?
+               $unpatrolled = $this->showAsUnpatrolled( $rc );
+
+               $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
+               $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
+               $s = '';
+               $classes = array();
+               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+               if ( $linenumber ) {
+                       if ( $linenumber & 1 ) {
+                               $classes[] = 'mw-line-odd';
+                       } else {
+                               $classes[] = 'mw-line-even';
+                       }
+               }
+
+               // Indicate watched status on the line to allow for more
+               // comprehensive styling.
+               $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+
+               // Moved pages (very very old, not supported anymore)
+               if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
+               // Log entries
+               } elseif ( $rc->mAttribs['rc_log_type'] ) {
+                       $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
+                       $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
+               // Log entries (old format) or log targets, and special pages
+               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+                       list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+                       if ( $name == 'Log' ) {
+                               $this->insertLog( $s, $rc->getTitle(), $subpage );
+                       }
+               // Regular entries
+               } else {
+                       $this->insertDiffHist( $s, $rc, $unpatrolled );
+                       # M, N, b and ! (minor, new, bot and unpatrolled)
+                       $s .= $this->recentChangesFlags(
+                               array(
+                                       'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
+                                       'minor' => $rc->mAttribs['rc_minor'],
+                                       'unpatrolled' => $unpatrolled,
+                                       'bot' => $rc->mAttribs['rc_bot']
+                               ),
+                               ''
+                       );
+                       $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+               }
+               # Edit/log timestamp
+               $this->insertTimestamp( $s, $rc );
+               # Bytes added or removed
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rc );
+                       if ( $cd !== '' ) {
+                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+                       }
+               }
+
+               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+                       $s .= $this->insertLogEntry( $rc );
+               } else {
+                       # User tool links
+                       $this->insertUserRelatedLinks( $s, $rc );
+                       # LTR/RTL direction mark
+                       $s .= $this->getLanguage()->getDirMark();
+                       $s .= $this->insertComment( $rc );
+               }
+
+               # Tags
+               $this->insertTags( $s, $rc, $classes );
+               # Rollback
+               $this->insertRollback( $s, $rc );
+               # For subclasses
+               $this->insertExtra( $s, $rc, $classes );
+
+               # How many users watch this page
+               if ( $rc->numberofWatchingusers > 0 ) {
+                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
+               }
+
+               if ( $this->watchlist ) {
+                       $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+               }
+
+               if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               wfProfileOut( __METHOD__ );
+               return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
+       }
+}
diff --git a/includes/changes/RCCacheEntry.php b/includes/changes/RCCacheEntry.php
new file mode 100644 (file)
index 0000000..9aef3d3
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class RCCacheEntry extends RecentChange {
+       var $secureName, $link;
+       var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
+       var $userlink, $timestamp, $watched;
+
+       /**
+        * @param $rc RecentChange
+        * @return RCCacheEntry
+        */
+       static function newFromParent( $rc ) {
+               $rc2 = new RCCacheEntry;
+               $rc2->mAttribs = $rc->mAttribs;
+               $rc2->mExtra = $rc->mExtra;
+               return $rc2;
+       }
+}
diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php
new file mode 100644 (file)
index 0000000..980bd0a
--- /dev/null
@@ -0,0 +1,846 @@
+<?php
+/**
+ * Utility class for creating and accessing recent change entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Utility class for creating new RC entries
+ *
+ * mAttribs:
+ *  rc_id           id of the row in the recentchanges table
+ *  rc_timestamp    time the entry was made
+ *  rc_cur_time     timestamp on the cur row
+ *  rc_namespace    namespace #
+ *  rc_title        non-prefixed db key
+ *  rc_type         is new entry, used to determine whether updating is necessary
+ *  rc_minor        is minor
+ *  rc_cur_id       page_id of associated page entry
+ *  rc_user         user id who made the entry
+ *  rc_user_text    user name who made the entry
+ *  rc_comment      edit summary
+ *  rc_this_oldid   rev_id associated with this entry (or zero)
+ *  rc_last_oldid   rev_id associated with the entry before this one (or zero)
+ *  rc_bot          is bot, hidden
+ *  rc_ip           IP address of the user in dotted quad notation
+ *  rc_new          obsolete, use rc_type==RC_NEW
+ *  rc_patrolled    boolean whether or not someone has marked this edit as patrolled
+ *  rc_old_len      integer byte length of the text before the edit
+ *  rc_new_len      the same after the edit
+ *  rc_deleted      partial deletion
+ *  rc_logid        the log_id value for this log entry (or zero)
+ *  rc_log_type     the log type (or null)
+ *  rc_log_action   the log action (or null)
+ *  rc_params       log params
+ *
+ * mExtra:
+ *  prefixedDBkey   prefixed db key, used by external app via msg queue
+ *  lastTimestamp   timestamp of previous entry, used in WHERE clause during update
+ *  lang            the interwiki prefix, automatically set in save()
+ *  oldSize         text size before the change
+ *  newSize         text size after the change
+ *  pageStatus      status of the page: created, deleted, moved, restored, changed
+ *
+ * temporary:       not stored in the database
+ *      notificationtimestamp
+ *      numberofWatchingusers
+ *
+ * @todo document functions and variables
+ */
+class RecentChange {
+       var $mAttribs = array(), $mExtra = array();
+
+       /**
+        * @var Title
+        */
+       var $mTitle = false;
+
+       /**
+        * @var User
+        */
+       private $mPerformer = false;
+
+       /**
+        * @var Title
+        */
+       var $mMovedToTitle = false;
+       var $numberofWatchingusers = 0; # Dummy to prevent error message in SpecialRecentchangeslinked
+       var $notificationtimestamp;
+
+       # Factory methods
+
+       /**
+        * @param $row
+        * @return RecentChange
+        */
+       public static function newFromRow( $row ) {
+               $rc = new RecentChange;
+               $rc->loadFromRow( $row );
+               return $rc;
+       }
+
+       /**
+        * @deprecated in 1.22
+        * @param $row
+        * @return RecentChange
+        */
+       public static function newFromCurRow( $row ) {
+               wfDeprecated( __METHOD__, '1.22' );
+               $rc = new RecentChange;
+               $rc->loadFromCurRow( $row );
+               $rc->notificationtimestamp = false;
+               $rc->numberofWatchingusers = false;
+               return $rc;
+       }
+
+       /**
+        * Obtain the recent change with a given rc_id value
+        *
+        * @param int $rcid rc_id value to retrieve
+        * @return RecentChange
+        */
+       public static function newFromId( $rcid ) {
+               return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
+       }
+
+       /**
+        * Find the first recent change matching some specific conditions
+        *
+        * @param array $conds of conditions
+        * @param $fname Mixed: override the method name in profiling/logs
+        * @param $options Array Query options
+        * @return RecentChange
+        */
+       public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
+               $dbr = wfGetDB( DB_SLAVE );
+               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
+               if ( $row !== false ) {
+                       return self::newFromRow( $row );
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Return the list of recentchanges fields that should be selected to create
+        * a new recentchanges object.
+        * @return array
+        */
+       public static function selectFields() {
+               return array(
+                       'rc_id',
+                       'rc_timestamp',
+                       'rc_cur_time',
+                       'rc_user',
+                       'rc_user_text',
+                       'rc_namespace',
+                       'rc_title',
+                       'rc_comment',
+                       'rc_minor',
+                       'rc_bot',
+                       'rc_new',
+                       'rc_cur_id',
+                       'rc_this_oldid',
+                       'rc_last_oldid',
+                       'rc_type',
+                       'rc_patrolled',
+                       'rc_ip',
+                       'rc_old_len',
+                       'rc_new_len',
+                       'rc_deleted',
+                       'rc_logid',
+                       'rc_log_type',
+                       'rc_log_action',
+                       'rc_params',
+               );
+       }
+
+       # Accessors
+
+       /**
+        * @param $attribs array
+        */
+       public function setAttribs( $attribs ) {
+               $this->mAttribs = $attribs;
+       }
+
+       /**
+        * @param $extra array
+        */
+       public function setExtra( $extra ) {
+               $this->mExtra = $extra;
+       }
+
+       /**
+        *
+        * @return Title
+        */
+       public function &getTitle() {
+               if ( $this->mTitle === false ) {
+                       $this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
+               }
+               return $this->mTitle;
+       }
+
+       /**
+        * Get the User object of the person who performed this change.
+        *
+        * @return User
+        */
+       public function getPerformer() {
+               if ( $this->mPerformer === false ) {
+                       if ( $this->mAttribs['rc_user'] ) {
+                               $this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] );
+                       } else {
+                               $this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
+                       }
+               }
+               return $this->mPerformer;
+       }
+
+       /**
+        * Writes the data in this object to the database
+        * @param $noudp bool
+        */
+       public function save( $noudp = false ) {
+               global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
+
+               $dbw = wfGetDB( DB_MASTER );
+               if ( !is_array( $this->mExtra ) ) {
+                       $this->mExtra = array();
+               }
+               $this->mExtra['lang'] = $wgLocalInterwiki;
+
+               if ( !$wgPutIPinRC ) {
+                       $this->mAttribs['rc_ip'] = '';
+               }
+
+               # If our database is strict about IP addresses, use NULL instead of an empty string
+               if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
+                       unset( $this->mAttribs['rc_ip'] );
+               }
+
+               # Trim spaces on user supplied text
+               $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
+
+               # Make sure summary is truncated (whole multibyte characters)
+               $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
+
+               # Fixup database timestamps
+               $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
+               $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
+               $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
+
+               ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
+               if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
+                       unset( $this->mAttribs['rc_cur_id'] );
+               }
+
+               # Insert new row
+               $dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ );
+
+               # Set the ID
+               $this->mAttribs['rc_id'] = $dbw->insertId();
+
+               # Notify extensions
+               wfRunHooks( 'RecentChange_save', array( &$this ) );
+
+               # Notify external application via UDP
+               if ( !$noudp ) {
+                       $this->notifyRCFeeds();
+               }
+
+               # E-mail notifications
+               if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
+                       $editor = $this->getPerformer();
+                       $title = $this->getTitle();
+
+                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
+                               # @todo FIXME: This would be better as an extension hook
+                               $enotif = new EmailNotification();
+                               $enotif->notifyOnPageChange( $editor, $title,
+                                       $this->mAttribs['rc_timestamp'],
+                                       $this->mAttribs['rc_comment'],
+                                       $this->mAttribs['rc_minor'],
+                                       $this->mAttribs['rc_last_oldid'],
+                                       $this->mExtra['pageStatus'] );
+                       }
+               }
+       }
+
+       /**
+        * @deprecated since 1.22, use notifyRCFeeds instead.
+        */
+       public function notifyRC2UDP() {
+               wfDeprecated( __METHOD__, '1.22' );
+               $this->notifyRCFeeds();
+       }
+
+       /**
+        * Send some text to UDP.
+        * @deprecated since 1.22
+        */
+       public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
+               global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix;
+
+               wfDeprecated( __METHOD__, '1.22' );
+
+               # Assume default for standard RC case
+               $address = $address ? $address : $wgRC2UDPAddress;
+               $prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
+               $port = $port ? $port : $wgRC2UDPPort;
+
+               $engine = new UDPRCFeedEngine();
+               $feed = array(
+                       'uri' => "udp://$address:$port/$prefix",
+                       'formatter' => 'IRCColourfulRCFeedFormatter',
+                       'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix,
+               );
+
+               return $engine->send( $feed, $line );
+       }
+
+       /**
+        * Notify all the feeds about the change.
+        */
+       public function notifyRCFeeds() {
+               global $wgRCFeeds;
+
+               foreach ( $wgRCFeeds as $feed ) {
+                       $engine = self::getEngine( $feed['uri'] );
+
+                       if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
+                               $actionComment = $this->mExtra['actionCommentIRC'];
+                       } else {
+                               $actionComment = null;
+                       }
+
+                       $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
+
+                       if (
+                               ( $omitBots && $this->mAttribs['rc_bot'] ) ||
+                               $this->mAttribs['rc_type'] == RC_EXTERNAL
+                       ) {
+                               continue;
+                       }
+
+                       $formatter = new $feed['formatter']();
+                       $line = $formatter->getLine( $feed, $this, $actionComment );
+
+                       $engine->send( $feed, $line );
+               }
+       }
+
+       /**
+        * Gets the stream engine object for a given URI from $wgRCEngines
+        *
+        * @param $uri string URI to get the engine object for
+        * @return object The engine object
+        */
+       private static function getEngine( $uri ) {
+               global $wgRCEngines;
+
+               $scheme = parse_url( $uri, PHP_URL_SCHEME );
+               if ( !$scheme ) {
+                       throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
+               }
+
+               if ( !isset( $wgRCEngines[$scheme] ) ) {
+                       throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
+               }
+
+               return new $wgRCEngines[$scheme];
+       }
+
+       /**
+        * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter
+        */
+       public static function cleanupForIRC( $text ) {
+               wfDeprecated( __METHOD__, '1.22' );
+               return IRCColourfulRCFeedFormatter::cleanupForIRC( $text );
+       }
+
+       /**
+        * Mark a given change as patrolled
+        *
+        * @param $change Mixed: RecentChange or corresponding rc_id
+        * @param $auto Boolean: for automatic patrol
+        * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
+        */
+       public static function markPatrolled( $change, $auto = false ) {
+               global $wgUser;
+
+               $change = $change instanceof RecentChange
+                       ? $change
+                       : RecentChange::newFromId( $change );
+
+               if ( !$change instanceof RecentChange ) {
+                       return null;
+               }
+               return $change->doMarkPatrolled( $wgUser, $auto );
+       }
+
+       /**
+        * Mark this RecentChange as patrolled
+        *
+        * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors
+        * @param $user User object doing the action
+        * @param $auto Boolean: for automatic patrol
+        * @return array of permissions errors, see Title::getUserPermissionsErrors()
+        */
+       public function doMarkPatrolled( User $user, $auto = false ) {
+               global $wgUseRCPatrol, $wgUseNPPatrol;
+               $errors = array();
+               // If recentchanges patrol is disabled, only new pages
+               // can be patrolled
+               if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
+                       $errors[] = array( 'rcpatroldisabled' );
+               }
+               // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
+               $right = $auto ? 'autopatrol' : 'patrol';
+               $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
+               if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+                       $errors[] = array( 'hookaborted' );
+               }
+               // Users without the 'autopatrol' right can't patrol their
+               // own revisions
+               if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
+                       $errors[] = array( 'markedaspatrollederror-noautopatrol' );
+               }
+               if ( $errors ) {
+                       return $errors;
+               }
+               // If the change was patrolled already, do nothing
+               if ( $this->getAttribute( 'rc_patrolled' ) ) {
+                       return array();
+               }
+               // Actually set the 'patrolled' flag in RC
+               $this->reallyMarkPatrolled();
+               // Log this patrol event
+               PatrolLog::record( $this, $auto, $user );
+               wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
+               return array();
+       }
+
+       /**
+        * Mark this RecentChange patrolled, without error checking
+        * @return Integer: number of affected rows
+        */
+       public function reallyMarkPatrolled() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'recentchanges',
+                       array(
+                               'rc_patrolled' => 1
+                       ),
+                       array(
+                               'rc_id' => $this->getAttribute( 'rc_id' )
+                       ),
+                       __METHOD__
+               );
+               // Invalidate the page cache after the page has been patrolled
+               // to make sure that the Patrol link isn't visible any longer!
+               $this->getTitle()->invalidateCache();
+               return $dbw->affectedRows();
+       }
+
+       /**
+        * Makes an entry in the database corresponding to an edit
+        *
+        * @param $timestamp
+        * @param $title Title
+        * @param $minor
+        * @param $user User
+        * @param $comment
+        * @param $oldId
+        * @param $lastTimestamp
+        * @param $bot
+        * @param $ip string
+        * @param $oldSize int
+        * @param $newSize int
+        * @param $newId int
+        * @param $patrol int
+        * @return RecentChange
+        */
+       public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
+               $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
+               $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mPerformer = $user;
+               $rc->mAttribs = array(
+                       'rc_timestamp'  => $timestamp,
+                       'rc_cur_time'   => $timestamp,
+                       'rc_namespace'  => $title->getNamespace(),
+                       'rc_title'      => $title->getDBkey(),
+                       'rc_type'       => RC_EDIT,
+                       'rc_minor'      => $minor ? 1 : 0,
+                       'rc_cur_id'     => $title->getArticleID(),
+                       'rc_user'       => $user->getId(),
+                       'rc_user_text'  => $user->getName(),
+                       'rc_comment'    => $comment,
+                       'rc_this_oldid' => $newId,
+                       'rc_last_oldid' => $oldId,
+                       'rc_bot'        => $bot ? 1 : 0,
+                       'rc_ip'         => self::checkIPAddress( $ip ),
+                       'rc_patrolled'  => intval( $patrol ),
+                       'rc_new'        => 0,  # obsolete
+                       'rc_old_len'    => $oldSize,
+                       'rc_new_len'    => $newSize,
+                       'rc_deleted'    => 0,
+                       'rc_logid'      => 0,
+                       'rc_log_type'   => null,
+                       'rc_log_action' => '',
+                       'rc_params'     => ''
+               );
+
+               $rc->mExtra = array(
+                       'prefixedDBkey' => $title->getPrefixedDBkey(),
+                       'lastTimestamp' => $lastTimestamp,
+                       'oldSize'       => $oldSize,
+                       'newSize'       => $newSize,
+                       'pageStatus'   => 'changed'
+               );
+               $rc->save();
+               return $rc;
+       }
+
+       /**
+        * Makes an entry in the database corresponding to page creation
+        * Note: the title object must be loaded with the new id using resetArticleID()
+        * @todo Document parameters and return
+        *
+        * @param $timestamp
+        * @param $title Title
+        * @param $minor
+        * @param $user User
+        * @param $comment
+        * @param $bot
+        * @param $ip string
+        * @param $size int
+        * @param $newId int
+        * @param $patrol int
+        * @return RecentChange
+        */
+       public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
+               $ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
+               $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mPerformer = $user;
+               $rc->mAttribs = array(
+                       'rc_timestamp'      => $timestamp,
+                       'rc_cur_time'       => $timestamp,
+                       'rc_namespace'      => $title->getNamespace(),
+                       'rc_title'          => $title->getDBkey(),
+                       'rc_type'           => RC_NEW,
+                       'rc_minor'          => $minor ? 1 : 0,
+                       'rc_cur_id'         => $title->getArticleID(),
+                       'rc_user'           => $user->getId(),
+                       'rc_user_text'      => $user->getName(),
+                       'rc_comment'        => $comment,
+                       'rc_this_oldid'     => $newId,
+                       'rc_last_oldid'     => 0,
+                       'rc_bot'            => $bot ? 1 : 0,
+                       'rc_ip'             => self::checkIPAddress( $ip ),
+                       'rc_patrolled'      => intval( $patrol ),
+                       'rc_new'            => 1, # obsolete
+                       'rc_old_len'        => 0,
+                       'rc_new_len'        => $size,
+                       'rc_deleted'        => 0,
+                       'rc_logid'          => 0,
+                       'rc_log_type'       => null,
+                       'rc_log_action'     => '',
+                       'rc_params'         => ''
+               );
+
+               $rc->mExtra = array(
+                       'prefixedDBkey' => $title->getPrefixedDBkey(),
+                       'lastTimestamp' => 0,
+                       'oldSize' => 0,
+                       'newSize' => $size,
+                       'pageStatus' => 'created'
+               );
+               $rc->save();
+               return $rc;
+       }
+
+       /**
+        * @param $timestamp
+        * @param $title
+        * @param $user
+        * @param $actionComment
+        * @param $ip string
+        * @param $type
+        * @param $action
+        * @param $target
+        * @param $logComment
+        * @param $params
+        * @param $newId int
+        * @param $actionCommentIRC string
+        * @return bool
+        */
+       public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
+               $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
+       {
+               global $wgLogRestrictions;
+               # Don't add private logs to RC!
+               if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
+                       return false;
+               }
+               $rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
+                       $target, $logComment, $params, $newId, $actionCommentIRC );
+               $rc->save();
+               return true;
+       }
+
+       /**
+        * @param $timestamp
+        * @param $title Title
+        * @param $user User
+        * @param $actionComment
+        * @param $ip string
+        * @param $type
+        * @param $action
+        * @param $target Title
+        * @param $logComment
+        * @param $params
+        * @param $newId int
+        * @param $actionCommentIRC string
+        * @return RecentChange
+        */
+       public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
+               $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
+               global $wgRequest;
+
+               ## Get pageStatus for email notification
+               switch ( $type . '-' . $action ) {
+                       case 'delete-delete':
+                               $pageStatus = 'deleted';
+                               break;
+                       case 'move-move':
+                       case 'move-move_redir':
+                               $pageStatus = 'moved';
+                               break;
+                       case 'delete-restore':
+                               $pageStatus = 'restored';
+                               break;
+                       case 'upload-upload':
+                               $pageStatus = 'created';
+                               break;
+                       case 'upload-overwrite':
+                       default:
+                               $pageStatus = 'changed';
+                               break;
+               }
+
+               $rc = new RecentChange;
+               $rc->mTitle = $target;
+               $rc->mPerformer = $user;
+               $rc->mAttribs = array(
+                       'rc_timestamp'  => $timestamp,
+                       'rc_cur_time'   => $timestamp,
+                       'rc_namespace'  => $target->getNamespace(),
+                       'rc_title'      => $target->getDBkey(),
+                       'rc_type'       => RC_LOG,
+                       'rc_minor'      => 0,
+                       'rc_cur_id'     => $target->getArticleID(),
+                       'rc_user'       => $user->getId(),
+                       'rc_user_text'  => $user->getName(),
+                       'rc_comment'    => $logComment,
+                       'rc_this_oldid' => 0,
+                       'rc_last_oldid' => 0,
+                       'rc_bot'        => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
+                       'rc_ip'         => self::checkIPAddress( $ip ),
+                       'rc_patrolled'  => 1,
+                       'rc_new'        => 0, # obsolete
+                       'rc_old_len'    => null,
+                       'rc_new_len'    => null,
+                       'rc_deleted'    => 0,
+                       'rc_logid'      => $newId,
+                       'rc_log_type'   => $type,
+                       'rc_log_action' => $action,
+                       'rc_params'     => $params
+               );
+
+               $rc->mExtra = array(
+                       'prefixedDBkey' => $title->getPrefixedDBkey(),
+                       'lastTimestamp' => 0,
+                       'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
+                       'pageStatus'    => $pageStatus,
+                       'actionCommentIRC' => $actionCommentIRC
+               );
+               return $rc;
+       }
+
+       /**
+        * Initialises the members of this object from a mysql row object
+        *
+        * @param $row
+        */
+       public function loadFromRow( $row ) {
+               $this->mAttribs = get_object_vars( $row );
+               $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
+               $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
+       }
+
+       /**
+        * Makes a pseudo-RC entry from a cur row
+        *
+        * @deprected in 1.22
+        * @param $row
+        */
+       public function loadFromCurRow( $row ) {
+               wfDeprecated( __METHOD__, '1.22' );
+               $this->mAttribs = array(
+                       'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
+                       'rc_cur_time' => $row->rev_timestamp,
+                       'rc_user' => $row->rev_user,
+                       'rc_user_text' => $row->rev_user_text,
+                       'rc_namespace' => $row->page_namespace,
+                       'rc_title' => $row->page_title,
+                       'rc_comment' => $row->rev_comment,
+                       'rc_minor' => $row->rev_minor_edit ? 1 : 0,
+                       'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
+                       'rc_cur_id' => $row->page_id,
+                       'rc_this_oldid' => $row->rev_id,
+                       'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
+                       'rc_bot' => 0,
+                       'rc_ip' => '',
+                       'rc_id' => $row->rc_id,
+                       'rc_patrolled' => $row->rc_patrolled,
+                       'rc_new' => $row->page_is_new, # obsolete
+                       'rc_old_len' => $row->rc_old_len,
+                       'rc_new_len' => $row->rc_new_len,
+                       'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
+                       'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
+                       'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
+                       'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
+                       'rc_deleted' => $row->rc_deleted // MUST be set
+               );
+       }
+
+       /**
+        * Get an attribute value
+        *
+        * @param string $name Attribute name
+        * @return mixed
+        */
+       public function getAttribute( $name ) {
+               return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
+       }
+
+       /**
+        * @return array
+        */
+       public function getAttributes() {
+               return $this->mAttribs;
+       }
+
+       /**
+        * Gets the end part of the diff URL associated with this object
+        * Blank if no diff link should be displayed
+        * @param $forceCur
+        * @return string
+        */
+       public function diffLinkTrail( $forceCur ) {
+               if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
+                       $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
+                               "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
+                       if ( $forceCur ) {
+                               $trail .= '&diff=0';
+                       } else {
+                               $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
+                       }
+               } else {
+                       $trail = '';
+               }
+               return $trail;
+       }
+
+       /**
+        * Returns the change size (HTML).
+        * The lengths can be given optionally.
+        * @param $old int
+        * @param $new int
+        * @return string
+        */
+       public function getCharacterDifference( $old = 0, $new = 0 ) {
+               if ( $old === 0 ) {
+                       $old = $this->mAttribs['rc_old_len'];
+               }
+               if ( $new === 0 ) {
+                       $new = $this->mAttribs['rc_new_len'];
+               }
+               if ( $old === null || $new === null ) {
+                       return '';
+               }
+               return ChangesList::showCharacterDifference( $old, $new );
+       }
+
+       /**
+        * Purge expired changes from the recentchanges table
+        * @since 1.22
+        */
+       public static function purgeExpiredChanges() {
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+                       global $wgRCMaxAge;
+
+                       $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+                       $dbw->delete(
+                               'recentchanges',
+                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+                               $method
+                       );
+               } );
+       }
+
+       private static function checkIPAddress( $ip ) {
+               global $wgRequest;
+               if ( $ip ) {
+                       if ( !IP::isIPAddress( $ip ) ) {
+                               throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" );
+                       }
+               } else {
+                       $ip = $wgRequest->getIP();
+                       if ( !$ip ) {
+                               $ip = '';
+                       }
+               }
+               return $ip;
+       }
+
+       /**
+        * Check whether the given timestamp is new enough to have a RC row with a given tolerance
+        * as the recentchanges table might not be cleared out regularly (so older entries might exist)
+        * or rows which will be deleted soon shouldn't be included.
+        *
+        * @param $timestamp mixed MWTimestamp compatible timestamp
+        * @param $tolerance integer Tolerance in seconds
+        * @return bool
+        */
+       public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
+               global $wgRCMaxAge;
+               return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge;
+       }
+}
index c3850b9..5f175a4 100644 (file)
@@ -3111,7 +3111,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @since 1.20
         */
        final public function onTransactionIdle( $callback ) {
-               $this->mTrxIdleCallbacks[] = $callback;
+               $this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() );
                if ( !$this->mTrxLevel ) {
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3130,7 +3130,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         */
        final public function onTransactionPreCommitOrIdle( $callback ) {
                if ( $this->mTrxLevel ) {
-                       $this->mTrxPreCommitCallbacks[] = $callback;
+                       $this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() );
                } else {
                        $this->onTransactionIdle( $callback ); // this will trigger immediately
                }
@@ -3150,8 +3150,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTrxIdleCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
+                                       list( $phpCallback ) = $callback;
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
-                                       call_user_func( $callback );
+                                       call_user_func( $phpCallback );
                                        $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
                                } catch ( Exception $e ) {}
                        }
@@ -3174,7 +3175,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTrxPreCommitCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
-                                       call_user_func( $callback );
+                                       list( $phpCallback ) = $callback;
+                                       call_user_func( $phpCallback );
                                } catch ( Exception $e ) {}
                        }
                } while ( count( $this->mTrxPreCommitCallbacks ) );
@@ -3274,6 +3276,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
+               $this->mTrxDoneWrites = false;
                $this->runOnTransactionIdleCallbacks();
        }
 
@@ -3308,6 +3311,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
+               $this->mTrxDoneWrites = false;
        }
 
        /**
@@ -3892,9 +3896,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                return (string)$this->mConn;
        }
 
+       /**
+        * Run a few simple sanity checks
+        */
        public function __destruct() {
+               if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
+                       trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+               }
                if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
-                       trigger_error( "Transaction idle or pre-commit callbacks still pending." ); // sanity
+                       $callers = array();
+                       foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) {
+                               $callers[] = $callbackInfo[0];
+
+                       }
+                       $callers = implode( ', ', $callers );
+                       trigger_error( "DB transaction  callbacks still pending (from $callers)." );
                }
        }
 }
index 174c1d6..298d724 100644 (file)
@@ -692,7 +692,7 @@ class Diff {
        /**
         * Check for empty diff.
         *
-        * @return bool True iff two sequences were identical.
+        * @return bool True if two sequences were identical.
         */
        function isEmpty() {
                foreach ( $this->edits as $edit ) {
index bdeb578..f586578 100644 (file)
@@ -1183,8 +1183,10 @@ 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 array $paths Storage paths
-        * @param integer $type LockManager::LOCK_* constant
+        * @see ScopedLock::factory()
+        *
+        * @param array $paths List of storage paths or map of lock types to path lists
+        * @param integer|string $type LockManager::LOCK_* constant or "mixed"
         * @param Status $status Status to update on lock/unlock
         * @return ScopedLock|null Returns null on failure
         */
index 7d35487..97584a7 100644 (file)
@@ -141,17 +141,10 @@ class FileBackendMultiWrite extends FileBackend {
 
                $mbe = $this->backends[$this->masterIndex]; // convenience
 
-               // Get the paths to lock from the master backend
-               $realOps = $this->substOpBatchPaths( $ops, $mbe );
-               $paths = $mbe->getPathsToLockForOpsInternal( $mbe->getOperationsInternal( $realOps ) );
-               // Get the paths under the proxy backend's name
-               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
                // Try to lock those files for the scope of this function...
                if ( empty( $opts['nonLocking'] ) ) {
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+                       $scopeLock = $this->getScopedLocksForOps( $ops, $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
@@ -178,6 +171,7 @@ class FileBackendMultiWrite extends FileBackend {
                        }
                }
                // Actually attempt the operation batch on the master backend...
+               $realOps = $this->substOpBatchPaths( $ops, $mbe );
                $masterStatus = $mbe->doOperations( $realOps, $opts );
                $status->merge( $masterStatus );
                // Propagate the operations to the clone backends if there were no unexpected errors
@@ -624,15 +618,16 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
-               $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
+               $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
+               $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $realOps );
                // Get the paths to lock from the master backend
                $paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
                // Get the paths under the proxy backend's name
-               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
-               return array(
-                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+               $pbPaths = array(
+                       LockManager::LOCK_UW => $this->unsubstPaths( $paths[LockManager::LOCK_UW] ),
+                       LockManager::LOCK_EX => $this->unsubstPaths( $paths[LockManager::LOCK_EX] )
                );
+               // Actually acquire the locks
+               return array( $this->getScopedFileLocks( $pbPaths, 'mixed', $status ) );
        }
 }
index 8ff383b..0921e99 100644 (file)
@@ -953,12 +953,13 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Get a list of storage paths to lock for a list of operations
-        * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
-        * each corresponding to a list of storage paths to be locked.
-        * All returned paths are normalized.
+        * Returns an array with LockManager::LOCK_UW (shared locks) and
+        * LockManager::LOCK_EX (exclusive locks) keys, each corresponding
+        * to a list of storage paths to be locked. All returned paths are
+        * normalized.
         *
         * @param array $performOps List of FileOp objects
-        * @return Array ('sh' => list of paths, 'ex' => list of paths)
+        * @return Array (LockManager::LOCK_UW => path list, LockManager::LOCK_EX => path list)
         */
        final public function getPathsToLockForOpsInternal( array $performOps ) {
                // Build up a list of files to lock...
@@ -972,15 +973,15 @@ abstract class FileBackendStore extends FileBackend {
                // Get a shared lock on the parent directory of each path changed
                $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
 
-               return $paths;
+               return array(
+                       LockManager::LOCK_UW => $paths['sh'],
+                       LockManager::LOCK_EX => $paths['ex']
+               );
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
                $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
-               return array(
-                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
-               );
+               return array( $this->getScopedFileLocks( $paths, 'mixed', $status ) );
        }
 
        final protected function doOperationsInternal( array $ops, array $opts ) {
@@ -998,8 +999,7 @@ abstract class FileBackendStore extends FileBackend {
                        // Build up a list of files to lock...
                        $paths = $this->getPathsToLockForOpsInternal( $performOps );
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+                       $scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
index 33a5c9e..fe83308 100644 (file)
@@ -384,7 +384,7 @@ abstract class FileOp {
 
        /**
         * precheckDestExistence() helper function to get the source file SHA-1.
-        * Subclasses should overwride this iff the source is not in storage.
+        * Subclasses should overwride this if the source is not in storage.
         *
         * @return string|bool Returns false on failure
         */
index a620f88..db090a9 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 /**
- * @brief Class for an OpenStack Swift based file backend.
+ * @brief Class for an OpenStack Swift (or Ceph RGW) based file backend.
  *
  * This requires the SwiftCloudFiles MediaWiki extension, which includes
  * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
index e081987..3e934ba 100644 (file)
@@ -110,6 +110,19 @@ abstract class DBLockManager extends QuorumLockManager {
                $this->session = wfRandomString( 31 );
        }
 
+       // @TODO: change this code to work in one batch
+       protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+               $status = Status::newGood();
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+               }
+               return $status;
+       }
+
+       protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+               return Status::newGood();
+       }
+
        /**
         * @see QuorumLockManager::isServerUp()
         * @return bool
@@ -252,7 +265,7 @@ class MySqlLockManager extends DBLockManager {
         * @see DBLockManager::getLocksOnServer()
         * @return Status
         */
-       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+       protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
                $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
@@ -318,14 +331,6 @@ class MySqlLockManager extends DBLockManager {
                return $status;
        }
 
-       /**
-        * @see QuorumLockManager::freeLocksOnServer()
-        * @return Status
-        */
-       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
-               return Status::newGood(); // not supported
-       }
-
        /**
         * @see QuorumLockManager::releaseAllLocks()
         * @return Status
@@ -361,7 +366,7 @@ class PostgreSqlLockManager extends DBLockManager {
                self::LOCK_EX => self::LOCK_EX
        );
 
-       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+       protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
                if ( !count( $paths ) ) {
                        return $status; // nothing to lock
@@ -407,14 +412,6 @@ class PostgreSqlLockManager extends DBLockManager {
                return $status;
        }
 
-       /**
-        * @see QuorumLockManager::freeLocksOnServer()
-        * @return Status
-        */
-       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
-               return Status::newGood(); // not supported
-       }
-
        /**
         * @see QuorumLockManager::releaseAllLocks()
         * @return Status
index f0e54ec..dad8a62 100644 (file)
@@ -98,7 +98,7 @@ abstract class LockManager {
        /**
         * Lock the resources at the given abstract paths
         *
-        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
         * @return Status
         * @since 1.22
@@ -125,7 +125,7 @@ abstract class LockManager {
        /**
         * Unlock the resources at the given abstract paths
         *
-        * @param array $paths List of storage paths
+        * @param array $paths List of paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -136,7 +136,7 @@ abstract class LockManager {
        /**
         * Unlock the resources at the given abstract paths
         *
-        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         * @since 1.22
         */
@@ -176,7 +176,7 @@ abstract class LockManager {
         * Normalize the $paths array by converting LOCK_UW locks into the
         * appropriate type and removing any duplicated paths for each lock type.
         *
-        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
         * @return Array
         * @since 1.22
         */
@@ -190,7 +190,7 @@ abstract class LockManager {
 
        /**
         * @see LockManager::lockByType()
-        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         * @since 1.22
         */
@@ -215,7 +215,7 @@ abstract class LockManager {
        /**
         * Lock resources with the given keys and lock type
         *
-        * @param array $paths List of storage paths
+        * @param array $paths List of paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -223,7 +223,7 @@ abstract class LockManager {
 
        /**
         * @see LockManager::unlockByType()
-        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         * @since 1.22
         */
@@ -238,7 +238,7 @@ abstract class LockManager {
        /**
         * Unlock resources with the given keys and lock type
         *
-        * @param array $paths List of storage paths
+        * @param array $paths List of paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
         */
@@ -250,22 +250,10 @@ abstract class LockManager {
  * @since 1.19
  */
 class NullLockManager extends LockManager {
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
        protected function doLock( array $paths, $type ) {
                return Status::newGood();
        }
 
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
        protected function doUnlock( array $paths, $type ) {
                return Status::newGood();
        }
index 757aeee..5eab03e 100644 (file)
@@ -88,11 +88,44 @@ class MemcLockManager extends QuorumLockManager {
                $this->session = wfRandomString( 32 );
        }
 
+       // @TODO: change this code to work in one batch
+       protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+               $status = Status::newGood();
+
+               $lockedPaths = array();
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+                       if ( $status->isOK() ) {
+                               $lockedPaths[$type] = isset( $lockedPaths[$type] )
+                                       ? array_merge( $lockedPaths[$type], $paths )
+                                       : $paths;
+                       } else {
+                               foreach ( $lockedPaths as $type => $paths ) {
+                                       $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+                               }
+                               break;
+                       }
+               }
+
+               return $status;
+       }
+
+       // @TODO: change this code to work in one batch
+       protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+               $status = Status::newGood();
+
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+               }
+
+               return $status;
+       }
+
        /**
         * @see QuorumLockManager::getLocksOnServer()
         * @return Status
         */
-       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+       protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
                $memc = $this->getCache( $lockSrv );
@@ -164,7 +197,7 @@ class MemcLockManager extends QuorumLockManager {
         * @see QuorumLockManager::freeLocksOnServer()
         * @return Status
         */
-       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+       protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
                $memc = $this->getCache( $lockSrv );
index 3b96ad6..8356d32 100644 (file)
 abstract class QuorumLockManager extends LockManager {
        /** @var Array Map of bucket indexes to peer server lists */
        protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+       /** @var Array Map of degraded buckets */
+       protected $degradedBuckets = array(); // (buckey index => UNIX timestamp)
 
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
        final protected function doLock( array $paths, $type ) {
+               return $this->doLockByType( array( $type => $paths ) );
+       }
+
+       final protected function doUnlock( array $paths, $type ) {
+               return $this->doUnlockByType( array( $type => $paths ) );
+       }
+
+       protected function doLockByType( array $pathsByType ) {
                $status = Status::newGood();
 
-               $pathsToLock = array(); // (bucket => paths)
+               $pathsToLock = array(); // (bucket => type => paths)
                // Get locks that need to be acquired (buckets => locks)...
-               foreach ( $paths as $path ) {
-                       if ( isset( $this->locksHeld[$path][$type] ) ) {
-                               ++$this->locksHeld[$path][$type];
-                       } else {
-                               $bucket = $this->getBucketFromPath( $path );
-                               $pathsToLock[$bucket][] = $path;
+               foreach ( $pathsByType as $type => $paths ) {
+                       foreach ( $paths as $path ) {
+                               if ( isset( $this->locksHeld[$path][$type] ) ) {
+                                       ++$this->locksHeld[$path][$type];
+                               } else {
+                                       $bucket = $this->getBucketFromPath( $path );
+                                       $pathsToLock[$bucket][$type][] = $path;
+                               }
                        }
                }
 
-               $lockedPaths = array(); // files locked in this attempt
+               $lockedPaths = array(); // files locked in this attempt (type => paths)
                // Attempt to acquire these locks...
-               foreach ( $pathsToLock as $bucket => $paths ) {
+               foreach ( $pathsToLock as $bucket => $pathsToLockByType ) {
                        // Try to acquire the locks for this bucket
-                       $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+                       $status->merge( $this->doLockingRequestBucket( $bucket, $pathsToLockByType ) );
                        if ( !$status->isOK() ) {
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+                               $status->merge( $this->doUnlockByType( $lockedPaths ) );
                                return $status;
                        }
                        // Record these locks as active
-                       foreach ( $paths as $path ) {
-                               $this->locksHeld[$path][$type] = 1; // locked
+                       foreach ( $pathsToLockByType as $type => $paths ) {
+                               foreach ( $paths as $path ) {
+                                       $this->locksHeld[$path][$type] = 1; // locked
+                                       // Keep track of what locks were made in this attempt
+                                       $lockedPaths[$type][] = $path;
+                               }
                        }
-                       // Keep track of what locks were made in this attempt
-                       $lockedPaths = array_merge( $lockedPaths, $paths );
                }
 
                return $status;
        }
 
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       final protected function doUnlock( array $paths, $type ) {
+       protected function doUnlockByType( array $pathsByType ) {
                $status = Status::newGood();
 
-               $pathsToUnlock = array();
-               foreach ( $paths as $path ) {
-                       if ( !isset( $this->locksHeld[$path][$type] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } else {
-                               --$this->locksHeld[$path][$type];
-                               // Reference count the locks held and release locks when zero
-                               if ( $this->locksHeld[$path][$type] <= 0 ) {
-                                       unset( $this->locksHeld[$path][$type] );
-                                       $bucket = $this->getBucketFromPath( $path );
-                                       $pathsToUnlock[$bucket][] = $path;
-                               }
-                               if ( !count( $this->locksHeld[$path] ) ) {
-                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+               $pathsToUnlock = array(); // (bucket => type => paths)
+               foreach ( $pathsByType as $type => $paths ) {
+                       foreach ( $paths as $path ) {
+                               if ( !isset( $this->locksHeld[$path][$type] ) ) {
+                                       $status->warning( 'lockmanager-notlocked', $path );
+                               } else {
+                                       --$this->locksHeld[$path][$type];
+                                       // Reference count the locks held and release locks when zero
+                                       if ( $this->locksHeld[$path][$type] <= 0 ) {
+                                               unset( $this->locksHeld[$path][$type] );
+                                               $bucket = $this->getBucketFromPath( $path );
+                                               $pathsToUnlock[$bucket][$type][] = $path;
+                                       }
+                                       if ( !count( $this->locksHeld[$path] ) ) {
+                                               unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+                                       }
                                }
                        }
                }
 
                // Remove these specific locks if possible, or at least release
                // all locks once this process is currently not holding any locks.
-               foreach ( $pathsToUnlock as $bucket => $paths ) {
-                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+               foreach ( $pathsToUnlock as $bucket => $pathsToUnlockByType ) {
+                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $pathsToUnlockByType ) );
                }
                if ( !count( $this->locksHeld ) ) {
                        $status->merge( $this->releaseAllLocks() );
+                       $this->degradedBuckets = array(); // safe to retry the normal quorum
                }
 
                return $status;
@@ -116,11 +121,10 @@ abstract class QuorumLockManager extends LockManager {
         * This is all or nothing; if any key is locked then this totally fails.
         *
         * @param $bucket integer
-        * @param array $paths List of resource keys to lock
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         */
-       final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+       final protected function doLockingRequestBucket( $bucket, array $pathsByType ) {
                $status = Status::newGood();
 
                $yesVotes = 0; // locks made on trustable servers
@@ -131,10 +135,11 @@ abstract class QuorumLockManager extends LockManager {
                        if ( !$this->isServerUp( $lockSrv ) ) {
                                --$votesLeft;
                                $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+                               $this->degradedBuckets[$bucket] = time();
                                continue; // server down?
                        }
                        // Attempt to acquire the lock on this peer
-                       $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+                       $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) );
                        if ( !$status->isOK() ) {
                                return $status; // vetoed; resource locked
                        }
@@ -158,21 +163,33 @@ abstract class QuorumLockManager extends LockManager {
         * Attempt to release locks with the peers for a bucket
         *
         * @param $bucket integer
-        * @param array $paths List of resource keys to lock
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         */
-       final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+       final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
                $status = Status::newGood();
 
+               $yesVotes = 0; // locks freed on trustable servers
+               $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+               $quorum = floor( $votesLeft / 2 + 1 ); // simple majority
+               $isDegraded = isset( $this->degradedBuckets[$bucket] ); // not the normal quorum?
                foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
                        if ( !$this->isServerUp( $lockSrv ) ) {
-                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+                               $status->warning( 'lockmanager-fail-svr-release', $lockSrv );
                        // Attempt to release the lock on this peer
                        } else {
-                               $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+                               $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
+                               ++$yesVotes; // success for this peer
+                               // Normally the first peers form the quorum, and the others are ignored.
+                               // Ignore them in this case, but not when an alternative quorum was used.
+                               if ( $yesVotes >= $quorum && !$isDegraded ) {
+                                       break; // lock released
+                               }
                        }
                }
+               // Set a bad status if the quorum was not met.
+               // Assumes the same "up" servers as during the acquire step.
+               $status->setResult( $yesVotes >= $quorum );
 
                return $status;
        }
@@ -190,7 +207,8 @@ abstract class QuorumLockManager extends LockManager {
        }
 
        /**
-        * Check if a lock server is up
+        * Check if a lock server is up.
+        * This should process cache results to reduce RTT.
         *
         * @param $lockSrv string
         * @return bool
@@ -198,14 +216,13 @@ abstract class QuorumLockManager extends LockManager {
        abstract protected function isServerUp( $lockSrv );
 
        /**
-        * Get a connection to a lock server and acquire locks on $paths
+        * Get a connection to a lock server and acquire locks
         *
         * @param $lockSrv string
-        * @param $paths array
-        * @param $type integer
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         */
-       abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+       abstract protected function getLocksOnServer( $lockSrv, array $pathsByType );
 
        /**
         * Get a connection to a lock server and release locks on $paths.
@@ -213,11 +230,10 @@ abstract class QuorumLockManager extends LockManager {
         * Subclasses must effectively implement this or releaseAllLocks().
         *
         * @param $lockSrv string
-        * @param $paths array
-        * @param $type integer
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
         * @return Status
         */
-       abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+       abstract protected function freeLocksOnServer( $lockSrv, array $pathsByType );
 
        /**
         * Release all locks that this session is holding.
index e8e5996..43b0198 100644 (file)
@@ -78,7 +78,40 @@ class RedisLockManager extends QuorumLockManager {
                $this->session = wfRandomString( 32 );
        }
 
-       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+       // @TODO: change this code to work in one batch
+       protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+               $status = Status::newGood();
+
+               $lockedPaths = array();
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+                       if ( $status->isOK() ) {
+                               $lockedPaths[$type] = isset( $lockedPaths[$type] )
+                                       ? array_merge( $lockedPaths[$type], $paths )
+                                       : $paths;
+                       } else {
+                               foreach ( $lockedPaths as $type => $paths ) {
+                                       $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+                               }
+                               break;
+                       }
+               }
+
+               return $status;
+       }
+
+       // @TODO: change this code to work in one batch
+       protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+               $status = Status::newGood();
+
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+               }
+
+               return $status;
+       }
+
+       protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
                $server = $this->lockServers[$lockSrv];
@@ -162,7 +195,7 @@ LUA;
                return $status;
        }
 
-       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+       protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
                $server = $this->lockServers[$lockSrv];
index 0c34f3e..fe769be 100644 (file)
@@ -1507,18 +1507,27 @@ class LocalFile extends File {
 
                wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
 
-               $this->purgeEverything();
-               foreach ( $archiveNames as $archiveName ) {
-                       $this->purgeOldThumbnails( $archiveName );
-               }
+               // Purge the source and target files...
+               $oldTitleFile = wfLocalFile( $this->title );
+               $newTitleFile = wfLocalFile( $target );
+               // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
+               // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
+               $this->getRepo()->getMasterDB()->onTransactionIdle(
+                       function() use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
+                               $oldTitleFile->purgeEverything();
+                               foreach ( $archiveNames as $archiveName ) {
+                                       $oldTitleFile->purgeOldThumbnails( $archiveName );
+                               }
+                               $newTitleFile->purgeEverything();
+                       }
+               );
+
                if ( $status->isOK() ) {
                        // Now switch the object
                        $this->title = $target;
                        // Force regeneration of the name and hashpath
                        unset( $this->name );
                        unset( $this->hashPath );
-                       // Purge the new image
-                       $this->purgeEverything();
                }
 
                return $status;
index 8bb7826..0110ac5 100644 (file)
@@ -32,7 +32,7 @@ abstract class DatabaseInstaller {
        /**
         * The Installer object.
         *
-        * TODO: naming this parent is confusing, 'installer' would be clearer.
+        * @todo Naming this parent is confusing, 'installer' would be clearer.
         *
         * @var WebInstaller
         */
@@ -505,7 +505,8 @@ abstract class DatabaseInstaller {
                        return false;
                }
 
-               return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
+               return $this->db->tableExists( 'cur', __METHOD__ ) ||
+                       $this->db->tableExists( 'revision', __METHOD__ );
        }
 
        /**
@@ -516,8 +517,18 @@ abstract class DatabaseInstaller {
        public function getInstallUserBox() {
                return Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
-                       $this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
-                       $this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
+                       $this->getTextBox(
+                               '_InstallUser',
+                               'config-db-username',
+                               array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-install-username' )
+                       ) .
+                       $this->getPasswordBox(
+                               '_InstallPassword',
+                               'config-db-password',
+                               array( 'dir' => 'ltr' ),
+                               $this->parent->getHelpBox( 'config-db-install-password' )
+                       ) .
                        Html::closeElement( 'fieldset' );
        }
 
index fdd34d4..267b6c5 100644 (file)
@@ -130,7 +130,8 @@ abstract class DatabaseUpdater {
        }
 
        /**
-        * Loads LocalSettings.php, if needed, and initialises everything needed for LoadExtensionSchemaUpdates hook
+        * Loads LocalSettings.php, if needed, and initialises everything needed for
+        * LoadExtensionSchemaUpdates hook.
         */
        private function loadExtensions() {
                if ( !defined( 'MEDIAWIKI_INSTALL' ) ) {
@@ -289,11 +290,22 @@ abstract class DatabaseUpdater {
         * @param string $tableName The table name
         * @param string $oldIndexName The old index name
         * @param string $newIndexName The new index name
-        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. [facultative; by default, false]
+        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old
+        * and the new indexes exist. [facultative; by default, false]
         * @param string $sqlPath The path to the SQL change path
         */
-       public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) {
-               $this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true );
+       public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName,
+               $sqlPath, $skipBothIndexExistWarning = false
+       ) {
+               $this->extensionUpdates[] = array(
+                       'renameIndex',
+                       $tableName,
+                       $oldIndexName,
+                       $newIndexName,
+                       $skipBothIndexExistWarning,
+                       $sqlPath,
+                       true
+               );
        }
 
        /**
@@ -758,12 +770,15 @@ abstract class DatabaseUpdater {
         * @param string $table Name of the table to modify
         * @param string $oldIndex Old name of the index
         * @param string $newIndex New name of the index
-        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist.
+        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the
+        * old and the new indexes exist.
         * @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
         */
-       protected function renameIndex( $table, $oldIndex, $newIndex, $skipBothIndexExistWarning, $patch, $fullpath = false ) {
+       protected function renameIndex( $table, $oldIndex, $newIndex,
+               $skipBothIndexExistWarning, $patch, $fullpath = false
+       ) {
                if ( !$this->doTable( $table ) ) {
                        return true;
                }
@@ -778,8 +793,11 @@ abstract class DatabaseUpdater {
                // Second requirement: the new index must be missing
                if ( $this->db->indexExists( $table, $newIndex, __METHOD__ ) ) {
                        $this->output( "...index $newIndex already set on $table table.\n" );
-                       if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
-                               $this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
+                       if ( !$skipBothIndexExistWarning &&
+                               $this->db->indexExists( $table, $oldIndex, __METHOD__ )
+                       ) {
+                               $this->output( "...WARNING: $oldIndex still exists, despite it has " .
+                                       "been renamed into $newIndex (which also exists).\n" .
                                        "            $oldIndex should be manually removed if not needed anymore.\n" );
                        }
 
@@ -794,7 +812,11 @@ abstract class DatabaseUpdater {
                }
 
                // Requirements have been satisfied, patch can be applied
-               return $this->applyPatch( $patch, $fullpath, "Renaming index $oldIndex into $newIndex to table $table" );
+               return $this->applyPatch(
+                       $patch,
+                       $fullpath,
+                       "Renaming index $oldIndex into $newIndex to table $table"
+               );
        }
 
        /**
@@ -848,7 +870,8 @@ abstract class DatabaseUpdater {
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
                        $this->output( "...$table table does not exist, skipping modify field patch.\n" );
                } elseif ( !$this->db->fieldExists( $table, $field, __METHOD__ ) ) {
-                       $this->output( "...$field field does not exist in $table table, skipping modify field patch.\n" );
+                       $this->output( "...$field field does not exist in $table table, " .
+                               "skipping modify field patch.\n" );
                } elseif ( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
index 0042089..6d3819c 100644 (file)
@@ -47,7 +47,11 @@ class InstallDocFormatter {
                // turn (bug nnnn) into links
                $text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
                // add links to manual to every global variable mentioned
-               $text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+               $text = preg_replace_callback(
+                       '/(\$wg[a-z0-9_]+)/i',
+                       array( $this, 'replaceConfigLinks' ),
+                       $text
+               );
 
                return $text;
        }
index 5eaacf8..276c572 100644 (file)
@@ -302,7 +302,8 @@ abstract class Installer {
        /**
         * URL to mediawiki-announce subscription
         */
-       protected $mediaWikiAnnounceUrl = 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
+       protected $mediaWikiAnnounceUrl =
+               'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
 
        /**
         * Supported language codes for Mailman
@@ -983,6 +984,7 @@ abstract class Installer {
                        $this->showMessage( 'config-using-server', $server );
                        $this->setVar( 'wgServer', $server );
                }
+
                return true;
        }
 
@@ -1001,7 +1003,11 @@ abstract class Installer {
                $IP = dirname( dirname( __DIR__ ) );
                $this->setVar( 'IP', $IP );
 
-               $this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
+               $this->showMessage(
+                       'config-using-uri',
+                       $this->getVar( 'wgServer' ),
+                       $this->getVar( 'wgScriptPath' )
+               );
 
                return true;
        }
@@ -1195,7 +1201,8 @@ abstract class Installer {
                        }
                }
 
-               // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl'
+               // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8',
+               // 'config-unicode-using-intl'
                if ( $useNormalizer === 'php' ) {
                        $this->showMessage( 'config-unicode-pure-php-warning' );
                } else {
index 858fbee..56d8353 100644 (file)
@@ -202,7 +202,7 @@ class LocalSettingsGenerator {
                        $locale = '';
                }
 
-               //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused!
+               //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // @todo FIXME: I'm unused!
                $hashedUploads = $this->safeMode ? '' : '#';
                $metaNamespace = '';
                if ( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
index 5e420b6..5f76972 100644 (file)
@@ -64,10 +64,6 @@ class MysqlInstaller extends DatabaseInstaller {
                return 'mysql';
        }
 
-       public function __construct( $parent ) {
-               parent::__construct( $parent );
-       }
-
        /**
         * @return Bool
         */
@@ -86,7 +82,12 @@ class MysqlInstaller extends DatabaseInstaller {
         * @return string
         */
        public function getConnectForm() {
-               return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+               return $this->getTextBox(
+                       'wgDBserver',
+                       'config-db-host',
+                       array(),
+                       $this->parent->getHelpBox( 'config-db-host-help' )
+               ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ),
@@ -481,7 +482,10 @@ class MysqlInstaller extends DatabaseInstaller {
                $conn = $status->value;
                $dbName = $this->getVar( 'wgDBname' );
                if ( !$conn->selectDB( $dbName ) ) {
-                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8", __METHOD__ );
+                       $conn->query(
+                               "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8",
+                               __METHOD__
+                       );
                        $conn->selectDB( $dbName );
                }
                $this->setupSchemaVars();
index b0092be..6ff7af0 100644 (file)
@@ -32,207 +32,213 @@ class MysqlUpdater extends DatabaseUpdater {
        protected function getCoreUpdateList() {
                return array(
                        // 1.2
-                       array( 'addField', 'ipblocks',      'ipb_id',           'patch-ipblocks.sql' ),
-                       array( 'addField', 'ipblocks',      'ipb_expiry',       'patch-ipb_expiry.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
                        array( 'doInterwikiUpdate' ),
                        array( 'doIndexUpdate' ),
-                       array( 'addTable', 'hitcounter',                        'patch-hitcounter.sql' ),
-                       array( 'addField', 'recentchanges', 'rc_type',          'patch-rc_type.sql' ),
+                       array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
 
                        // 1.3
-                       array( 'addField', 'user',          'user_real_name',   'patch-user-realname.sql' ),
-                       array( 'addTable', 'querycache',                        'patch-querycache.sql' ),
-                       array( 'addTable', 'objectcache',                       'patch-objectcache.sql' ),
-                       array( 'addTable', 'categorylinks',                     'patch-categorylinks.sql' ),
+                       array( 'addField', 'user', 'user_real_name', 'patch-user-realname.sql' ),
+                       array( 'addTable', 'querycache', 'patch-querycache.sql' ),
+                       array( 'addTable', 'objectcache', 'patch-objectcache.sql' ),
+                       array( 'addTable', 'categorylinks', 'patch-categorylinks.sql' ),
                        array( 'doOldLinksUpdate' ),
                        array( 'doFixAncientImagelinks' ),
-                       array( 'addField', 'recentchanges', 'rc_ip',            'patch-rc_ip.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ),
 
                        // 1.4
-                       array( 'addIndex', 'image',         'PRIMARY',          'patch-image_name_primary.sql' ),
-                       array( 'addField', 'recentchanges', 'rc_id',            'patch-rc_id.sql' ),
-                       array( 'addField', 'recentchanges', 'rc_patrolled',     'patch-rc-patrol.sql' ),
-                       array( 'addTable', 'logging',                           'patch-logging.sql' ),
-                       array( 'addField', 'user',          'user_token',       'patch-user_token.sql' ),
-                       array( 'addField', 'watchlist',     'wl_notificationtimestamp', 'patch-email-notification.sql' ),
+                       array( 'addIndex', 'image', 'PRIMARY', 'patch-image_name_primary.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
+                       array( 'addTable', 'logging', 'patch-logging.sql' ),
+                       array( 'addField', 'user', 'user_token', 'patch-user_token.sql' ),
+                       array( 'addField', 'watchlist', 'wl_notificationtimestamp', 'patch-email-notification.sql' ),
                        array( 'doWatchlistUpdate' ),
-                       array( 'dropField', 'user',         'user_emailauthenticationtimestamp', 'patch-email-authentication.sql' ),
+                       array( 'dropField', 'user', 'user_emailauthenticationtimestamp',
+                               'patch-email-authentication.sql' ),
 
                        // 1.5
                        array( 'doSchemaRestructuring' ),
-                       array( 'addField', 'logging',       'log_params',       'patch-log_params.sql' ),
-                       array( 'checkBin', 'logging',       'log_title',        'patch-logging-title.sql', ),
-                       array( 'addField', 'archive',       'ar_rev_id',        'patch-archive-rev_id.sql' ),
-                       array( 'addField', 'page',          'page_len',         'patch-page_len.sql' ),
-                       array( 'dropField', 'revision',     'inverse_timestamp', 'patch-inverse_timestamp.sql' ),
-                       array( 'addField', 'revision',      'rev_text_id',      'patch-rev_text_id.sql' ),
-                       array( 'addField', 'revision',      'rev_deleted',      'patch-rev_deleted.sql' ),
-                       array( 'addField', 'image',         'img_width',        'patch-img_width.sql' ),
-                       array( 'addField', 'image',         'img_metadata',     'patch-img_metadata.sql' ),
-                       array( 'addField', 'user',          'user_email_token', 'patch-user_email_token.sql' ),
-                       array( 'addField', 'archive',       'ar_text_id',       'patch-archive-text_id.sql' ),
+                       array( 'addField', 'logging', 'log_params', 'patch-log_params.sql' ),
+                       array( 'checkBin', 'logging', 'log_title', 'patch-logging-title.sql', ),
+                       array( 'addField', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ),
+                       array( 'addField', 'page', 'page_len', 'patch-page_len.sql' ),
+                       array( 'dropField', 'revision', 'inverse_timestamp', 'patch-inverse_timestamp.sql' ),
+                       array( 'addField', 'revision', 'rev_text_id', 'patch-rev_text_id.sql' ),
+                       array( 'addField', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ),
+                       array( 'addField', 'image', 'img_width', 'patch-img_width.sql' ),
+                       array( 'addField', 'image', 'img_metadata', 'patch-img_metadata.sql' ),
+                       array( 'addField', 'user', 'user_email_token', 'patch-user_email_token.sql' ),
+                       array( 'addField', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ),
                        array( 'doNamespaceSize' ),
-                       array( 'addField', 'image',         'img_media_type',   'patch-img_media_type.sql' ),
+                       array( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ),
                        array( 'doPagelinksUpdate' ),
-                       array( 'dropField', 'image',        'img_type',         'patch-drop_img_type.sql' ),
+                       array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ),
                        array( 'doUserUniqueUpdate' ),
                        array( 'doUserGroupsUpdate' ),
-                       array( 'addField', 'site_stats',    'ss_total_pages',   'patch-ss_total_articles.sql' ),
-                       array( 'addTable', 'user_newtalk',                      'patch-usernewtalk2.sql' ),
-                       array( 'addTable', 'transcache',                        'patch-transcache.sql' ),
-                       array( 'addField', 'interwiki',     'iw_trans',         'patch-interwiki-trans.sql' ),
+                       array( 'addField', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ),
+                       array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ),
+                       array( 'addTable', 'transcache', 'patch-transcache.sql' ),
+                       array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ),
 
                        // 1.6
                        array( 'doWatchlistNull' ),
-                       array( 'addIndex', 'logging',         'times',            'patch-logging-times-index.sql' ),
-                       array( 'addField', 'ipblocks',        'ipb_range_start',  'patch-ipb_range_start.sql' ),
+                       array( 'addIndex', 'logging', 'times', 'patch-logging-times-index.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ),
                        array( 'doPageRandomUpdate' ),
-                       array( 'addField', 'user',            'user_registration', 'patch-user_registration.sql' ),
+                       array( 'addField', 'user', 'user_registration', 'patch-user_registration.sql' ),
                        array( 'doTemplatelinksUpdate' ),
-                       array( 'addTable', 'externallinks',                       'patch-externallinks.sql' ),
-                       array( 'addTable', 'job',                                 'patch-job.sql' ),
-                       array( 'addField', 'site_stats',      'ss_images',        'patch-ss_images.sql' ),
-                       array( 'addTable', 'langlinks',                           'patch-langlinks.sql' ),
-                       array( 'addTable', 'querycache_info',                     'patch-querycacheinfo.sql' ),
-                       array( 'addTable', 'filearchive',                         'patch-filearchive.sql' ),
-                       array( 'addField', 'ipblocks',        'ipb_anon_only',    'patch-ipb_anon_only.sql' ),
-                       array( 'addIndex', 'recentchanges',   'rc_ns_usertext',   'patch-recentchanges-utindex.sql' ),
-                       array( 'addIndex', 'recentchanges',   'rc_user_text',     'patch-rc_user_text-index.sql' ),
+                       array( 'addTable', 'externallinks', 'patch-externallinks.sql' ),
+                       array( 'addTable', 'job', 'patch-job.sql' ),
+                       array( 'addField', 'site_stats', 'ss_images', 'patch-ss_images.sql' ),
+                       array( 'addTable', 'langlinks', 'patch-langlinks.sql' ),
+                       array( 'addTable', 'querycache_info', 'patch-querycacheinfo.sql' ),
+                       array( 'addTable', 'filearchive', 'patch-filearchive.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ),
+                       array( 'addIndex', 'recentchanges', 'rc_ns_usertext', 'patch-recentchanges-utindex.sql' ),
+                       array( 'addIndex', 'recentchanges', 'rc_user_text', 'patch-rc_user_text-index.sql' ),
 
                        // 1.9
-                       array( 'addField', 'user',          'user_newpass_time', 'patch-user_newpass_time.sql' ),
-                       array( 'addTable', 'redirect',                           'patch-redirect.sql' ),
-                       array( 'addTable', 'querycachetwo',                      'patch-querycachetwo.sql' ),
-                       array( 'addField', 'ipblocks',      'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
+                       array( 'addField', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ),
+                       array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+                       array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
                        array( 'doBacklinkingIndicesUpdate' ),
-                       array( 'addField', 'recentchanges', 'rc_old_len',        'patch-rc_len.sql' ),
-                       array( 'addField', 'user',          'user_editcount',    'patch-user_editcount.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ),
+                       array( 'addField', 'user', 'user_editcount', 'patch-user_editcount.sql' ),
 
                        // 1.10
                        array( 'doRestrictionsUpdate' ),
-                       array( 'addField', 'logging',       'log_id',           'patch-log_id.sql' ),
-                       array( 'addField', 'revision',      'rev_parent_id',    'patch-rev_parent_id.sql' ),
-                       array( 'addField', 'page_restrictions', 'pr_id',        'patch-page_restrictions_sortkey.sql' ),
-                       array( 'addField', 'revision',      'rev_len',          'patch-rev_len.sql' ),
-                       array( 'addField', 'recentchanges', 'rc_deleted',       'patch-rc_deleted.sql' ),
-                       array( 'addField', 'logging',       'log_deleted',      'patch-log_deleted.sql' ),
-                       array( 'addField', 'archive',       'ar_deleted',       'patch-ar_deleted.sql' ),
-                       array( 'addField', 'ipblocks',      'ipb_deleted',      'patch-ipb_deleted.sql' ),
-                       array( 'addField', 'filearchive',   'fa_deleted',       'patch-fa_deleted.sql' ),
-                       array( 'addField', 'archive',       'ar_len',           'patch-ar_len.sql' ),
+                       array( 'addField', 'logging', 'log_id', 'patch-log_id.sql' ),
+                       array( 'addField', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ),
+                       array( 'addField', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ),
+                       array( 'addField', 'revision', 'rev_len', 'patch-rev_len.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ),
+                       array( 'addField', 'logging', 'log_deleted', 'patch-log_deleted.sql' ),
+                       array( 'addField', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ),
+                       array( 'addField', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ),
+                       array( 'addField', 'archive', 'ar_len', 'patch-ar_len.sql' ),
 
                        // 1.11
-                       array( 'addField', 'ipblocks',      'ipb_block_email',  'patch-ipb_emailban.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ),
                        array( 'doCategorylinksIndicesUpdate' ),
-                       array( 'addField', 'oldimage',      'oi_metadata',      'patch-oi_metadata.sql' ),
-                       array( 'addIndex', 'archive',       'usertext_timestamp', 'patch-archive-user-index.sql' ),
-                       array( 'addIndex', 'image',         'img_usertext_timestamp', 'patch-image-user-index.sql' ),
-                       array( 'addIndex', 'oldimage',      'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ),
-                       array( 'addField', 'archive',       'ar_page_id',       'patch-archive-page_id.sql' ),
-                       array( 'addField', 'image',         'img_sha1',         'patch-img_sha1.sql' ),
+                       array( 'addField', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql' ),
+                       array( 'addIndex', 'archive', 'usertext_timestamp', 'patch-archive-user-index.sql' ),
+                       array( 'addIndex', 'image', 'img_usertext_timestamp', 'patch-image-user-index.sql' ),
+                       array( 'addIndex', 'oldimage', 'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ),
+                       array( 'addField', 'archive', 'ar_page_id', 'patch-archive-page_id.sql' ),
+                       array( 'addField', 'image', 'img_sha1', 'patch-img_sha1.sql' ),
 
                        // 1.12
-                       array( 'addTable', 'protected_titles',                  'patch-protected_titles.sql' ),
+                       array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
 
                        // 1.13
-                       array( 'addField', 'ipblocks',      'ipb_by_text',      'patch-ipb_by_text.sql' ),
-                       array( 'addTable', 'page_props',                        'patch-page_props.sql' ),
-                       array( 'addTable', 'updatelog',                         'patch-updatelog.sql' ),
-                       array( 'addTable', 'category',                          'patch-category.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ),
+                       array( 'addTable', 'page_props', 'patch-page_props.sql' ),
+                       array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+                       array( 'addTable', 'category', 'patch-category.sql' ),
                        array( 'doCategoryPopulation' ),
-                       array( 'addField', 'archive',       'ar_parent_id',     'patch-ar_parent_id.sql' ),
-                       array( 'addField', 'user_newtalk',  'user_last_timestamp', 'patch-user_last_timestamp.sql' ),
+                       array( 'addField', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql' ),
+                       array( 'addField', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql' ),
                        array( 'doPopulateParentId' ),
-                       array( 'checkBin', 'protected_titles', 'pt_title',      'patch-pt_title-encoding.sql', ),
+                       array( 'checkBin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ),
                        array( 'doMaybeProfilingMemoryUpdate' ),
                        array( 'doFilearchiveIndicesUpdate' ),
 
                        // 1.14
-                       array( 'addField', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
+                       array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
                        array( 'doActiveUsersInit' ),
-                       array( 'addField', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
 
                        // 1.15
                        array( 'doUniquePlTlIl' ),
-                       array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-                       /* array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ), */
-                       /* array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ), */
+                       array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+                       array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+                       array( 'addTable', 'valid_tag', 'patch-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( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+                       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' ),
+                       # listed separately from the previous update because 1.16 was released without this update
+                       array( 'doLogUsertextPopulation' ),
                        array( 'doLogSearchPopulation' ),
-                       array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.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' ),
+                       array( 'addTable', 'l10n_cache', 'patch-l10n_cache.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' ),
                        array( 'doUpdateTranscacheField' ),
                        array( 'doUpdateMimeMinorField' ),
 
                        // 1.17
-                       array( 'addTable', 'iwlinks',                           'patch-iwlinks.sql' ),
-                       array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from',  'patch-rename-iwl_prefix.sql' ),
-                       array( 'addField', 'updatelog',     'ul_value',         'patch-ul_value.sql' ),
-                       array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
-                       array( 'dropIndex', 'iwlinks',      'iwl_prefix',       'patch-kill-iwl_prefix.sql' ),
-                       array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
+                       array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+                       array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+                       array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+                       array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+                       array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
                        array( 'doClFieldsUpdate' ),
                        array( 'doCollationUpdate' ),
-                       array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
-                       array( 'addTable', 'module_deps',                       'patch-module_deps.sql' ),
-                       array( 'dropIndex', 'archive',      'ar_page_revid',    'patch-archive_kill_ar_page_revid.sql' ),
-                       array( 'addIndex', 'archive',       'ar_revid',         'patch-archive_ar_revid.sql' ),
+                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+                       array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+                       array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
+                       array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
                        array( 'doLangLinksLengthUpdate' ),
 
                        // 1.18
                        array( 'doUserNewTalkTimestampNotNull' ),
-                       array( 'addIndex', 'user',          'user_email',       'patch-user_email_index.sql' ),
+                       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( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+                       array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
                        // 1.19
-                       array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
-                       array( 'addField', 'revision',      'rev_sha1',         'patch-rev_sha1.sql' ),
+                       array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
+                       array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
                        array( 'doMigrateUserOptions' ),
-                       array( 'dropField', 'user',         'user_options', 'patch-drop-user_options.sql' ),
-                       array( 'addField', 'archive',       'ar_sha1',          'patch-ar_sha1.sql' ),
-                       array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
-                       array( 'addField',      'uploadstash',  'us_chunk_inx',         'patch-uploadstash_chunk.sql' ),
-                       array( 'addfield', 'job',           'job_timestamp',    'patch-jobs-add-timestamp.sql' ),
+                       array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
+                       array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
+                       array( 'addIndex', 'page', 'page_redirect_namespace_len',
+                               'patch-page_redirect_namespace_len.sql' ),
+                       array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+                       array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
 
                        // 1.20
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
-                       array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
-                       array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
-                       array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+                       array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
+                       array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.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' ),
-                       array( 'dropField', 'site_stats',   'ss_admins',        'patch-drop-ss_admins.sql' ),
-                       array( 'dropField', 'recentchanges', 'rc_moved_to_title',            'patch-rc_moved.sql' ),
-                       array( 'addTable', 'sites',                            'patch-sites.sql' ),
-                       array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-                       array( 'addField', 'job',           'job_attempts',       'patch-job_attempts.sql' ),
+                       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' ),
+                       array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+                       array( 'addTable', 'sites', 'patch-sites.sql' ),
+                       array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+                       array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
                        array( 'doEnableProfiling' ),
-                       array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+                       array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-                       array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
-                       array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+                       array( 'modifyField', 'user_former_groups', 'ufg_group',
+                               'patch-ufg_group-length-increase-255.sql' ),
+                       array( 'addIndex', 'page_props', 'pp_propname_page',
+                               'patch-page_props-propname-page-index.sql' ),
                        array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
 
                        // 1.22
                        array( 'doIwlinksIndexNonUnique' ),
-                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
-                       array( 'addField',      'archive',      'ar_id',                    'patch-archive-ar_id.sql' ),
-                       array( 'addField',      'externallinks',  'el_id',  'patch-externallinks-el_id.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',
+                               'patch-iwlinks-from-title-index.sql' ),
+                       array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+                       array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
                );
        }
 
@@ -302,7 +308,11 @@ class MysqlUpdater extends DatabaseUpdater {
                }
 
                $this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' );
-               $this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' );
+               $this->applyPatch(
+                       "$IP/maintenance/interwiki.sql",
+                       true,
+                       'Adding default interwiki definitions'
+               );
        }
 
        /**
@@ -335,7 +345,13 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               if ( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
+               $applied = $this->applyPatch(
+                       'patch-fix-il_from.sql',
+                       false,
+                       'Fixing ancient broken imagelinks table.'
+               );
+
+               if ( $applied ) {
                        $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." );
                }
        }
@@ -345,7 +361,12 @@ class MysqlUpdater extends DatabaseUpdater {
         */
        function doWatchlistUpdate() {
                $talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ );
-               $nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
+               $nontalk = $this->db->selectField(
+                       'watchlist',
+                       'count(*)',
+                       'NOT (wl_namespace & 1)',
+                       __METHOD__
+               );
                if ( $talk == $nontalk ) {
                        $this->output( "...watchlist talk page rows already present.\n" );
 
@@ -374,10 +395,21 @@ class MysqlUpdater extends DatabaseUpdater {
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......checking for duplicate entries.\n" );
 
-               list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
+               list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN(
+                       'cur',
+                       'old',
+                       'page',
+                       'revision',
+                       'text'
+               );
 
-               $rows = $this->db->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
-                               FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", __METHOD__ );
+               $rows = $this->db->query( "
+                       SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
+                       FROM $cur
+                       GROUP BY cur_title, cur_namespace
+                       HAVING c>1",
+                       __METHOD__
+               );
 
                if ( $rows->numRows() > 0 ) {
                        $this->output( wfTimestamp( TS_DB ) );
@@ -388,8 +420,13 @@ class MysqlUpdater extends DatabaseUpdater {
                                if ( !isset( $duplicate[$row->cur_namespace] ) ) {
                                        $duplicate[$row->cur_namespace] = array();
                                }
+
                                $duplicate[$row->cur_namespace][] = $row->cur_title;
-                               $this->output( sprintf( "      %-60s %3s %5s\n", $row->cur_title, $row->cur_namespace, $row->c ) );
+                               $this->output( sprintf(
+                                       "      %-60s %3s %5s\n",
+                                       $row->cur_title, $row->cur_namespace,
+                                       $row->c
+                               ) );
                        }
                        $sql = "SELECT cur_title, cur_namespace, cur_id, cur_timestamp FROM $cur WHERE ";
                        $firstCond = true;
@@ -474,7 +511,10 @@ class MysqlUpdater extends DatabaseUpdater {
 
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......Locking tables.\n" );
-               $this->db->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", __METHOD__ );
+               $this->db->query(
+                       "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE",
+                       __METHOD__
+               );
 
                $maxold = intval( $this->db->selectField( 'old', 'max(old_id)', '', __METHOD__ ) );
                $this->output( wfTimestamp( TS_DB ) );
@@ -495,27 +535,38 @@ class MysqlUpdater extends DatabaseUpdater {
                        $cur_text = 'cur_text';
                        $cur_flags = "''";
                }
-               $this->db->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text,
-                                       old_timestamp, old_minor_edit, old_flags)
-                       SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
-                       FROM $cur", __METHOD__ );
+               $this->db->query(
+                       "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user,
+                               old_user_text, old_timestamp, old_minor_edit, old_flags)
+                       SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text,
+                               cur_timestamp, cur_minor_edit, $cur_flags
+                       FROM $cur",
+                       __METHOD__
+               );
 
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......Setting up revision table.\n" );
-               $this->db->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp,
-                               rev_minor_edit)
+               $this->db->query(
+                       "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user,
+                               rev_user_text, rev_timestamp, rev_minor_edit)
                        SELECT old_id, cur_id, old_comment, old_user, old_user_text,
                                old_timestamp, old_minor_edit
-                       FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", __METHOD__ );
+                       FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title",
+                       __METHOD__
+               );
 
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......Setting up page table.\n" );
-               $this->db->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter,
-                       page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
-                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
-                               cur_random, cur_touched, rev_id, LENGTH(cur_text)
+               $this->db->query(
+                       "INSERT INTO $page (page_id, page_namespace, page_title,
+                               page_restrictions, page_counter, page_is_redirect, page_is_new, page_random,
+                               page_touched, page_latest, page_len)
+                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter,
+                               cur_is_redirect, cur_is_new, cur_random, cur_touched, rev_id, LENGTH(cur_text)
                        FROM $cur,$revision
-                       WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", __METHOD__ );
+                       WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}",
+                       __METHOD__
+               );
 
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......Unlocking tables.\n" );
@@ -562,7 +613,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" );
+               $this->applyPatch(
+                       'patch-pagelinks.sql',
+                       false,
+                       'Converting links and brokenlinks tables to pagelinks'
+               );
 
                global $wgContLang;
                foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
@@ -616,14 +671,16 @@ class MysqlUpdater extends DatabaseUpdater {
                        if ( $info->type() == 'int' ) {
                                $oldug = $this->db->tableName( 'user_groups' );
                                $newug = $this->db->tableName( 'user_groups_bogus' );
-                               $this->output( "user_groups table exists but is in bogus intermediate format. Renaming to $newug... " );
+                               $this->output( "user_groups table exists but is in bogus intermediate " .
+                                       "format. Renaming to $newug... " );
                                $this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
                                $this->output( "done.\n" );
 
                                $this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" );
 
                                $this->output( "***\n" );
-                               $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
+                               $this->output( "*** WARNING: You will need to manually fix up user " .
+                                       "permissions in the user_groups\n" );
                                $this->output( "*** table. Old 1.5 alpha versions did some pretty funky stuff...\n" );
                                $this->output( "***\n" );
                        } else {
@@ -637,7 +694,11 @@ class MysqlUpdater extends DatabaseUpdater {
 
                if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
                        if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
-                               $this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" );
+                               $this->db->applyPatch(
+                                       'patch-user_rights.sql',
+                                       false,
+                                       'Upgrading from a 1.3 or older database? Breaking out user_rights for conversion'
+                               );
                        } else {
                                $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
                                $this->output( "*** You may need to manually configure some sysops by manipulating\n" );
@@ -684,7 +745,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" );
+               $this->applyPatch(
+                       'patch-watchlist-null.sql',
+                       false,
+                       'Making wl_notificationtimestamp nullable'
+               );
        }
 
        /**
@@ -744,7 +809,8 @@ class MysqlUpdater extends DatabaseUpdater {
                                ), __METHOD__
                        );
                }
-               $this->output( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" );
+               $this->output( "Done. Please run maintenance/refreshLinks.php for a more " .
+                       "thorough templatelinks update.\n" );
        }
 
        protected function doBacklinkingIndicesUpdate() {
@@ -768,8 +834,16 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" );
-               $this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" );
+               $this->applyPatch(
+                       'patch-page_restrictions.sql',
+                       false,
+                       'Creating page_restrictions table (1/2)'
+               );
+               $this->applyPatch(
+                       'patch-page_restrictions_sortkey.sql',
+                       false,
+                       'Creating page_restrictions table (2/2)'
+               );
                $this->output( "done.\n" );
 
                $this->output( "Migrating old restrictions to new table...\n" );
@@ -838,7 +912,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return true;
                }
 
-               return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
+               return $this->applyPatch(
+                       'patch-profiling-memory.sql',
+                       false,
+                       'Adding pf_memory field to table profiling'
+               );
        }
 
        protected function doFilearchiveIndicesUpdate() {
@@ -858,12 +936,17 @@ class MysqlUpdater extends DatabaseUpdater {
                        return true;
                }
                if ( $this->skipSchema ) {
-                       $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
+                       $this->output( "...skipping schema change (making pl_namespace, tl_namespace " .
+                               "and il_to indices UNIQUE).\n" );
 
                        return false;
                }
 
-               return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
+               return $this->applyPatch(
+                       'patch-pl-tl-il-unique.sql',
+                       false,
+                       'Making pl_namespace, tl_namespace and il_to indices UNIQUE'
+               );
        }
 
        protected function doUpdateMimeMinorField() {
@@ -873,7 +956,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" );
+               $this->applyPatch(
+                       'patch-mime_minor_length.sql',
+                       false,
+                       'Altering all *_mime_minor fields to 100 bytes in size'
+               );
        }
 
        protected function doClFieldsUpdate() {
@@ -883,7 +970,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' );
+               $this->applyPatch(
+                       'patch-categorylinks-better-collation2.sql',
+                       false,
+                       'Updating categorylinks (again)'
+               );
        }
 
        protected function doLangLinksLengthUpdate() {
@@ -892,7 +983,11 @@ class MysqlUpdater extends DatabaseUpdater {
                $row = $this->db->fetchObject( $res );
 
                if ( $row && $row->Type == "varbinary(10)" ) {
-                       $this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' );
+                       $this->applyPatch(
+                               'patch-langlinks-ll_lang-20.sql',
+                               false,
+                               'Updating length of ll_lang in langlinks'
+                       );
                } else {
                        $this->output( "...ll_lang is up-to-date.\n" );
                }
@@ -913,7 +1008,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
+               $this->applyPatch(
+                       'patch-user-newtalk-timestamp-null.sql',
+                       false,
+                       'Making user_last_timestamp nullable'
+               );
        }
 
        protected function doIwlinksIndexNonUnique() {
@@ -929,6 +1028,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        return false;
                }
 
-               return $this->applyPatch( 'patch-iwl_prefix_title_from-non-unique.sql', false, "Making iwl_prefix_title_from index non-UNIQUE" );
+               return $this->applyPatch(
+                       'patch-iwl_prefix_title_from-non-unique.sql',
+                       false,
+                       'Making iwl_prefix_title_from index non-UNIQUE'
+               );
        }
 }
index efa8d00..7757510 100644 (file)
@@ -60,12 +60,22 @@ class OracleInstaller extends DatabaseInstaller {
                        $this->parent->setVar( 'wgDBserver', '' );
                }
 
-               return $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
+               return $this->getTextBox(
+                       'wgDBserver',
+                       'config-db-host-oracle',
+                       array(),
+                       $this->parent->getHelpBox( 'config-db-host-oracle-help' )
+               ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
                        $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
-                       $this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) .
+                       $this->getTextBox(
+                               '_OracleTempTS',
+                               'config-oracle-temp-ts',
+                               array(),
+                               $this->parent->getHelpBox( 'config-db-oracle-help' )
+                       ) .
                        Html::closeElement( 'fieldset' ) .
                        $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) .
                        $this->getInstallUserBox() .
@@ -81,7 +91,12 @@ class OracleInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBprefix', 'wgDBuser', 'wgDBpassword' ) );
+               $newValues = $this->setVarsFromRequest(
+                       'wgDBserver',
+                       'wgDBprefix',
+                       'wgDBuser',
+                       'wgDBpassword'
+               );
                $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
 
                // Validate them
@@ -318,8 +333,11 @@ class OracleInstaller extends DatabaseInstaller {
         * @return bool Whether the connection string is valid.
         */
        public static function checkConnectStringFormat( $connect_string ) {
+               // @@codingStandardsIgnoreStart Long lines with regular expressions.
+               // @todo Very long regular expression. Make more readable?
                $isValid = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name
                $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
+               // @@codingStandardsIgnoreEnd
                return (bool)$isValid;
        }
 }
index 8484189..ec91e57 100644 (file)
@@ -48,13 +48,13 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
                        //1.18
-                       array( 'addIndex',      'user',          'i02',       'patch-user_email_index.sql' ),
+                       array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ),
                        array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
                        array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
                        array( 'doRecentchangesFK2Cascade' ),
 
                        //1.19
-                       array( 'addIndex', 'logging',       'i05',      'patch-logging_type_action_index.sql'),
+                       array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ),
                        array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ),
                        array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
                        array( 'doRemoveNotNullEmptyDefaults2' ),
@@ -70,22 +70,25 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.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',      'archive',      'ar_id',                        'patch-archive-ar_id.sql' ),
-                       array( 'addField',      'externallinks',        'el_id',                'patch-externallinks-el_id.sql' ),
-                       array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
-                       array( 'dropField', 'site_stats', 'ss_admins',  'patch-ss_admins.sql' ),
+                       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', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+                       array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
+                       array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+                       array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
-                       array( 'addTable', 'sites',                            'patch-sites.sql' ),
-                       array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-                       array( 'addField', 'job',           'job_attempts',       'patch-job_attempts.sql' ),
-                       array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+                       array( 'addTable', 'sites', 'patch-sites.sql' ),
+                       array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+                       array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+                       array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-                       array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+                       array( 'modifyField', 'user_former_groups', 'ufg_group',
+                               'patch-ufg_group-length-increase-255.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
@@ -104,14 +107,22 @@ class OracleUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" );
+               $this->applyPatch(
+                       'patch_namespace_defaults.sql',
+                       false,
+                       'Altering namespace fields with default value'
+               );
        }
 
        /**
         * Uniform FK names + deferrable state
         */
        protected function doFKRenameDeferr() {
-               $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
+               $meta = $this->db->query( '
+                       SELECT COUNT(*) cnt
+                       FROM user_constraints
+                       WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\''
+               );
                $row = $meta->fetchRow();
                if ( $row && $row['cnt'] > 0 ) {
                        return;
@@ -169,7 +180,11 @@ class OracleUpdater extends DatabaseUpdater {
                if ( $meta->isNullable() ) {
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" );
+               $this->applyPatch(
+                       'patch_remove_not_null_empty_defs.sql',
+                       false,
+                       'Removing not null empty constraints'
+               );
        }
 
        protected function doRemoveNotNullEmptyDefaults2() {
@@ -177,7 +192,11 @@ class OracleUpdater extends DatabaseUpdater {
                if ( $meta->isNullable() ) {
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" );
+               $this->applyPatch(
+                       'patch_remove_not_null_empty_defs2.sql',
+                       false,
+                       'Removing not null empty constraints'
+               );
        }
 
        /**
index a7e8462..2cf4156 100644 (file)
@@ -42,8 +42,8 @@ class PostgresInstaller extends DatabaseInstaller {
                '_InstallUser' => 'postgres',
        );
 
-       var $minimumVersion = '8.3';
-       var $maxRoleSearchDepth = 5;
+       public $minimumVersion = '8.3';
+       public $maxRoleSearchDepth = 5;
 
        protected $pgConns = array();
 
@@ -56,12 +56,27 @@ class PostgresInstaller extends DatabaseInstaller {
        }
 
        function getConnectForm() {
-               return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+               return $this->getTextBox(
+                       'wgDBserver',
+                       'config-db-host',
+                       array(),
+                       $this->parent->getHelpBox( 'config-db-host-help' )
+               ) .
                        $this->getTextBox( 'wgDBport', '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' ) ) .
+                       $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();
        }
index f0e4aec..dfe7865 100644 (file)
@@ -51,16 +51,16 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'renameIndex', 'pagecontent', 'text_pkey', 'pagecontent_pkey' ),
 
                        # renamed sequences
-                       array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq'         ),
-                       array( 'renameSequence', 'rev_rev_id_val',      'revision_rev_id_seq'         ),
-                       array( 'renameSequence', 'text_old_id_val',     'text_old_id_seq'             ),
-                       array( 'renameSequence', 'rc_rc_id_seq',        'recentchanges_rc_id_seq'     ),
-                       array( 'renameSequence', 'log_log_id_seq',      'logging_log_id_seq'          ),
-                       array( 'renameSequence', 'pr_id_val',           'page_restrictions_pr_id_seq' ),
-                       array( 'renameSequence', 'us_id_seq',           'uploadstash_us_id_seq' ),
+                       array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ),
+                       array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ),
+                       array( 'renameSequence', 'text_old_id_val', 'text_old_id_seq' ),
+                       array( 'renameSequence', 'rc_rc_id_seq', 'recentchanges_rc_id_seq' ),
+                       array( 'renameSequence', 'log_log_id_seq', 'logging_log_id_seq' ),
+                       array( 'renameSequence', 'pr_id_val', 'page_restrictions_pr_id_seq' ),
+                       array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ),
 
                        # since r58263
-                       array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq'),
+                       array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq' ),
 
                        # new sequences if not renamed above
                        array( 'addSequence', 'logging', false, 'logging_log_id_seq' ),
@@ -68,200 +68,216 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addSequence', 'filearchive', 'fa_id', 'filearchive_fa_id_seq' ),
 
                        # new tables
-                       array( 'addTable', 'category',          'patch-category.sql' ),
-                       array( 'addTable', 'page',              'patch-page.sql' ),
-                       array( 'addTable', 'querycachetwo',     'patch-querycachetwo.sql' ),
-                       array( 'addTable', 'page_props',        'patch-page_props.sql' ),
+                       array( 'addTable', 'category', 'patch-category.sql' ),
+                       array( 'addTable', 'page', 'patch-page.sql' ),
+                       array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+                       array( 'addTable', 'page_props', 'patch-page_props.sql' ),
                        array( 'addTable', 'page_restrictions', 'patch-page_restrictions.sql' ),
-                       array( 'addTable', 'profiling',         'patch-profiling.sql' ),
-                       array( 'addTable', 'protected_titles',  'patch-protected_titles.sql' ),
-                       array( 'addTable', 'redirect',          'patch-redirect.sql' ),
-                       array( 'addTable', 'updatelog',         'patch-updatelog.sql' ),
-                       array( 'addTable', 'change_tag',        'patch-change_tag.sql' ),
-                       array( 'addTable', 'tag_summary',       'patch-tag_summary.sql' ),
-                       array( 'addTable', 'valid_tag',         'patch-valid_tag.sql' ),
-                       array( 'addTable', 'user_properties',   'patch-user_properties.sql' ),
-                       array( 'addTable', 'log_search',        'patch-log_search.sql' ),
-                       array( 'addTable', 'l10n_cache',        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'iwlinks',           'patch-iwlinks.sql' ),
-                       array( 'addTable', 'msg_resource',      'patch-msg_resource.sql' ),
-                       array( 'addTable', 'msg_resource_links','patch-msg_resource_links.sql' ),
-                       array( 'addTable', 'module_deps',       'patch-module_deps.sql' ),
-                       array( 'addTable', 'uploadstash',       'patch-uploadstash.sql' ),
-                       array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
-                       array( 'addTable', 'sites',             'patch-sites.sql' ),
+                       array( 'addTable', 'profiling', 'patch-profiling.sql' ),
+                       array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
+                       array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+                       array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+                       array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+                       array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+                       array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ),
+                       array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+                       array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+                       array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+                       array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+                       array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
+                       array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+                       array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+                       array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
+                       array( 'addTable', 'sites', 'patch-sites.sql' ),
 
                        # Needed before new field
                        array( 'convertArchive2' ),
 
                        # new fields
-                       array( 'addPgField', 'updatelog',     'ul_value',             'TEXT' ),
-                       array( 'addPgField', 'archive',       'ar_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'archive',       'ar_len',               'INTEGER' ),
-                       array( 'addPgField', 'archive',       'ar_page_id',           'INTEGER' ),
-                       array( 'addPgField', 'archive',       'ar_parent_id',         'INTEGER' ),
-                       array( 'addPgField', 'archive',       'ar_content_model',     'TEXT' ),
-                       array( 'addPgField', 'archive',       'ar_content_format',    'TEXT' ),
-                       array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix',    "TEXT NOT NULL DEFAULT ''"),
-                       array( 'addPgField', 'categorylinks', 'cl_collation',         "TEXT NOT NULL DEFAULT 0" ),
-                       array( 'addPgField', 'categorylinks', 'cl_type',              "TEXT NOT NULL DEFAULT 'page'" ),
-                       array( 'addPgField', 'image',         'img_sha1',             "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'ipblocks',      'ipb_allow_usertalk',   'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_anon_only',        'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_by_text',          "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'ipblocks',      'ipb_block_email',      'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_create_account',   'SMALLINT NOT NULL DEFAULT 1' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
-                       array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
-                       array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'filearchive',   'fa_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
-                       array( 'addPgField', 'logging',       'log_params',           'TEXT' ),
-                       array( 'addPgField', 'mwuser',        'user_editcount',       'INTEGER' ),
-                       array( 'addPgField', 'mwuser',        'user_newpass_time',    'TIMESTAMPTZ' ),
-                       array( 'addPgField', 'oldimage',      'oi_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'oldimage',      'oi_major_mime',        "TEXT NOT NULL DEFAULT 'unknown'" ),
-                       array( 'addPgField', 'oldimage',      'oi_media_type',        'TEXT' ),
-                       array( 'addPgField', 'oldimage',      'oi_metadata',          "BYTEA NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'oldimage',      'oi_minor_mime',        "TEXT NOT NULL DEFAULT 'unknown'" ),
-                       array( 'addPgField', 'oldimage',      'oi_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'page',          'page_content_model',   'TEXT' ),
-                       array( 'addPgField', 'page_restrictions', 'pr_id',            "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
-                       array( 'addPgField', 'profiling',     'pf_memory',            'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'recentchanges', 'rc_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'recentchanges', 'rc_log_action',        'TEXT' ),
-                       array( 'addPgField', 'recentchanges', 'rc_log_type',          'TEXT' ),
-                       array( 'addPgField', 'recentchanges', 'rc_logid',             'INTEGER NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'recentchanges', 'rc_new_len',           'INTEGER' ),
-                       array( 'addPgField', 'recentchanges', 'rc_old_len',           'INTEGER' ),
-                       array( 'addPgField', 'recentchanges', 'rc_params',            'TEXT' ),
-                       array( 'addPgField', 'redirect',      'rd_interwiki',         'TEXT NULL' ),
-                       array( 'addPgField', 'redirect',      'rd_fragment',          'TEXT NULL' ),
-                       array( 'addPgField', 'revision',      'rev_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-                       array( 'addPgField', 'revision',      'rev_len',              'INTEGER' ),
-                       array( 'addPgField', 'revision',      'rev_parent_id',        'INTEGER DEFAULT NULL' ),
-                       array( 'addPgField', 'revision',      'rev_content_model',    'TEXT' ),
-                       array( 'addPgField', 'revision',      'rev_content_format',   'TEXT' ),
-                       array( 'addPgField', 'site_stats',    'ss_active_users',      "INTEGER DEFAULT '-1'" ),
-                       array( 'addPgField', 'user_newtalk',  'user_last_timestamp',  'TIMESTAMPTZ' ),
-                       array( 'addPgField', 'logging',       'log_user_text',        "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'logging',       'log_page',             'INTEGER' ),
-                       array( 'addPgField', 'interwiki',     'iw_api',               "TEXT NOT NULL DEFAULT ''"),
-                       array( 'addPgField', 'interwiki',     'iw_wikiid',            "TEXT NOT NULL DEFAULT ''"),
-                       array( 'addPgField', 'revision',      'rev_sha1',             "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'archive',       'ar_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'uploadstash',   'us_chunk_inx',         "INTEGER NULL" ),
-                       array( 'addPgField', 'job',           'job_timestamp',        "TIMESTAMPTZ" ),
-                       array( 'addPgField', 'job',           'job_random',           "INTEGER NOT NULL DEFAULT 0" ),
-                       array( 'addPgField', 'job',           'job_attempts',         "INTEGER NOT NULL DEFAULT 0" ),
-                       array( 'addPgField', 'job',           'job_token',            "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'job',           'job_token_timestamp',  "TIMESTAMPTZ" ),
-                       array( 'addPgField', 'job',           'job_sha1',             "TEXT NOT NULL DEFAULT ''" ),
-                       array( 'addPgField', 'archive',       'ar_id',                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
-                       array( 'addPgField', 'externallinks', 'el_id',                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
-
+                       array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ),
+                       array( 'addPgField', 'archive', 'ar_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ),
+                       array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ),
+                       array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ),
+                       array( 'addPgField', 'archive', 'ar_content_model', 'TEXT' ),
+                       array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ),
+                       array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0" ),
+                       array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'" ),
+                       array( 'addPgField', 'image', 'img_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'ipblocks', 'ipb_allow_usertalk', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_anon_only', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_by_text', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'ipblocks', 'ipb_block_email', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+                       array( 'addPgField', 'ipblocks', 'ipb_parent_block_id',
+                               'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ' .
+                               'ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
+                       array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'logging', 'log_id',
+                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
+                       array( 'addPgField', 'logging', 'log_params', 'TEXT' ),
+                       array( 'addPgField', 'mwuser', 'user_editcount', 'INTEGER' ),
+                       array( 'addPgField', 'mwuser', 'user_newpass_time', 'TIMESTAMPTZ' ),
+                       array( 'addPgField', 'oldimage', 'oi_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'oldimage', 'oi_major_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+                       array( 'addPgField', 'oldimage', 'oi_media_type', 'TEXT' ),
+                       array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+                       array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'page', 'page_content_model', 'TEXT' ),
+                       array( 'addPgField', 'page_restrictions', 'pr_id',
+                               "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
+                       array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'recentchanges', 'rc_log_action', 'TEXT' ),
+                       array( 'addPgField', 'recentchanges', 'rc_log_type', 'TEXT' ),
+                       array( 'addPgField', 'recentchanges', 'rc_logid', 'INTEGER NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'recentchanges', 'rc_new_len', 'INTEGER' ),
+                       array( 'addPgField', 'recentchanges', 'rc_old_len', 'INTEGER' ),
+                       array( 'addPgField', 'recentchanges', 'rc_params', 'TEXT' ),
+                       array( 'addPgField', 'redirect', 'rd_interwiki', 'TEXT NULL' ),
+                       array( 'addPgField', 'redirect', 'rd_fragment', 'TEXT NULL' ),
+                       array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ),
+                       array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ),
+                       array( 'addPgField', 'revision', 'rev_content_model', 'TEXT' ),
+                       array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ),
+                       array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ),
+                       array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ),
+                       array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'logging', 'log_page', 'INTEGER' ),
+                       array( 'addPgField', 'interwiki', 'iw_api', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'interwiki', 'iw_wikiid', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ),
+                       array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ),
+                       array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ),
+                       array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ),
+                       array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ),
+                       array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'archive', 'ar_id',
+                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
+                       array( 'addPgField', 'externallinks', 'el_id',
+                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
 
                        # type changes
-                       array( 'changeField', 'archive',       'ar_deleted',      'smallint', '' ),
-                       array( 'changeField', 'archive',       'ar_minor_edit',   'smallint', 'ar_minor_edit::smallint DEFAULT 0' ),
-                       array( 'changeField', 'filearchive',   'fa_deleted',      'smallint', '' ),
-                       array( 'changeField', 'filearchive',   'fa_height',       'integer',  '' ),
-                       array( 'changeField', 'filearchive',   'fa_metadata',     'bytea',    "decode(fa_metadata,'escape')" ),
-                       array( 'changeField', 'filearchive',   'fa_size',         'integer',  '' ),
-                       array( 'changeField', 'filearchive',   'fa_width',        'integer',  '' ),
-                       array( 'changeField', 'filearchive',   'fa_storage_group', 'text',     '' ),
-                       array( 'changeField', 'filearchive',   'fa_storage_key',  'text',     '' ),
-                       array( 'changeField', 'image',         'img_metadata',    'bytea',    "decode(img_metadata,'escape')" ),
-                       array( 'changeField', 'image',         'img_size',        'integer',  '' ),
-                       array( 'changeField', 'image',         'img_width',       'integer',  '' ),
-                       array( 'changeField', 'image',         'img_height',      'integer',  '' ),
-                       array( 'changeField', 'interwiki',     'iw_local',        'smallint', 'iw_local::smallint' ),
-                       array( 'changeField', 'interwiki',     'iw_trans',        'smallint', 'iw_trans::smallint DEFAULT 0' ),
-                       array( 'changeField', 'ipblocks',      'ipb_auto',        'smallint', 'ipb_auto::smallint DEFAULT 0' ),
-                       array( 'changeField', 'ipblocks',      'ipb_anon_only',   'smallint', "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
-                       array( 'changeField', 'ipblocks',      'ipb_create_account', 'smallint', "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ),
-                       array( 'changeField', 'ipblocks',      'ipb_enable_autoblock', 'smallint', "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ),
-                       array( 'changeField', 'ipblocks',      'ipb_block_email', 'smallint', "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ),
-                       array( 'changeField', 'ipblocks',      'ipb_address',     'text',     'ipb_address::text' ),
-                       array( 'changeField', 'ipblocks',      'ipb_deleted',     'smallint', 'ipb_deleted::smallint DEFAULT 0' ),
-                       array( 'changeField', 'mwuser',        'user_token',      'text',     '' ),
-                       array( 'changeField', 'mwuser',        'user_email_token', 'text',     '' ),
-                       array( 'changeField', 'objectcache',   'keyname',         'text',     '' ),
-                       array( 'changeField', 'oldimage',      'oi_height',       'integer',  '' ),
-                       array( 'changeField', 'oldimage',      'oi_metadata',     'bytea',    "decode(img_metadata,'escape')" ),
-                       array( 'changeField', 'oldimage',      'oi_size',         'integer',  '' ),
-                       array( 'changeField', 'oldimage',      'oi_width',        'integer',  '' ),
-                       array( 'changeField', 'page',          'page_is_redirect', 'smallint', 'page_is_redirect::smallint DEFAULT 0' ),
-                       array( 'changeField', 'page',          'page_is_new',     'smallint', 'page_is_new::smallint DEFAULT 0' ),
-                       array( 'changeField', 'querycache',    'qc_value',        'integer',  '' ),
-                       array( 'changeField', 'querycachetwo', 'qcc_value',       'integer',  '' ),
-                       array( 'changeField', 'recentchanges', 'rc_bot',          'smallint', 'rc_bot::smallint DEFAULT 0' ),
-                       array( 'changeField', 'recentchanges', 'rc_deleted',      'smallint', '' ),
-                       array( 'changeField', 'recentchanges', 'rc_minor',        'smallint', 'rc_minor::smallint DEFAULT 0' ),
-                       array( 'changeField', 'recentchanges', 'rc_new',          'smallint', 'rc_new::smallint DEFAULT 0' ),
-                       array( 'changeField', 'recentchanges', 'rc_type',         'smallint', 'rc_type::smallint DEFAULT 0' ),
-                       array( 'changeField', 'recentchanges', 'rc_patrolled',    'smallint', 'rc_patrolled::smallint DEFAULT 0' ),
-                       array( 'changeField', 'revision',      'rev_deleted',     'smallint', 'rev_deleted::smallint DEFAULT 0' ),
-                       array( 'changeField', 'revision',      'rev_minor_edit',  'smallint', 'rev_minor_edit::smallint DEFAULT 0' ),
-                       array( 'changeField', 'templatelinks', 'tl_namespace',    'smallint', 'tl_namespace::smallint' ),
-                       array( 'changeField', 'user_newtalk',  'user_ip',         'text',     'host(user_ip)' ),
-                       array( 'changeField', 'uploadstash',   'us_image_bits',   'smallint', '' ),
-                       array( 'changeField', 'profiling',     'pf_time',         'float', '' ),
-                       array( 'changeField', 'profiling',     'pf_memory',       'float', '' ),
+                       array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
+                       array( 'changeField', 'archive', 'ar_minor_edit', 'smallint',
+                               'ar_minor_edit::smallint DEFAULT 0' ),
+                       array( 'changeField', 'filearchive', 'fa_deleted', 'smallint', '' ),
+                       array( 'changeField', 'filearchive', 'fa_height', 'integer', '' ),
+                       array( 'changeField', 'filearchive', 'fa_metadata', 'bytea', "decode(fa_metadata,'escape')" ),
+                       array( 'changeField', 'filearchive', 'fa_size', 'integer', '' ),
+                       array( 'changeField', 'filearchive', 'fa_width', 'integer', '' ),
+                       array( 'changeField', 'filearchive', 'fa_storage_group', 'text', '' ),
+                       array( 'changeField', 'filearchive', 'fa_storage_key', 'text', '' ),
+                       array( 'changeField', 'image', 'img_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+                       array( 'changeField', 'image', 'img_size', 'integer', '' ),
+                       array( 'changeField', 'image', 'img_width', 'integer', '' ),
+                       array( 'changeField', 'image', 'img_height', 'integer', '' ),
+                       array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint' ),
+                       array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ),
+                       array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ),
+                       array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint',
+                               "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
+                       array( 'changeField', 'ipblocks', 'ipb_create_account', 'smallint',
+                               "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ),
+                       array( 'changeField', 'ipblocks', 'ipb_enable_autoblock', 'smallint',
+                               "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ),
+                       array( 'changeField', 'ipblocks', 'ipb_block_email', 'smallint',
+                               "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ),
+                       array( 'changeField', 'ipblocks', 'ipb_address', 'text', 'ipb_address::text' ),
+                       array( 'changeField', 'ipblocks', 'ipb_deleted', 'smallint', 'ipb_deleted::smallint DEFAULT 0' ),
+                       array( 'changeField', 'mwuser', 'user_token', 'text', '' ),
+                       array( 'changeField', 'mwuser', 'user_email_token', 'text', '' ),
+                       array( 'changeField', 'objectcache', 'keyname', 'text', '' ),
+                       array( 'changeField', 'oldimage', 'oi_height', 'integer', '' ),
+                       array( 'changeField', 'oldimage', 'oi_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+                       array( 'changeField', 'oldimage', 'oi_size', 'integer', '' ),
+                       array( 'changeField', 'oldimage', 'oi_width', 'integer', '' ),
+                       array( 'changeField', 'page', 'page_is_redirect', 'smallint',
+                               'page_is_redirect::smallint DEFAULT 0' ),
+                       array( 'changeField', 'page', 'page_is_new', 'smallint', 'page_is_new::smallint DEFAULT 0' ),
+                       array( 'changeField', 'querycache', 'qc_value', 'integer', '' ),
+                       array( 'changeField', 'querycachetwo', 'qcc_value', 'integer', '' ),
+                       array( 'changeField', 'recentchanges', 'rc_bot', 'smallint', 'rc_bot::smallint DEFAULT 0' ),
+                       array( 'changeField', 'recentchanges', 'rc_deleted', 'smallint', '' ),
+                       array( 'changeField', 'recentchanges', 'rc_minor', 'smallint', 'rc_minor::smallint DEFAULT 0' ),
+                       array( 'changeField', 'recentchanges', 'rc_new', 'smallint', 'rc_new::smallint DEFAULT 0' ),
+                       array( 'changeField', 'recentchanges', 'rc_type', 'smallint', 'rc_type::smallint DEFAULT 0' ),
+                       array( 'changeField', 'recentchanges', 'rc_patrolled', 'smallint',
+                               'rc_patrolled::smallint DEFAULT 0' ),
+                       array( 'changeField', 'revision', 'rev_deleted', 'smallint', 'rev_deleted::smallint DEFAULT 0' ),
+                       array( 'changeField', 'revision', 'rev_minor_edit', 'smallint',
+                               'rev_minor_edit::smallint DEFAULT 0' ),
+                       array( 'changeField', 'templatelinks', 'tl_namespace', 'smallint', 'tl_namespace::smallint' ),
+                       array( 'changeField', 'user_newtalk', 'user_ip', 'text', 'host(user_ip)' ),
+                       array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ),
+                       array( 'changeField', 'profiling', 'pf_time', 'float', '' ),
+                       array( 'changeField', 'profiling', 'pf_memory', 'float', '' ),
 
                        # null changes
-                       array( 'changeNullableField', 'oldimage', 'oi_bits',       'NULL' ),
-                       array( 'changeNullableField', 'oldimage', 'oi_timestamp',  'NULL' ),
+                       array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ),
+                       array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
-                       array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
-                       array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
+                       array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL' ),
+                       array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL' ),
                        array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
 
                        array( 'checkOiDeleted' ),
 
                        # New indexes
-                       array( 'addPgIndex', 'archive',       'archive_user_text',      '(ar_user_text)' ),
-                       array( 'addPgIndex', 'image',         'img_sha1',               '(img_sha1)' ),
-                       array( 'addPgIndex', 'ipblocks',      'ipb_parent_block_id',              '(ipb_parent_block_id)' ),
-                       array( 'addPgIndex', 'oldimage',      'oi_sha1',                '(oi_sha1)' ),
-                       array( 'addPgIndex', 'page',          'page_mediawiki_title',   '(page_title) WHERE page_namespace = 8' ),
-                       array( 'addPgIndex', 'pagelinks',     'pagelinks_title',        '(pl_title)' ),
-                       array( 'addPgIndex', 'page_props',    'pp_propname_page',       '(pp_propname, pp_page)' ),
-                       array( 'addPgIndex', 'revision',      'rev_text_id_idx',        '(rev_text_id)' ),
-                       array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot',       '(rc_timestamp) WHERE rc_bot = 0' ),
-                       array( 'addPgIndex', 'templatelinks', 'templatelinks_from',     '(tl_from)' ),
-                       array( 'addPgIndex', 'watchlist',     'wl_user',                '(wl_user)' ),
-                       array( 'addPgIndex', 'logging',       'logging_user_type_time', '(log_user, log_type, log_timestamp)' ),
-                       array( 'addPgIndex', 'logging',       'logging_page_id_time',   '(log_page,log_timestamp)' ),
-                       array( 'addPgIndex', 'iwlinks',       'iwl_prefix_from_title',  '(iwl_prefix, iwl_from, iwl_title)' ),
-                       array( 'addPgIndex', 'iwlinks',       'iwl_prefix_title_from',  '(iwl_prefix, iwl_title, iwl_from)' ),
-                       array( 'addPgIndex', 'job',           'job_timestamp_idx',      '(job_timestamp)' ),
-                       array( 'addPgIndex', 'job',           'job_sha1',               '(job_sha1)' ),
-                       array( 'addPgIndex', 'job',           'job_cmd_token',          '(job_cmd, job_token, job_random)' ),
-                       array( 'addPgIndex', 'job',           'job_cmd_token_id',       '(job_cmd, job_token, job_id)' ),
-                       array( 'addPgIndex', 'filearchive',   'fa_sha1',                '(fa_sha1)' ),
+                       array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
+                       array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+                       array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
+                       array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
+                       array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
+                       array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
+                       array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
+                       array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ),
+                       array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
+                       array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
+                       array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
+                       array( 'addPgIndex', 'logging', 'logging_user_type_time',
+                               '(log_user, log_type, log_timestamp)' ),
+                       array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
+                       array( 'addPgIndex', 'iwlinks', 'iwl_prefix_from_title', '(iwl_prefix, iwl_from, iwl_title)' ),
+                       array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
+                       array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
+                       array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ),
+                       array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
+                       array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
+                       array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
 
                        array( 'checkIndex', 'pagelink_unique', array(
                                array( 'pl_from', 'int4_ops', 'btree', 0 ),
                                array( 'pl_namespace', 'int2_ops', 'btree', 0 ),
                                array( 'pl_title', 'text_ops', 'btree', 0 ),
                        ),
-                       'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
+                               'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
                        array( 'checkIndex', 'cl_sortkey', array(
                                array( 'cl_to', 'text_ops', 'btree', 0 ),
                                array( 'cl_sortkey', 'text_ops', 'btree', 0 ),
                                array( 'cl_from', 'int4_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+                               'CREATE INDEX cl_sortkey ON "categorylinks" ' .
+                                       'USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
                        array( 'checkIndex', 'iwl_prefix_title_from', array(
                                array( 'iwl_prefix', 'text_ops', 'btree', 0 ),
                                array( 'iwl_title', 'text_ops', 'btree', 0 ),
                                array( 'iwl_from', 'int4_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX iwl_prefix_title_from ON "iwlinks" USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ),
+                       'CREATE INDEX iwl_prefix_title_from ON "iwlinks" ' .
+                               'USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ),
                        array( 'checkIndex', 'logging_times', array(
                                array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
                        ),
@@ -271,36 +287,48 @@ class PostgresUpdater extends DatabaseUpdater {
                                array( 'oi_name', 'text_ops', 'btree', 0 ),
                                array( 'oi_archive_name', 'text_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "oi_name_archive_name" ON "oldimage" USING "btree" ("oi_name", "oi_archive_name")' ),
+                       'CREATE INDEX "oi_name_archive_name" ON "oldimage" ' .
+                               'USING "btree" ("oi_name", "oi_archive_name")' ),
                        array( 'checkIndex', 'oi_name_timestamp', array(
                                array( 'oi_name', 'text_ops', 'btree', 0 ),
                                array( 'oi_timestamp', 'timestamptz_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "oi_name_timestamp" ON "oldimage" USING "btree" ("oi_name", "oi_timestamp")' ),
+                       'CREATE INDEX "oi_name_timestamp" ON "oldimage" ' .
+                               'USING "btree" ("oi_name", "oi_timestamp")' ),
                        array( 'checkIndex', 'page_main_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_main_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
+                       'CREATE INDEX "page_main_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
                        array( 'checkIndex', 'page_mediawiki_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_mediawiki_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
+                       'CREATE INDEX "page_mediawiki_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
                        array( 'checkIndex', 'page_project_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_project_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 4)' ),
+                       'CREATE INDEX "page_project_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") ' .
+                               'WHERE ("page_namespace" = 4)' ),
                        array( 'checkIndex', 'page_talk_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_talk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 1)' ),
+                       'CREATE INDEX "page_talk_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") ' .
+                               'WHERE ("page_namespace" = 1)' ),
                        array( 'checkIndex', 'page_user_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_user_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 2)' ),
+                       'CREATE INDEX "page_user_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") WHERE ' .
+                               '("page_namespace" = 2)' ),
                        array( 'checkIndex', 'page_utalk_title', array(
                                array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
                        ),
-                       'CREATE INDEX "page_utalk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 3)' ),
+                       'CREATE INDEX "page_utalk_title" ON "page" ' .
+                               'USING "btree" ("page_title" "text_pattern_ops") ' .
+                               'WHERE ("page_namespace" = 3)' ),
                        array( 'checkIndex', 'ts2_page_text', array(
                                array( 'textvector', 'tsvector_ops', 'gist', 0 ),
                        ),
@@ -320,39 +348,48 @@ class PostgresUpdater extends DatabaseUpdater {
                                array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
                                array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ),
                        ),
-                       'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
+                       'CREATE UNIQUE INDEX ipb_address_unique ' .
+                               'ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
 
                        array( 'checkIwlPrefix' ),
 
                        # All FK columns should be deferred
-                       array( 'changeFkeyDeferrable', 'archive',          'ar_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'categorylinks',    'cl_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'externallinks',    'el_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'filearchive',      'fa_deleted_user', 'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'filearchive',      'fa_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'image',            'img_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'imagelinks',       'il_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_by',          'mwuser(user_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_parent_block_id',       'ipblocks(ipb_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'langlinks',        'll_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'logging',          'log_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'oldimage',         'oi_name',         'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'oldimage',         'oi_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'pagelinks',        'pl_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'page_props',       'pp_page',         'page (page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'recentchanges',    'rc_cur_id',       'page(page_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'recentchanges',    'rc_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'redirect',         'rd_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'revision',         'rev_page',        'page (page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'revision',         'rev_user',        'mwuser(user_id) ON DELETE RESTRICT' ),
-                       array( 'changeFkeyDeferrable', 'templatelinks',    'tl_from',         'page(page_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'user_groups',      'ug_user',         'mwuser(user_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'user_newtalk',     'user_id',         'mwuser(user_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'user_properties',  'up_user',         'mwuser(user_id) ON DELETE CASCADE' ),
-                       array( 'changeFkeyDeferrable', 'watchlist',        'wl_user',         'mwuser(user_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'archive', 'ar_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'categorylinks', 'cl_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'externallinks', 'el_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'filearchive', 'fa_deleted_user',
+                               'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'filearchive', 'fa_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'image', 'img_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id',
+                               'ipblocks(ipb_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'oldimage', 'oi_name',
+                               'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'oldimage', 'oi_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'pagelinks', 'pl_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'page_props', 'pp_page', 'page (page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page',
+                               'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user',
+                               'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id',
+                               'page(page_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user',
+                               'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ),
+                       array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'user_properties', 'up_user',
+                               'mwuser(user_id) ON DELETE CASCADE' ),
+                       array( 'changeFkeyDeferrable', 'watchlist', 'wl_user', 'mwuser(user_id) ON DELETE CASCADE' ),
 
                        # r81574
                        array( 'addInterwikiType' ),
@@ -569,7 +606,8 @@ END;
                        if ( !$skipBothIndexExistWarning
                                && $this->db->indexExists( $table, $old, __METHOD__ )
                        ) {
-                               $this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
+                               $this->output( "...WARNING: $old still exists, despite it has been " .
+                                       "renamed into $new (which also exists).\n" .
                                        "            $old should be manually removed if not needed anymore.\n" );
                        }
 
@@ -682,7 +720,8 @@ END;
        protected function changeFkeyDeferrable( $table, $field, $clause ) {
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
-                       $this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" );
+                       $this->output( "WARNING! Column '$table.$field' does not exist but it should! " .
+                               "Please report this.\n" );
 
                        return;
                }
@@ -696,10 +735,13 @@ END;
                        $command = "ALTER TABLE $table DROP CONSTRAINT $conname";
                        $this->db->query( $command );
                } else {
-                       $this->output( "Column '$table.$field' does not have a foreign key constraint, will be added\n" );
+                       $this->output( "Column '$table.$field' does not have a foreign key " .
+                               "constraint, will be added\n" );
                        $conclause = "";
                }
-               $command = "ALTER TABLE $table ADD $conclause FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
+               $command =
+                       "ALTER TABLE $table ADD $conclause " .
+                       "FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
                $this->db->query( $command );
        }
 
@@ -713,7 +755,11 @@ END;
                                $this->output( "Dropping rule 'archive_delete'\n" );
                                $this->db->query( 'DROP RULE archive_delete ON archive' );
                        }
-                       $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
+                       $this->applyPatch(
+                               'patch-remove-archive2.sql',
+                               false,
+                               "Converting 'archive2' back to normal archive table"
+                       );
                } else {
                        $this->output( "...obsolete table 'archive2' does not exist\n" );
                }
@@ -723,7 +769,8 @@ END;
                if ( $this->db->fieldInfo( 'oldimage', 'oi_deleted' )->type() !== 'smallint' ) {
                        $this->output( "Changing 'oldimage.oi_deleted' to type 'smallint'\n" );
                        $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" );
-                       $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
+                       $this->db->query(
+                               "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
                        $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" );
                } else {
                        $this->output( "...column 'oldimage.oi_deleted' is already of type 'smallint'\n" );
@@ -732,23 +779,32 @@ END;
 
        protected function checkOiNameConstraint() {
                if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascaded" ) ) {
-                       $this->output( "...table 'oldimage' has correct cascading delete/update foreign key to image\n" );
+                       $this->output( "...table 'oldimage' has correct cascading delete/update " .
+                               "foreign key to image\n" );
                } else {
                        if ( $this->db->hasConstraint( "oldimage_oi_name_fkey" ) ) {
-                               $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
+                               $this->db->query(
+                                       "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
                        }
                        if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascade" ) ) {
-                               $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
+                               $this->db->query(
+                                       "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
                        }
                        $this->output( "Making foreign key on table 'oldimage' (to image) a cascade delete/update\n" );
-                       $this->db->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " .
-                               "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" );
+                       $this->db->query(
+                               "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " .
+                               "FOREIGN KEY (oi_name) REFERENCES image(img_name) " .
+                               "ON DELETE CASCADE ON UPDATE CASCADE" );
                }
        }
 
        protected function checkPageDeletedTrigger() {
                if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
-                       $this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
+                       $this->applyPatch(
+                               'patch-page_deleted.sql',
+                               false,
+                               "Adding function and trigger 'page_deleted' to table 'page'"
+                       );
                } else {
                        $this->output( "...table 'page' has 'page_deleted' trigger\n" );
                }
@@ -783,13 +839,21 @@ END;
                if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
                        $this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
                } else {
-                       $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
+                       $this->applyPatch(
+                               'patch-revision_rev_user_fkey.sql',
+                               false,
+                               "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT"
+                       );
                }
        }
 
        protected function checkIwlPrefix() {
                if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
-                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'" );
+                       $this->applyPatch(
+                               'patch-rename-iwl_prefix.sql',
+                               false,
+                               "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'"
+                       );
                }
        }
 
index 136ca4b..19218c6 100644 (file)
@@ -82,8 +82,17 @@ class SqliteInstaller extends DatabaseInstaller {
        }
 
        public function getConnectForm() {
-               return $this->getTextBox( 'wgSQLiteDataDir', 'config-sqlite-dir', array(), $this->parent->getHelpBox( 'config-sqlite-dir-help' ) ) .
-                       $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-sqlite-name-help' ) );
+               return $this->getTextBox(
+                       'wgSQLiteDataDir',
+                       'config-sqlite-dir', array(),
+                       $this->parent->getHelpBox( 'config-sqlite-dir-help' )
+               ) .
+               $this->getTextBox(
+                       'wgDBname',
+                       'config-db-name',
+                       array(),
+                       $this->parent->getHelpBox( 'config-sqlite-name-help' )
+               );
        }
 
        /**
@@ -132,9 +141,16 @@ class SqliteInstaller extends DatabaseInstaller {
                        if ( !is_writable( dirname( $dir ) ) ) {
                                $webserverGroup = Installer::maybeGetWebserverPrimaryGroup();
                                if ( $webserverGroup !== null ) {
-                                       return Status::newFatal( 'config-sqlite-parent-unwritable-group', $dir, dirname( $dir ), basename( $dir ), $webserverGroup );
+                                       return Status::newFatal(
+                                               'config-sqlite-parent-unwritable-group',
+                                               $dir, dirname( $dir ), basename( $dir ),
+                                               $webserverGroup
+                                       );
                                } else {
-                                       return Status::newFatal( 'config-sqlite-parent-unwritable-nogroup', $dir, dirname( $dir ), basename( $dir ) );
+                                       return Status::newFatal(
+                                               'config-sqlite-parent-unwritable-nogroup',
+                                               $dir, dirname( $dir ), basename( $dir )
+                                       );
                                }
                        }
 
index cfefe09..78ca511 100644 (file)
@@ -32,90 +32,97 @@ class SqliteUpdater extends DatabaseUpdater {
        protected function getCoreUpdateList() {
                return array(
                        // 1.14
-                       array( 'addField', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
+                       array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
                        array( 'doActiveUsersInit' ),
-                       array( 'addField', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
                        array( 'sqliteInitialIndexes' ),
 
                        // 1.15
-                       array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-                       array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ),
-                       array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ),
+                       array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+                       array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+                       array( 'addTable', 'valid_tag', 'patch-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( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+                       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' ),
+                       # listed separately from the previous update because 1.16 was released without this update
+                       array( 'doLogUsertextPopulation' ),
                        array( 'doLogSearchPopulation' ),
-                       array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.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' ),
+                       array( 'addTable', 'l10n_cache', 'patch-l10n_cache.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' ),
                        array( 'doUpdateTranscacheField' ),
                        array( 'sqliteSetupSearchindex' ),
 
                        // 1.17
-                       array( 'addTable', 'iwlinks',                           'patch-iwlinks.sql' ),
-                       array( 'addIndex', 'iwlinks',   'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
-                       array( 'addField', 'updatelog', 'ul_value',             'patch-ul_value.sql' ),
-                       array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
-                       array( 'dropIndex', 'iwlinks', 'iwl_prefix',            'patch-kill-iwl_prefix.sql' ),
-                       array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
+                       array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+                       array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+                       array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+                       array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+                       array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
                        array( 'doCollationUpdate' ),
-                       array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
-                       array( 'addTable', 'module_deps',                       'patch-module_deps.sql' ),
-                       array( 'dropIndex', 'archive', 'ar_page_revid',         'patch-archive_kill_ar_page_revid.sql' ),
-                       array( 'addIndex', 'archive', 'ar_revid',               'patch-archive_ar_revid.sql' ),
+                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+                       array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+                       array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
+                       array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
 
                        // 1.18
-                       array( 'addIndex', 'user',          'user_email',       'patch-user_email_index.sql' ),
-                       array( 'addTable', 'uploadstash',                       'patch-uploadstash.sql' ),
-                       array( 'addTable', 'user_former_groups',                'patch-user_former_groups.sql'),
+                       array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
+                       array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+                       array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
                        // 1.19
-                       array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
+                       array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
                        array( 'doMigrateUserOptions' ),
-                       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' ),
-                       array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
-                       array( 'addField',      'uploadstash',  'us_chunk_inx',         'patch-uploadstash_chunk.sql' ),
-                       array( 'addfield', 'job',           'job_timestamp',    'patch-jobs-add-timestamp.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' ),
+                       array( 'addIndex', 'page', 'page_redirect_namespace_len',
+                               'patch-page_redirect_namespace_len.sql' ),
+                       array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+                       array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
 
                        // 1.20
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
                        array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
                        array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
-                       array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+                       array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.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' ),
-                       array( 'dropField', 'site_stats',    'ss_admins',         'patch-drop-ss_admins.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' ),
+                       array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
-                       array( 'addTable', 'sites',                            'patch-sites.sql' ),
-                       array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-                       array( 'addField', 'job',           'job_attempts',      'patch-job_attempts.sql' ),
+                       array( 'addTable', 'sites', 'patch-sites.sql' ),
+                       array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+                       array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
                        array( 'doEnableProfiling' ),
-                       array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+                       array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-                       array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
-                       array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+                       array( 'modifyField', 'user_former_groups', 'ufg_group',
+                               'patch-ufg_group-length-increase-255.sql' ),
+                       array( 'addIndex', 'page_props', 'pp_propname_page',
+                               'patch-page_props-propname-page-index.sql' ),
                        array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
-                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ),
                        array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
                        array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
                );
        }
 
        protected function sqliteInitialIndexes() {
-               // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
-               if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) {
+               // initial-indexes.sql fails if the indexes are already present,
+               // so we perform a quick check if our database is newer.
+               if ( $this->updateRowExists( 'initial_indexes' ) ||
+                       $this->db->indexExists( 'user', 'user_name', __METHOD__ )
+               ) {
                        $this->output( "...have initial indexes\n" );
 
                        return;
@@ -127,7 +134,11 @@ class SqliteUpdater extends DatabaseUpdater {
                $module = DatabaseSqlite::getFulltextSearchModule();
                $fts3tTable = $this->updateRowExists( 'fts3' );
                if ( $fts3tTable && !$module ) {
-                       $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
+                       $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" );
                } else {
index cbceed6..e23edf5 100644 (file)
@@ -660,7 +660,9 @@ class WebInstaller extends Installer {
         */
        public function getInfoBox( $text, $icon = false, $class = false ) {
                $text = $this->parse( $text, true );
-               $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/' . $icon;
+               $icon = ( $icon == false ) ?
+                       '../skins/common/images/info-32.png' :
+                       '../skins/common/images/' . $icon;
                $alt = wfMessage( 'config-information' )->text();
 
                return Html::infoBox( $text, $icon, $alt, $class, false );
index 11c0a8e..e30373e 100644 (file)
@@ -704,9 +704,8 @@ class WebInstaller_Name extends WebInstallerPage {
                        ) ) .
                        $this->parent->getTextBox( array(
                                'var' => 'wgMetaNamespace',
-                               'label' => '', //TODO: Needs a label?
-                               'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ),
-
+                               'label' => '', // @todo Needs a label?
+                               'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' )
                        ) ) .
                        $this->getFieldSetStart( 'config-admin-box' ) .
                        $this->parent->getTextBox( array(
@@ -865,7 +864,6 @@ class WebInstaller_Name extends WebInstallerPage {
 }
 
 class WebInstaller_Options extends WebInstallerPage {
-
        public function execute() {
                if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
                        return 'skip';
@@ -1255,7 +1253,9 @@ class WebInstaller_Install extends WebInstallerPage {
        public function startStage( $step ) {
                // Messages: config-install-database, config-install-tables, config-install-interwiki,
                // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
-               $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis' )->escaped() );
+               $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() .
+                       wfMessage( 'ellipsis' )->escaped() );
+
                if ( $step == 'extension-tables' ) {
                        $this->startLiveBox();
                }
@@ -1282,7 +1282,6 @@ class WebInstaller_Install extends WebInstallerPage {
 }
 
 class WebInstaller_Complete extends WebInstallerPage {
-
        public function execute() {
                // Pop up a dialog box, to make it difficult for the user to forget
                // to download the file
index 10f2c97..6556ee8 100644 (file)
@@ -40,7 +40,6 @@ abstract class JobQueue {
        protected $dupCache;
 
        const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
-       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions (b/c)
 
        const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
 
index ce2f3c7..d3ce164 100644 (file)
@@ -47,9 +47,9 @@
  * @since 1.22
  */
 class JobQueueFederated extends JobQueue {
-       /** @var Array (partition name => weight) */
+       /** @var Array (partition name => weight) reverse sorted by weight */
        protected $partitionMap = array();
-       /** @var Array (partition name => JobQueue) */
+       /** @var Array (partition name => JobQueue) reverse sorted by weight */
        protected $partitionQueues = array();
        /** @var HashRing */
        protected $partitionPushRing;
@@ -82,7 +82,10 @@ class JobQueueFederated extends JobQueue {
                if ( !isset( $params['partitionsBySection'][$section] ) ) {
                        throw new MWException( "No configuration for section '$section'." );
                }
+               // Get the full partition map
                $this->partitionMap = $params['partitionsBySection'][$section];
+               arsort( $this->partitionMap, SORT_NUMERIC );
+               // Get the partitions jobs can actually be pushed to
                $partitionPushMap = $this->partitionMap;
                if ( isset( $params['partitionsNoPush'] ) ) {
                        foreach ( $params['partitionsNoPush'] as $partition ) {
@@ -104,7 +107,7 @@ class JobQueueFederated extends JobQueue {
                        $this->partitionQueues[$partition] = JobQueue::factory(
                                $baseConfig + $params['configByPartition'][$partition] );
                }
-               // Get the ring of partitions to push job de-duplication information into
+               // Get the ring of partitions to push jobs into
                $this->partitionPushRing = new HashRing( $partitionPushMap );
                // Aggregate cache some per-queue values if there are multiple partition queues
                $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
@@ -140,7 +143,7 @@ class JobQueueFederated extends JobQueue {
                                        return false;
                                }
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
 
@@ -182,7 +185,7 @@ class JobQueueFederated extends JobQueue {
                        try {
                                $count += $queue->$method();
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
 
@@ -242,7 +245,7 @@ class JobQueueFederated extends JobQueue {
                                $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
                        } catch ( JobQueueError $e ) {
                                $ok = false;
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                        if ( $ok ) {
                                $key = $this->getCacheKey( 'empty' );
@@ -264,7 +267,7 @@ class JobQueueFederated extends JobQueue {
                                $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
                        } catch ( JobQueueError $e ) {
                                $ok = false;
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                        if ( $ok ) {
                                $key = $this->getCacheKey( 'empty' );
@@ -301,7 +304,7 @@ class JobQueueFederated extends JobQueue {
                                $job = $queue->pop();
                        } catch ( JobQueueError $e ) {
                                $job = false;
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                        if ( $job ) {
                                $job->metadata['QueuePartition'] = $partition;
@@ -327,7 +330,7 @@ class JobQueueFederated extends JobQueue {
                $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
                try {
                        return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
-               } catch ( MWException $e ) {
+               } catch ( JobQueueError $e ) {
                        if ( isset( $partitions[1] ) ) { // check fallback partition
                                return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
                        }
@@ -340,7 +343,7 @@ class JobQueueFederated extends JobQueue {
                $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
                try {
                        return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
-               } catch ( MWException $e ) {
+               } catch ( JobQueueError $e ) {
                        if ( isset( $partitions[1] ) ) { // check fallback partition
                                return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
                        }
@@ -353,7 +356,7 @@ class JobQueueFederated extends JobQueue {
                        try {
                                $queue->doDelete();
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
        }
@@ -363,7 +366,7 @@ class JobQueueFederated extends JobQueue {
                        try {
                                $queue->waitForBackups();
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
        }
@@ -421,15 +424,18 @@ class JobQueueFederated extends JobQueue {
                        try {
                                $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
                                if ( is_array( $nonEmpty ) ) {
-                                       $result = array_merge( $result, $nonEmpty );
+                                       $result = array_unique( array_merge( $result, $nonEmpty ) );
                                } else {
                                        return null; // not supported on all partitions; bail
                                }
+                               if ( count( $result ) == count( $types ) ) {
+                                       break; // short-circuit
+                               }
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
-               return array_values( array_unique( $result ) );
+               return array_values( $result );
        }
 
        protected function doGetSiblingQueueSizes( array $types ) {
@@ -445,7 +451,7 @@ class JobQueueFederated extends JobQueue {
                                        return null; // not supported on all partitions; bail
                                }
                        } catch ( JobQueueError $e ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               MWExceptionHandler::logException( $e );
                        }
                }
                return $result;
index 6c4690e..2a1545b 100644 (file)
@@ -6,6 +6,7 @@
 # and is available on most Linux systems. If Perl was distributed with
 # BSD::Resource included, we would happily use that instead, but it isn't.
 
+MW_INCLUDE_STDERR=
 MW_CPU_LIMIT=0
 MW_CGROUP=
 MW_MEM_LIMIT=0
@@ -15,6 +16,10 @@ MW_WALL_CLOCK_LIMIT=0
 # Override settings
 eval "$2"
 
+if [ -n "$MW_INCLUDE_STDERR" ]; then
+       exec 2>&1
+fi
+
 if [ "$MW_CPU_LIMIT" -gt 0 ]; then
        ulimit -t "$MW_CPU_LIMIT"
 fi
index e1dc42e..135e0e8 100644 (file)
@@ -273,38 +273,6 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       /**
-        * Non-atomic implementation of incr().
-        *
-        * Probably all callers actually want incr() to atomically initialise
-        * values to zero if they don't exist, as provided by the Redis INCR
-        * command. But we are constrained by the memcached-like interface to
-        * return null in that case. Once the key exists, further increments are
-        * atomic.
-        */
-       public function incr( $key, $value = 1 ) {
-               wfProfileIn( __METHOD__ );
-               list( $server, $conn ) = $this->getConnection( $key );
-               if ( !$conn ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-               if ( !$conn->exists( $key ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return null;
-               }
-               try {
-                       $result = $conn->incrBy( $key, $value );
-               } catch ( RedisException $e ) {
-                       $result = false;
-                       $this->handleException( $server, $conn, $e );
-               }
-
-               $this->logRequest( 'incr', $key, $server, $result );
-               wfProfileOut( __METHOD__ );
-               return $result;
-       }
-
        /**
         * Get a Redis object with a connection suitable for fetching the specified key
         * @return Array (server, RedisConnRef) or (false, false)
index 70a94fe..4b6eeca 100644 (file)
@@ -139,7 +139,7 @@ class CoreParserFunctions {
                $pref = $parser->getOptions()->getDateFormat();
 
                // Specify a different default date format other than the the normal default
-               // iff the user has 'default' for their setting
+               // if the user has 'default' for their setting
                if ( $pref == 'default' && $defaultPref ) {
                        $pref = $defaultPref;
                }
index 6fc457d..4600402 100644 (file)
@@ -377,6 +377,10 @@ class LinkHolderArray {
                                $key = "$ns:$index";
                                $searchkey = "<!--LINK $key-->";
                                $displayText = $entry['text'];
+                               if ( isset( $entry['selflink'] ) ) {
+                                       $replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query );
+                                       continue;
+                               }
                                if ( $displayText === '' ) {
                                        $displayText = null;
                                }
@@ -455,20 +459,17 @@ class LinkHolderArray {
                // single string to all variants. This would improve parser's performance
                // significantly.
                foreach ( $this->internals as $ns => $entries ) {
+                       if ( $ns == NS_SPECIAL ) {
+                               continue;
+                       }
                        foreach ( $entries as $index => $entry ) {
                                $pdbk = $entry['pdbk'];
                                // we only deal with new links (in its first query)
                                if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
-                                       $title = $entry['title'];
-                                       $titleText = $title->getText();
-                                       $titlesAttrs[] = array(
-                                               'ns' => $ns,
-                                               'key' => "$ns:$index",
-                                               'titleText' => $titleText,
-                                       );
+                                       $titlesAttrs[] = array( $index, $entry['title'] );
                                        // separate titles with \0 because it would never appears
                                        // in a valid title
-                                       $titlesToBeConverted .= $titleText . "\0";
+                                       $titlesToBeConverted .= $entry['title']->getText() . "\0";
                                }
                        }
                }
@@ -479,19 +480,35 @@ class LinkHolderArray {
                foreach ( $titlesAllVariants as &$titlesVariant ) {
                        $titlesVariant = explode( "\0", $titlesVariant );
                }
-               $l = count( $titlesAttrs );
+
                // Then add variants of links to link batch
-               for ( $i = 0; $i < $l; $i ++ ) {
+               $parentTitle = $this->parent->getTitle();
+               foreach ( $titlesAttrs as $i => $attrs ) {
+                       list( $index, $title ) = $attrs;
+                       $ns = $title->getNamespace();
+                       $text = $title->getText();
+
                        foreach ( $allVariantsName as $variantName ) {
                                $textVariant = $titlesAllVariants[$variantName][$i];
-                               if ( $textVariant != $titlesAttrs[$i]['titleText'] ) {
-                                       $variantTitle = Title::makeTitle( $titlesAttrs[$i]['ns'], $textVariant );
-                                       if ( is_null( $variantTitle ) ) {
-                                               continue;
-                                       }
-                                       $linkBatch->addObj( $variantTitle );
-                                       $variantMap[$variantTitle->getPrefixedDBkey()][] = $titlesAttrs[$i]['key'];
+                               if ( $textVariant === $text ) {
+                                       continue;
+                               }
+
+                               $variantTitle = Title::makeTitle( $ns, $textVariant );
+                               if ( is_null( $variantTitle ) ) {
+                                       continue;
+                               }
+
+                               // Self-link checking for mixed/different variant titles. At this point, we
+                               // already know the exact title does not exist, so the link cannot be to a
+                               // variant of the current title that exists as a separate page.
+                               if ( $variantTitle->equals( $parentTitle ) && $title->getFragment() === '' ) {
+                                       $this->internals[$ns][$index]['selflink'] = true;
+                                       continue 2;
                                }
+
+                               $linkBatch->addObj( $variantTitle );
+                               $variantMap[$variantTitle->getPrefixedDBkey()][] = "$ns:$index";
                        }
                }
 
index 7dbb202..1f14223 100644 (file)
@@ -2117,16 +2117,12 @@ class Parser {
                                }
                        }
 
-                       # Self-link checking
-                       if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
-                               if ( $nt->equals( $this->mTitle ) || ( !$nt->isKnown() && in_array(
-                                       $this->mTitle->getPrefixedText(),
-                                       $this->getConverterLanguage()->autoConvertToAllVariants( $nt->getPrefixedText() ),
-                                       true
-                               ) ) ) {
-                                       $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
-                                       continue;
-                               }
+                       # Self-link checking. For some languages, variants of the title are checked in
+                       # LinkHolderArray::doVariants() to allow batching the existence checks necessary
+                       # for linking to a different variant.
+                       if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && $nt->getFragment() === '' ) {
+                               $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
+                               continue;
                        }
 
                        # NS_MEDIA is a pseudo-namespace for linking directly to a file
@@ -2285,13 +2281,13 @@ class Parser {
                $result = $this->closeParagraph();
 
                if ( '*' === $char ) {
-                       $result .= '<ul><li>';
+                       $result .= "<ul>\n<li>";
                } elseif ( '#' === $char ) {
-                       $result .= '<ol><li>';
+                       $result .= "<ol>\n<li>";
                } elseif ( ':' === $char ) {
-                       $result .= '<dl><dd>';
+                       $result .= "<dl>\n<dd>";
                } elseif ( ';' === $char ) {
-                       $result .= '<dl><dt>';
+                       $result .= "<dl>\n<dt>";
                        $this->mDTopen = true;
                } else {
                        $result = '<!-- ERR 1 -->';
@@ -2309,11 +2305,11 @@ class Parser {
         */
        function nextItem( $char ) {
                if ( '*' === $char || '#' === $char ) {
-                       return '</li><li>';
+                       return "</li>\n<li>";
                } elseif ( ':' === $char || ';' === $char ) {
-                       $close = '</dd>';
+                       $close = "</dd>\n";
                        if ( $this->mDTopen ) {
-                               $close = '</dt>';
+                               $close = "</dt>\n";
                        }
                        if ( ';' === $char ) {
                                $this->mDTopen = true;
@@ -2335,15 +2331,15 @@ class Parser {
         */
        function closeList( $char ) {
                if ( '*' === $char ) {
-                       $text = '</li></ul>';
+                       $text = "</li>\n</ul>";
                } elseif ( '#' === $char ) {
-                       $text = '</li></ol>';
+                       $text = "</li>\n</ol>";
                } elseif ( ':' === $char ) {
                        if ( $this->mDTopen ) {
                                $this->mDTopen = false;
-                               $text = '</dt></dl>';
+                               $text = "</dt>\n</dl>";
                        } else {
-                               $text = '</dd></dl>';
+                               $text = "</dd>\n</dl>";
                        }
                } else {
                        return '<!-- ERR 3 -->';
diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php
new file mode 100644 (file)
index 0000000..4bcc133
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+class RedisPubSubFeedEngine implements RCFeedEngine {
+       /**
+        * Emit a recent change notification via Redis Pub/Sub
+        *
+        * If the feed URI contains a path component, it will be used to generate a
+        * channel name by stripping the leading slash and replacing any remaining
+        * slashes with '.'. If no path component is present, the channel is set to
+        * 'rc'. If the URI contains a query string, its parameters will be parsed
+        * as RedisConnectionPool options.
+        *
+        * @example $wgRCFeeds['redis'] = array(
+        *      'formatter' => 'JSONRCFeedFormatter',
+        *      'uri'       => "redis://127.0.0.1:6379/rc.$wgDBname",
+        * );
+        *
+        * @since 1.22
+        */
+       public function send( array $feed, $line ) {
+               $parsed = parse_url( $feed['uri'] );
+               $server = $parsed['host'];
+               $options = array( 'serializer' => 'none' );
+               $channel = 'rc';
+
+               if ( isset( $parsed['port'] ) ) {
+                       $server .= ":{$parsed['port']}";
+               }
+               if ( isset( $parsed['query'] ) ) {
+                       parse_str( $parsed['query'], $options );
+               }
+               if ( isset( $parsed['pass'] ) ) {
+                       $options['password'] = $parsed['pass'];
+               }
+               if ( isset( $parsed['path'] ) ) {
+                       $channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) );
+               }
+               $pool = RedisConnectionPool::singleton( $options );
+               $conn = $pool->getConnection( $server );
+               $conn->publish( $channel, $line );
+       }
+}
index 19d019d..ef999d9 100644 (file)
@@ -592,7 +592,7 @@ class ResourceLoader {
         * and clear out the output buffer. If the client cache is too old then do nothing.
         * @param $context ResourceLoaderContext
         * @param string $mtime The TS_MW timestamp to check the header against
-        * @return bool True iff 304 header sent and output handled
+        * @return bool True if 304 header sent and output handled
         */
        protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) {
                // If there's an If-Modified-Since header, respond with a 304 appropriately
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
deleted file mode 100644 (file)
index c3d6080..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Implements Special:Blockme
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * A special page called by proxyCheck.php to block open proxies
- *
- * @ingroup SpecialPage
- */
-class SpecialBlockme extends UnlistedSpecialPage {
-
-       function __construct() {
-               parent::__construct( 'Blockme' );
-       }
-
-       function execute( $par ) {
-               global $wgBlockOpenProxies, $wgProxyKey;
-
-               $this->setHeaders();
-               $this->outputHeader();
-
-               $ip = $this->getRequest()->getIP();
-               if ( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
-                       $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
-
-                       return;
-               }
-
-               $user = User::newFromName( $this->msg( 'proxyblocker' )->inContentLanguage()->text() );
-               # FIXME: newFromName could return false on a badly configured wiki.
-               if ( !$user->isLoggedIn() ) {
-                       $user->addToDatabase();
-               }
-
-               $block = new Block();
-               $block->setTarget( $ip );
-               $block->setBlocker( $user );
-               $block->mReason = $this->msg( 'proxyblockreason' )->inContentLanguage()->text();
-
-               $block->insert();
-
-               $this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
-       }
-
-       protected function getGroupName() {
-               return 'other';
-       }
-}
index 65aa07e..0f910a5 100644 (file)
@@ -227,7 +227,8 @@ class SpecialContributions extends SpecialPage {
         * Generates the subheading with links
         * @param $userObj User object for the target
         * @return String: appropriately-escaped HTML to be output literally
-        * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php. Could be combined.
+        * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php.
+        * Could be combined.
         */
        protected function contributionsSub( $userObj ) {
                if ( $userObj->isAnon() ) {
@@ -594,9 +595,11 @@ class SpecialContributions extends SpecialPage {
  */
 class ContribsPager extends ReverseChronologicalPager {
        public $mDefaultDirection = true;
-       var $messages, $target;
-       var $namespace = '', $mDb;
-       var $preventClickjacking = false;
+       public $messages;
+       public $target;
+       public $namespace = '';
+       public $mDb;
+       public $preventClickjacking = false;
 
        /**
         * @var array
@@ -679,8 +682,13 @@ class ContribsPager extends ReverseChronologicalPager {
                 * $limit: see phpdoc above
                 * $descending: see phpdoc above
                 */
-               $data = array( $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ) );
-               wfRunHooks( 'ContribsPager::reallyDoQuery', array( &$data, $pager, $offset, $limit, $descending ) );
+               $data = array( $this->mDb->select(
+                       $tables, $fields, $conds, $fname, $options, $join_conds
+               ) );
+               wfRunHooks(
+                       'ContribsPager::reallyDoQuery',
+                       array( &$data, $pager, $offset, $limit, $descending )
+               );
 
                $result = array();
 
@@ -944,7 +952,11 @@ class ContribsPager extends ReverseChronologicalPager {
                                $chardiff .= Linker::formatRevisionSize( $row->rev_len );
                                $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
                        } else {
-                               $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
+                               $parentLen = 0;
+                               if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) {
+                                       $this->mParentLens[$row->rev_parent_id];
+                               }
+
                                $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
                                $chardiff .= ChangesList::showCharacterDifference(
                                        $parentLen,
@@ -974,7 +986,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        # Show user names for /newbies as there may be different users.
                        # Note that we already excluded rows with hidden user names.
                        if ( $this->contribs == 'newbie' ) {
-                               $userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+                               $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
                                $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
                        } else {
@@ -1001,11 +1013,14 @@ class ContribsPager extends ReverseChronologicalPager {
                        $diffHistLinks = $this->msg( 'parentheses' )
                                ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )
                                ->escaped();
-                       $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+                       $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} ";
+                       $ret .= "{$link}{$userlink} {$comment} {$topmarktext}";
 
                        # Denote if username is redacted for this edit
                        if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
-                               $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
+                               $ret .= " <strong>" .
+                                       $this->msg( 'rev-deleted-user-contribs' )->escaped() .
+                                       "</strong>";
                        }
 
                        # Tags, if any.
index 2cf1730..9b9888a 100644 (file)
  */
 class DeletedContribsPager extends IndexPager {
        public $mDefaultDirection = true;
-       var $messages, $target;
-       var $namespace = '', $mDb;
+       public $messages;
+       public $target;
+       public $namespace = '';
+       public $mDb;
 
        /**
         * @var string Navigation bar with paging links.
@@ -358,9 +360,9 @@ class DeletedContributionsPage extends SpecialPage {
                # If there were contributions, and it was a valid user or IP, show
                # the appropriate "footer" message - WHOIS tools, etc.
                if ( $target != 'newbies' ) {
-                       $message = IP::isIPAddress( $target )
-                               ? 'sp-contributions-footer-anon'
-                               'sp-contributions-footer';
+                       $message = IP::isIPAddress( $target ) ?
+                               'sp-contributions-footer-anon' :
+                               'sp-contributions-footer';
 
                        if ( !$this->msg( $message )->isDisabled() ) {
                                $out->wrapWikiMsg(
index 90c4c35..5ac3e65 100644 (file)
@@ -221,8 +221,8 @@ class LoginForm extends SpecialPage {
 
                $status = $this->addNewaccountInternal();
                if ( !$status->isGood() ) {
-                       $error = $this->getOutput()->parse( $status->getWikiText() );
-                       $this->mainLoginForm( $error );
+                       $error = $status->getMessage();
+                       $this->mainLoginForm( $error->toString() );
                        return;
                }
 
@@ -257,8 +257,8 @@ class LoginForm extends SpecialPage {
                # Create the account and abort if there's a problem doing so
                $status = $this->addNewAccountInternal();
                if ( !$status->isGood() ) {
-                       $error = $this->getOutput()->parse( $status->getWikiText() );
-                       $this->mainLoginForm( $error );
+                       $error = $status->getMessage();
+                       $this->mainLoginForm( $error->toString() );
                        return false;
                }
 
@@ -447,7 +447,9 @@ class LoginForm extends SpecialPage {
                if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
-                       return Status::newFatal( new RawMessage( $abortError ) );
+                       $abortError = new RawMessage( $abortError );
+                       $abortError->text();
+                       return Status::newFatal( $abortError );
                }
 
                // Hook point to check for exempt from account creation throttle
index 11632a3..4afa279 100644 (file)
@@ -208,7 +208,21 @@ class SpecialWatchlist extends SpecialPage {
                        $usePage = false;
                } else {
                        # Top log Ids for a page are not stored
-                       $conds[] = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG;
+                       $nonRevisionTypes = array( RC_LOG );
+                       wfRunHooks( 'SpecialWatchlistGetNonRevisionTypes', array( &$nonRevisionTypes ) );
+                       if ( $nonRevisionTypes ) {
+                               if ( count( $nonRevisionTypes ) === 1 ) {
+                                       // if only one use an equality instead of IN condition
+                                       $nonRevisionTypes = reset( $nonRevisionTypes );
+                               }
+                               $conds[] = $dbr->makeList(
+                                       array(
+                                               'rc_this_oldid=page_latest',
+                                               'rc_type' => $nonRevisionTypes,
+                                       ),
+                                       LIST_OR
+                               );
+                       }
                        $limitWatchlist = 0;
                        $usePage = true;
                }
index 7a4b9f2..4750af9 100644 (file)
@@ -158,9 +158,10 @@ class UsercreateTemplate extends BaseTemplate {
                                                        'id' => 'wpEmail',
                                                        'tabindex' => '6',
                                                        'size' => '20',
+                                                       'required' => $this->data['emailrequired'],
                                                        'placeholder' => $this->getMsg( $this->data['loggedin'] ?
                                                                'createacct-another-email-ph' : 'createacct-email-ph' )->text()
-                                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
+                                               ) );
                                        ?>
                                <?php } ?>
                        </div>
index f5ae353..5eb6094 100644 (file)
@@ -69,10 +69,6 @@ class UserloginTemplate extends BaseTemplate {
                                </label>
                                <?php
                                $extraAttrs = array();
-                               // Set focus to this field if it's blank.
-                               if ( !$this->data['name'] ) {
-                                       $extraAttrs['autofocus'] = '';
-                               }
                                echo Html::input( 'wpName', $this->data['name'], 'text', array(
                                        'class' => 'loginText',
                                        'id' => 'wpName1',
@@ -80,9 +76,11 @@ class UserloginTemplate extends BaseTemplate {
                                        'size' => '20',
                                        // 'required' is blacklisted for now in Html.php due to browser issues.
                                        // Keeping here in case that changes.
-                                       'required',
+                                       'required' => true,
+                                       // Set focus to this field if it's blank.
+                                       'autofocus' => !$this->data['name'],
                                        'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
-                               ) + $extraAttrs );
+                               ) );
                                ?>
                        </div>
 
@@ -101,18 +99,15 @@ class UserloginTemplate extends BaseTemplate {
                                        ?>
                                </label>
                                <?php
-                               $extraAttrs = array();
-                               // Set focus to this field if username is filled in.
-                               if ( $this->data['name'] ) {
-                                       $extraAttrs['autofocus'] = '';
-                               }
                                echo Html::input( 'wpPassword', null, 'password', array(
                                        'class' => 'loginPassword',
                                        'id' => 'wpPassword1',
                                        'tabindex' => '2',
                                        'size' => '20',
+                                       // Set focus to this field if username is filled in.
+                                       'autofocus' => (bool)$this->data['name'],
                                        'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
-                               ) + $extraAttrs );
+                               ) );
                                ?>
                        </div>
 
index 79ddb6a..ccf9b1e 100644 (file)
@@ -1263,7 +1263,10 @@ class ConverterRule {
                $variants = $this->mConverter->mVariants;
                $varsep_pattern = $this->mConverter->getVarSeparatorPattern();
 
+               // Split according to $varsep_pattern, but ignore semicolons from HTML entities
+               $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules );
                $choice = preg_split( $varsep_pattern, $rules );
+               $choice = str_replace( "\x01", ';', $choice );
 
                foreach ( $choice as $c ) {
                        $v = explode( ':', $c, 2 );
index 06c9e60..c087891 100644 (file)
@@ -164,12 +164,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Peusom neuandam teupatroli bak neuubah paléng barô',
 'tog-newpageshidepatrolled' => 'Peusom ôn teupatroli nibak dapeuta ôn barô',
 'tog-extendwatchlist' => 'Peuhah dapeuta keunalön keu peuleumah ban dum neuubah, kon nyang paléng barô mantöng',
-'tog-usenewrc' => 'Nguy neuleumah neuubah barô tingkat lanjut (peureulèë JavaScript)',
+'tog-usenewrc' => 'Peusaho neuandam bak neuleumah neuubah barô ngon dapeuta keunalon meunurot ôn',
 'tog-numberheadings' => 'Bôh numbô nan keudroë',
-'tog-showtoolbar' => 'Peuleumah <em>toolbar</em> (bateuëng alat) andam',
+'tog-showtoolbar' => 'Peuleumah bateuëng alat andam',
 'tog-editondblclick' => 'Andam ôn ngon duwa go teugon',
 'tog-editsection' => 'Peujeuet andam bideueng rot hubong [andam]',
-'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng (peureulee JavaScript)',
+'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng',
 'tog-showtoc' => 'Peuleumah dapeuta asoe (keu on-on nyang na leubeh nibak 3 boh aneuk ulee)',
 'tog-rememberpassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
 'tog-watchcreations' => 'Tamah halaman nyang lonpeugot u dapeuta keunalon',
@@ -187,7 +187,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
 'tog-oldsig' => 'Tanda jaroe jinoe:',
 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-uselivepreview' => 'Nguy peuleumah hase langsong (JavaScript) (baci)',
+'tog-uselivepreview' => 'Nguy peuleumah hase langsong (baci)',
 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
 'tog-watchlisthideown' => 'Peusöm nyang lôn andam nibak dapeuta keunalön',
 'tog-watchlisthidebots' => 'Peusöm nyang teu andam nibak sagoö nyang bak dapeuta keunalön',
@@ -264,9 +264,18 @@ $messages = array(
 'oct' => 'Siplôh',
 'nov' => 'Siblaih',
 'dec' => 'Duwa Blaih',
-'january-date' => 'Buleuën Sa',
-'february-date' => 'Buleuën Duwa',
-'march-date' => 'Buleuën Lhèë',
+'january-date' => '$1 Buleuën Sa',
+'february-date' => '$1 Buleuën Duwa',
+'march-date' => '$1 Buleuën Lhèë',
+'april-date' => '$1 Buleuën Peuët',
+'may-date' => '$1 Buleuën Limong',
+'june-date' => '$1 Buleuën Nam',
+'july-date' => '$1 Buleuën Tujôh',
+'august-date' => '$1 Buleuën Lapan',
+'september-date' => '$1 Buleuën Sikureuëng',
+'october-date' => '$1 Buleuën Siplôh',
+'november-date' => '$1 Buleuën Siblaih',
+'december-date' => '$1 Buleuën Duwa Blaih',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
@@ -292,7 +301,7 @@ $messages = array(
 'newwindow' => '(peuhah bak tingkap barô)',
 'cancel' => 'Peubateuë',
 'moredotdotdot' => 'Lom...',
-'morenotlisted' => 'Lom...',
+'morenotlisted' => 'Dapeuta nyoe hana leungkap',
 'mypage' => 'Ôn',
 'mytalk' => 'Marit',
 'anontalk' => 'Peugah haba IP nyoë.',
@@ -395,7 +404,7 @@ $1",
 # 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).
 'aboutsite' => 'Bhaih {{SITENAME}}',
 'aboutpage' => 'Project:Bhaih',
-'copyright' => 'Asoë nyang na saban ngön',
+'copyright' => "Asoë na meunurot $1 keucuali meunyo na hay la'en nyang geupeugah",
 'copyrightpage' => '{{ns:project}}:Hak karang',
 'currentevents' => 'Haba barô',
 'currentevents-url' => 'Project:Haba barô',
@@ -476,6 +485,10 @@ Dapeuta on kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:specia
 'error' => 'Seunalah',
 'databaseerror' => 'Kesalahan basis data',
 'databaseerror-text' => 'Saboh salah bak nè data ka teujadi. Nyoë meuhat na nyang han paih bak peukakaih droëneuh',
+'databaseerror-textcl' => 'Teunanyong basis data teungoh kacho',
+'databaseerror-query' => 'Teunanyong: $1',
+'databaseerror-function' => 'Guna: $1',
+'databaseerror-error' => 'Salah: $1',
 'laggedslavemode' => 'Peuneugah: On nyoe kadang hana neuubah baro',
 'readonly' => 'Basis data geurok',
 'enterlockreason' => 'Pasoe daleh neurok ngon pajan jeuet geupeuhah',
@@ -508,10 +521,11 @@ Kadang ka na soe sampoh.',
 'cannotdelete-title' => 'H\'an jeuet sampoh on "$1"',
 'delete-hook-aborted' => "Seunampoh geupeubateue le kaw'et parser.
 Hana jeuneulaih.",
+'no-null-revision' => 'H\'an jeuet peugot revisi null baro keu halaman "$1"',
 'badtitle' => 'Nan hana sah',
 'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.',
-'perfcached' => 'Data di yup nyoe geucok nibak peuniyoh ngon kadang kon data baro. {{PLURAL:$1||}}$1 hase maksimum na bak beuen.',
-'perfcachedts' => 'Data di yup nyoe geupeusom, ngon geupeubaro keuneulheueh bak $1. {{PLURAL:$1||}}$1 hase maksimal na lam beuen.',
+'perfcached' => 'Data di yup nyoe geupeusom ngon kadang kon data baro. {{PLURAL:$1|saboh hase|$1 hase}} maksimum na lam beujana.',
+'perfcachedts' => 'Data di yup nyoe geupeusom, ngon geupeubaro seuneulheueh bak $1. {{PLURAL:$4|saboh hase|$4 hase}} paleng le na lam beujana.',
 'querypage-no-updates' => "Beunaro keu on nyoe hat nyoe teungoh h'an jeuet.
 Data sinoe h'an geupasoe ulang.",
 'wrong_wfQuery_params' => 'Parameter salah u wfQuery()<br />
@@ -522,8 +536,11 @@ Neulakee: $2',
 'actionthrottled' => 'Buet geupeubataih',
 'actionthrottledtext' => 'Sibagoe saboh seunipat lawan-spam, droeneuh geupeubataih nibak neupeulaku buet nyoe le that go lam watee paneuk, ngon droeneuh ka leubeh nibak bataih.
 Neuci lom lam padum minet.',
+'protectedpagetext' => 'Laman nyoe ka geupeulindong mangat bek jeuet geuandam',
 'viewsourcetext' => 'Droëneuh  jeuët neu’eu',
 'viewyourtext' => 'Droëneuh meuidzin kalon ngon neucok nè andam droëneuh u ôn nyoë',
+'protectedinterface' => 'Halaman nyoe na teks muka keu muka keu peukakaih leumiek ngon geupeulindong mangat bek jeuet jipeureuloh.
+Keu neuk tamah atawa ubah teujeumah keu ban dum wiki, neungui [//translatewiki.net/ translatewiki.net], proyek lokalisasi MediaWiki.',
 'ns-specialprotected' => 'Ôn khusuih bèk neuandam',
 'exception-nologin' => 'Hana tamong lom',
 
index 14285d3..1443309 100644 (file)
@@ -219,8 +219,8 @@ $messages = array(
 'tog-extendwatchlist' => 'Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie',
 'tog-usenewrc' => 'Groepeer wysigings per bladsy in onlangse wysigings en dophoulys (benodig JavaScript)',
 'tog-numberheadings' => 'Nommer opskrifte outomaties',
-'tog-showtoolbar' => 'Wys redigeergereedskap (benodig JavaScript)',
-'tog-editondblclick' => 'Dubbelkliek om blaaie te wysig (benodig JavaScript)',
+'tog-showtoolbar' => 'Wys redigeergereedskap',
+'tog-editondblclick' => 'Dubbelkliek om te wysig',
 'tog-editsection' => 'Wys [wysig]-skakels vir elke afdeling',
 'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)',
 'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)',
@@ -666,6 +666,7 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
 'userlogin-resetpassword-link' => 'Herstel u wagwoord',
 'helplogin-url' => 'Help:Aanmelding',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp met aanmelding]]',
+'userlogin-createanother' => "Skep nog 'n rekening",
 'createacct-join' => 'Verskaf u gegewens hieronder.',
 'createacct-another-join' => 'Sleutel die nuwe rekening se inligting hier onder in:',
 'createacct-emailrequired' => 'E-posadres',
@@ -2563,7 +2564,7 @@ $1',
 'contributions' => '{{GENDER:$1|Gebruikersbydraes}}',
 'contributions-title' => '$1 se bydraes',
 'mycontris' => 'Bydraes',
-'contribsub2' => 'Vir $1 ($2)',
+'contribsub2' => 'Vir {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Geen veranderinge wat by hierdie kriteria pas, is gevind nie.',
 'uctop' => '(laaste wysiging)',
 'month' => 'Vanaf maand (en vroeër):',
@@ -2722,12 +2723,9 @@ Die blokkade is moontlik reeds opgehef.',
 Die blokkade is 'n onderdeel van die reeks $2, waarvan die blokkade wel opgehef kan word.",
 'ip_range_invalid' => 'Ongeldige IP waardegebied.',
 'ip_range_toolarge' => 'Reeks-blokkades groter as /$1 word nie toegelaat nie.',
-'blockme' => 'Versper my',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Die funksie is gedeaktiveer.',
 'proxyblockreason' => "U IP-adres is geblokkeer omdat dit van 'n oop instaanbediener (proxy) gebruik maak.
 Kontak asseblief u internet-diensverskaffer of tegniese ondersteuning en lig hulle van hierdie ernstige sekuriteitsprobleem in.",
-'proxyblocksuccess' => 'Voltooi.',
 'sorbsreason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.",
 'sorbs_create_account_reason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.
 U kan nie 'n rekening skep nie.",
@@ -3904,7 +3902,10 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
 'tags-tag' => 'Etiketnaam',
 'tags-display-header' => 'Weergawe in wysigingslyste',
 'tags-description-header' => 'Volledige beskrywing van betekenis',
+'tags-active-header' => 'Aktief?',
 'tags-hitcount-header' => 'Geëtiketteerde veranderings',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'wysig',
 'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
 
@@ -4070,8 +4071,8 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 'limitreport-ppvisitednodes' => 'Aantal nodes besoek tydens voorverwerking:',
 'limitreport-ppgeneratednodes' => 'Aantal nodes geskep tydens voorverwerking:',
 'limitreport-postexpandincludesize' => 'Inklusiegrootte na uitbreiding',
-'limitreport-postexpandincludesize-value' => '$1/$2 grepe',
-'limitreport-templateargumentsize-value' => '$1/$2 grepe',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
 'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte',
 
 );
index 730af88..da80c4f 100644 (file)
@@ -1848,9 +1848,6 @@ $1',
 'ipb_expiry_invalid' => 'የሚያልቅበት ግዜ አይሆንም።',
 'ipb_already_blocked' => '«$1» ገና ከዚህ በፊት ታግዶ ነው።',
 'ipb-needreblock' => '$1 አሁን ገና ታግዷል። ዝርዝሩን ማስተካከል ፈለጉ?',
-'blockme' => 'ልታገድ',
-'proxyblocker-disabled' => 'ይህ ተግባር እንደማይሠራ ተደርጓል።',
-'proxyblocksuccess' => 'ተደርጓል።',
 'cant-block-while-blocked' => 'እርስዎ እየታገዱ ሌላ ተጠቃሚ ለማገድ አይችሉም።',
 
 # Developer tools
index 10330ed..c180c9f 100644 (file)
@@ -2371,11 +2371,8 @@ Ta más detalles, debaixo s'amuestra o rechistro de supresions:",
 'ipb_blocked_as_range' => "Error: L'adreza IP $1 no s'ha bloqueyato dreitament y por ixo no se puede desbloqueyar. Manimenos, ye bloqueyata por estar parte d'o rango $2, que sí puede desbloqueyar-se de conchunta.",
 'ip_range_invalid' => "O rango d'adrezas IP no ye conforme.",
 'ip_range_toolarge' => 'No se permiten os bloqueyos de rangos más grans que /$1.',
-'blockme' => 'bloqueyar-me',
 'proxyblocker' => 'bloqueyador de proxies',
-'proxyblocker-disabled' => 'Ista función ye desactivata.',
 'proxyblockreason' => "S'ha bloqueyato a suya adreza IP porque ye un proxy ubierto. Por favor, contaute on o suyo furnidor de servicios d'Internet u con o suyo servicio d'asistencia tecnica e informe-les d'iste grau problema de seguridat.",
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}.',
 'sorbs_create_account_reason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}. No puede creyar una cuenta',
 'cant-block-while-blocked' => 'No puet bloqueyar a atros usuarios en o tiempo que ye bloqueyato.',
index 3c723b7..c2bc374 100644 (file)
@@ -370,8 +370,8 @@ Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm
 'cascadeprotected' => 'Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre "cascading": $2',
 
 # Virus scanner
-'virus-badscanner' => "Јастыра конфигурация: Јарты јок сканер ''$1''",
-'virus-unknownscanner' => 'Јарты јок антивирус:',
+'virus-badscanner' => '',
+'virus-unknownscanner' => '',
 
 # Login and logout pages
 'logouttext' => "'''Þū eart nū ūtmeldod.'''
@@ -401,8 +401,8 @@ Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmel
 'logout' => 'Ūtmeldian',
 'userlogout' => 'Ūtmeldian',
 'notloggedin' => 'Nā ingemeldod',
-'userlogin-noaccount' => 'Слерде аккаунт јок по?',
-'userlogin-joinproject' => '{{SITENAME}} кирер',
+'userlogin-noaccount' => '',
+'userlogin-joinproject' => '',
 'nologin' => 'Næfst þū reccinge? $1',
 'nologinlink' => 'Scieppan reccinge',
 'createaccount' => 'Scieppan reccinge',
@@ -497,12 +497,12 @@ Gif þū hider be misfēnge cōme, cnoca þīnes webbsēcendes '''on bæc''' cn
 'editingold' => "'''WARNUNG: Þū adihtest ealde fadunge þisses trametes.'''
 Gif þū hine hordie, ǣnga andwendunga þā wǣron gedōn æfter þisse fadunge bēoþ sōðes forloren.",
 'yourdiff' => 'Fǣgnessa',
-'copyrightwarning2' => "Bidde behielde þæt man mæȝ ealla forðunga tō {{SITENAME}}
-ādihtan, hƿeorfan, oþþe forniman.
-Ȝif þū ne ƿille man þīn ȝeƿrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.<br />
-Þū behǣtst ēac þæt þū selfa þis ƿrite, oþþe efenlǣhtest of sumre
-folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
-'''Ne forþsend efenlǣhtscielded ƿeorc būtan þafunge!'''",
+'copyrightwarning2' => "Bidde behielde þæt man mæg ealla forðunga tō {{SITENAME}}
+ādihtan, hweorfan, oþþe forniman.
+Gif þū ne wille man þīn gewrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.<br />
+Þū behǣtst ēac þæt þū selfa þis write, oþþe efenlǣhtest of sumre
+folclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum).
+'''Ne forþsend efenlǣhtscielded weorc būtan þafunge!'''",
 'templatesused' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þissum tramete:',
 'templatesusedpreview' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre fōrebysene:',
 'template-protected' => '(geborgen)',
@@ -1024,7 +1024,6 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 'contribslink' => 'forðunga',
 'unblocklogentry' => 'unfortȳnde $1',
 'block-log-flags-nocreate' => 'Forbēad tō scieppenne reccinge',
-'proxyblocksuccess' => 'Gedōn.',
 
 # Move page
 'movearticle' => 'Wegan tramet:',
@@ -1168,7 +1167,7 @@ Cēos ōðerne naman lā.',
 'exif-sharpness' => 'Scearpnes',
 'exif-gpslatituderef' => 'Norþ oþþe sūþ brǣdu',
 'exif-gpslatitude' => 'Brǣdu',
-'exif-gpslongituderef' => 'Ēast oþþe ƿest lengu',
+'exif-gpslongituderef' => 'Ēast oþþe west lengu',
 'exif-gpslongitude' => 'Lengu',
 'exif-gpsmeasuremode' => 'Mētungmōd',
 'exif-gpsimgdirection' => 'Rihtung þæs biliðes',
@@ -1177,7 +1176,7 @@ Cēos ōðerne naman lā.',
 'exif-compression-1' => 'Unȝeþrycced',
 
 'exif-meteringmode-0' => 'Uncūþ',
-'exif-meteringmode-1' => 'Ȝeþēaƿisc',
+'exif-meteringmode-1' => 'Geþēawisc',
 'exif-meteringmode-6' => 'Sām',
 'exif-meteringmode-255' => 'Ōðer',
 
@@ -1212,7 +1211,7 @@ Cēos ōðerne naman lā.',
 
 # Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
 'exif-gpslongitude-e' => 'Ēast lengu',
-'exif-gpslongitude-w' => 'Ƿest lengu',
+'exif-gpslongitude-w' => 'West lengu',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Sōþ rihtung',
index 16cc385..1e82ec5 100644 (file)
@@ -693,7 +693,7 @@ $messages = array(
 'articlepage' => 'اعرض صفحة المحتوى',
 'talk' => 'نقاش',
 'views' => 'معاينة',
-'toolbox' => 'صÙ\86دÙ\88Ù\82 Ø§Ù\84أدÙ\88ات',
+'toolbox' => 'الأدوات',
 'userpage' => 'طالع صفحة المستخدم',
 'projectpage' => 'طالع صفحة المشروع',
 'imagepage' => 'طالع صفحة الملف',
@@ -1744,7 +1744,7 @@ $1",
 'email-address-validity-invalid' => 'أدخل عنوان بريد إلكتروني صالح',
 
 # User rights
-'userrights' => 'إدارة ØµÙ\84احÙ\8aات Ø§Ù\84Ù\85ستخدÙ\85',
+'userrights' => 'صلاحيات المستخدم',
 'userrights-lookup-user' => 'أدِر مجموعات المستخدم',
 'userrights-user-editname' => 'أدخل اسم مستخدم:',
 'editusergroup' => 'عدل مجموعات المستخدم',
@@ -1894,8 +1894,8 @@ $1",
 'action-block' => 'منع هذا المستخدم من التعديل',
 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
 'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
-'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
-'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
+'action-import' => 'استيراد صفحات من ويكي آخر',
+'action-importupload' => 'استيراد صفحات من ملف مرفوع',
 'action-patrol' => 'تعليم تعديلات الآخرين بعلامة المراجعة',
 'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
 'action-unwatchedpages' => 'رؤية قائمة الصفحات غير المراقبة',
@@ -2438,8 +2438,9 @@ $1',
 'protectedtitlestext' => 'العناوين التالية محمية ضد الإنشاء',
 'protectedtitlesempty' => 'لا توجد عناوين محمية حاليا بهذه المحددات.',
 'listusers' => 'قائمة الأعضاء',
-'listusers-editsonly' => 'اعرض المستخدمين الذين قاموا بتعديلات فقط',
+'listusers-editsonly' => 'اعرض المستخدمين الذين أجروا تعديلات فقط',
 'listusers-creationsort' => 'رتب حسب تاريخ الإنشاء',
+'listusers-desc' => 'رتب تنازليا',
 'usereditcount' => '{{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}',
 'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2',
 'newpages' => 'صفحات جديدة',
@@ -2564,7 +2565,7 @@ $1',
 # Email user
 'mailnologin' => 'لا يوجد عنوان للإرسال',
 'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
-'emailuser' => 'إرسال رسالة لهذا المستخدم',
+'emailuser' => 'مراسلة المستخدم',
 'emailuser-title-target' => 'راسل بالبريد الإلكتروني هذا  {{GENDER:$1| المستخدم}}',
 'emailuser-title-notarget' => 'مراسلة المستخدم',
 'emailpage' => 'إرسال رسالة للمستخدم',
@@ -2746,8 +2747,8 @@ $UNWATCHURL
 'modifiedarticleprotection' => 'غير مستوى حماية "[[$1]]"',
 'unprotectedarticle' => 'أزال الحماية من "[[$1]]"',
 'movedarticleprotection' => 'نقل إعدادات الحماية من "[[$2]]" إلى "[[$1]]"',
-'protect-title' => 'ضبط Ù\85ستÙ\88Ù\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ© Ù\84"$1"',
-'protect-title-notallowed' => 'عرض Ù\85ستÙ\88Ù\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ© Ù\84 "$1"',
+'protect-title' => 'ضبط Ù\85ستÙ\88Ù\89 Ø­Ù\85اÙ\8aØ© "$1"',
+'protect-title-notallowed' => 'عرض Ù\85ستÙ\88Ù\89 Ø­Ù\85اÙ\8aØ© "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
 'protect-badnamespace-title' => 'نطاق لا يحمى',
 'protect-badnamespace-text' => 'صفحات هذا النطاق لا يمكن حمايتها',
@@ -2888,7 +2889,7 @@ $1',
 'sp-contributions-uploads' => 'مرفوعات',
 'sp-contributions-logs' => 'سجلات',
 'sp-contributions-talk' => 'نقاش',
-'sp-contributions-userrights' => 'إدارة ØµÙ\84احÙ\8aات Ø§Ù\84Ù\85ستخدÙ\85',
+'sp-contributions-userrights' => 'صلاحيات المستخدم',
 'sp-contributions-blocked-notice' => 'هذا المستخدم ممنوع حاليا.
 إن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:',
 'sp-contributions-blocked-notice-anon' => 'عنوان الأيبي هذا ممنوع حاليا.
@@ -2921,7 +2922,7 @@ $1',
 'autoblockid' => 'منع تلقائي #$1',
 'block' => 'امنع المستخدم',
 'unblock' => 'إلغاء منع مستخدم',
-'blockip' => 'منع مستخدم',
+'blockip' => 'منع المستخدم',
 'blockip-title' => 'منع مستخدم',
 'blockip-legend' => 'منع المستخدم',
 'blockiptext' => 'استخدم النموذج التالي لمنع مستخدم، أو عنوان آيبي، معين من التعديل أو إنشاء حسابات جديدة. تُستخدم هذه العملية لمنع التخريب فقط، ويجب أن تتماشى مع [[{{MediaWiki:Policy-url}}|سياسة المنع]]. أدخل تعليلاً واضحًا لسبب المنع في الخانة المخصصة لذلك (مثلاً: ذكر صفحات محددة تمّ تخريبها من قبل المستخدم).',
@@ -3032,12 +3033,9 @@ $1',
 لكنه ممنوع كجزء من النطاق $2، والذي يمكن رفع المنع عنه.',
 'ip_range_invalid' => 'نطاق عناوين الأيبي المدخل غير صحيح.',
 'ip_range_toolarge' => 'لا يسمح بنطاقات المنع الأكبر من /$1',
-'blockme' => 'امنعني',
 'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'هذه الخاصية معطلة.',
 'proxyblockreason' => 'تم منع عنوان الأيبي الخاص بك لكونه بروكسي مفتوح.
 من فضلك اتصل بمزود خدمة الإنترنت الخاص بك أو الدعم الفني وأعلمهم بهذه المشكلة الأمنية الخطيرة.',
-'proxyblocksuccess' => 'تم.',
 'sorbs' => 'دي إن إس بي إل',
 'sorbsreason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.',
 'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.
@@ -4372,7 +4370,10 @@ $5
 'tags-tag' => 'اسم الوسم',
 'tags-display-header' => 'الظهور في قوائم التغييرات',
 'tags-description-header' => 'وصف كامل للمعنى',
+'tags-active-header' => 'نشط؟',
 'tags-hitcount-header' => 'تغييرات موسومة',
+'tags-active-yes' => 'نعم',
+'tags-active-no' => 'لا',
 'tags-edit' => 'عدل',
 'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
 
index a6b49d2..33b463c 100644 (file)
@@ -1461,8 +1461,6 @@ $1',
 'ipb_already_blocked' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ',
 'ipb-needreblock' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ
 Do you want to change the settings?',
-'blockme' => 'ܚܪܘܡ ܠܝ',
-'proxyblocksuccess' => 'ܒܪܐ',
 
 # Move page
 'move-page' => 'ܫܢܝ $1',
index 0281662..fe0312a 100644 (file)
@@ -752,7 +752,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 'blocklogentry' => 'Katrüntukufi [[$1]] $2 antü/ora mew, $3',
 'block-log-flags-nocreate' => 'Pepi dewmangelay konün',
 'block-log-flags-hiddenname' => 'Üy kellufe ellkan',
-'proxyblocksuccess' => 'Dewmangey.',
 
 # Move page
 'move-page' => 'Nengümün $1',
index 1555749..ceadcf3 100644 (file)
@@ -142,7 +142,7 @@ $messages = array(
 'noindex-category' => 'shat mamfhtsach',
 'broken-file-category' => 'ṣfaḫi fiha wṣlat milffaṫ mhrrsa',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'ala',
 'article' => 'sfht mohtawa',
@@ -1873,10 +1873,7 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e
 'ipb_expiry_temp' => 'L-Blokaj dyal s-smiyyaṫ dyal l-mosṫeĥdimin l-mĥebbyin ĥaṣṣo ybqa dima.',
 'ipb_already_blocked' => '"$1" rah fayeṫ mbloki',
 'ipb-otherblocks-header' => 'Blokaj {{PLURAL:$1|weḫdaĥor|weḫdaĥrin}}',
-'blockme' => 'blokini',
 'proxyblocker' => 'blokør dl-proksi',
-'proxyblocker-disabled' => 'had l-ĥaṣṣiyya ma mtloqa-ċ',
-'proxyblocksuccess' => 'ṣafi.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
index 5d4a353..13b3f37 100644 (file)
@@ -2423,12 +2423,9 @@ $1',
 بس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2، و اللى ممكن رفع المنع عنه.',
 'ip_range_invalid' => 'نطاق عناوين الأيبى مش صحيح.',
 'ip_range_toolarge' => 'حدود المنع اللى اكبر من /$1 مش مسموح بيها.',
-'blockme' => 'امنعنى',
 'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'الخاصية دى متعطلة.',
 'proxyblockreason' => 'عنوان الأيبى بتاعك اتمنع لانه بروكسى مفتوح.
 لو سمحت تتصل بمزود خدمة الإنترنت بتاعك أو الدعم الفنى و قولهم على المشكلة الامنية الخطيرة دي.',
-'proxyblocksuccess' => 'خلاص.',
 'sorbs' => 'دى إن إس بى إل',
 'sorbsreason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى DNSBL اللى بيستعمله{{SITENAME}}.',
 'sorbs_create_account_reason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى ال DNSBL اللى بيستعمله {{SITENAME}}.
index 2c044f9..ada0998 100644 (file)
@@ -2676,12 +2676,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 কিন্তু এইটো $2 পৰিসীমাৰ অন্তৰ্গত যাৰ বাধা আঁতৰাব পাৰি ।',
 'ip_range_invalid' => 'অবৈধ আই.পি. পৰিসৰ ।',
 'ip_range_toolarge' => '/$1তকৈ ডাঙৰ প্ৰতিবন্ধক পৰিসৰ অনুমোদিত নহয় ।',
-'blockme' => 'মোক বাৰণ কৰক',
 'proxyblocker' => 'প্ৰক্সী অৱৰোধকাৰী',
-'proxyblocker-disabled' => 'এই ফাংচনটো নিষ্ক্ৰিয়',
 'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ এইটো এটা মুক্ত প্ৰক্সী ।
 অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সেৱা প্ৰদানকাৰী বা কাৰিকৰী সহায়কৰ্তাৰ লগত যোগাযোগ কৰক আৰু এই গুৰুতৰ সুৰক্ষা সমস্যাৰ বিষয়ে জনাওক ।',
-'proxyblocksuccess' => 'সম্পন্ন কৰা হ’ল ।',
 'sorbsreason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
 'sorbs_create_account_reason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
 আপুনি একাউণ্ট সৃষ্টি কৰিব নোৱাৰে',
index b2782db..8923642 100644 (file)
@@ -2616,11 +2616,8 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'ipb_blocked_as_range' => 'Error: La IP $1 nun ta bloquiada direutamente, polo que nun pue ser desloquiada. Sicasí, foi bloquiada como parte del intervalu $2, que pue ser desbloquiáu.',
 'ip_range_invalid' => 'Rangu IP non válidu.',
 'ip_range_toolarge' => 'Nun se permiten bloqueos mayores de /$1.',
-'blockme' => 'Blóquiame',
 'proxyblocker' => 'Bloquiador de proxys',
-'proxyblocker-disabled' => 'Esta función ta desactivada.',
 'proxyblockreason' => "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.",
-'proxyblocksuccess' => 'Fecho.',
 'sorbsreason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta',
 'xffblockreason' => "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
index 2a7fc88..3259115 100644 (file)
@@ -1716,11 +1716,8 @@ male abdion elekayane IP mane.',
 'ipb_expiry_invalid' => "temps d'expiration invalide.",
 'ipb_already_blocked' => '"$1" ixam tir elekan',
 'ip_range_invalid' => 'IP elega mewadafa.',
-'blockme' => 'Zo eleká !',
 'proxyblocker' => 'Elekasiki va proxy',
-'proxyblocker-disabled' => 'Bati fli tir metegirafi.',
 'proxyblockreason' => "Votre ip a été bloquée car c'est un proxy ouvert. Merci de contacter votre fournisseur d'accès internet ou votre support technique et de l'informer de ce problème de sécurité.",
-'proxyblocksuccess' => 'Tenuweyes.',
 'sorbsreason' => "Rinafe IP mane wetce fenkunafi 'proxy' koe DNSBL faveni gan {{SITENAME}} zo vexalar.",
 
 # Developer tools
index e393e7d..33ef132 100644 (file)
@@ -206,7 +206,7 @@ $messages = array(
 'noindex-category' => 'İndeksləşdirilməyən səhifələr',
 'broken-file-category' => 'İşləməyən fayl keçidləri olan səhifələr',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Haqqında',
 'article' => 'Mündəricat',
@@ -2028,10 +2028,7 @@ Bloklama şərtlərini dəyişmək istəyirsiniz?',
 'unblock-hideuser' => 'İstifadəçi adı gizli olduğu üçün, bi bloku götürə bilməzsiniz.',
 'ipb_cant_unblock' => 'Xəta: Bloklama IDsi $1 tapılmadı. Bloklamanın götürülməsi mümkündür.',
 'ip_range_invalid' => 'Yanlış IP',
-'blockme' => 'Məni blokla',
 'proxyblocker' => 'Proksi bloklayıcı',
-'proxyblocker-disabled' => 'Bu funksiya əngəlləndi.',
-'proxyblocksuccess' => 'Oldu.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
index b845a59..e9423fb 100644 (file)
@@ -2542,12 +2542,9 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 آنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.',
 'ip_range_invalid' => 'یانلیش ای پی',
 'ip_range_toolarge' => '/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.',
-'blockme' => 'منی باغلا',
 'proxyblocker' => 'پروکسی باغلییان',
-'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.',
 'proxyblockreason' => 'ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی.
 خاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.',
-'proxyblocksuccess' => 'اولدو.',
 'sorbsreason' => 'ای پی عنوانینیز، {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
 'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
 حساب میدانا گتیره بیلمز',
index 3197a42..848a9b3 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author AiseluRB
+ * @author Alfiya55
  * @author Assele
  * @author Comp1089
  * @author Haqmar
@@ -155,12 +156,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Һуңғы үҙгәртеүҙәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-newpageshidepatrolled' => 'Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-extendwatchlist' => 'Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге',
-'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештерҙе төркөмдәргә булергә (JavaScript)',
-'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерландыр',
-'tog-showtoolbar' => 'Мөхәррирләү ваҡытында өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәкле)',
-'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә (JavaScript кәрәкле)',
+'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә',
+'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерлаe',
+'tog-showtoolbar' => 'Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)',
+'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә',
 'tog-editsection' => 'Һәр бүлек өсөн «үҙгәртеү» һылтанмаһын күрһәтергә',
-'tog-editsectiononrightclick' => 'Ð\91үлекÑ\82Ó\99Ñ\80Ò\99е Ð¸Ñ\81емдÓ\99Ñ\80енÓ\99 Ñ\81Ñ\8bÑ\81ҡан Ð¼ÐµÐ½Ó\99н Ñ\81иÑ\80Ñ\82еп Ò¯Ò\99гÓ\99Ñ\80Ñ\82еÑ\80гÓ\99 (JavaScript ÐºÓ\99Ñ\80Ó\99кле)',
+'tog-editsectiononrightclick' => 'Ð\91үлекÑ\82Ó\99Ñ\80Ò\99е Ð¸Ñ\81емдÓ\99Ñ\80енÓ\99 Ñ\82Ó©Ñ\80Ñ\82көнөң Ñ\83Ò£ Ñ\8fÒ\93Ñ\8bна Ñ\81иÑ\80Ñ\82еп Ò¯Ò\99гÓ\99Ñ\80Ñ\82еÑ\80гÓ\99',
 'tog-showtoc' => 'Эстәлек күрһәтелһен (3-тән күп башлығы булған биттәрҙә)',
 'tog-rememberpassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен',
 'tog-watchcreations' => 'Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә',
@@ -191,6 +192,7 @@ $messages = array(
 'tog-showhiddencats' => 'Йәшерен категорияларҙы күрһәтергә',
 'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң версия айырмалары күрһәтелмәһен',
 'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә',
+'tog-prefershttps' => 'Системаға танытылғандан һуң һәр ваҡыт һаҡланыулы тоташыу ҡулланырға',
 
 'underline-always' => 'Һәр ваҡыт',
 'underline-never' => 'Бер ҡасан да',
@@ -291,7 +293,7 @@ $messages = array(
 'newwindow' => '(яңы биттә)',
 'cancel' => 'Бөтөрөргә',
 'moredotdotdot' => 'Дауамы...',
-'morenotlisted' => 'Башҡа бер нимә лә юҡ...',
+'morenotlisted' => 'Был исемлек тулы түгел',
 'mypage' => 'Бит',
 'mytalk' => 'Әңгәмә',
 'anontalk' => 'Был IP-адресының фекер алышыу бите',
@@ -347,6 +349,7 @@ $messages = array(
 'create-this-page' => 'Был битте яһарға',
 'delete' => 'Юҡ  итергә',
 'deletethispage' => 'Был битте юйырға',
+'undeletethispage' => 'Юйылған был битте ҡабат тергеҙеү',
 'undelete_short' => '$1 {{PLURAL:$1|үҙгәртеүҙе}} тергеҙергә',
 'viewdeleted_short' => '{{PLURAL:$1|1 юйылған үҙгәртеүҙе|$1 юйылған үҙгәртеүҙе}} ҡарау',
 'protect' => 'Һаҡларға',
@@ -393,7 +396,7 @@ $1',
 # 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).
 'aboutsite' => '{{SITENAME}} тураһында',
 'aboutpage' => 'Project:Тасуирлама',
-'copyright' => '$1 ярашлы эстәлеге менән һәр кем файҙалана ала.',
+'copyright' => '$1 лицензияһына ярашлы, эстәлеге менән һәр кем файҙалана ала (башҡаһы күрһәтелмәһә)',
 'copyrightpage' => '{{ns:project}}:Авторлыҡ хоҡуҡтары',
 'currentevents' => 'Ағымдағы ваҡиғалар',
 'currentevents-url' => 'Project:Ағымдағы ваҡиғалар',
@@ -477,6 +480,12 @@ $1',
 # General errors
 'error' => 'Хата',
 'databaseerror' => 'Мәғлүмәттәр базаһы хатаһы',
+'databaseerror-text' => 'Бирелмәләр базаһында хата киткән.
+Был программа тәьминәтендә хата барлығы күрһәткесе булырға мөмкин.',
+'databaseerror-textcl' => 'Бирелмәләр базаһында хата бар.',
+'databaseerror-query' => 'Һоратыу: $1',
+'databaseerror-function' => 'Функция:$1',
+'databaseerror-error' => 'Хата: $1',
 'laggedslavemode' => "'''Иғтибар:''' биттә һуңғы үҙгәртеүҙәр күрһәтелмәгән булырға мөмкин.",
 'readonly' => 'Мәғлүмәттәр базаһы бикләнгән',
 'enterlockreason' => 'Ябылыу сәбәбен һәм ваҡытын белдерегеҙ.',
@@ -511,6 +520,7 @@ $1',
 'cannotdelete-title' => '"$1" битен юйып булмай',
 'delete-hook-aborted' => 'Үҙгәртеүҙе махсус-процедура кире ҡаҡты.
 Өҫтәмә аңлатма килтерелмәй.',
+'no-null-revision' => '«$1» бите өсөн яңы нулле төҙәтеү яһап булманы',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
 'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
@@ -537,6 +547,10 @@ $2',
 'namespaceprotected' => '«$1» исем арауығындағы биттәрҙе мөхәррирләү өсөн хоҡуҡтарығыҙ юҡ.',
 'customcssprotected' => 'Был CSS-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.',
 'customjsprotected' => 'Был JavaScript-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.',
+'mycustomcssprotected' => 'Биттең был CSS-ын  мөхәррирләргә хоҡуғығыҙ юҡ.',
+'mycustomjsprotected' => 'Был биттәге  JavaScript-ты мөхәррирләргә хоҡуғығыҙ юҡ.',
+'myprivateinfoprotected' => 'Һеҙгә шәхси мәғлүмәттәрегеҙҙе үҙгәртергә рөхсәт юҡ',
+'mypreferencesprotected' => 'Һеҙҙең көйләүҙәрегеҙҙе мөхәррирләргә хоҡуғығыҙ юҡ.',
 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.',
 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған.
 Белдерелгән сәбәп: ''$2''.",
@@ -554,21 +568,26 @@ $2',
 'virus-unknownscanner' => 'беленмәгән антивирус:',
 
 # Login and logout pages
-'logouttext' => "'''Һеҙ иҫәп яҙыуығыҙҙан сыҡтығыҙ.'''
+'logouttext' => "'''Һеҙ эш сеансын тамамланығыҙ.'''
 
-Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки <span class='plainlinks'>[$1 яңынан таныла]</span> алаһығыҙ (үҙ йәки башҡа исем менән).
-Ҡайһы бер биттәр һеҙ системала танылған һымаҡ күренергә мөмкин, уны бөтөрөү өсөн браузер кэшын таҙартығыҙ.",
+Ҡайһы бер биттәр һеҙ системаға танылмаған кеүек күренеүен дауам итер. Быны бөтөрөү өсөн браузер кэшын таҙартығыҙ.",
 'welcomeuser' => 'Рәхим итегеҙ $1!',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
 'userlogin-yourname' => 'Ҡулланыусы исеме',
+'userlogin-yourname-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ',
+'createacct-another-username-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ',
 'yourpassword' => 'Серһүҙ',
 'userlogin-yourpassword' => 'Серһүҙ',
 'userlogin-yourpassword-ph' => 'Яңы серһүҙҙе яҙығыҙ',
+'createacct-yourpassword-ph' => 'Серһүҙҙе яҙығыҙ',
 'yourpasswordagain' => 'Серһүҙҙе ҡабаттан яҙыу',
-'remembermypassword' => 'Был компьютерҙа серһүҙемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'createacct-yourpasswordagain' => 'Серһүҙҙе раҫлағыҙ',
+'createacct-yourpasswordagain-ph' => 'Серһүҙҙе тағы бер тапҡыр яҙығыҙ',
+'remembermypassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен',
 'userlogin-remembermypassword' => 'Системала ҡалырға',
+'userlogin-signwithsecure' => 'Һаҡланыулы тоташыу',
 'yourdomainname' => 'Һеҙҙең домен',
 'password-change-forbidden' => 'Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.',
 'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.',
@@ -580,19 +599,43 @@ $2',
 'logout' => 'Тамамлау',
 'userlogout' => 'Тамамлау',
 'notloggedin' => 'Танылмағанһығыҙ',
+'userlogin-noaccount' => 'Иҫәп яҙмағыҙ юҡмы?',
+'userlogin-joinproject' => 'Проектҡа ҡушылырға',
 'nologin' => "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
 'nologinlink' => 'Иҫәп яҙыуын булдырырға',
 'createaccount' => 'Яңы ҡатнашыусыны теркәү',
 'gotaccount' => "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
 'gotaccountlink' => 'Үҙегеҙ менән таныштырығыҙ',
 'userlogin-resetlink' => 'Танылыу мәғлүмәттәрен оноттоғоҙмо?',
-'createaccountmail' => 'эл. почта буйынса',
+'userlogin-resetpassword-link' => 'Серһүҙҙе ҡабул итмәү',
+'helplogin-url' => 'Help:Системаға танылыу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]Системаға инеүҙә ярҙам',
+'userlogin-loggedin' => ' Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.',
+'userlogin-createanother' => 'Башҡа иҫәп яҙмаһын булдырырға',
+'createacct-join' => 'Аҫта мәғлүмәттәрегеҙҙе яҙығыҙ.',
+'createacct-another-join' => 'Аҫта яңы иҫәп яҙмағыҙҙың мәғлүмәттәрен яҙығыҙ.',
+'createacct-emailrequired' => 'Электрон почта адресы',
+'createacct-emailoptional' => 'Электрон почта адресы (мотлаҡ түгел)',
+'createacct-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ',
+'createacct-another-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ',
+'createaccountmail' => 'Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә',
+'createacct-realname' => 'Ысын исемегеҙ (мотлаҡ түгел)',
 'createaccountreason' => 'Сәбәп:',
+'createacct-reason' => 'Сәбәп',
+'createacct-reason-ph' => 'Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?',
 'createacct-captcha' => 'Һаҡлылыҡты тикшереү',
+'createacct-imgcaptcha-ph' => 'Өҫтәге тексты индерегеҙ',
+'createacct-submit' => 'Иҫәп яҙмаһын булдырырға',
+'createacct-another-submit' => 'Тағы бер иҫәп яҙмаһын булдырырға',
+'createacct-benefit-heading' => '{{SITENAME}} һеҙҙең кеүек үк кешеләр тарафынан булдырылған',
+'createacct-benefit-body1' => '{{PLURAL:$1|үҙгәртеү}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|мәҡәлә|мәҡәлә|мәҡәләнең}}',
+'createacct-benefit-body3' => 'һуңғы ваҡытта {{PLURAL:$1|ҡатнашыусы|}}',
 'badretype' => 'Һеҙ кереткән серһүҙҙәр тап килмәй.',
 'userexists' => 'Керетелгән исем ҡулланыла инде.
 Зинһар, башҡа исем һайлағыҙ.',
 'loginerror' => 'Танылыу хатаһы',
+'createacct-error' => 'Иҫәп яҙмаһын булдырғандағы хата',
 'createaccounterror' => 'Иҫәп яҙыуын яһап булмай: $1',
 'nocookiesnew' => 'Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.',
 'nocookieslogin' => '{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.',
@@ -637,21 +680,24 @@ $2',
 'cannotchangeemail' => 'Иҫәп яҙыуы электрон почта адрестарын был викила үҙгәртеп булмай.',
 'emaildisabled' => 'Был сайт электрон почта хәберҙәрен ебәрә алмай',
 'accountcreated' => 'Иҫәп яҙыуы яһалды',
-'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|msj]])   өсөн иҫәп яҙмаһы булдырылды.',
 'createaccount-title' => '{{SITENAME}}: теркәлеү',
 'createaccount-text' => 'Кемдер, электрон почта адресығыҙҙы күрһәтеп, {{SITENAME}} ($4) проектында «$3» пароле менән «$2» исемле иҫәп яҙыуы теркәне. Һеҙҙең кереүегеҙ һәм серһүҙегеҙҙе алмаштырыуығыҙ кәрәк.
 
 Иҫәп яҙыуы яңылыш яһалһа, был хатҡа иғтибар итмәгеҙ.',
 'usernamehasherror' => 'Ҡулланыусы исемендә "#" символы була алмай',
-'login-throttled' => 'Һеҙ системала артыҡ күп танылырға тырыштығыҙ.
\97инһаÑ\80, Ò¡Ð°Ð±Ð°Ñ\82ламаҫÑ\82ан Ð°Ð»Ð´Ð° Ð±ÐµÑ\80аÒ\99 көтөгөҙ.',
+'login-throttled' => 'Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.
¢Ð°Ò\93Ñ\8b Ð±ÐµÑ\80 Ñ\82анÑ\8bлÑ\8bÑ\80Ò\99ан Ð°Ð»Ð´Ð°, Ð·Ð¸Ð½Ò»Ð°Ñ\80, $1 көтөгөҙ.',
 'login-abort-generic' => 'Танылыу уңышһыҙ тамамланды',
 'loginlanguagelabel' => 'Тел: $1',
 'suspicious-userlogout' => 'Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.',
+'createacct-another-realname-tip' => 'Ысын исемегеҙ (мотлаҡ түгел).
+Уны яҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү өсөн ҡулланыласаҡ.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP-ның mail() функцияһында билдәһеҙ хата',
 'user-mail-no-addy' => 'Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны',
+'user-mail-no-body' => 'Буш йә мәғәнәһеҙ йөкмәткеле ҡыҫҡа электрон хат ебәрергә тырышҡан.',
 
 # Change password dialog
 'resetpass' => 'Серһүҙҙе үҙгәртеү',
@@ -661,7 +707,7 @@ $2',
 'newpassword' => 'Яңы серһүҙ:',
 'retypenew' => 'Серһүҙҙе яңынан керетегеҙ:',
 'resetpass_submit' => 'Серһүҙ ҡуйырға һәм танышырға',
-'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде! Системала танышыу бара...',
+'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!',
 'resetpass_forbidden' => 'Серһүҙҙе үҙгәртеп булмай',
 'resetpass-no-info' => 'Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.',
 'resetpass-submit-loggedin' => 'Серһүҙҙе үҙгәртергә',
@@ -669,11 +715,15 @@ $2',
 'resetpass-wrong-oldpass' => 'Хаталы ваҡытлыса йәки ағымдағы серһүҙ.
 Һеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.',
 'resetpass-temp-password' => 'Ваҡытлыса серһүҙ',
+'resetpass-abort-generic' => 'Серһүҙҙе үҙгәртеү киңәйеү тарафынан өҙөлдө.',
 
 # Special:PasswordReset
 'passwordreset' => 'Серһүҙҙе ташлатыу',
+'passwordreset-text-one' => 'Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.',
+'passwordreset-text-many' => '{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}',
 'passwordreset-legend' => 'Серһүҙҙе ташлатыу',
 'passwordreset-disabled' => 'Был викила серһүҙҙе ташлатыу ғәмәлдә түгел',
+'passwordreset-emaildisabled' => 'Был викиҙа электрон почта функцияһы һүндерелгән.',
 'passwordreset-username' => 'Ҡулланыусы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
@@ -697,9 +747,9 @@ $2
 Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙеҙҙе ҡулланыуҙы дауам итегеҙ.',
 'passwordreset-emailelement' => 'Ҡулланыусы исеме: $1
 Ваҡытлыса серһүҙ: $2',
-'passwordreset-emailsent' => 'ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ñ\88а Ð¸Ò«Ð»Ó\99Ñ\82еү Ñ\85аÑ\82Ñ\8b ебәрелде.',
-'passwordreset-emailsent-capture' => 'Ð\95бÓ\99Ñ\80елгÓ\99н Ñ\85Ó\99Ñ\82еÑ\80лÓ\99Ñ\82еү Ñ\85Ó\99бÓ\99Ñ\80е Ñ\82үбÓ\99ндÓ\99 ÐºÒ¯Ñ\80Ò»Ó\99лгÓ\99н.',
-'passwordreset-emailerror-capture' => 'Ð\9aилеп Ñ\81Ñ\8bҡҡан Ñ\85Ó\99Ñ\82еÑ\80лÓ\99Ñ\82еү Ñ\85Ó\99бÓ\99Ñ\80е Ñ\82үбÓ\99ндÓ\99 ÐºÒ¯Ñ\80Ò»Ó\99Ñ\82елгÓ\99н, Ñ\82ик Ñ\83нÑ\8b ÐµÐ±Ó\99Ñ\80еү Ñ\83Ò£Ñ\8bÑ\88Ò»Ñ\8bÒ\99 Ñ\82амамландÑ\8b. Ð¡Ó\99бÓ\99бе:$1',
+'passwordreset-emailsent' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е Ñ\82аÑ\88лаÑ\83 Ñ\82Ñ\83Ñ\80аһÑ\8bндаÒ\93Ñ\8b Ð¼Ó\99Ò\93лүмÓ\99Ñ\82 Ð¼ÐµÐ½Ó\99н Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ñ\88а Ñ\85аÑ\82 ебәрелде.',
+'passwordreset-emailsent-capture' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е Ñ\82аÑ\88лаÑ\83 Ñ\82Ñ\83Ñ\80аһÑ\8bндаÒ\93Ñ\8b Ð¼Ó\99Ò\93лүмÓ\99Ñ\82 Ð¼ÐµÐ½Ó\99н Ñ\8dлекÑ\82Ñ\80он Ñ\85аÑ\82 ÐµÐ±Ó\99Ñ\80елде, Ñ\83нÑ\8bÒ£ Ñ\82екÑ\81Ñ\8b Ñ\82үбÓ\99ндÓ\99 Ð±Ð¸Ñ\80елÓ\99:',
+'passwordreset-emailerror-capture' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е Ñ\82аÑ\88лаÑ\83 Ñ\82Ñ\83Ñ\80аһÑ\8bнда Ñ\85Ó\99бÓ\99Ñ\80 Ð¸Ñ\82еүÑ\81е Ñ\8dлекÑ\82Ñ\80он Ñ\85аÑ\82 Ð±Ñ\83лдÑ\8bÑ\80Ñ\8bлÒ\93айнÑ\8b, Ð»Ó\99кин Ñ\83нÑ\8b  {{GENDER:$2|kullanıcıya}} Ñ\82үбÓ\99ндÓ\99ге Ñ\81Ó\99бÓ\99п Ð°Ñ\80ҡаһÑ\8bнда ÐµÐ±Ó\99Ñ\80еп Ð±Ñ\83лманÑ\8b$1',
 
 # Special:ChangeEmail
 'changeemail' => 'Электрон почта адресын үҙгәртергә',
@@ -713,6 +763,19 @@ $2
 'changeemail-submit' => 'Адресты үҙгәртергә',
 'changeemail-cancel' => 'Кире алырға',
 
+# Special:ResetTokens
+'resettokens' => 'Токендарҙы ташларға',
+'resettokens-text' => 'Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ.
+
+Яңылыштан уларҙы берәйһе менән уртаҡлашҡан  йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.',
+'resettokens-no-tokens' => 'Ташлар өсөн токендар юҡ.',
+'resettokens-legend' => 'Токендарҙы ташларға',
+'resettokens-tokens' => 'Токендар:',
+'resettokens-token-label' => '$1 (ағымдағы мәғәнә: $2)',
+'resettokens-watchlist-token' => ' [[Special:Watchlist|күҙәтеүҙәрегеҙ исемлегендә биттәрҙең үҙгәрештәре]] веб-каналы өсөн токен(Atom/RSS)',
+'resettokens-done' => 'Токендар ташланды.',
+'resettokens-resetbutton' => 'Һайланған токендарҙы ташларға',
+
 # Edit page toolbar
 'bold_sample' => 'Ҡалын яҙылыш',
 'bold_tip' => 'Ҡалын яҙылыш',
@@ -789,9 +852,9 @@ $2
 'loginreqlink' => 'танылыу',
 'loginreqpagetext' => 'Башҡа биттәрҙе ҡарау өсөн $1 кәрәк.',
 'accmailtitle' => 'Серһүҙ ебәрелде.',
-'accmailtext' => "[[User talk:$1|$1]] ҡулланыусыһы өсөн яһалған серһүҙ $2 адресына ебәрелде.
+'accmailtext' => "[[User talk:$1|$1]] өсөн осраҡлы яһалған серһүҙ $2 адресына ебәрелде.
 
¡Ð¸Ñ\81Ñ\82емала Ñ\82анÑ\8bлÒ\93андан Ò»Ñ\83Ò£ ''[[Special:ChangePassword|Ñ\81еÑ\80Ò»Ò¯Ò\99егеÒ\99Ò\99е үҙгәртә алаһығыҙ]]''.",
¢Ð°Ð½Ñ\8bлÒ\93андан Ò»Ñ\83Ò£ Ð±Ñ\8bл Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8b Ó©Ñ\81өн Ñ\81еÑ\80Ò»Ò¯Ò\99Ò\99е ''[[Special:ChangePassword|Ñ\81еÑ\80Ò»Ò¯Ò\99Ò\99е Ò¯Ò\99гÓ\99Ñ\80Ñ\82еү Ó©Ñ\81өн Ð¼Ð°Ñ\85Ñ\81Ñ\83Ñ\81 Ð±Ð¸Ñ\82Ñ\82Ó\99 үҙгәртә алаһығыҙ]]''.",
 'newarticle' => '(Яңы)',
 'newarticletext' => "Һеҙ һылтанма буйынса әлегә яһалмаған биткә күстегеҙ.
 Яңы бит яһар өсөн аҫтағы тәҙрәгә текст керетегеҙ (тулыраҡ мәғлүмәт өсөн [[{{MediaWiki:Helppage}}|ярҙам битен]] ҡарағыҙ).
@@ -891,7 +954,7 @@ $2
 'nocreate-loggedin' => 'Яңы биттәр яһау хоҡуғығыҙ юҡ.',
 'sectioneditnotsupported-title' => 'Бүлектәрҙә мөхәррирләү терәкләнмәй',
 'sectioneditnotsupported-text' => 'Был биттә бүлектәрҙе мөхәррирләү терәкләнмәй.',
-'permissionserrors' => 'Ирешеү хоҡуҡтары хаталары',
+'permissionserrors' => 'Инеү хоҡуғы хатаһы',
 'permissionserrorstext' => 'Түбәндәге {{PLURAL:$1|сәбәп|сәбәптәр}} буйынса һеҙҙең был ғәмәлде үтәү хоҡуғығыҙ юҡ:',
 'permissionserrorstext-withaction' => "«'''$2'''» ғәмәлен башҡара алмайһығыҙ. {{PLURAL:$1|Сәбәбе|Сәбәптәре}}:",
 'recreate-moveddeleted-warn' => "'''Иғтибар: Һеҙ, элек юйылған битте яңынан яһарға теләйһегеҙ.'''
@@ -907,6 +970,7 @@ $2
 Бәлки ул юйылғандыр.',
 'edit-conflict' => 'Төҙәтеүҙәр конфликты',
 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
+'postedit-confirmation' => 'Үҙгәртеүегеҙ һаҡланды.',
 'edit-already-exists' => 'Яңы бит яһап булмай.
 Ул былай ҙа бар.',
 'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
@@ -949,6 +1013,7 @@ $2
 'undo-failure' => 'Ара үҙгәртеүҙәр тура килмәү сәбәпле төҙәтеүҙе кире алып булмай.',
 'undo-norev' => 'Үҙгәртеүҙе кире алып булмай, сөнки юҡ йәки юйылған.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ҡулланыусыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу',
+'undo-summary-username-hidden' => 'Исеме йәшерелгән ҡатнашыусының төҙәтеүен  $1 кире ҡағыу',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Иҫәп яҙыуын яһап булмай',
@@ -975,8 +1040,8 @@ $3 белдергән сәбәп: ''$2''",
 Аңлатмалар: '''({{int:cur}})''' — хәҙерге версиянан айырма, '''({{int:last}})''' — алдағы версиянан айырма, '''{{int:minoreditletter}}''' — әҙ үҙгәреш яһалған.",
 'history-fieldset-title' => 'Тарихты ҡарарға',
 'history-show-deleted' => 'Юйылғандар ғына',
-'histfirst' => 'Иң иҫке',
-'histlast' => 'Һуңғы',
+'histfirst' => 'Иң иҫкеләр',
+'histlast' => 'Иң һуңғылар',
 'historysize' => '($1 {{PLURAL:$1|байт}})',
 'historyempty' => '(буш)',
 
@@ -1128,6 +1193,7 @@ $1",
 'compareselectedversions' => 'Һайланған версияларҙы сағыштырыу',
 'showhideselectedversions' => 'Һайланған версияларҙы күрһәтергә/йәшерергә',
 'editundo' => 'кире алыу',
+'diff-empty' => '(айырмалар юҡ)',
 'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|бер өлгөһө|$2 өлгөһө}} табылманы.
@@ -1176,7 +1242,7 @@ $1",
 'search-interwiki-default' => '$1 һөҙөмтә:',
 'search-interwiki-more' => '(тағы)',
 'search-relatedarticle' => 'Ҡағылышлы',
-'mwsuggest-disable' => 'AJAX-тәҡдимдәрен ябырға',
+'mwsuggest-disable' => 'Эҙләү өйрәтмәләрен һүндерергә',
 'searcheverything-enable' => 'Бар исем арауыҡтарында эҙләргә',
 'searchrelated' => 'ҡағылышлы',
 'searchall' => 'барыһы',
@@ -1197,6 +1263,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} эҙләүе ябыҡ.
 Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ.
 Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
+'search-error' => 'Эҙләүҙә хата китте: $1',
 
 # Preferences page
 'preferences' => 'Көйләүҙәр',
@@ -1228,7 +1295,7 @@ $1",
 'prefs-rendering' => 'Күренеш',
 'saveprefs' => 'Һаҡларға',
 'resetprefs' => 'Һаҡланмаған үҙгәрештерҙе таҙартырға',
-'restoreprefs' => 'Ғәҙәттәге бар көйләүҙәргә ҡайтырға',
+'restoreprefs' => 'Алдан ҡуйылған көйләүҙәрҙе тергеҙергә',
 'prefs-editing' => 'Мөхәррирләү',
 'rows' => 'Юлдар:',
 'columns' => 'Бағаналар:',
@@ -1240,6 +1307,8 @@ $1",
 'recentchangesdays-max' => 'Иң күбендә $1 {{PLURAL:$1|көн}}',
 'recentchangescount' => 'Ғәҙәттә күрһәтелгән үҙгәртеүҙәр һаны:',
 'prefs-help-recentchangescount' => 'Һуңғы үҙгәртеүҙәрҙе, биттәр тарихын, журналдарҙы үҙ эсенә ала.',
+'prefs-help-watchlist-token2' => 'Был - күҙәтеүҙәрегеҙ исемлегенең веб-каналы өсөн йәшерен асҡыс.
+Уны белеүселәр күҙәтеүҙәрегеҙ исемлеген уҡый аласаҡ, шуға уны бер кемгә лә әйтмәгеҙ. [[Special:ResetTokens|Уны ташларға теләһәгеҙ, ошонда баҫығыҙ]].',
 'savedprefs' => 'Һеҙҙең көйләүҙәрегеҙ һаҡланды.',
 'timezonelegend' => 'Ваҡыт бүлкәте:',
 'localtime' => 'Урындағы ваҡыт:',
@@ -1283,12 +1352,13 @@ $1",
 'prefs-help-signature' => 'Әңгәмә биттәрендәге хәбәрҙәрегеҙ һеҙҙең имзағыҙға һәм ваҡытҡа әйләнәсәк "<nowiki>~~~~</nowiki>" тамғаларын өҫтәү юлы менән имзаланырға тейеш.',
 'badsig' => 'Хаталы имза. HTML-тегдарҙың дөрөҫлөгөн тикшерегеҙ.',
 'badsiglength' => 'Бигерәк оҙон имза. Имза оҙонлоғо $1 {{PLURAL:$1|символдан}} артыҡ булмаҫҡа тейеш.',
-'yourgender' => 'Зат:',
-'gender-unknown' => 'күрһәтелмәгән',
-'gender-male' => 'Ир-егет',
-'gender-female' => 'Ҡатын-ҡыҙ',
-'prefs-help-gender' => 'Теләк буйынса: ҡатнашыусының затына бәйле ҡайһы бер программа хәбәрҙәрендә ҡулланыла.
-Был дөйөм мәғлүмәт буласаҡ.',
+'yourgender' => 'Ҡайһы тасуирлама һеҙгә ҡулайыраҡ?',
+'gender-unknown' => 'Күрһәткем килмәй',
+'gender-male' => 'Ул вики биттәрен мөхәррирләй',
+'gender-female' => 'Ул вики биттәрен мөхәррирләй',
+'prefs-help-gender' => 'Был көйләүҙе ҡуйыу мотлаҡ түгел.
+Программа тәьминәте был мәғлүмәтте һеҙгә грамматика йәһәтенән дөрөҫ мөрәжәғәт итеү өсөн ҡулланасаҡ. 
+Был мәғлүмәт бөтәһенә лә күренәсәк.',
 'email' => 'Электрон почта',
 'prefs-help-realname' => 'Ысын исемегеҙ (теләк буйынса).
 Әгәр уны күрһәтһәгеҙ, битте кемдең төҙәткәнен күрһәткәндә ҡулланыласаҡ.',
@@ -1302,7 +1372,9 @@ $1",
 'prefs-signature' => 'Имза',
 'prefs-dateformat' => 'Ваҡыт форматы',
 'prefs-timeoffset' => 'Ваҡыт күсереү:',
-'prefs-advancedediting' => 'Киңәйтелгән көйләүҙәр',
+'prefs-advancedediting' => 'Дөйөм көйләүҙәр',
+'prefs-editor' => 'мөхәррир',
+'prefs-preview' => 'алдан байҡау',
 'prefs-advancedrc' => 'Киңәйтелгән көйләүҙәр',
 'prefs-advancedrendering' => 'Киңәйтелгән көйләүҙәр',
 'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүҙәр',
@@ -1311,6 +1383,7 @@ $1",
 'prefs-displaysearchoptions' => 'Күренеш көйләүҙәре',
 'prefs-displaywatchlist' => 'Күренеш көйләүҙәре',
 'prefs-diffs' => 'Айырмалар',
+'prefs-help-prefershttps' => 'Был көйләү системаға киләһе танылыуҙан һуң ҡулланыласаҡ.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail адрес дөрөҫ булғанға оҡшаған',
@@ -1334,9 +1407,11 @@ $1",
 'userrights-no-interwiki' => 'Һеҙҙең башҡа вики-проекттарҙа ҡатнашыусыларҙың хоҡуҡтарын үҙгәртергә хоҡуҡтарығыҙ юҡ.',
 'userrights-nodatabase' => '$1 базаһы юҡ йәки урындағы (локаль) база түгел.',
 'userrights-nologin' => 'Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хаким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.',
-'userrights-notallowed' => 'Һеҙҙең иҫәп яҙыуығыҙҙан ҡатнашыусыларҙың хоҡуҡтарын өҫтәү йәки алыу рөхсәт ителмәгән.',
+'userrights-notallowed' => 'Һеҙгә ҡатнашыусыларҙың хоҡуҡтарын өҫтәргә йәки юҡ итергә рөхсәт ителмәгән.',
 'userrights-changeable-col' => 'Һеҙ үҙгәртә алған төркөмдәр',
 'userrights-unchangeable-col' => 'Һеҙ үҙгәртә алмаған төркөмдәр',
+'userrights-conflict' => 'Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.',
+'userrights-removed-self' => 'Һеҙ үҙ хоҡуҡтарығыҙҙы уңышлы юҡ иттегеҙ. Шулай итеп, был биткә башҡаса инә алмаясаҡһығыҙ.',
 
 # Groups
 'group' => 'Төркөм:',
@@ -1380,7 +1455,7 @@ $1",
 'right-reupload-shared' => 'Дөйөм һаҡлағыстағы файлды урындағы (локаль) файл менән алыштырыу',
 'right-upload_by_url' => 'Файлдарҙы URL адрестан күсереү',
 'right-purge' => 'Биттәрҙең кэшын раҫлауһыҙ юйыу',
-'right-autoconfirmed' => 'Үҙгәртеүҙән ярым-һаҡланған биттәрҙе мөхәррирләү',
+'right-autoconfirmed' => 'IP-адресҡа тиҙлек сикләүе юҡ',
 'right-bot' => 'Үҙенән-үҙе башҡарыла торған эш тип иҫәпләнеү',
 'right-nominornewtalk' => 'Фекер алышыу битендә кереткән әҙ үҙгәрештәр яңы хәбәр тураһында белдереү булдырмай',
 'right-apihighlimits' => 'API-һорауҙарҙы башҡарыуға сикләүҙәр аҙыраҡ',
@@ -1400,13 +1475,22 @@ $1",
 'right-hideuser' => 'Ҡатнашыусы исемен тыйыу һәм йәшереү',
 'right-ipblock-exempt' => 'IP адрестарҙы бикләүҙе, авто-бикләүҙәрҙе, арауыҡтарҙы бикләүҙе урап үтеү',
 'right-proxyunbannable' => 'Прокси серверҙарҙы авто-бикләүҙе урап үтеү',
-'right-unblockself' => 'Үҙҙәренең биген асыу',
-'right-protect' => 'Биттәрҙең һаҡланыу дәрәжәһен үҙгәртеү һәм һаҡланған биттәрҙе мөхәррирләү',
-'right-editprotected' => 'Һаҡланған биттәрҙе мөхәррирләү(эҙмә-эҙлекле һаҡлауһыҙ)',
+'right-unblockself' => 'Үҙ бигеңде асырға',
+'right-protect' => 'Биттәрҙең һаҡланыу кимәлен үҙгәртеү һәм баҫҡыслап һаҡланған биттәрҙе төҙәтеү',
+'right-editprotected' => '"{{int:protect-level-sysop}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
 'right-editinterface' => 'Ҡулланыусы интерфейсын үҙгәртеү',
 'right-editusercssjs' => 'Башҡа ҡатнашыусыларҙың CSS һәм JS файлдарын мөхәррирләү',
 'right-editusercss' => 'Башҡа ҡатнашыусыларҙың CSS файлдарын мөхәррирләү',
 'right-edituserjs' => 'Башҡа ҡатнашыусыларҙың JS файлдарын мөхәррирләү',
+'right-editmyusercss' => 'Файҙаланыусының CSS файлдарын мөхәррирләү',
+'right-editmyuserjs' => 'Үҙеңдең файҙаланыуҙағы JavaScript-файлдарын мөхәррирләргә',
+'right-viewmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген ҡарарға',
+'right-editmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген мөхәррирләргә.
+Ҡайһы бер ғәмәлдәрҙең, быға хоҡуғы булмаһа ла, биттәр өҫтәүенә иғтибар итегеҙ.',
+'right-viewmyprivateinfo' => 'Үҙеңдең шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) байҡау',
+'right-editmyprivateinfo' => 'Үҙ шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) төҙәтеү',
+'right-editmyoptions' => 'Үҙ өҫтөнлөктәреңде мөхәррирләргә',
 'right-rollback' => 'Ниндәйҙер битте мөхәррирләгән һуңғы ҡатнашыусының үҙгәртеүҙәрен тиҙ кире алыу',
 'right-markbotedits' => 'Кире алынған үҙгәртеүҙәрҙе бот үҙгәртеүе тип билдәләү',
 'right-noratelimit' => 'Тиҙлек сикләнмәгән',
@@ -1458,8 +1542,8 @@ $1",
 'action-block' => 'Был ҡатнашыусыға мөхәррирләүҙе тыйыу',
 'action-protect' => 'Был биттең һаҡланыу дәрәжәһен үҙгәртеү',
 'action-rollback' => 'битте мөхәррирләгән һуңғы ҡатнашыусының үҙгәртеүҙәрен тиҙ кире алыу',
-'action-import' => 'Ð\91Ñ\8bл Ð±Ð¸Ñ\82Ñ\82е Ð±Ð°Ñ\88ҡа Ð²Ð¸ÐºÐ¸-пÑ\80оекÑ\82Ñ\82ан күсереү',
-'action-importupload' => 'Был битте файл күсереү аша тейәү',
+'action-import' => 'баÑ\88ҡа Ð²Ð¸ÐºÐ¸-пÑ\80оекÑ\82Ñ\82ан Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99е күсереү',
+'action-importupload' => 'тейәлгән файлдан биттәрҙе күсереү',
 'action-patrol' => 'Башҡаларҙың үҙгәртеүҙәрен тикшерелгән тип билдәләү',
 'action-autopatrol' => 'Үҙ үҙгәртеүҙәрен тикшерелгән тип билдәләү',
 'action-unwatchedpages' => 'Күҙәтелмәгән биттәр исемлеген ҡарау',
@@ -1468,12 +1552,19 @@ $1",
 'action-userrights-interwiki' => 'Ҡатнашыусыларҙың башҡа Викиларҙағы хоҡуҡтарын үҙгәртеү',
 'action-siteadmin' => 'Мәғлүмәттәр базаһын асыу һәм ябыу',
 'action-sendemail' => 'электрон хат ебәреү',
+'action-editmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемелеген мөхәррирләү',
+'action-viewmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемлеген байҡау',
+'action-viewmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте байҡау',
+'action-editmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте мөхәррирләү',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}',
+'enhancedrc-history' => 'тарих',
 'recentchanges' => 'Һуңғы үҙгәртеүҙәр',
 'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре',
 'recentchanges-summary' => 'Төрлө биттәрҙә эшләнгән һуңғы үҙгәртеүҙәр исемлеге',
+'recentchanges-noresult' => 'Был осорҙа тейешле шарттарға тап килгән үҙгәрештәр юҡ.',
 'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға',
 'recentchanges-label-newpage' => 'Был үҙгәртеү яңы бит яһаны',
 'recentchanges-label-minor' => 'Был әҙ үҙгәреш',
@@ -1501,7 +1592,7 @@ $1",
 'rc_categories_any' => 'Һәр',
 'rc-change-size-new' => 'Үҙгәртештән һуң $1 {{PLURAL:$1|байт|байт}}',
 'newsectionsummary' => '/* $1 */ яңы бүлек',
-'rc-enhanced-expand' => 'Ваҡлыҡтарҙы күрһәтергә (JavaScript кәрәкле)',
+'rc-enhanced-expand' => 'Ваҡ-төйәгенә тиклем күрһәтергә',
 'rc-enhanced-hide' => 'Ваҡлыҡтарҙы йәшерергә',
 'rc-old-title' => 'төп нөхсә исеме "$1"',
 
@@ -1521,7 +1612,7 @@ $1",
 'reuploaddesc' => 'Тейәү формаһына кире ҡайтырға',
 'upload-tryagain' => 'Файлдың үҙгәртелгән  тасуирламаһын ебәрергә',
 'uploadnologin' => 'Танылмағанһығыҙ',
-'uploadnologintext' => 'ФайлдаÑ\80 Ñ\82ейÓ\99Ò¯ Ó©Ñ\81өн, Ò»ÐµÒ\99гÓ\99 [[Special:UserLogin|Ñ\82анÑ\8bлÑ\8bÑ\80Ò\93а]] ÐºÓ\99Ñ\80Ó\99к.',
+'uploadnologintext' => 'СеÑ\80веÑ\80Ò\93а Ñ\84айлдаÑ\80 Ñ\82ейÓ\99Ò¯ Ó©Ñ\81өн Ò»ÐµÒ\99 Ñ\82ейеÑ\88һегеÒ\99 $1',
 'upload_directory_missing' => 'Тейәү өсөн директория ($1) юҡ йәки веб-сервер уны булдыра алмай.',
 'upload_directory_read_only' => 'Тейәү өсөн директорияға ($1) веб-сервер яҙҙыра алмай.',
 'uploaderror' => 'Тейәү хатаһы',
@@ -1760,8 +1851,7 @@ $1',
 'upload_source_file' => '(һеҙҙең компьютерҙағы файл)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Был махсус бит бөтә тейәлгән файлдарҙы күрһәтә.
-Ҡулланыусыға күрә һайланһа, был ҡулланыусының һуңғы файл өҫтәүҙәре генә күрһәтелә.',
+'listfiles-summary' => 'Был ярҙамсы бит бөтә тейәлгән файлдарҙы күрһәтә.',
 'listfiles_search_for' => 'Файл исеме буйынса эҙләү:',
 'imgfile' => 'файл',
 'listfiles' => 'Файлдар исемлеге',
@@ -1772,6 +1862,10 @@ $1',
 'listfiles_size' => 'Күләм',
 'listfiles_description' => 'Тасуирлау',
 'listfiles_count' => 'Версиялар',
+'listfiles-show-all' => 'Рәсемдәрҙең иҫке версияларын индерергә',
+'listfiles-latestversion' => 'Ағымдағы версия',
+'listfiles-latestversion-yes' => 'Эйе',
+'listfiles-latestversion-no' => 'Юҡ',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1868,6 +1962,13 @@ $1',
 'randompage' => 'Осраҡлы мәҡәлә',
 'randompage-nopages' => 'Түбәндәге {{PLURAL:$2|исемдәр арауығында|исемдәр арауыҡтарында}} биттәр юҡ: $1.',
 
+# Random page in category
+'randomincategory' => 'Категориялағы осраҡлы бит',
+'randomincategory-invalidcategory' => '$1 тигән категория юҡ.',
+'randomincategory-nopages' => '[[:Category:$1|$1]] категорияһында биттәр юҡ.',
+'randomincategory-selectcategory' => '$1 $2 категорияһынан осраҡлы биткә күсергә.',
+'randomincategory-selectcategory-submit' => 'Күсергә',
+
 # Random redirect
 'randomredirect' => 'Осраҡлы биткә күсеү',
 'randomredirect-nopages' => '"$1" исемдәр арауығында йүнәлтеүҙәр юҡ.',
@@ -1893,6 +1994,14 @@ $1',
 'statistics-users-active-desc' => 'Һуңғы {{PLURAL:$1|көндә|$1 көндә}} ниндәйҙер эшмәкәрлек башҡарған ҡатнашыусылар',
 'statistics-mostpopular' => 'Иң күп ҡаралған биттәр',
 
+'pageswithprop' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр',
+'pageswithprop-legend' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр',
+'pageswithprop-text' => 'Бында айырым үҙенсәлектәре ҡулдан яңыртып билдәләнгән биттәр һанала.',
+'pageswithprop-prop' => 'Үҙенсәлектең атамаһы:',
+'pageswithprop-submit' => 'Табырға',
+'pageswithprop-prophidden-long' => 'Текст үҙенсәлегенең оҙон мәғәнәһе йәшерелгән ($1)',
+'pageswithprop-prophidden-binary' => 'ике тармаҡлы үҙенсәлектең мәғәнәһе йәшерелгән ($1)',
+
 'doubleredirects' => 'Икеле йүнәлтеүҙәр',
 'doubleredirectstext' => 'Был биттә икенсе йүнәлтеү биттәренә йүнәлткән биттәр исемлеге килтерелгән.
 Һәр юл беренсе һәм икенсе йүнәлтеүгә һылтанманан, шулай уҡ икенсе һылтанма йүнәлткән һәм беренсе йүнәлтмә һылтанма яһарға тейеш булған биттән  тора.
@@ -1950,6 +2059,7 @@ $1',
 'mostrevisions' => 'Иң күп үҙгәртеү яһалған биттәр',
 'prefixindex' => 'Исемдәре башында ҡушымта торған биттәр',
 'prefixindex-namespace' => 'Префикслы бар биттәр ( $1 исемдәр арауығы)',
+'prefixindex-strip' => 'Һөҙөмтәләр исемлегендә префиксты йәшерергә',
 'shortpages' => 'Ҡыҫҡа биттәр',
 'longpages' => 'Оҙон биттәр',
 'deadendpages' => 'Көрсөк биттәр',
@@ -1965,6 +2075,7 @@ $1',
 'listusers' => 'Ҡатнашыусылар исемлеге',
 'listusers-editsonly' => 'Кәмендә бер үҙгәртеү индергән ҡатнашыусыларҙы ғына күрһәтергә',
 'listusers-creationsort' => 'Булдырыу көнө буйынса тәртипкә килтерергә',
+'listusers-desc' => 'Кәмеү буйынса айырырға',
 'usereditcount' => '$1 {{PLURAL:$1|үҙгәртеү}}',
 'usercreated' => '$3 ҡулланыусыһының теркәлеү ваҡыты: $1 $2',
 'newpages' => 'Яңы биттәр',
@@ -2045,8 +2156,8 @@ $1',
 'linksearch-ns' => 'Исемдәр арауығы:',
 'linksearch-ok' => 'Эҙләү',
 'linksearch-text' => '<code>*.wikipedia.org</code> һымаҡ төркөм билдәләрен ҡулланырға була.
-Кәмендә, өҫкө кимәл домен кәрәк. Мәҫәлән, <code>*.org</code><br />
-Мөмкин булған протоколдар: <code>$1</code> (бер протокол да күрһәтелмәһә, http:// ҡулланыла)',
+Кәмендә өҫкө кимәл домен кәрәк, мәҫәлән, <code>*.org</code><br />
+Мөмкин булған{{PLURAL:$2|протокол|протоколдар}}: <code>$1</code> (башҡа протокол өҫтәлмәһә, алдан бирелгәне индерелә http://).',
 'linksearch-line' => '$1 адресына $2 битенән һылтанма яһалған',
 'linksearch-error' => 'Төркөм билдәләре URL адрестың башында ғына ҡулланыла ала.',
 
@@ -2059,7 +2170,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => 'Әүҙем ҡатнашыусылар исемлеге',
 'activeusers-intro' => 'Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.',
-'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендә $1 {{PLURAL:$1|үҙгәртеү}}',
+'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендәге һуңғы көндә $1 {{PLURAL:$1|үҙгәртеү}}',
 'activeusers-from' => 'Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:',
 'activeusers-hidebots' => 'Боттарҙы йәшерергә',
 'activeusers-hidesysops' => 'Хакимдәрҙе йәшерергә',
@@ -2069,7 +2180,8 @@ $1',
 'listgrouprights' => 'Ҡатнашыусылар төркөмө хоҡуҡтары',
 'listgrouprights-summary' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.
 Шәхси хоҡуҡтар тураһында [[{{MediaWiki:Listgrouprights-helppage}}|өҫтәмә мәғлүмәт]] булыуы мөмкин.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Бирелгән хоҡуҡтар</span>
+'listgrouprights-key' => 'Легенда:
+* <span class="listgrouprights-granted">Бирелгән хоҡуҡтар</span>
 * <span class="listgrouprights-revoked">Алынған хоҡуҡтар</span>',
 'listgrouprights-group' => 'Төркөм',
 'listgrouprights-rights' => 'Хоҡуҡтар',
@@ -2140,8 +2252,8 @@ $1',
 'unwatchthispage' => 'Күҙәтеүҙе туҡтатырға',
 'notanarticle' => 'Мәҡәлә түгел',
 'notvisiblerev' => 'Башҡа ҡатнашыусы тарафынан керетелгән һуңғы өлгө юйылған',
-'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит|$1 бит}} бар.',
-'wlheader-enotif' => 'Электрон почта аша белдереү һайланған',
+'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит}} бар.',
+'wlheader-enotif' => 'Электрон почта аша белдереү индерелгән.',
 'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
 'watchmethod-recent' => 'күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау',
 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау',
@@ -2226,9 +2338,11 @@ $UNWATCHURL
 'deleteotherreason' => 'Башҡа/өҫтәмә сәбәп:',
 'deletereasonotherlist' => 'Башҡа сәбәп',
 'deletereason-dropdown' => '* Ғәҙәттәге юйыу сәбәптәре
-** Автор һорауы буйынса
-** Авторлыҡ хоҡуҡтарын боҙоу
-** Вандаллыҡ',
+**спам
+**емереү
+**авторлыҡ хоҡуҡтарын боҙоу
+**автор үтенесе буйынса
+**эшләмәгән ҡайтанан йүнәлтеү',
 'delete-edit-reasonlist' => 'Сәбәптәр исемлеген мөхәррирләргә',
 'delete-toobig' => 'Был биттең үҙгәртеүҙәр тарихы бик оҙон, $1 {{PLURAL:$1|өлгөнән}} күберәк.
 {{SITENAME}} проектының эшмәкәрлеге боҙолмауы маҡсатында бындай биттәрҙе юйыу тыйылған.',
@@ -2248,7 +2362,7 @@ $UNWATCHURL
 Һуңғы үҙгәртеүҙәрҙе [[User:$3|$3]] ([[User talk:$3| фекер алышыу]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) кереткән.',
 'editcomment' => "Үҙгәртеүҙең тасуирламаһы \"''\$1''\" ине.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|фекер алышыу]]) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды',
-'revertpage-nouser' => '(Ҡатнашыусының исеме юйылған) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды',
+'revertpage-nouser' => '(Ҡатнашыусының исеме йәшерелгән) үҙгәртеүҙәре {{GENDER:$1|[[User:$1|$1]]}}өлгөһөнә ҡайтарылды',
 'rollback-success' => '$1 уҙгәртеүҙәре кире алдынды;
 $2 өлгөһөнә ҡайтыу.',
 
@@ -2271,6 +2385,8 @@ $2 өлгөһөнә ҡайтыу.',
 'prot_1movedto2' => '[[$1]] битенең исемен [[$2]] тип үҙгәрткән',
 'protect-badnamespace-title' => 'Һаҡланмаған исемдәр арауығы',
 'protect-badnamespace-text' => 'Был исемдәр арауығындағы биттәрҙе һаҡлап булмай.',
+'protect-norestrictiontypes-text' => 'Был бит һаҡлана алмай, сөнки уға сикләүҙәрҙең рөхсәт ителгән төрҙәре юҡ.',
+'protect-norestrictiontypes-title' => 'Һаҡланмаған бит',
 'protect-legend' => 'Битте һаҡлауҙы раҫлау',
 'protectcomment' => 'Сәбәп:',
 'protectexpiry' => 'Тамамлана:',
@@ -2285,8 +2401,8 @@ $2 өлгөһөнә ҡайтыу.',
 'protect-locked-access' => "Биттең һаҡлау дәрәжеһен үҙгәртер өсөн иҫәп яҙыуығыҙҙың хоҡуҡтары етәрле түгел. '''$1''' битенең хәҙерге һаҡлау көйләүҙәре:",
 'protect-cascadeon' => 'Был бит һаҡланған, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|биткә|биттәргә}} керә. Һеҙ был биттең һаҡлау дәрәжәһен үҙгәртә алаһығыҙ, ләкин был эҙмә-эҙлекле һаҡлауға йоғонто яһамаясаҡ.',
 'protect-default' => 'Бар ҡулланыусыларға рөхсәт бирергә',
-'protect-fallback' => '«$1» Ñ\80Ó©Ñ\85Ñ\81Ó\99Ñ\82е ÐºÓ\99Ñ\80Ó\99к',
-'protect-level-autoconfirmed' => 'Яңы һәм теркәлмәгән ҡулланыусыларҙан һаҡларға',
+'protect-fallback' => '«$1» Ñ\85оҡÑ\83ҡлÑ\8b Ò¡Ð°Ñ\82наÑ\88Ñ\8bÑ\83Ñ\81Ñ\8bлаÑ\80Ò\93а Ò\93Ñ\8bна Ñ\80Ó©Ñ\85Ñ\81Ó\99Ñ\82е Ð¸Ñ\82елгÓ\99н',
+'protect-level-autoconfirmed' => 'Үҙенән-үҙе раҫланған ҡатнашыусыларға ғына рөхсәт ителгән',
 'protect-level-sysop' => 'Хакимдәр генә',
 'protect-summary-cascade' => 'эҙмә-эҙлекле',
 'protect-expiring' => '$1 бөтә (UTC)',
@@ -2390,9 +2506,9 @@ $1',
 'contributions' => '{{GENDER:$1|Ҡатнашыусы}} өлөшө',
 'contributions-title' => '$1 исемле ҡулланыусының кереткән өлөшө',
 'mycontris' => 'Өлөш',
-'contribsub2' => '$1 ($2) өсөн',
+'contribsub2' => '{{GENDER:$3|$1}} өлөшө ($2)',
 'nocontribs' => 'Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.',
-'uctop' => '(аÒ\99аҡҡы)',
+'uctop' => '(аÒ\93Ñ\8bмдаÒ\93ы)',
 'month' => 'Айҙан башлап (һәм элегерәк):',
 'year' => 'Йылдан башлап (һәм элегерәк):',
 
@@ -2551,15 +2667,13 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 Әммә ул $2 бикләү арауығына керә һәм был арауыҡтың биге алына ала.',
 'ip_range_invalid' => 'IP адрестар арауығы дөрөҫ түгел.',
 'ip_range_toolarge' => '/$1 арауығынан ҙурыраҡ адрестар арауығын бикләү рөхсәт ителмәй.',
-'blockme' => 'Мине биклә',
 'proxyblocker' => 'Проксины бикләү',
-'proxyblocker-disabled' => 'Был мөмкинлек һүндерелгән.',
 'proxyblockreason' => 'Һеҙҙең IP адресығыҙ бикләнгән, сөнки ул — асыҡ прокси.
 Зинһар, Интернет менән тәъмин итеүсегеҙгә йәки ярҙам хеҙмәтенә мөрәжәғәт итегеҙ һәм уларға был едти хәүефһеҙлек хатаһы тураһында хәбәр итегеҙ.',
-'proxyblocksuccess' => 'Үтәлде',
 'sorbsreason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә.',
 'sorbs_create_account_reason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә.
 Һеҙ иҫәп яҙмаһы булдыра алмайһығыҙ.',
+'xffblockreason' => 'X-Forwarded-For атамаһы эсенә ингән һәм һеҙҙекеме, һеҙ ҡулланған прокси-серверҙыҡымы булған IP-адрес бикләнде. Бикләүҙең тәүсәбәбе ошо ине: $1',
 'cant-block-while-blocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыусыларҙы бикләй алмайһығыҙ.',
 'cant-see-hidden-user' => 'Һеҙ бикләргә тырышҡан ҡатнашыусы әлеге ваҡытта бикләнгән һәм йәшерелгән.
 Ҡатнашыусыларҙы йәшереү хоҡуғығыҙ булмағанға күрә, һеҙ был бикләүҙе ҡарай йәки үҙгәртә алмайһығыҙ.',
@@ -2591,18 +2705,18 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 # Move page
 'move-page' => '$1 — исемен үҙгәртеү',
 'move-page-legend' => 'Биттең исемен үҙгәртеү',
-'movepagetext' => "Аҫтағы Ñ\84оÑ\80манÑ\8b Ò¡Ñ\83лланÑ\8bÑ\83 Ð±Ð¸Ñ\82Ñ\82ең Ð¸Ñ\81емен Ò¯Ò\99гÓ\99Ñ\80Ñ\82Ó\99 Ò»Ó\99м Ñ\83нÑ\8bÒ£ Ò¯Ò\99гÓ\99Ñ\80Ñ\82еүÒ\99Ó\99Ñ\80 Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8b Ñ\83Ñ\80Ñ\8bнÒ\93а ÐºÒ¯Ñ\81еÑ\80Ó\99.
+'movepagetext' => "Аҫтағы Ò¡Ð°Ð»Ñ\8bпÑ\82Ñ\8b Ò¡Ñ\83лланÑ\8bп, Ð±Ð¸Ñ\82Ñ\82ең Ð¸Ñ\81емен Ò¯Ò\99гÓ\99Ñ\80Ñ\82Ó\99 Ò»Ó\99м Ñ\83нÑ\8bÒ£ Ò¯Ò\99гÓ\99Ñ\80Ñ\82еүÒ\99Ó\99Ñ\80 Ð¶Ñ\83Ñ\80налÑ\8bн Ñ\8fÒ£Ñ\8b Ñ\83Ñ\80Ñ\8bнÒ\93а ÐºÒ¯Ñ\81еÑ\80Ó\99 Ð°Ð»Ð°Ò»Ñ\8bÒ\93Ñ\8bÒ\99.
 Биттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ.
-Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыз.
-Әгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәрҙе]] тикшерегеҙ.
-Һылтанмаларҙың кәрәкле урынға күрһәтеүҙәренең дауам итеүе өсөн һеҙ яуаплы.
+Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыҙ.
+Әгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәр]] барлығын тикшерегеҙ.
+Һылтанмаларҙың кәрәкле урынға күрһәтеүен дауам итеүе өсөн һеҙ яуаплы.
 
-Иғтибар итегеҙ, әгәр яңы исемле бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; элекке бит йүнәлтеү, буш һәм үҙгәртеү тарихына эйә булмаған осраҡтарҙан башҡа.
\91Ñ\8bл Ñ\88Ñ\83нÑ\8b Ð°Ò£Ð»Ð°Ñ\82а: Ð±Ð¸Ñ\82 Ð¸Ñ\81емен Ñ\8fÒ£Ñ\8bлÑ\8bÑ\88 Ò¯Ò\99гÓ\99Ñ\80Ñ\82Ò»Ó\99геÒ\99, Ð±Ð¸Ñ\82Ñ\82е кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ.
+Иғтибар итегеҙ: әгәр яңы һайланған исемдәге тағы бер бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; ул бит йүнәлтеүсе  йәки буш булһа һәм төҙәтеүҙәр тарихына эйә булмаһа ғына,  был мөмкин.
¢Ð¸Ð¼Ó\99к, Ð±Ð¸Ñ\82Ñ\82ең Ð¸Ñ\81емен Ñ\8fÒ£Ñ\8bлÑ\8bÑ\88 Ò¯Ò\99гÓ\99Ñ\80Ñ\82Ò»Ó\99геÒ\99, Ð±Ð¸Ñ\82Ñ\82е Ñ\8dлекке Ð¸Ñ\81еменÓ\99 кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ.
 
-'''Ð\98Ò\93Ñ\82ибаÑ\80!'''
-Популяр биттәрҙең исемен үҙгәртеү көтмәгән һөҙөмтәләргә килтерергә мөмкин.
\94аÑ\83ам Ð¸Ñ\82еÑ\80Ò\99Ó\99н Ð°Ð»Ð´Ð°, Ð±Ó©Ñ\82Ó\99 Ð±Ñ\83лаÑ\81аҡ Ò»Ó©Ò\99өмÑ\82Ó\99лÓ\99Ñ\80Ò\99е Ð°Ò£Ð»Ð°Ñ\83Ñ\8bÒ\93Ñ\8bÒ\99Ò\99Ñ\8b Ñ\83йлағыҙ.",
+'''Ð\98ҫкÓ\99Ñ\80Ñ\82еү!'''
+\"Популяр\" биттәрҙең исемен үҙгәртеү күләмле һәм көтөлмәгән һөҙөмтәләргә килтерергә мөмкин.
\94аÑ\83ам Ð¸Ñ\82еÑ\80Ò\99Ó\99н Ð°Ð»Ð´Ð°, Ð¸Ñ\85Ñ\82имал Ð±Ñ\83лÒ\93ан Ò»Ó©Ò\99өмÑ\82Ó\99лÓ\99Ñ\80Ò\99е Ð°Ò£Ð»Ð°Ñ\83Ñ\8bÒ\93Ñ\8bÒ\99Ò\93а Ñ\8bÑ\88анÑ\8bғыҙ.",
 'movepagetext-noredirectfixer' => "Аҫтағы форманы ҡулланыу биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр яҙмаһын яңы урынға күсерә.
 Биттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ.
 Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыз.
@@ -2721,6 +2835,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'thumbnail-more' => 'Ҙурайтырға',
 'filemissing' => 'Файл юҡ',
 'thumbnail_error' => 'Шартлы рәсем булдырыу хатаһы: $1',
+'thumbnail_error_remote' => '$1 хата тураһында хәбәр итә:
+$2',
 'djvu_page_error' => 'DjVu битенең һаны биттәр һанынан ашҡан',
 'djvu_no_xml' => 'DjVu файлы өсөн XML сығарып булмай',
 'thumbnail-temp-create' => 'Эскиздың ваҡытлыса файлын яһап булмай',
@@ -2910,12 +3026,13 @@ The wiki server cannot provide data in a format your client can read.',
 'pageinfo-length' => 'Бит оҙонлоғо (байттарҙа)',
 'pageinfo-article-id' => 'Бит идентификаторы',
 'pageinfo-language' => 'Бит эстәлегенең теле',
-'pageinfo-robot-policy' => 'ЭÒ\99лÓ\99Ò¯ Ñ\85еÒ\99мÓ\99Ñ\82Ñ\82Ó\99Ñ\80е Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81Ñ\8b',
-'pageinfo-robot-index' => 'Ð\98ндекÑ\81лана',
-'pageinfo-robot-noindex' => 'Ð\98ндекÑ\81ланмай',
+'pageinfo-robot-policy' => 'ЭÒ\99лÓ\99Ò¯ Ñ\80обоÑ\82Ñ\82аÑ\80Ñ\8b Ñ\82аÑ\80аÑ\84Ñ\8bнан Ð¸Ð½Ð´ÐµÐºÑ\81аÑ\86иÑ\8fланÑ\8bÑ\83',
+'pageinfo-robot-index' => 'РөÑ\85Ñ\81Ó\99Ñ\82 Ð¸Ñ\82елгÓ\99н',
+'pageinfo-robot-noindex' => 'РөÑ\85Ñ\81Ó\99Ñ\82 Ð¸Ñ\82елмÓ\99й',
 'pageinfo-views' => 'Ҡарау һаны',
 'pageinfo-watchers' => 'Битте күҙәтеүселәр һаны',
-'pageinfo-redirects-name' => 'Был биткә йүнәлтеүҙәр',
+'pageinfo-few-watchers' => 'Күп тигәндә $1 {{PLURAL:$1|күҙәтеүсе}}',
+'pageinfo-redirects-name' => 'Был биткә йүнәлтеүҙәр һаны',
 'pageinfo-subpages-name' => 'Был биттең эске биттәре',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|йүнәлтеү}}; $3 {{PLURAL:$3|ябай}})',
 'pageinfo-firstuser' => 'Битте яһаусы',
@@ -2929,6 +3046,7 @@ The wiki server cannot provide data in a format your client can read.',
 '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' => 'мәғлүмәт',
@@ -2937,6 +3055,10 @@ The wiki server cannot provide data in a format your client can read.',
 'pageinfo-protect-cascading' => 'Бынан башлап һикәлтәле һаҡлау',
 'pageinfo-protect-cascading-yes' => 'Эйе',
 'pageinfo-protect-cascading-from' => 'Бынан башлап һикәлтәле һаҡлау',
+'pageinfo-category-info' => 'Категория тураһында мәғлүмәт',
+'pageinfo-category-pages' => 'Биттәр һаны',
+'pageinfo-category-subcats' => 'Категория бүлемдәре һаны',
+'pageinfo-category-files' => 'Файлдар һаны',
 
 # Skin names
 'skinname-cologneblue' => 'Кёльн һағышы',
@@ -3019,9 +3141,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 сәғәт|$1 сәғәт}}',
 'days' => '{{PLURAL:$1|$1 көн|$1 көн}}',
+'weeks' => '{{PLURAL:$1|$1 аҙна|$1 аҙна|}}',
+'months' => '{{PLURAL:$1|$1 ай}}',
+'years' => '{{PLURAL:$1|$1 йыл}}',
 'ago' => '$1 элек',
 'just-now' => 'яңы ғына',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|сәғәт}} элек',
+'minutes-ago' => '$1 {{PLURAL:$1|минут}} элек',
+'seconds-ago' => '$1 {{PLURAL:$1|секунд}} элек',
+'monday-at' => 'дүшәмбе $1',
+'tuesday-at' => 'шишәмбе $1',
+'wednesday-at' => 'шаршамбы $1',
+'thursday-at' => 'кесе йома $1',
+'friday-at' => 'йома $1',
+'saturday-at' => 'шәмбе $1',
+'sunday-at' => 'йәкшәмбе $1',
+'yesterday-at' => 'Кисә $1',
+
 # Bad image list
 'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш:
 
@@ -3234,7 +3372,7 @@ $1',
 'exif-compression-4' => 'CCITT Group 4, факслы кодлау',
 
 'exif-copyrighted-true' => 'Авторлыҡ хоҡуҡтары менән һаҡлана',
-'exif-copyrighted-false' => 'Ð\94өйөм Ð¼Ð¸Ð»ÐµÐº',
+'exif-copyrighted-false' => 'Ð\90вÑ\82оÑ\80лÑ\8bÒ¡-Ñ\85оҡÑ\83ҡи Ñ\81Ñ\82аÑ\82Ñ\83Ñ\81 Ð¸Ð½Ð´ÐµÑ\80елмÓ\99гÓ\99н',
 
 'exif-unknowndate' => 'Билдәһеҙ көн',
 
@@ -3498,11 +3636,10 @@ $3
 $5
 
 Был раҫлау коды $4 ғәмәлдән сыға.',
-'confirmemail_body_set' => 'Кемдер, бәлки һеҙҙер, $1 IP адресынан 
-{{SITENAME}}  проектында "$2" иҫәп яҙмаһының электрон почта адресын ошо адрес итеп билдәләгән.
+'confirmemail_body_set' => 'Кемдер (бәлки, һеҙҙер) $1 IP-адресынан 
+{{SITENAME}}  проектында "$2" иҫәп яҙмаһының электрон почта адресы итеп ошо адресты күрһәткән.
 
-Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм
-{{SITENAME}} проектында электрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
+Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау һәм {{SITENAME}} сайтынан хат ебәреү мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
 
 $3
 
@@ -3628,6 +3765,7 @@ $5
 'version-license' => 'Рөхсәтнамә',
 'version-poweredby-credits' => "Был вики проект '''[//www.mediawiki.org/ MediaWiki]''' нигеҙендә эшләй, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'башҡалар',
+'version-poweredby-translators' => 'translatewiki.net тәржемәселәре',
 'version-credits-summary' => '[[Special:Version|MediaWiki]] үҫешенә өлөш индергәндәре өсөн киләһе ҡатнашыусыларға рәхмәт әйтәбеҙ.',
 'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License рөхсәтнамәһенә ярашлы тарата һәм/йәки үҙгәртә алаһығыҙ (рөхсәтнамәнең йә исенсе өлгөһө, йә унан һуңғы өлгөләре).
 
@@ -3641,6 +3779,18 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-entrypoints-header-entrypoint' => 'Инеш урыны',
 'version-entrypoints-header-url' => 'URL',
 
+# Special:Redirect
+'redirect' => 'Файлдан, файҙаланыусынан йә версияның тиңләштереүсеһенән артабан йүнәлтеү',
+'redirect-legend' => 'Файлға йәки биткә йүнәлтеү',
+'redirect-summary' => 'Был махсус бит файлға (файлдың исеменән), биткә (версияның тиңләштереүсеһенән) йәки ҡатнашыусының битенә (ҡатнашыусының һанлы тиңләштереүсеһенән) йүнәлтә.',
+'redirect-submit' => 'Күсергә',
+'redirect-lookup' => 'Эҙләү',
+'redirect-value' => 'Мәғәнәһе:',
+'redirect-user' => 'Ҡатнашыусының тиңләштереүсеһе',
+'redirect-revision' => 'Биттең версияһы',
+'redirect-file' => 'Файлдың исеме',
+'redirect-not-exists' => 'Мәғәнәһе табылманы',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер иш файлдарҙы эҙләү',
 'fileduplicatesearch-summary' => 'Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.',
@@ -3667,7 +3817,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'specialpages-group-highuse' => 'Йыш ҡулланылған биттәр',
 'specialpages-group-pages' => 'Биттәр исемлеге',
 'specialpages-group-pagetools' => 'Биттәр өсөн ҡоралдар',
-'specialpages-group-wiki' => 'Ð\92ики Ð¼Ó\99Ò\93лүмÓ\99Ñ\82 һәм ҡоралдар',
+'specialpages-group-wiki' => 'Ð\9cÓ\99Ò\93лүмÓ\99Ñ\82Ñ\82Ó\99Ñ\80 һәм ҡоралдар',
 'specialpages-group-redirects' => 'Йүнәлтеүсе махсус биттәр',
 'specialpages-group-spam' => 'Спамға ҡаршы ҡоралдар',
 
@@ -3689,12 +3839,16 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'tags' => 'Ҡулланылған үҙгәртеү билдәләре',
 'tag-filter' => '[[Special:Tags|Билдәләрҙе]] һайлау:',
 'tag-filter-submit' => 'Һайлау',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тамғалар}}]]: $2)',
 'tags-title' => 'Билдәләр',
 'tags-intro' => 'Был биттә программа үҙгәртеүҙәрҙе билдәләү өсөн ҡулланған билдәләр һәм уларҙың мәғәнәләре исемлеге килтерелгән.',
 'tags-tag' => 'Билдә исеме',
 'tags-display-header' => 'Үҙгәртеүҙәр исемлегендә күрһәтеү',
 'tags-description-header' => 'Мәғәнәһенең тулы тасуирламаһы',
+'tags-active-header' => 'Әүҙемме?',
 'tags-hitcount-header' => 'Билдәләнгән үҙгәртеүҙәр',
+'tags-active-yes' => 'Эйе',
+'tags-active-no' => 'Юҡ',
 'tags-edit' => 'үҙгәртергә',
 'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
 
@@ -3715,6 +3869,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'dberr-problems' => 'Ғәфү итегеҙ! Был сайтта техник ҡыйынлыҡтар тыуҙы.',
 'dberr-again' => 'Битте бер нисә минуттан яңыртып ҡарағыҙ.',
 'dberr-info' => '(Мәғлүмәттәр базаһы серверы менән тоташтырылып булмай: $1)',
+'dberr-info-hidden' => '(Мәғлүмәт базаларының серверына тоташып булмай)',
 'dberr-usegoogle' => 'Әлегә һеҙ Google ярҙамында эҙләп ҡарай алһығыҙ.',
 'dberr-outofdate' => 'Әммә уның индекстары иҫекргән булыуы мөмкинлеген күҙ уңында тотоғоҙ.',
 'dberr-cachederror' => 'Түбәндә һоралған биттең кэшта һаҡланған өлгөһө күрһәтелгән, унда аҙаҡҡы үҙгәртеүҙәр булмауы мөмкин.',
@@ -3730,23 +3885,26 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'htmlform-submit' => 'Ебәрергә',
 'htmlform-reset' => 'Үҙгәртеүҙәрҙе кире алырға',
 'htmlform-selectorother-other' => 'Башҡа',
+'htmlform-no' => 'Юҡ',
+'htmlform-yes' => 'Эйе',
+'htmlform-chosen-placeholder' => 'Вариант һайлағыҙ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, тулы текст буйынса эҙләү мөмкинлеге менән',
 'sqlite-no-fts' => '$1, тулы текст буйынса эҙләү мөмкинлекһеҙ',
 
 # New logging system
-'logentry-delete-delete' => '$1 $3 битен юйҙы',
-'logentry-delete-restore' => '$1 $3 битен тергеҙҙе',
-'logentry-delete-event' => '$1 {{PLURAL:$5|$5 журнал яҙмаһының|$5 журнал яҙмаһының}} күренеүсәнлеген $3 битендә үҙгәртте: $4',
-'logentry-delete-revision' => '$1 {{PLURAL:$5|$5 версияның|$5 версияның}} күренеүсәнлеген $3 битендә үҙгәртте: $4',
-'logentry-delete-event-legacy' => '$1 $3 журнал яҙмаһының күренеүсәнлеген үҙгәртте',
-'logentry-delete-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген үҙгәртте',
-'logentry-suppress-delete' => '$1 $3 битен йәшерҙе',
-'logentry-suppress-event' => '$1 {{PLURAL:$5|$5 журнал яҙмаһының|$5 журнал яҙмаһының}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4',
-'logentry-suppress-revision' => '$1 {{PLURAL:$5|$5 версияның|$5 версияның}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4',
-'logentry-suppress-event-legacy' => '$1 $3 журнал яҙмаһының күренеүсәнлеген йәшерен үҙгәртте',
-'logentry-suppress-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген йәшерен үҙгәртте',
+'logentry-delete-delete' => '$1 $3 битен {{GENDER:$2|юйҙы}}',
+'logentry-delete-restore' => '$1 $3 битен {{GENDER:$2|тергеҙҙе}}',
+'logentry-delete-event' => '$1 журналдағы {{PLURAL:$5|яҙманы}} $3: $4 {{GENDER:$2|үҙгәртте}}',
+'logentry-delete-revision' => '$1 {{PLURAL:$5|$5 версияның}} күренеүсәнлеген   $3: $4 битендә {{GENDER:$2|үҙгәртте}}',
+'logentry-delete-event-legacy' => '$1  $3 журналы яҙмаларының күренеүсәнлеген {{GENDER:$2|үҙгәртте}}',
+'logentry-delete-revision-legacy' => '$1  $3 битендә версияларҙың күренеүсәнлеген {{GENDER:$2|үҙгәртте}}',
+'logentry-suppress-delete' => '$1 $3 битен {{GENDER:$2|баҫырылдырҙы}}',
+'logentry-suppress-event' => '$1 журналдағы {{PLURAL:$5|$5 яҙманың}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4',
+'logentry-suppress-revision' => '$1 {{PLURAL:$5|$5 версияның}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4',
+'logentry-suppress-event-legacy' => '$1  журнал яҙмаларының күренеүсәнлеген йәшерен  {{GENDER:$2|үҙгәртте}}$3',
+'logentry-suppress-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген йәшерен {{GENDER:$2|}}',
 'revdelete-content-hid' => 'эстәлек йәшерелгән',
 'revdelete-summary-hid' => 'төҙәтеү аңлатмаһы йәшерелде',
 'revdelete-uname-hid' => 'ҡатнашыусы исеме йәшерелгән',
@@ -3755,19 +3913,20 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'revdelete-uname-unhid' => 'ҡатнашыусы исеме күрһәтелде',
 'revdelete-restricted' => 'хакимдәргә ҡаршы ҡулланылған сикләүҙәр',
 'revdelete-unrestricted' => 'хакимдәрҙән алынған сикләүҙәр',
-'logentry-move-move' => '$1 $3 битенең исемен үҙгәртте. Яңы исеме: $4',
-'logentry-move-move-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса үҙгәртте. Яңы исеме: $4',
-'logentry-move-move_redir' => '$1 $3 битенең исемен йүнәлтеү өҫтөнән үҙгәртте. Яңы исеме: $4',
-'logentry-move-move_redir-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса һәм йүнәлтеү өҫтөнән үҙгәртте. Яңы исеме: $4',
-'logentry-patrol-patrol' => '$1 $3 битенең $4 версияһын билдәләне.',
-'logentry-patrol-patrol-auto' => '$1 $3 битенең $4 версияһын автоматик рәүештә билдәләне.',
-'logentry-newusers-newusers' => '$1 ҡатнашыусыһының иҫәп яҙмаһы булдырылды',
-'logentry-newusers-create' => '$1 ҡатнашыусыһының иҫәп яҙмаһы булдырылды',
-'logentry-newusers-create2' => '$3 ҡатнашыусыһының иҫәп яҙмаһы $1 тарафынан булдырылды',
-'logentry-newusers-autocreate' => 'Автоматик рәүештә $1 иҫәп яҙыуы яһалды',
-'logentry-rights-rights' => '$1 $3 ҡулланыусыһының төркөмдәрҙәге ағзалығын $4 икән, $5 тип үҙгәртте',
-'logentry-rights-rights-legacy' => '$1 $3 ҡулланыусыһының төркөм ағзалығын үҙгәртте',
-'logentry-rights-autopromote' => '$1 автоматик рәүештә $2 икән, $3 ителде.',
+'logentry-move-move' => '$1  $3 битенең исемен {{GENDER:$2| үҙгәртте}}. Яңы исеме: $4',
+'logentry-move-move-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4',
+'logentry-move-move_redir' => '$1 $3 битенең исемен йүнәлтеү өҫтөнән {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4',
+'logentry-move-move_redir-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса һәм йүнәлтеү өҫтөнән {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4',
+'logentry-patrol-patrol' => '$1 $3 битенең $4 версияһын {{GENDER:$2|тикшерҙе}}.',
+'logentry-patrol-patrol-auto' => '$1 $3 битенең $4 версияһын автоматик рәүештә {{GENDER:$2|тикшерҙе}}.',
+'logentry-newusers-newusers' => ' {{GENDER:$2|ҡатнашыусы}} $1 иҫәп яҙмаһы булдырҙы',
+'logentry-newusers-create' => '{{GENDER:$2|ҡатнашыусы}} $1 иҫәп яҙмаһы булдырҙы.',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|ҡатнашыусы}} $3 иҫәп яҙмаһын булдырҙы',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|}} $3 иҫәп яҙмаһын булдырҙы һәм серһүҙ электрон почта аша ебәрелде',
+'logentry-newusers-autocreate' => 'Автоматик рәүештә {{GENDER:$2| ҡатнашыусының}} $1 иҫәп яҙмаһы яһалды',
+'logentry-rights-rights' => '$1  $3 файҙаланыусының төркөмдәрҙәге ағзалығын $4 урынына $5 тип {{GENDER:$2|үҙгәртте}}',
+'logentry-rights-rights-legacy' => '$1  $3 өсөн төркөмдәрҙәге ағзалыҡты {{GENDER:$2|үҙгәртте}}',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|}} автоматик рәүештә {{GENDER:$2|}} $4 урынына $5 ителде.',
 'rightsnone' => '(юҡ)',
 
 # Feedback
@@ -3822,6 +3981,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'api-error-ok-but-empty' => 'Эске хата: серверҙан яуап юҡ.',
 'api-error-overwrite' => 'Булған файлды алыштырыу рөхсәт ителмәй.',
 'api-error-stashfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.',
+'api-error-publishfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.',
 'api-error-timeout' => 'Көтөлгән ваҡыт эсендә сервер яуып бирмәне.',
 'api-error-unclassified' => 'Билдәһеҙ хата барлыҡҡа килде.',
 'api-error-unknown-code' => 'Билдәһеҙ хата: «$1»',
@@ -3842,4 +4002,22 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'duration-centuries' => '$1 {{PLURAL:$1|быуат|быуаттар}}',
 'duration-millennia' => '$1 {{PLURAL:$1|меңйыллыҡ|меңйыллыҡтар}}',
 
+# Image rotation
+'rotate-comment' => 'Рәсем сәғәт йөрөшө буйынса $1{{PLURAL:$1|}} градусҡа боролдо',
+
+# Limit report
+'limitreport-title' => 'Анализатор мәғлүмәттәре:',
+'limitreport-cputime' => 'Процессорҙың ваҡытын ҡулланыу',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунд}}',
+'limitreport-walltime' => 'Ғәмәлдәге ваҡыт режимында ҡулланыу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунд}}',
+'limitreport-ppvisitednodes' => 'Процессор инеп ҡараған төйөндәр һаны',
+'limitreport-ppgeneratednodes' => 'Процессор эшләп сығарған төйөндәр һаны',
+'limitreport-postexpandincludesize' => 'Асылған өлөштәр һаны',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-templateargumentsize' => 'Ҡалып аргументының үлсәмдәре',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-expansiondepth' => 'Киңәйеүҙең иң ҙур тәрәнлеге',
+'limitreport-expensivefunctioncount' => 'Анализаторҙың "ҡиммәтле" функцияларының һаны',
+
 );
index 7a7c0de..62d92e9 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Ebraminio
  * @author Huji
  * @author Kaganer
  * @author Mostafadaneshvar
@@ -2079,12 +2080,9 @@ $1',
 'ipb_blocked_as_range' => 'حطا: ای پی  $1 مستقیما محدود نهنت و نه تونیت رفع محدودیت بیت.
 بله آی جزی چه محدوده  $2 محدود بوتت که تونیت رفع محدودیت بیت.',
 'ip_range_invalid' => 'نامعتبر محدوده آی پی',
-'blockme' => 'مناء محدود کن',
 'proxyblocker' => 'محدود کننده ی پروکسی',
-'proxyblocker-disabled' => 'ای عمگر غیرفعالنت.',
 'proxyblockreason' => 'شمی آدرس آی پی محدود بوتت په چی که ایء یک پچین پروکسی ات.
 لطفا گون وتی اینترنتی شرکت تماس گریت یا حمایت تکنیکی و آیانا چی ای مشکل امنیتی شدید سهی کنیت.',
-'proxyblocksuccess' => 'انجام بوت.',
 'sorbs' => 'دی ان اس بی ال',
 'sorbsreason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته  DNSBL که استفاده بیت گون {{SITENAME}}.',
 'sorbs_create_account_reason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته  دی ان ای بی ال که استفاده بیت گون {{SITENAME}}.
index d76944c..fee4441 100644 (file)
@@ -2611,11 +2611,8 @@ Hilngon sa [[Special:BlockList|listahan nin kubkob]] para sa listahan kan presen
 Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.',
 'ip_range_invalid' => 'Dai pwede ining serye nin IP.',
 'ip_range_toolarge' => 'An hidwas kan mga kubkob dakulaon kesa /$1 dae pinagtutugutan.',
-'blockme' => 'Kubkuba ako',
 'proxyblocker' => 'Parabagát na karibay',
-'proxyblocker-disabled' => 'Ining punksyon pinag-untok.',
 'proxyblockreason' => 'Binagat an saimong direccion nin IP ta ini sarong bukas na proxy. Apodon tabi an saimong Internet service provider o tech support asin ipaaram sainda ining seriosong problema nin seguridad.',
-'proxyblocksuccess' => 'Tapos.',
 'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}.
 Ika dae makakamukna nin sarong panindog.',
index 1f49571..85dab07 100644 (file)
@@ -2363,12 +2363,9 @@ $1',
 'ipb_blocked_as_range' => 'Нельга зняць блок з IP-адрасу $1, таму што ён заблакаваны не наўпрост, але як частка абсягу $2; той абсяг, у сваю чаргу, можна разблакоўваць.',
 'ip_range_invalid' => 'Няправільны абсяг IP.',
 'ip_range_toolarge' => 'Блакіроўкі дыяпазонаў звыш /$1 забаронены.',
-'blockme' => 'Заблакаваць сябе',
 'proxyblocker' => 'Блакіратар проксі',
-'proxyblocker-disabled' => 'Гэта функцыя выключаная.',
 'proxyblockreason' => "Ваш адрас IP заблакаваны, таму што ён належыць да ліку адкрытых проксі.
 Гэта сур'ёзная праблема бяспекі; паведамце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.",
-'proxyblocksuccess' => 'Зроблена.',
 'sorbsreason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.
 Вы не можаце рэгістравацца',
index fdf9f84..f3e431f 100644 (file)
@@ -2450,9 +2450,11 @@ $UNWATCHURL
 'deleteotherreason' => 'Іншая/дадатковая прычына:',
 'deletereasonotherlist' => 'Іншая прычына',
 'deletereason-dropdown' => '* Агульныя прычыны выдаленьня
-** Запыт аўтара/аўтаркі
+** Спам
+** Вандалізм
 ** Парушэньне аўтарскіх правоў
-** Вандалізм',
+** Запыт аўтара
+** Кепскае перанакіраваньне',
 'delete-edit-reasonlist' => 'Рэдагаваць прычыны выдаленьня',
 'delete-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, болей за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
@@ -2771,12 +2773,9 @@ $1',
 Тым ня менш, ён належыць да дыяпазону $2, які можа быць разблякаваны.',
 'ip_range_invalid' => 'Некарэктны дыяпазон IP-адрасоў.',
 'ip_range_toolarge' => 'Блякаваньні дыяпазонаў, большых за /$1, не дазволеныя.',
-'blockme' => 'Заблякуйце мяне',
 'proxyblocker' => 'Блякаваньне проксі',
-'proxyblocker-disabled' => 'Гэта функцыя выключаная.',
 'proxyblockreason' => "Ваш IP-адрас быў заблякаваны таму што ён належыць адкрытаму проксі.
 Калі ласка, зьвяжыцеся з Вашым Інтэрнэт-правайдарам альбо са службай тэхнічнай падтрымкі і паведаміце ім пра гэтую сур'ёзную праблему бясьпекі.",
-'proxyblocksuccess' => 'Зроблена.',
 'sorbsreason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.
 Вы ня зможаце стварыць рахунак',
index d421698..f3db6e5 100644 (file)
@@ -572,6 +572,7 @@ $1',
 'databaseerror' => 'Грешка при работа с базата от данни',
 'databaseerror-text' => 'Възникна грешка при заявката за базата данни.
 Това може да означава бъг в софтуера.',
+'databaseerror-textcl' => 'Възникна грешка при заявка за базата данни.',
 'databaseerror-query' => 'Заявка: $1',
 'databaseerror-function' => 'Функция: $1',
 'databaseerror-error' => 'Грешка: $1',
@@ -632,6 +633,7 @@ $2',
 'customjsprotected' => 'Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.',
 'mycustomcssprotected' => 'Нямате права за редактиране на тази CSS страница.',
 'mycustomjsprotected' => 'Нямате права за редактиране на тази JavaScript страница.',
+'myprivateinfoprotected' => 'Нямате права да редактирате личната си информация.',
 'mypreferencesprotected' => 'Нямате права да редактирате настройките си.',
 'ns-specialprotected' => 'Специалните страници не могат да бъдат редактирани.',
 'titleprotected' => "Тази страница е била защитена срещу създаване от [[User:$1|$1]].
@@ -657,13 +659,14 @@ $2',
 'yourname' => 'Потребителско име:',
 'userlogin-yourname' => 'Потребителско име',
 'userlogin-yourname-ph' => 'Въведете вашето потребителско име',
+'createacct-another-username-ph' => 'Въвежда се потребителското име',
 'yourpassword' => 'Парола:',
 'userlogin-yourpassword' => 'Парола',
 'userlogin-yourpassword-ph' => 'Въведете вашата парола',
 'createacct-yourpassword-ph' => 'Въведете парола',
 'yourpasswordagain' => 'Парола (повторно):',
 'createacct-yourpasswordagain' => 'Потвърждаване на паролата',
-'createacct-yourpasswordagain-ph' => 'Ð\92Ñ\8aведеÑ\82е Ð¿Ð°Ñ\80олаÑ\82а Ð¾Ñ\82ново',
+'createacct-yourpasswordagain-ph' => 'Ð\92Ñ\8aвежда Ñ\81е Ð¿Ð°Ñ\80олаÑ\82а (повÑ\82оÑ\80но)',
 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
 'userlogin-signwithsecure' => 'Използване на защитена връзка',
 'yourdomainname' => 'Домейн:',
@@ -690,14 +693,20 @@ $2',
 'userlogin-resetpassword-link' => 'Възстановяване на паролата',
 'helplogin-url' => 'Help:Влизане',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощ за влизане]] в системата',
+'userlogin-loggedin' => 'Вече сте влезли в системата като {{GENDER:$1|$1}}.
+Чрез формуляра по-долу можете да влезете като друг потребител.',
 'userlogin-createanother' => 'Създаване на друга сметка',
 'createacct-join' => 'Въведете своите данни по-долу.',
+'createacct-another-join' => 'Попълване на информацията за новата сметка',
 'createacct-emailrequired' => 'Адрес за електронна поща',
 'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)',
-'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
+'createacct-another-email-ph' => 'Въвежда се електронна поща',
+'createaccountmail' => 'Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу',
 'createacct-realname' => 'Истинско име (незадължително)',
 'createaccountreason' => 'Причина:',
 'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Защо създавате друга сметка',
+'createacct-captcha' => 'Проверка за сигурност',
 'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
 'createacct-submit' => 'Създаване на сметката',
 'createacct-another-submit' => 'Създаване на друга сметка',
@@ -780,7 +789,7 @@ $2',
 'newpassword' => 'Нова парола:',
 'retypenew' => 'Нова парола повторно:',
 'resetpass_submit' => 'Избиране на парола и влизане',
-'changepassword-success' => 'Паролата ви беше сменена! Сега влизате…',
+'changepassword-success' => 'Паролата ви беше променена успешно!',
 'resetpass_forbidden' => 'Не е разрешена смяна на паролата',
 'resetpass-no-info' => 'За да достъпвате тази страница директно, необходимо е да влезете в системата.',
 'resetpass-submit-loggedin' => 'Промяна на паролата',
@@ -792,9 +801,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
+'passwordreset-text-one' => 'Попълването на формуляра ще доведе до възстановяване на паролата.',
 'passwordreset-text-many' => '{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
+'passwordreset-emaildisabled' => 'Функционалността за електронна поща е изключена в това уики.',
 'passwordreset-username' => 'Потребителско име:',
 'passwordreset-domain' => 'Домейн:',
 'passwordreset-capture' => 'Преглеждане на електронното писмо?',
@@ -821,7 +832,7 @@ $2
 Временна парола: $2',
 'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.',
 'passwordreset-emailsent-capture' => 'По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на потребителя: $1',
+'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Промяна на адреса за е-поща',
@@ -914,9 +925,7 @@ $2
 'loginreqlink' => 'влизане',
 'loginreqpagetext' => 'Необходимо е $1, за да можете да разглеждате други страници.',
 'accmailtitle' => 'Паролата беше изпратена.',
-'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2.
-
-Паролата за тази нова потребителска сметка може да бъде променена от специалната страница ''[[Special:ChangePassword|„Промяна на парола“]]'' след влизане в системата.",
+'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2. Паролата може да бъде променена от страницата ''[[Special:ChangePassword|„Промяна на паролата“]]'' след влизане в системата.",
 'newarticle' => '(нова)',
 'newarticletext' => 'Последвахте препратка към страница, която все още не съществува.
 За да я създадете, просто започнете да пишете в долната текстова кутия
@@ -1014,7 +1023,7 @@ $2
 'nocreate-loggedin' => 'Нямате необходимите права да създавате нови страници.',
 'sectioneditnotsupported-title' => 'Не се поддържа редактиране на раздели',
 'sectioneditnotsupported-text' => 'Не се поддържа редактиране на раздели на тази страница.',
-'permissionserrors' => 'Ð\93Ñ\80еÑ\88ки при правата на достъп',
+'permissionserrors' => 'Ð\93Ñ\80еÑ\88ка при правата на достъп',
 'permissionserrorstext' => 'Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:',
 'permissionserrorstext-withaction' => 'Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:',
 'recreate-moveddeleted-warn' => "'''Внимание: Създавате страница, която по-рано вече е била изтрита.'''
@@ -1344,7 +1353,7 @@ $1",
 'prefs-rendering' => 'Облик',
 'saveprefs' => 'Съхраняване',
 'resetprefs' => 'Отмяна на текущите промени',
-'restoreprefs' => 'Възстановяване на всички настройки по подразбиране',
+'restoreprefs' => 'Възстановяване на всички настройки по подразбиране (за всички раздели)',
 'prefs-editing' => 'Редактиране',
 'rows' => 'Редове:',
 'columns' => 'Колони:',
@@ -1584,6 +1593,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|промяна|промени}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|от последното посещение}}',
 'enhancedrc-history' => 'история',
 'recentchanges' => 'Последни промени',
 'recentchanges-legend' => 'Опции на списъка с последни промени',
@@ -2588,11 +2598,8 @@ $1',
 'ipb_blocked_as_range' => 'Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.',
 'ip_range_invalid' => 'Невалиден интервал за IP-адреси.',
 'ip_range_toolarge' => 'Забранено е блокиране на диапазони от IP адреси по-големи от /$1.',
-'blockme' => 'Самоблокиране',
 'proxyblocker' => 'Блокировач на проксита',
-'proxyblocker-disabled' => 'Тази функция е деактивирана.',
 'proxyblockreason' => 'IP-адресът ви беше блокиран, тъй като е анонимно достъпен междинен сървър. Свържете се с доставчика ви на интернет и го информирайте за този сериозен проблем в сигурността.',
-'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}.',
 'sorbs_create_account_reason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}. Не може да създадете сметка.',
 'cant-block-while-blocked' => 'Не можете да блокирате други потребители, докато сам(а) сте блокиран(а).',
index 420b898..fe44b3a 100644 (file)
@@ -2509,12 +2509,9 @@ Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pam
 Ngini, kayapa pun, diblukir sawagai palihan wilayah $2, nang kawa-ai dilapas-blukirnya.',
 'ip_range_invalid' => 'Jarak IP kada sah.',
 'ip_range_toolarge' => 'Jarak blukir taganal pada /$1 kada dibulihakan.',
-'blockme' => 'Blokir ulun',
 'proxyblocker' => 'Pamblukir pruksi',
-'proxyblocker-disabled' => 'Pungsi ngini dipajahakan.',
 'proxyblockreason' => 'Alamat IP Pian diblukir karana ngini sabuah pruksi tabuka.
 Muhun hubungi Panyadia Layan Internet Pian atawa sukungan tiknik wan padahi sidin pasal masalah ka-amanan sarius ngini.',
-'proxyblocksuccess' => 'Sudah.',
 'sorbsreason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.
 Pian kada kawa maulah sabuah akun',
index 66db1f2..e9a6f9e 100644 (file)
@@ -113,7 +113,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক',
 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও',
 'tog-norollbackdiff' => 'রোলব্যাকের পরে পার্থক্য দেখিও না',
-'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তন সহ কোনো পাতা ত্যাগের সময় সাবধান করো',
+'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তনসহ কোনো পাতা ত্যাগের সময় সাবধান করো',
 'tog-prefershttps' => 'যখনই প্রবেশ করবেন সবসময় নিরাপদ সংযোগ ব্যবহার করুন',
 
 'underline-always' => 'সব সময়',
@@ -271,7 +271,7 @@ $messages = array(
 'create-this-page' => 'পাতাটি তৈরি করো',
 'delete' => 'অপসারণ',
 'deletethispage' => 'এই পাতাটি মুছে ফেলুন',
-'undeletethispage' => 'à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\8b à¦¨à¦¾',
+'undeletethispage' => 'পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\8b',
 'undelete_short' => 'পুনঃস্থাপন {{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনাসমূহ}}',
 'viewdeleted_short' => '{{PLURAL:$1| টি অপসারিত সম্পাদনা|$1 টি অপসারিত সম্পাদনা}} দেখাও',
 'protect' => 'সুরক্ষা',
@@ -318,7 +318,7 @@ $1',
 # 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).
 'aboutsite' => '{{SITENAME}} বৃত্তান্ত',
 'aboutpage' => 'Project:বৃত্তান্ত',
-'copyright' => '$1 à¦\8fর à¦\86à¦\93তায় à¦ªà§\8dরাপà§\8dয।',
+'copyright' => '$1 à¦\8fর à¦\86à¦\93তায় à¦ªà§\8dরà¦\95াশিত à¦¯à¦¦à¦¿ à¦\85নà§\8dয à¦\95িà¦\9bà§\81 à¦¨à¦¿à¦°à§\8dধারিত à¦¨à¦¾ à¦¥à¦¾à¦\95à§\87।',
 'copyrightpage' => '{{ns:project}}:কপিরাইট',
 'currentevents' => 'সমসাময়িক ঘটনা',
 'currentevents-url' => 'Project:সমসাময়িক ঘটনাসমূহ',
@@ -335,7 +335,7 @@ $1',
 'privacypage' => 'Project:গোপনীয়তার নীতি',
 
 'badaccess' => 'অনুমোদন ত্রুটি',
-'badaccess-group0' => 'আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই',
+'badaccess-group0' => 'আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই',
 'badaccess-groups' => 'আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন সদস্য ব্যবহারকারী সম্পাদন করতে পারেন: $1।',
 
 'versionrequired' => 'মিডিয়াউইকির $1 সংস্করণ প্রয়োজন',
@@ -529,6 +529,8 @@ $2',
 'userlogin-resetpassword-link' => 'শব্দচাবি পুনরায় ধার্য করুন',
 'helplogin-url' => 'Help:প্রবেশ',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
+'userlogin-loggedin' => 'আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন।
+অন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।',
 'userlogin-createanother' => 'আরেকটি অ্যাকাউন্ট তৈরি করুন',
 'createacct-join' => 'আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।',
 'createacct-another-join' => 'নিচে আপনার নতুন অ্যাকাউন্টের তথ্য দিন।',
@@ -1456,8 +1458,8 @@ $1",
 'action-block' => 'এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দাও',
 'action-protect' => 'এই পাতার সুরক্ষার মাত্রা পরিবর্তন করো',
 'action-rollback' => 'একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন',
-'action-import' => 'à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি আমদানী করো',
-'action-importupload' => 'ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি আমদানী করো',
+'action-import' => 'à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ আমদানী করো',
+'action-importupload' => 'ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ আমদানী করো',
 'action-patrol' => 'অন্যদের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো',
 'action-autopatrol' => 'পরীক্ষিত বলে চিহ্নিত কি আপনি সম্পাদনা করেছেন',
 'action-unwatchedpages' => 'নজরতালিকা বহির্ভূত পাতাগুলির তালিকা দেখাও',
@@ -1980,6 +1982,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'listusers' => 'ব্যবহারকারীর তালিকা',
 'listusers-editsonly' => 'শুধুমাত্র এমন ব্যবহারকারীদের দেখাও যাদের অবদান আছে',
 'listusers-creationsort' => 'তৈরির তারিখ অনুসারে সাজাও',
+'listusers-desc' => 'বড় থেকে ছোট ক্রম অনুযায়ী সাজাও',
 'usereditcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}',
 'usercreated' => '{{GENDER:$3|তৈরি হয়েছে}} $1 তারিখ, সময়: $2',
 'newpages' => 'নতুন পাতাসমূহ',
@@ -2075,7 +2078,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # Special:ActiveUsers
 'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা',
 'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।',
-'activeusers-count' => 'à¦\97ত {{PLURAL:$3|দিনà§\87}} à¦¸à¦°à§\8dবমà§\8bà¦\9f {{PLURAL:$1|পদ}} à¦¸à¦\82à¦\96à§\8dযা $1',
+'activeusers-count' => 'à¦\97ত {{PLURAL:$3|à¦\95ালà§\87|$3 à¦¦à¦¿à¦¨à§\87}} à¦¸à¦°à§\8dবমà§\8bà¦\9f {{PLURAL:$1|à¦\95রà§\8dমà§\87র}} à¦¸à¦\82à¦\96à§\8dযা $1à¦\9fি',
 'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
 'activeusers-hidebots' => 'বট লুকাও',
 'activeusers-hidesysops' => 'প্রশাসক লুকাও',
@@ -2241,9 +2244,11 @@ $UNWATCHURL
 'deleteotherreason' => 'অন্য/অতিরিক্ত কারণ:',
 'deletereasonotherlist' => 'অন্য কারণ',
 'deletereason-dropdown' => '*মুছে ফেলার সাধারণ কারণগুলি
-** লেখকের অনুরোধ
+** স্প্যাম
+** ধ্বংসপ্রবণতা
 ** কপিরাইট ভঙ্গ
-** ধ্বংসপ্রবণতা',
+** লেখকের অনুরোধ
+** অকার্যকর পুনঃনির্দেশ',
 'delete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা',
 'delete-toobig' => 'এই পাতার সম্পাদনার ইতিহাস অনেক বড়, যা $1টি {{PLURAL:$1|সংস্করণের|সংস্করণের}} বেশি।
 {{SITENAME}}-এর দূর্ঘটনাজনিত সমস্যা এড়াতে এই ধরনের পাতা মুছার ব্যপারে সীমাবদ্ধতা আরোপিত হয়েছে।',
@@ -2560,11 +2565,8 @@ $1',
 'ipb_blocked_as_range' => 'ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।',
 'ip_range_invalid' => 'অবৈধ আইপি শ্রেণী',
 'ip_range_toolarge' => '/$1 এর বড় রেঞ্জব্লক ব্যবহার অনুমদিত নয়।',
-'blockme' => 'আমাকে বাধা দেওয়া হোক',
 'proxyblocker' => 'প্রক্সি বাধাদানকারী',
-'proxyblocker-disabled' => 'এই ফাংশনটি নিষ্ক্রিয়।',
 'proxyblockreason' => 'আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ এটি একটি উন্মুক্ত প্রক্সি। অনুগ্রহ করে আপনার ইন্টারনেট সেবা প্রদানকারী কোম্পানির সাথে কারিগরি সহায়তার ব্যাপারে যোগাযোগ করুন এবং এই গুরুত্বপূর্ণ নিরাপত্তা সমস্যার ব্যাপারে তাদেরকে অবহিত করুন।',
-'proxyblocksuccess' => 'নিষ্পন্ন হয়েছে।',
 'sorbsreason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।',
 'sorbs_create_account_reason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।',
 'xffblockreason' => 'X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1',
index 1dd3e15..daab6d4 100644 (file)
@@ -2647,7 +2647,7 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"',
 'blocklogpage' => 'Roll ar stankadennoù',
 'blocklog-showlog' => "Stanket eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar stankadennoù, d'ho titouriñ :",
 'blocklog-showsuppresslog' => "Stanket ha kuzhet eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar diverkadennoù, d'ho titouriñ :",
-'blocklogentry' => 'en/he deus stanket [[$1]] betek an $2 $3',
+'blocklogentry' => 'en/he deus stanket [[$1]] gant ur pad termen a $2 $3',
 'reblock-logentry' => "en deus kemmet an arventennoù stankañ evit [[$1]] gant un termen d'an $2 $3",
 'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.",
 'unblocklogentry' => 'distanket "$1"',
@@ -2670,11 +2670,8 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"',
 'ipb_blocked_as_range' => "Fazi : N'eo ket bet stanket ar chomlec'h IP $1 war-eeun, setu n'hall ket bezañ distanket. Stanket eo bet dre al live $2 avat, hag a c'hall bezañ distanket.",
 'ip_range_invalid' => 'Stankañ IP direizh.',
 'ip_range_toolarge' => "N'eo ket aotreet stankañ pajennoù brasoc'h evit /$1.",
-'blockme' => "Stankit ac'hanon",
 'proxyblocker' => 'Stanker proksi',
-'proxyblocker-disabled' => "Diweredekaet eo an arc'hwel-mañ.",
 'proxyblockreason' => "Stanket eo bet hoc'h IP rak ur proksi digor eo. Trugarez da gelaouiñ ho pourvezer moned ouzh ar Genrouedad pe ho skoazell deknikel eus ar gudenn surentez-mañ.",
-'proxyblocksuccess' => 'Echu.',
 'sorbsreason' => "Rollet eo ho chomlec'h IP evel ur proksi digor en DNSBL implijet gant {{SITENAME}}.",
 'sorbs_create_account_reason' => "Rollet eo ho chomlec'h IP evel ur proksi digor war an DNSBL implijet gant {{SITENAME}}. N'hallit ket krouiñ ur gont",
 'cant-block-while-blocked' => "N'hallit ket stankañ implijerien all ma'z oc'h stanket c'hwi hoc'h-unan.",
index a5d49ac..0db0d0c 100644 (file)
@@ -733,6 +733,7 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'userlogin-resetpassword-link' => 'Resetirajte svoju šifru/lozinku',
 'helplogin-url' => 'Help:Prijavljivanje',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'userlogin-createanother' => 'Napravi još jedan račun',
 'createacct-join' => 'Unesite svoje podatke ispod.',
 'createacct-another-join' => 'Unesite informacije o novom računu ispod.',
 'createacct-emailrequired' => 'Adresa e-pošte',
@@ -2610,7 +2611,7 @@ $1',
 'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}',
 'contributions-title' => 'Doprinosi korisnika $1',
 'mycontris' => 'Doprinos',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
 'uctop' => '(trenutno)',
 'month' => 'Od mjeseca (i ranije):',
@@ -2767,11 +2768,8 @@ Možda je već deblokirana.',
 Međutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.',
 'ip_range_invalid' => 'Netačan raspon IP adresa.',
 'ip_range_toolarge' => 'Nisu dopuštene blokade veće od /$1.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi.  Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
 'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
 Ne možete napraviti račun',
index ee209f9..759a4c1 100644 (file)
@@ -2687,11 +2687,8 @@ Per més detalls, a sota es mostra el registre de supressions:',
 'ipb_blocked_as_range' => "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
 'ip_range_invalid' => 'Rang de IP no vàlid.',
 'ip_range_toolarge' => 'No estan permesos el bloquejos de rangs més grans que /$1.',
-'blockme' => "Bloca'm",
 'proxyblocker' => 'Bloqueig de proxy',
-'proxyblocker-disabled' => "S'ha inhabilitat la funció.",
 'proxyblockreason' => "La vostra adreça IP ha estat bloquejada perquè és un proxy obert. Si us plau contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
-'proxyblocksuccess' => 'Fet.',
 'sorbsreason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
 'sorbs_create_account_reason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
 'xffblockreason' => "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
index 80ae8e2..0533b95 100644 (file)
@@ -456,9 +456,9 @@ $messages = array(
 'index-category' => 'Меттигтерахьйо агlонаш',
 'noindex-category' => 'ДӀахьушйоцу агӀонаш',
 'broken-file-category' => '{{#switch:{{NAMESPACE}}
- |{{ns:0}}=Ð\91олÑ\85 Ñ\86абеÑ\88 Ñ\84айланÑ\88и Ñ\85Ñ\8cажоÑ\80игаш йолу агӀонаш}}',
+ |{{ns:0}}=Ð\91олÑ\85 Ñ\86абеÑ\88 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаш йолу агӀонаш}}',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Цуьнах лаьцна',
 'article' => 'Яззам',
@@ -506,8 +506,8 @@ $messages = array(
 'help' => 'ГӀо',
 'search' => 'Лаха',
 'searchbutton' => 'Лаха',
-'go' => 'Дехьа хьажа',
-'searcharticle' => 'Дехьа хьажа',
+'go' => 'Дехьа гӀо',
+'searcharticle' => 'Дехьа гӀо',
 'history' => 'Истори',
 'history_short' => 'Истори',
 'updatedmarker' => 'Керла яккхина сона гинчултӀаьхьа',
@@ -553,7 +553,7 @@ $messages = array(
 'lastmodifiedat' => 'ХӀокху агӀон тӀаьххьаралера хийцам: $2, $1.',
 'viewcount' => 'ХӀокху агӀонга хьойсина $1 {{PLURAL:$1|за|за|за}}.',
 'protectedpage' => 'ГӀароллийца йолу агӀо',
-'jumpto' => 'ДехьагӀо оцу:',
+'jumpto' => 'Дехьа гӀо:',
 'jumptonavigation' => 'Навигаци',
 'jumptosearch' => 'лаха',
 'view-pool-error' => 'Бехк цабиллар доьха, хӀинц гӀулкхдириг йоьттина ю.
@@ -655,11 +655,11 @@ $1',
 'laggedslavemode' => 'Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.',
 'readonly' => 'Блоктоьхна дӀайаздар хаамийн бухе',
 'enterlockreason' => 'Билгал де блоктохаран бахьна а и чекх йолу хан а.',
-'missing-article' => 'Хlокху чохь кароезаш йолу хьан дехарца йозан агlонаш цакарийна «$1» $2.
+'missing-article' => 'ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2.
 
\98Ñ\88Ñ\82наÑ\80г Ð½Ð°Ð³Ð³Ð°Ñ\85Ñ\8c Ñ\85Ñ\83Ñ\8cлÑ\83 Ñ\85Ñ\8cажоÑ\80иг Ð´lайаÑ\8cккÑ\85ина Ð¹Ð°Ð»Ñ\85Ñ\8c Ð¹Ð° Ñ\85ийÑ\86ам Ð±Ð¸Ð½Ð° Ñ\82иÑ\88а Ñ\85Ñ\8cажоÑ\80игÑ\86а Ð´ÐµÑ\85Ñ\8cа Ð²Ð°Ð»Ð° Ð³lоьртича.
\98Ñ\88Ñ\82наÑ\80г Ð½Ð°Ð³Ð³Ð°Ñ\85Ñ\8c Ñ\85Ñ\83Ñ\8cлÑ\83 Ñ\85Ñ\8cажоÑ\80аг Ð´Ó\80аÑ\8fÑ\8cккÑ\85ина ÐµÐ»Ð°Ñ\85Ñ\8c Ñ\8f Ñ\85ийÑ\86ам Ð±Ð¸Ð½Ð° Ñ\82иÑ\88а Ñ\85Ñ\8cажоÑ\80агÑ\86а Ð´ÐµÑ\85Ñ\8cа Ð³Ó\80о Ð³Ó\80оьртича.
 
-Нагахьсан гlулкх цуьнах доьзна дацахь, хьуна карийна гlирс латточехь гlалат.
+Нагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат.
 Дехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.',
 'missingarticle-rev' => '(верси № $1)',
 'missingarticle-diff' => '(тейп тайпнара: $1, $2)',
@@ -684,6 +684,8 @@ $1',
 'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.',
 'perfcached' => 'Лахара хаам схьаэца кэша чура цундела тӀехьарлаьра хийцамаш гойтуш бац. Кэша чохь латтаё оцул $1  кӀезиг {{PLURAL:$1|дӀаяздар|дӀаяздарш}}.',
 'perfcachedts' => 'Лахара хаам схьаэца кэша чура иза тӀаьхьара карла ялла $1. Кэша чохь латта до оцул $4 кӀезиг {{PLURAL:$4|дӀаяздар|дӀаяздарш}}.',
+'querypage-no-updates' => 'ХӀинца хӀара агӀо карлаякхар дӀадайина ду.
+Кхузахь гайтина болу хаамаш карла боккхур бац.',
 'wrong_wfQuery_params' => 'Хилийта йиш йоцу параметраш хӀокху функцин wfQuery()<br />
 Функци: $1<br />
 Жоп дехар: $2',
@@ -693,6 +695,9 @@ $1',
 'protectedpagetext' => 'ХӀара агӀо дӀакъойлина йу рé цадаккхийта.',
 'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:',
 'protectedinterface' => 'ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо ю. Куьйгалхошна бен иза хийца цало.',
+'editinginterface' => "'''Тергам бе:''' Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан.
+Цуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.
+Хьокху хаамийн гочдар тӀетоха я хийца лела йе сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
 'namespaceprotected' => 'ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».',
 'customcssprotected' => 'Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.',
 'customjsprotected' => 'Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.',
@@ -812,11 +817,28 @@ $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Хийца электрони почт',
+'changeemail-header' => 'Электрони почтан адрес хийцар',
+'changeemail-text' => 'Юза хӀара форма хьайн электрони почтан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.',
 'changeemail-no-info' => 'ХӀара агӀо лело системин чугӀо.',
+'changeemail-oldemail' => 'Карара электронни почтан адрес:',
+'changeemail-newemail' => 'Электрони почтан керла адрес:',
 'changeemail-none' => '(яц)',
+'changeemail-password' => 'Хьан пароль «{{SITENAME}}» проектан:',
 'changeemail-submit' => 'Хийца email',
 'changeemail-cancel' => 'Цаоьшу',
 
+# Special:ResetTokens
+'resettokens' => 'Токенаш кхоссар',
+'resettokens-text' => 'Хьан йиш ю токенаш кхосса, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ю хьан дӀаяздар ца вовшахтесна. 
+
+Хьона иза оьшу, ахьа хьай токенаш цхьам гучу яьхна елахь я хьан аккаунт йохийна елахь.',
+'resettokens-legend' => 'Токенаш кхоссар',
+'resettokens-tokens' => 'Токенаш:',
+'resettokens-token-label' => '$1 (карара маьӀна: $2)',
+'resettokens-watchlist-token' => 'Веб-каналан (Atom/RSS) токен  [[Special:Watchlist|хьан тергаме могӀам чура агӀонашна хийцамаш бар]]',
+'resettokens-done' => 'Токенаш кхиссина.',
+'resettokens-resetbutton' => 'Къастина токенаш кхоссар',
+
 # Edit page toolbar
 'bold_sample' => 'Дерстино до йоза',
 'bold_tip' => 'Дерстино до йоза',
@@ -825,7 +847,7 @@ $1',
 'link_sample' => 'Хьажориган коьрта могlа',
 'link_tip' => 'Чоьхьа хьажориг',
 'extlink_sample' => 'http://www.example.com хьажориг корта',
-'extlink_tip' => 'Арахьа хьажориг (йиц ма йе хlотталушерг http://)',
+'extlink_tip' => 'Арахьара хьажораг (йиц ма йе хӀотталушерг http://)',
 'headline_sample' => 'Йозан корта',
 'headline_tip' => 'Корта 2-гlа локхаллийца',
 'nowiki_sample' => 'Чудиллийша кхузе барамхlоттонза йоза.',
@@ -850,6 +872,8 @@ $1',
 'summary-preview' => 'Цуьнах лаьцна хирду:',
 'blockedtitle' => 'Декъашхочун блоктоьхана',
 'nosuchsectiontitle' => 'Дакъа каро йиш яц.',
+'nosuchsectiontext' => 'Хьо гӀерта дуцу дакъа тадан.
+Хьо хӀокху агӀоне хьоьжучу хенахь иза кхечухьа деккхина я дӀадаьккхина хела тарло.',
 'loginreqtitle' => 'Хьай цӀарца чугӀо',
 'loginreqlink' => 'Логин',
 'accmailtitle' => 'Пароль дlаяхьийтина.',
@@ -1011,6 +1035,7 @@ $1',
 
 # History merging
 'mergehistory-from' => 'Дуьххьарлера агӀоно',
+'mergehistory-fail' => 'АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а хене а хьажа.',
 'mergehistory-invalid-source' => 'Хьостан нийса корта хила еза.',
 'mergehistory-invalid-destination' => 'Юзийна агӀона нийса корта хила еза.',
 'mergehistory-reason' => 'Бахьан:',
@@ -1109,6 +1134,7 @@ $1',
 'prefs-email' => 'Электронан почтан параметраш',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
+'resetprefs' => 'Кхоссар',
 'restoreprefs' => 'МеттахӀоттабе гӀирс Iад битарца',
 'prefs-editing' => 'Тадар',
 'rows' => 'МогӀанаш:',
@@ -1222,21 +1248,73 @@ $1',
 'grouppage-suppress' => '{{ns:project}}:Ревизораш',
 
 # Rights
+'right-read' => 'агӀонашка хьажар',
 'right-edit' => 'АгӀоаш нисяр',
 'right-createpage' => 'АгӀонаш кхоллар (дийцарш дац)',
 'right-createtalk' => 'Дийцаре агӀонаш кхоллар',
 'right-createaccount' => 'декъашхошна керла дӀаяздарш кхоллар',
+'right-minoredit' => '«къезиг хийцам» аьлла билгало хӀоттор',
 'right-move' => 'АгӀонашан цӀераш хийцар',
 'right-move-subpages' => 'АгӀонашан цӀераш хийцар цера бухара агӀонашцан',
+'right-move-rootuserpages' => 'декъашхочун ораман агӀонийн цӀераш хийцар',
 'right-movefile' => 'Файланши цӀе хийцар',
+'right-suppressredirect' => 'агӀона цӀе хуьйцуш ширчу цӀарах ма кхолла дӀасахьажаяр',
 'right-upload' => 'Файлаш чуйаьхар',
+'right-reupload' => 'йолуш йолу чера тӀехула файлаш дӀаязъяр',
+'right-reupload-own' => 'тохарлеррачу декъашхочо файлаш юху дӀаязъяр',
+'right-reupload-shared' => 'юкъахь йолу проекташкара файлаш чоьхьарачу файлашца хийцар',
+'right-upload_by_url' => 'URL адресца файлаш чуяхар',
+'right-purge' => 'бакъдеш йолу агӀо йиссалц, агӀонийн кэш цӀанъян',
+'right-autoconfirmed' => 'IP-адресан чехкалин доза дац',
+'right-bot' => 'автоматически процес сана лара',
+'right-nominornewtalk' => 'агӀонашкахь къезиг нисдарш цахиларо хуьлуьйту керла хаамийн хӀоттам',
+'right-apihighlimits' => 'API-дехарш кхочушдан кӀезиг дихкар',
+'right-writeapi' => 'дӀаяздеш лелойо API',
 'right-delete' => 'агӀош дӀаяхар',
 'right-bigdelete' => 'еха хийцаман истори йолу агӀонаш дӀаяхар',
+'right-deletelogentry' => 'тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.',
+'right-deleterevision' => 'агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а',
+'right-deletedhistory' => 'дӀаяхна агӀонийн исторега хьажар дӀадаьккхина йоза тӀекхочехь доцуш',
+'right-deletedtext' => 'дӀадаьккхина йозане а хийцамашка а хьажар агӀонийн дӀаяхна версин юккъахь',
 'right-browsearchive' => 'ДӀаяхна агӀонаш лахар',
 'right-undelete' => 'АгӀонаш меттахӀоттор',
+'right-suppressrevision' => 'куьйгалхойх хьулйина йолу агӀонийн версеш меттахӀиттаяр а хьажар а',
+'right-suppressionlog' => 'долара тептаршка хьажар',
+'right-block' => 'кхечу декъашхошка тадарш ца дайта дехкар хӀоттор',
 'right-blockemail' => 'Цамагдо декъашхошка хааман кехаташ кхехьийта',
+'right-hideuser' => 'декъашхочун цӀе а и лечкъо а цамагор',
+'right-ipblock-exempt' => 'IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а блоктохаршна а',
+'right-proxyunbannable' => 'проксен автоматически блоктохаран чекхбовлар',
 'right-unblockself' => 'ша шин блокдӀаяккхар',
 'right-protect' => 'АгӀона гӀоралла хийцар а гӀоралла дина агӀо нисяр а',
+'right-editprotected' => '«{{int:protect-level-sysop}}» бахьанца гӀоралла дина агӀонаш нисяр',
+'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» бахьанца гӀоралла дина агӀонаш нисяр',
+'right-editinterface' => 'лелош йолу интерфейсан хийцам бар',
+'right-editusercssjs' => 'кхечу декъашхойн CSS- а JS- а файлаш нисяр',
+'right-editusercss' => 'кхечу декъашхойн CSS-файлаш нсяр',
+'right-edituserjs' => 'кхечу декъашхойн JavaScript-файлаш нисяр',
+'right-editmyusercss' => 'Декъашхочун CSS файлаш таяр',
+'right-editmyuserjs' => 'Лелош йолу шен JavaScript-файлаш таяр',
+'right-viewmywatchlist' => 'Шен тергаме могӀане хьажар',
+'right-editmywatchlist' => 'Хьайн тергаме могӀам табар. Тидам бе, цхьадолу динарш могӀам юкъа шаш кхетар ду.',
+'right-viewmyprivateinfo' => 'Хьан долара хаамашка хьажар (масала, электронан адрес, бакъ цӀе)',
+'right-editmyprivateinfo' => 'Хьан долара хаамаш нисбар (масала, электронан адрес, бакъ цӀе)',
+'right-editmyoptions' => 'Тае хьайн гӀоли хетарг',
+'right-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина нисдарш сиха юхадахар',
+'right-markbotedits' => 'юхудохучу нисдаршан шаболх бечунна нисдарш аьлла билгало ян',
+'right-noratelimit' => 'чехкалин доза дац',
+'right-import' => 'кхечу википедешкара агӀонаш импорт ян',
+'right-importupload' => 'файлаш чуяхарца агӀонаш импорт ян',
+'right-patrol' => 'нисдарш хьаьжна сана билгалдар',
+'right-patrolmarks' => 'керла нисдарийн хьаьжна билгалонашка хьажар',
+'right-unwatchedpages' => 'тергамехь йоцу агӀонийн могӀане хьажар',
+'right-mergehistory' => 'агӀонаш вовшахтохар',
+'right-userrights' => 'декъашхойн массо бакъонаш хийцар',
+'right-userrights-interwiki' => 'кхечу вики сайташкара декъашхойн бакъонаш хийцар',
+'right-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а',
+'right-override-export-depth' => 'агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан',
+'right-sendemail' => 'кхечу декъашхошка электронан хаамаш кхехьийта',
+'right-passwordreset' => 'пароль хийцарца электроннан хаамашка хьажар',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Декъашхой дlабазбина тептар',
@@ -1248,9 +1326,13 @@ $1',
 'action-read' => 'хӀара агӀо ешар',
 'action-edit' => 'нисйа хlара агlо',
 'action-move' => 'хӀокху агӀон цӀе хийца',
+'action-move-rootuserpages' => 'декъашхочун ораман агӀонийн цӀераш хийцар',
 'action-delete' => 'дӀаяккха хӀара агӀо',
 'action-deletedhistory' => 'хӀокху агӀона дӀаяккхинцу исторега хьажар',
 'action-undelete' => 'хӀара агӀо меттахӀоттор',
+'action-patrol' => 'кхечера нисдарш хьаьжна сана билгалдар',
+'action-autopatrol' => 'шен нисдарш хьаьжна сана билгалдар',
+'action-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
@@ -1312,6 +1394,7 @@ $1',
 'filesource' => 'Хьост:',
 'ignorewarning' => 'ХӀума дац чуяккха файл',
 'ignorewarnings' => 'ДӀахедар тергал ца дан',
+'badfilename' => 'Файлан цӀе оцу $1.',
 'emptyfile' => 'Ахьа чуйоккхуш йолу файл еса хийла там бу. Иза гӀалат хийла мега файлан цӀе нийса язйина йоцу дела. Дехар до хьажа бакъалла и юьй ахьа чуйоккхуш йолу файл.',
 'file-deleted-duplicate' => 'Иштта файл ([[:$1]]) хӀинцале дӀаяьккхина хилла. Дехар до, юху файл чуяккхале файл дӀаяккхаран историга хьажа.',
 'uploadwarning' => 'Дlахьедар',
@@ -1352,7 +1435,7 @@ PICT # тайп тайпан
 Декъашхо къастичи, цун керла файлаш гойту.',
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
 'imgfile' => 'файл',
-'listfiles' => 'ФайлаÑ\88и могӀам',
+'listfiles' => 'Файлийн могӀам',
 'listfiles_date' => 'Терахь',
 'listfiles_name' => 'Файлан цӀе',
 'listfiles_user' => 'Декъашхо',
@@ -1407,6 +1490,7 @@ PICT # тайп тайпан
 
 # MIME search
 'mimesearch' => 'MIME хула лаха',
+'mimesearch-summary' => 'ХӀокху агӀоно йиш хуьлуьйту MIME-тайпан файлаш харжа. Яздеш долу формат: чулацаман тайп/бухара тайп, масала  <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тайп:',
 
 # Unwatched pages
@@ -1417,6 +1501,8 @@ PICT # тайп тайпан
 
 # Unused templates
 'unusedtemplates' => 'Лелош доцу кепаш',
+'unusedtemplatestext' => 'Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.
+Диц ма делахь хьажа кеп агӀонашкахь лелош юй.',
 
 # Random page
 'randompage' => 'Цахууш нисйелла агӀо',
@@ -1424,6 +1510,7 @@ PICT # тайп тайпан
 # Random page in category
 'randomincategory' => 'Категори чу цахууш нийса елла агӀо',
 'randomincategory-selectcategory' => 'Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Дехьа гӀо',
 
 # Random redirect
 'randomredirect' => 'Цахууш нисделла дIасахьажор',
@@ -1455,7 +1542,8 @@ PICT # тайп тайпан
 'brokenredirects-edit' => 'нисйé',
 'brokenredirects-delete' => 'дӀаяккха',
 
-'withoutinterwiki' => 'Кхечу меттанашан хьажориг йоцу агIонаш',
+'withoutinterwiki' => 'Юкъарвики-хьажорагаш йоцу агӀонаш',
+'withoutinterwiki-summary' => 'Лахара агӀонийн юкъарвики-хьажорагаш яц:',
 'withoutinterwiki-submit' => 'Гайта',
 
 'fewestrevisions' => 'ЧIогIа кIезиг башхонаш йолу агIонаш',
@@ -1479,6 +1567,9 @@ PICT # тайп тайпан
 'wantedcategories' => 'Оьшуш йолу категореш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
 'wantedfiles' => 'Оьшуш йолу файлаш',
+'wantedfiletext-cat' => 'Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула <del>сиз</del> хира ду.
+Кхин йоцу файлаш гойту [[:$1]] чохь',
+'wantedfiletext-nocat' => 'Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула <del>сиз</del> хира ду.',
 'wantedtemplates' => 'Оьшуш долу кепаш',
 'mostlinked' => 'Дуккха хьажоригаш тIе тоьхна йолу агIонаш',
 'mostlinkedcategories' => 'Дуккха тӀе хьажораш йолу категореш',
@@ -1489,6 +1580,7 @@ PICT # тайп тайпан
 'mostrevisions' => 'Сих сиха нисйина йолу агIонаш',
 'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
 'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
+'prefixindex-strip' => 'Хиламийн могӀам чура префикс къайлаяккха',
 'shortpages' => 'Боцоа яззамаш',
 'longpages' => 'Беха яззамаш',
 'deadendpages' => 'Дика йоцу агIонаш',
@@ -1497,6 +1589,7 @@ PICT # тайп тайпан
 'listusers' => 'Декъашхой могlам',
 'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
 'listusers-creationsort' => 'Кхолларан хене хьаьжна нисъяр',
+'listusers-desc' => 'Харжа къезиг хиларца',
 'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2',
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
@@ -1553,8 +1646,12 @@ PICT # тайп тайпан
 'sp-deletedcontributions-contribs' => 'къинхьегам',
 
 # Special:LinkSearch
-'linksearch' => 'Арахьа хьажориг',
+'linksearch' => 'Арахьара хьажораг',
+'linksearch-pat' => 'Лаха кеп:',
 'linksearch-ok' => 'Лаха',
+'linksearch-text' => 'Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.
+Лакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />
+Ловш йолу {{PLURAL:$2|протокол|протоколаш}}: <code>$1</code> (Iад йитарца http://, протокол бакъалла язъен яцахь).',
 'linksearch-line' => '$2 — хьажориг кху $1',
 
 # Special:ListUsers
@@ -1578,6 +1675,7 @@ PICT # тайп тайпан
 'listgrouprights-members' => '(тобан могlам)',
 
 # Email user
+'mailnologintext' => 'Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.',
 'emailuser' => 'Декъашхочун хааман кехат',
 'emailuser-title-target' => 'Декъашхочунга кехат яздар',
 'emailuser-title-notarget' => 'Декъашхочунга кехат яздар',
@@ -1729,6 +1827,7 @@ PICT # тайп тайпан
 'undeletebtn' => 'МеттахӀоттае',
 'undeletelink' => 'хьажа/меттахӀоттае',
 'undeleteviewlink' => 'хьажа',
+'undeletereset' => 'ЦӀанъян',
 'undeleteinvert' => 'Къастае массо',
 'undeletecomment' => 'Бахьан:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|хийцамаш|хийцамаш|хийцамаш}} меттахӀоттайина',
@@ -1962,6 +2061,8 @@ PICT # тайп тайпан
 'allmessagesname' => 'Хаам',
 'allmessagesdefault' => 'Шаьшха йоза',
 'allmessagescurrent' => 'Карарчу хенан йоза',
+'allmessagestext' => 'ХӀара «MediaWiki» цӀерийн меттигера системан хаамийн могӀа бу.
+Хьайна MediaWiki тая лууш делахь, дехар до, проект [//translatewiki.net translatewiki.net] [//www.mediawiki.org/wiki/Localisation юьйцучу хьажа].',
 'allmessages-filter-legend' => 'Литтар',
 'allmessages-filter' => 'Литтар оцу хьола хийцамца:',
 'allmessages-filter-unmodified' => 'Хийцан йоцурш',
@@ -1969,7 +2070,7 @@ PICT # тайп тайпан
 'allmessages-filter-modified' => 'Хийцнарш',
 'allmessages-prefix' => 'Литтар оцу дешахьалхе:',
 'allmessages-language' => 'Мотт:',
-'allmessages-filter-submit' => 'Ð\94еÑ\85Ñ\8cа Ð²Ð°Ð»Ð°',
+'allmessages-filter-submit' => 'Ð\94еÑ\85Ñ\8cа Ð³Ó\80о',
 
 # Thumbnails
 'thumbnail-more' => 'Доккха де',
@@ -1980,6 +2081,7 @@ PICT # тайп тайпан
 'import-interwiki-source' => 'Вики-хьост/агlо:',
 'import-interwiki-templates' => 'Лата де массо кепаш',
 'import-upload-filename' => 'Файлан цӀе:',
+'import-comment' => 'Билгалдаккхар:',
 'importnosources' => 'Юкъаравики-импортан хьост хаьржина яцара, дуьхьала хийцамашан истори чуяккхар дӀадайина ду.',
 
 # Import log
@@ -2005,7 +2107,7 @@ PICT # тайп тайпан
 'tooltip-ca-watch' => 'Тlетоха хlара агlо сан тергаме могlам юкъа',
 'tooltip-ca-unwatch' => 'Дlайаккха хlара агlо хьай тергаме могlам юкъар',
 'tooltip-search' => 'Лаха иза дош',
-'tooltip-search-go' => 'Билгала и санна цlе йолучу агlон чу дехьа вала',
+'tooltip-search-go' => 'Билгала и санна цӀе йолучу агӀон чу дехьа гӀо',
 'tooltip-search-fulltext' => 'Лаха агlонаш ше чулацамехь хlара йоза долуш',
 'tooltip-p-logo' => 'Коьрта агӀона дехьа гӀо',
 'tooltip-n-mainpage' => 'Коьрта агӀона дехьа гӀо',
@@ -2103,9 +2205,10 @@ PICT # тайп тайпан
 'show-big-image-size' => '$1 × $2 пикселш',
 
 # Special:NewFiles
-'newimages' => 'Ð\9aеÑ\80лаÑ\87Ñ\83 Ñ\84айланÑ\88ан галерий',
+'newimages' => 'Ð\9aеÑ\80лаÑ\87Ñ\83 Ñ\84айлийн галерий',
 'newimages-summary' => 'ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.',
 'newimages-legend' => 'Литтар',
+'showhidebots' => '$1 шабелхалой',
 'ilsubmit' => 'Лаха',
 'sp-newimages-showfrom' => 'Гайта керла файлаш $2, $1 тӀера дуьйна',
 
@@ -2168,6 +2271,7 @@ PICT # тайп тайпан
 'exif-gpsaltitude' => 'Локхалла',
 'exif-gpsdestlatitude' => 'Объектан дохалла',
 'exif-gpsdatestamp' => 'Терахь',
+'exif-jpegfilecomment' => 'JPEG-файлан билгалдаккхар',
 'exif-keywords' => 'Коьрта дешнаш',
 'exif-objectname' => 'Йоцца цӀе',
 'exif-specialinstructions' => 'Къаьсттина тӀехьажор',
@@ -2179,6 +2283,8 @@ PICT # тайп тайпан
 'exif-originaltransmissionref' => 'ДӀадолалун меттиган код',
 'exif-label' => 'Билгало',
 'exif-datetimemetadata' => 'ТӀехьара метахаамаш хийцина терахь',
+'exif-pngfilecomment' => 'PNG-файлан билгалдаккхар',
+'exif-giffilecomment' => 'GIF-файлан билгалдаккхар',
 
 # Exif attributes
 'exif-compression-1' => 'ТIеIовдан яц',
@@ -2281,11 +2387,17 @@ PICT # тайп тайпан
 'redirect' => 'Декъашхочун файлан тӀера дӀасхьажор',
 'redirect-legend' => 'Файлан я агӀона тӀера дӀасхьажор',
 'redirect-summary' => 'ХӀара агӀо лело йиш ю файлан я агӀона тӀера дӀасхьажош.',
+'redirect-submit' => 'Дехьа гӀо',
+'redirect-lookup' => 'Лаха:',
 'redirect-value' => 'МаьӀна:',
 'redirect-user' => 'Декъашхочун ID',
+'redirect-revision' => 'АгӀона верси',
+'redirect-file' => 'Файлан цӀе',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Лаха цхьатера йолу файлаш',
+'fileduplicatesearch-summary' => 'Лаха цхьатера йолу файлаш хэш-кодаца.',
+'fileduplicatesearch-legend' => 'Цхьатера ерш лахар',
 'fileduplicatesearch-filename' => 'Файлан цӀе:',
 'fileduplicatesearch-submit' => 'Лаха',
 'fileduplicatesearch-info' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}<br />Файлан барам: $3<br />MIME-тайп: $4',
@@ -2357,6 +2469,7 @@ PICT # тайп тайпан
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а',
 'logentry-newusers-newusers' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
 'logentry-newusers-create' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
+'logentry-newusers-autocreate' => 'Автоматически кхоьллина {{GENDER:$2|декъашхочун}} $1 дӀаяздар',
 'logentry-rights-rights' => '$1 {{GENDER:$2|хийцина}} хӀокхуна $3 бакъо $4 → $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо',
 'rightsnone' => '(яц)',
index 3090f3f..6716b78 100644 (file)
@@ -2461,12 +2461,9 @@ $1',
 'ipb_blocked_as_range' => 'هەڵە: ئای‌پی $1 ڕاستەوخۆ بەربەست نەکراوە بۆیە ناکڕێت لە بەربەست لای‌ بەیت.
 ئەوە وەک بەشێک لە زنجیرە ئای‌پیی $2 بەربەست کراوە و هەر بەو شێوە دەکرێ لە بەربەست دەرچێ.',
 'ip_range_invalid' => 'زنجیرە ئای‌پی نەگونجاو.',
-'blockme' => 'بەربەست‌کردنی من',
 'proxyblocker' => 'بەربەست‌کەری پرۆکسی',
-'proxyblocker-disabled' => 'ئەم فەنکشێنە لەکار خستراوە.',
 'proxyblockreason' => 'ناونیشانی ئای‌پی تۆ بەربەست‌کراوە لەبەر ئەوەی پرۆکسیەکی کراوەیە.
 تکایە پەیوەندی بکە بە دابینکەری خزمەتی ئینتەرنەتی خۆت یان پاڵپشتی تەکنیکی و ئاگادریان کەوە لەو کێشە ئەمنیە گرینگە.',
-'proxyblocksuccess' => 'جێ‌بەجێ‌کرا.',
 'sorbsreason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.',
 'sorbs_create_account_reason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.
 بۆیە ناتوانی هەژمارە درووست‌بکەی.',
index a582b18..1d8cf70 100644 (file)
@@ -230,7 +230,7 @@ $messages = array(
 'noindex-category' => 'Индекссиз саифелер',
 'broken-file-category' => 'Ичинде бозукъ файл багълантылары олгъан саифелер',
 
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„])))(.+)$/sDu',
 
 'about' => 'Акъкъында',
 'article' => 'Саифе',
index bd6306f..9b51638 100644 (file)
@@ -224,7 +224,7 @@ $messages = array(
 'noindex-category' => 'İndekssiz saifeler',
 'broken-file-category' => 'İçinde bozuq fayl bağlantıları olğan saifeler',
 
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„])))(.+)$/sDu',
 
 'about' => 'Aqqında',
 'article' => 'Saife',
index 81ba616..c4277c2 100644 (file)
@@ -2857,11 +2857,8 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 není blokována přímo a tak ji nelze odblokovat. Je částí zablokovaného rozsahu $2, který může být odblokován.',
 'ip_range_invalid' => 'Neplatný IP rozsah.',
 'ip_range_toolarge' => 'Blokování rozsahů větších než /$1 není dovoleno.',
-'blockme' => 'Zablokuj mě',
 'proxyblocker' => 'Blokování proxy serverů',
-'proxyblocker-disabled' => 'Tato funkce je vypnuta.',
 'proxyblockreason' => 'Vaše IP adresa byla zablokována, protože funguje jako otevřený proxy server. Kontaktujte svého poskytovatele internetového připojení nebo technickou podporu a informujte je o tomto vážném bezpečnostním problému.',
-'proxyblocksuccess' => 'Hotovo.',
 'sorbsreason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.',
 'sorbs_create_account_reason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet',
 'xffblockreason' => 'IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1',
@@ -3880,7 +3877,7 @@ Opravdu si přejete znovu tuto stránku založit?',
 
 # Separators for various lists, etc.
 'ellipsis' => '…',
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← předchozí stránka',
index 67b8657..2d2d4bf 100644 (file)
@@ -1041,7 +1041,6 @@ Biéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc
 'blocklogentry' => 'zablokòwôł [[$1]], czas blokadë: $2 $3',
 'unblocklogentry' => 'òdblokòwôł $1',
 'block-log-flags-nocreate' => 'blokada ùsôdzaniô kònta',
-'proxyblocksuccess' => 'Fertich.',
 
 # Developer tools
 'lockbtn' => 'Zascëgôj bazã pòdôwków',
index e9c7e05..8a6738d 100644 (file)
@@ -180,7 +180,7 @@ $messages = array(
 'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
 'listingcontinuesabbrev' => '· вѧщє',
 
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'опьсаниѥ',
 'article' => 'члѣнъ',
index ef5f4f1..0bbb896 100644 (file)
@@ -153,7 +153,7 @@ $messages = array(
 'category-file-count-limited' => 'Ку категоринче $1 файл.',
 'listingcontinuesabbrev' => '(малалли)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff«"]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff«"])))(.+)$/sD',
 
 'about' => 'Ăнлантаркăч',
 'article' => 'Статья',
index 5ffe6a2..e7c3818 100644 (file)
@@ -301,7 +301,7 @@ $messages = array(
 'tagline' => 'Oddi ar {{SITENAME}}',
 'help' => 'Cymorth',
 'search' => 'Chwilio',
-'searchbutton' => 'Chwilio',
+'searchbutton' => 'Chwilier',
 'go' => 'Eler',
 'searcharticle' => 'Mynd',
 'history' => 'Hanes y dudalen',
@@ -334,7 +334,7 @@ $messages = array(
 'articlepage' => 'Dangos tudalen bwnc',
 'talk' => 'Sgwrs',
 'views' => 'Golygon',
-'toolbox' => 'Blwch offer',
+'toolbox' => 'Offer',
 'userpage' => 'Gweld tudalen y defnyddiwr',
 'projectpage' => 'Gweld tudalen y wici',
 'imagepage' => 'Gweld tudalen y ffeil',
@@ -399,7 +399,7 @@ $1',
 'youhavenewmessagesmulti' => 'Mae negeseuon newydd gennych ar $1',
 'editsection' => 'golygu',
 'editold' => 'golygu',
-'viewsourceold' => 'dangos y tarddiad',
+'viewsourceold' => 'dangos côd y dudalen',
 'editlink' => 'golygu',
 'viewsourcelink' => 'dangos côd y dudalen',
 'editsectionhint' => "Golygu'r adran: $1",
@@ -558,16 +558,16 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'loginprompt' => "Mae'n rhaid galluogi cwcis er mwyn mewngofnodi i {{SITENAME}}.",
 'userlogin' => 'Mewngofnodi / creu cyfrif',
 'userloginnocreate' => 'Mewngofnodi',
-'logout' => 'Allgofnodi',
+'logout' => 'Allgofnoder',
 'userlogout' => 'Allgofnodi',
 'notloggedin' => 'Nid ydych wedi mewngofnodi',
 'userlogin-noaccount' => 'Dim cyfrif gennych?',
 'userlogin-joinproject' => 'Ymuno â {{SITENAME}}',
-'nologin' => "Dim cyfrif gennych? '''$1'''.",
+'nologin' => 'Dim cyfrif gennych? $1.',
 'nologinlink' => 'Crëwch gyfrif',
 'createaccount' => 'Creu cyfrif newydd',
-'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
-'gotaccountlink' => 'Mewngofnodwch',
+'gotaccount' => 'Oes cyfrif gennych eisoes? $1.',
+'gotaccountlink' => 'Mewngofnodi',
 'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?',
 'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair',
 'helplogin-url' => 'Help:Mewngofnodi',
@@ -722,7 +722,7 @@ Y cyfrinair dros dro: $2",
 'changeemail-none' => '(dim)',
 'changeemail-password' => 'Eich cyfrinair ar {{SITENAME}}:',
 'changeemail-submit' => 'Newidier y cyfeiriad e-bost',
-'changeemail-cancel' => 'Dileer',
+'changeemail-cancel' => 'Diddymer',
 
 # Special:ResetTokens
 'resettokens' => 'Ailosod tocynnau',
@@ -898,7 +898,7 @@ Cynigiodd y gweinyddwr a glodd y gronfa ddata y rheswm hwn dros ei chloi: $1",
 Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 'semiprotectedpagewarning' => "'''Sylwer:''' Mae'r dudalen hon wedi ei chloi; dim ond defnyddwyr cofrestredig a allant ei golygu.
 Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
-'cascadeprotectedwarning' => "'''Dalier sylw:''' Mae'r dudalen hon wedi ei diogelu fel nad ond defnyddwyr â galluoedd gweinyddwyr sy'n gallu ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei|ei|eu|eu|eu|eu}} sgydol-ddiogelu.",
+'cascadeprotectedwarning' => "'''Dalier sylw:''' Mae'r dudalen hon wedi ei diogelu fel nad ond defnyddwyr â galluoedd gweinyddwyr sy'n gallu ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei sgydol-ddiogelu|ei sgydol-ddiogelu|eu sgydol-diogelu}}.",
 'titleprotectedwarning' => "'''RHYBUDD:  Mae'r dudalen hon wedi ei chloi; dim ond rhai defnyddwyr sydd â'r [[Special:ListGroupRights|gallu]] i'w chreu.'''
 Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 'templatesused' => 'Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y dudalen hon:',
@@ -2611,11 +2611,8 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
 'ipb_blocked_as_range' => "Gwall: Nid yw'r cyfeiriad IP $1 wedi'n rwystro'n uniongyrchol ac felly ni ellir ei ddadrwystro. Wedi dweud hynny, y mae'n rhan o'r amrediad $2 sydd wedi'i rwystro; gellir dadrwystro'r amrediad.",
 'ip_range_invalid' => 'Ystod IP annilys.',
 'ip_range_toolarge' => "Ni chaniateir rhwystrau ystod sy'n fwy na /$1.",
-'blockme' => 'Rhwystro fi',
 'proxyblocker' => 'Dirprwy-flociwr',
-'proxyblocker-disabled' => 'Analluogwyd y swyddogaeth hon.',
 'proxyblockreason' => "Mae eich cyfeiriad IP wedi'i rwystro gan ei fod yn ddirprwy agored. Cysylltwch â'ch Cyflenwr Gwasanaeth Rhyngrwyd neu gymorth technegol er mwyn eu hysbysu am y broblem ddiogelwch ddifrifol yma.",
-'proxyblocksuccess' => 'Gwnaethpwyd.',
 'sorbsreason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.
 Ni allwch greu cyfrif',
index 04e3d8e..d090089 100644 (file)
@@ -219,7 +219,7 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'Send mig en e-mail ved ændringer til en side eller fil på min overvågningsliste',
 'tog-enotifusertalkpages' => 'Send mig en e-mail når min brugerdiskussionsside ændres',
 'tog-enotifminoredits' => 'Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste',
-'tog-enotifrevealaddr' => 'Vis min e-mail-adresse i mails med besked om ændringer',
+'tog-enotifrevealaddr' => 'Vis min e-mailadresse i e-mails med besked om ændringer',
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
@@ -361,7 +361,7 @@ $messages = array(
 'vector-action-move' => 'Flyt',
 'vector-action-protect' => 'Beskyt',
 'vector-action-undelete' => 'Gendan',
-'vector-action-unprotect' => 'Ændr beskyttelse',
+'vector-action-unprotect' => 'Ændre beskyttelse',
 'vector-simplesearch-preference' => 'Aktivér forenklet søgefelt (kun Vector-udseendet)',
 'vector-view-create' => 'Opret',
 'vector-view-edit' => 'Redigér',
@@ -398,10 +398,10 @@ $messages = array(
 'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskyt',
-'protect_change' => 'ændr',
+'protect_change' => 'ændre',
 'protectthispage' => 'Beskyt side',
-'unprotect' => 'Ændr beskyttelse',
-'unprotectthispage' => 'Ændr beskyttelsen af denne side',
+'unprotect' => 'Ændre beskyttelse',
+'unprotectthispage' => 'Ændre beskyttelsen af denne side',
 'newpage' => 'Ny side',
 'talkpage' => 'Diskussion',
 'talkpagelinktext' => 'diskussion',
@@ -658,7 +658,7 @@ Brug formularen nedenfor til at logge på som en anden bruger.',
 'createacct-emailrequired' => 'Mailadresse',
 'createacct-emailoptional' => 'Mailadresse (valgfri)',
 'createacct-email-ph' => 'Indtast din mailadresse',
-'createacct-another-email-ph' => 'Indtast e-mail-adresse',
+'createacct-another-email-ph' => 'Indtast e-mailadresse',
 'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse',
 'createacct-realname' => 'Dit rigtige navn',
 'createaccountreason' => 'Begrundelse:',
@@ -706,25 +706,24 @@ Din midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
 
 Hvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den,
 kan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.',
-'noemail' => 'Der er ikke oplyst en e-mail-adresse for bruger "$1".',
+'noemail' => 'Der er ikke oplyst en e-mailadresse for bruger "$1".',
 'noemailcreate' => 'Du skal angive en gyldig e-mailadresse',
-'passwordsent' => 'En ny adgangskode er sendt til e-mail-adressen,
-som er registreret for "$1".
+'passwordsent' => 'En ny adgangskode er sendt til e-mailadressen, som er registreret for "$1".
 Du bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.',
 'blocked-mailpassword' => 'Din IP-adresse er spærret for ændring af sider. For at forhindre misbrug, er det heller ikke muligt, at bestille et nyt password.',
-'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mail-adresse.
+'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mailadresse.
 
 Før en e-mail kan modtages af andre brugere af {{SITENAME}}-mailfunktionen, skal adressen og dens tilhørsforhold til denne bruger bekræftes. Følg venligst anvisningerne i denne mail.',
 'throttled-mailpassword' => 'Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.',
 'mailerror' => 'Fejl ved afsendelse af e-mail: $1',
 'acct_creation_throttle_hit' => 'Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.
 Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.',
-'emailauthenticated' => 'Din e-mail-adresse blev bekræftet $2 $3.',
+'emailauthenticated' => 'Din e-mailadresse blev bekræftet $2 $3.',
 'emailnotauthenticated' => 'Din e-mail-adresse er endnu ikke bekræftet og de avancerede e-mail-funktioner er slået fra indtil bekræftelse har fundet sted (d.u.a.). Log ind med den midlertidige adgangskode, der er blevet sendt til dig, for at bekræfte, eller bestil et nyt på loginsiden.',
-'noemailprefs' => 'Angiv en e-mail-adresse, så følgende funktioner er til rådighed.',
-'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).',
-'invalidemailaddress' => 'E-mail-adressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mail-adresse med et korrekt format eller tøm feltet.',
-'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
+'noemailprefs' => 'Angiv en e-mailadresse, så følgende funktioner er til rådighed.',
+'emailconfirmlink' => 'Bekræft din e-mailadresse',
+'invalidemailaddress' => 'E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet.',
+'cannotchangeemail' => 'De e-mailadresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
 'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.',
 'accountcreated' => 'Brugerkonto oprettet',
 'accountcreatedtext' => 'Brugerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) er oprettet.',
@@ -744,7 +743,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 
 # 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-addy' => 'Forsøgte at sende e-mail uden en e-mailadresse',
 'user-mail-no-body' => 'Forsøgte at sende en e-mail med tomt eller urimeligt kort indhold.',
 
 # Change password dialog
@@ -775,22 +774,22 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
 'passwordreset-emaildisabled' => 'E-mailfunktioner er slået fra på denne wiki.',
 'passwordreset-username' => 'Brugernavn:',
 'passwordreset-domain' => 'Domæne:',
-'passwordreset-capture' => 'Se den resulterende email?',
+'passwordreset-capture' => 'Se den resulterende e-mail?',
 'passwordreset-capture-help' => 'Hvis du krydser dette felt af, vil emailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.',
-'passwordreset-email' => 'E-mail adresse:',
+'passwordreset-email' => 'E-mailadresse:',
 'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
-'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
 'passwordreset-emailelement' => 'Brugernavn: $1
 Midlertidig adgangskode: $2',
 'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet sendt.',
@@ -798,15 +797,15 @@ Midlertidig adgangskode: $2',
 'passwordreset-emailerror-capture' => 'En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Ændr email-adresse',
-'changeemail-header' => 'Ændr kontoens email-adresse',
-'changeemail-text' => 'Udfyld denne formular for at ændre din email-adresse. Du skal indtaste dit kodeord for at bekræfte denne ændring.',
+'changeemail' => 'Ændre e-mailadresse',
+'changeemail-header' => 'Ændre kontoens e-mailadresse',
+'changeemail-text' => 'Udfyld denne formular for at ændre din e-mailadresse. Du skal indtaste dit kodeord for at bekræfte denne ændring.',
 'changeemail-no-info' => 'Du skal være logget på for at komme direkte til denne side.',
-'changeemail-oldemail' => 'Nuværende email-adresse:',
-'changeemail-newemail' => 'Ny email-adresse:',
+'changeemail-oldemail' => 'Nuværende e-mailadresse:',
+'changeemail-newemail' => 'Ny e-mailadresse:',
 'changeemail-none' => '(ingen)',
 'changeemail-password' => 'Din adgangskode til {{SITENAME}}:',
-'changeemail-submit' => 'Ændr email',
+'changeemail-submit' => 'Ændre e-mail',
 'changeemail-cancel' => 'Afbryd',
 
 # Special:ResetTokens
@@ -886,13 +885,13 @@ Begrundelsen for det er:
 
 Du kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen.
 
-Bemærk at du ikke kan bruge funktionen "e-mail til denne bruger" medmindre du har en gyldig e-mail-adresse registreret i din [[Special:Preferences|brugerindstilling]], og du ikke er blevet blokeret fra at bruge den.
+Bemærk at du ikke kan bruge funktionen "e-mail til denne bruger" medmindre du har en gyldig e-mailadresse registreret i din [[Special:Preferences|brugerindstilling]], og du ikke er blevet blokeret fra at bruge den.
 
 Din nuværende IP-adresse er $3, og blokerings-id\'et er #$5.
 Angiv venligst alle de ovenstående detaljer ved eventuelle henvendelser.',
 'blockednoreason' => 'ingen begrundelse givet',
 'whitelistedittext' => 'Du skal $1 for at kunne redigere sider.',
-'confirmedittext' => 'Du skal først bekræfte e-mail-adressen, før du kan lave ændringer. Udfyld og bekræft din e-mail-adresse i dine [[Special:Preferences|Indstillinger]].',
+'confirmedittext' => 'Du skal først bekræfte e-mailadressen, før du kan lave ændringer. Udfyld og bekræft din e-mailadresse i dine [[Special:Preferences|indstillinger]].',
 'nosuchsectiontitle' => 'Kan ikke finde afsnittet',
 'nosuchsectiontext' => 'Du forsøgte at ændre et ikke-eksisterende afsnit. Det kan være flyttet eller slettet, siden du hentede siden.',
 'loginreqtitle' => 'Log på nødvendigt',
@@ -1152,7 +1151,7 @@ Andre administratorer på {{SITENAME}} vil fortsat være i stand til at se det s
 'revdelete-hide-comment' => 'Skjul ændringskommentar',
 'revdelete-hide-user' => 'Skjul brugerens brugernavn/IP',
 'revdelete-hide-restricted' => 'Skjul også informationen for administratorer',
-'revdelete-radio-same' => '(ændr ikke)',
+'revdelete-radio-same' => '(ikke ændre)',
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nej',
 'revdelete-suppress' => 'Skjul også informationen for administratorer',
@@ -1331,8 +1330,8 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'prefs-watchlist-token' => 'Overvågningslistenøgle:',
 'prefs-misc' => 'Forskelligt',
 'prefs-resetpass' => 'Skift adgangskode',
-'prefs-changeemail' => 'Ændr email',
-'prefs-setemail' => 'Angiv en email-adresse',
+'prefs-changeemail' => 'Ændre e-mailadresse',
+'prefs-setemail' => 'Angiv en e-mailadresse',
 'prefs-email' => 'Indstillinger for e-mail',
 'prefs-rendering' => 'Udseende',
 'saveprefs' => 'Gem indstillinger',
@@ -1405,9 +1404,9 @@ Informationen vil være offentlig.',
 'email' => 'E-mail',
 'prefs-help-realname' => 'Angivelse af rigtigt navn er valgfrit.
 Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
-'prefs-help-email' => 'Angivelse af e-mail-adresse er valgfrit. Det gør det muligt at sende dig en ny adgangskode hvis du glemmer den.',
+'prefs-help-email' => 'Angivelse af e-mailadresse er valgfrit, men den gør det muligt at sende dig en ny adgangskode hvis du glemmer den.',
 'prefs-help-email-others' => 'Du kan også vælge at lade andre kontakte dig gennem din bruger eller diskussions side uden at behøve at afsløre din identitet.',
-'prefs-help-email-required' => 'E-mail-adresse er krævet.',
+'prefs-help-email-required' => 'E-mailadresse er krævet.',
 'prefs-info' => 'Grundlæggende information',
 'prefs-i18n' => 'Internationalisering:',
 'prefs-signature' => 'Signatur',
@@ -1429,7 +1428,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 
 # 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',
+'email-address-validity-invalid' => 'Indtast en gyldig e-mailadresse',
 
 # User rights
 'userrights' => 'Håndtering af brugerrettigheder',
@@ -1530,8 +1529,8 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'right-editmyuserjs' => 'Redigere dine egne JavaScript-filer',
 'right-viewmywatchlist' => 'Se din egen overvågningsliste',
 'right-editmywatchlist' => 'Redigere din egen overvågningsliste. Bemærk nogle handlinger tilføjer sider selv uden denne rettelse.',
-'right-viewmyprivateinfo' => 'Se dine egen private data (f.eks. e-mail-adresse, rigtige navn)',
-'right-editmyprivateinfo' => 'Redigere din egen private data (f.eks. e-mail-adresse, rigtige navn)',
+'right-viewmyprivateinfo' => 'Se dine egne private data (f.eks. e-mailadresse, rigtige navn)',
+'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. e-mailadresse, rigtige navn)',
 'right-editmyoptions' => 'Redigere dine egne indstillinger',
 'right-rollback' => 'Hurtig gendannelse af alle redigeringer foretaget af den seneste bruger',
 'right-markbotedits' => 'Markere gendannelser som ændringer foretaget af en robot',
@@ -1593,7 +1592,7 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'action-userrights' => 'ændre alle brugerrettigheder',
 'action-userrights-interwiki' => 'ændre brugerrettigheder for brugere på andre wikier',
 'action-siteadmin' => 'låse eller låse databasen op',
-'action-sendemail' => 'sende email',
+'action-sendemail' => 'sende e-mail',
 'action-editmywatchlist' => 'rediger din overvågningsliste',
 'action-viewmywatchlist' => 'se din overvågningsliste',
 'action-viewmyprivateinfo' => 'se din private information',
@@ -2243,17 +2242,17 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat
 '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',
-'emailuser-title-target' => 'Send email til denne {{GENDER:$1|bruger}}',
-'emailuser-title-notarget' => 'Send email til en bruger',
+'emailuser-title-target' => 'Send e-mail til denne {{GENDER:$1|bruger}}',
+'emailuser-title-notarget' => 'Send e-mail til en bruger',
 'emailpage' => 'E-mail bruger',
 'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne {{GENDER:$1|bruger}}.
 Den e-mail-adresse, du har angivet i [[Special:Preferences|dine indstillinger]], vil dukke op i "fra"-feltet på e-mailen, så modtageren kan svare dig.',
 'usermailererror' => 'E-mail-modulet returnerede en fejl:',
-'defemailsubject' => '{{SITENAME}}-email fra brugeren "$1"',
+'defemailsubject' => '{{SITENAME}}-e-mail fra brugeren "$1"',
 'usermaildisabled' => 'Bruger-e-mail deaktiveret',
 'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere på denne wiki',
-'noemailtitle' => 'Ingen e-mail-adresse',
-'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.',
+'noemailtitle' => 'Ingen e-mailadresse',
+'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mailadresse.',
 'nowikiemailtitle' => 'E-mail er ikke tilladt',
 'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.',
 'emailnotarget' => 'Ikke-eksisterende eller ugyldigt brugernavn for modtageren.',
@@ -2417,7 +2416,7 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sideb
 'modifiedarticleprotection' => 'ændrede beskyttelsen af "[[$1]]"',
 'unprotectedarticle' => 'fjernede beskyttelse af "[[$1]]"',
 'movedarticleprotection' => 'flyttede beskyttelsesindstillinger fra "[[$2]]" til "[[$1]]"',
-'protect-title' => 'Ændr beskyttelse af "$1"',
+'protect-title' => 'Ændre beskyttelse af "$1"',
 'protect-title-notallowed' => 'Få vist beskyttelsesniveauet af "$1"',
 'prot_1movedto2' => '$1 flyttet til $2',
 'protect-badnamespace-title' => 'Navnerum, der ikke kan beskyttes',
@@ -2662,7 +2661,7 @@ Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'ipblocklist-no-results' => 'Den angivene IP-addresse eller brugernavn er ikke blokeret.',
 'blocklink' => 'bloker',
 'unblocklink' => 'ophæv blokering',
-'change-blocklink' => 'ændr blokering',
+'change-blocklink' => 'ændre blokering',
 'contribslink' => 'bidrag',
 'emaillink' => 'send e-mail',
 'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]".
@@ -2697,11 +2696,8 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
 'ipb_blocked_as_range' => 'Fejl: IP-adressen $1 er ikke direkte blokeret. Derfor kan en blokering ikke ophæves. Adressen er blokeret som en del af intervallet $2. Denne blokering kan ophæves.',
 'ip_range_invalid' => 'Ugyldigt IP-interval.',
 'ip_range_toolarge' => 'Blokeringer af IP-serier større end /$1 er ikke tilladte.',
-'blockme' => 'Bloker mig',
 'proxyblocker' => 'Proxy-blokering',
-'proxyblocker-disabled' => 'Denne funktion er ikke i brug.',
 'proxyblockreason' => "Din IP-adresse er blevet blokeret fordi den er en såkaldt ''åben proxy''. Kontakt din Internet-udbyder eller tekniske hotline og oplyse dem om dette alvorlige sikkerhedsproblem.",
-'proxyblocksuccess' => 'Færdig.',
 'sorbsreason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY.',
 'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.',
 'xffblockreason' => 'En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en på en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1',
@@ -2958,7 +2954,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 Du kan se på kildeteksten.',
 'tooltip-ca-history' => 'Tidligere versioner af denne side',
 'tooltip-ca-protect' => 'Beskyt denne side',
-'tooltip-ca-unprotect' => 'Ændr beskyttelsen af denne side',
+'tooltip-ca-unprotect' => 'Ændre beskyttelsen af denne side',
 'tooltip-ca-delete' => 'Slet denne side',
 'tooltip-ca-undelete' => 'Gendan de redigeringer der blev lavet på denne side før den blev slettet',
 'tooltip-ca-move' => 'Flyt denne side',
@@ -3617,37 +3613,39 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 'limitall' => 'alle',
 
 # 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.',
+'confirmemail' => 'Bekræft e-mailadresse',
+'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mailadresse i din [[Special:Preferences|brugerprofil]].',
+'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mailadresse (autentificering), før du kan bruge de udvidede e-mailfunktioner. 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-mailadressen er gyldig.',
 'confirmemail_pending' => 'En bekræftelsesmail er allerede sendt til dig. Hvis du først for nylig har oprettet brugerkontoen, vent da et par minutter på denne e-mail, før du bestiller en ny kode.',
 'confirmemail_send' => 'Send bekræftelseskode',
 'confirmemail_sent' => 'Bekræftelses-e-mail afsendt.',
-'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mail-adresse. Denne kode skal ikke bruges til anmeldelsen, den kræves dog til aktiveringen af e-mail-funktionerne indenfor Wikien.',
-'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt.
+'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mailadresse. Denne kode skal ikke bruges til at logge på, den kræves til aktivering af e-mailfunktionerne i Wikien.',
+'confirmemail_sendfailed' => '{{SITENAME}} kunne ikke afsende din bekræftelsesmail.
+Kontroller at e-mailadressen er korrekt.
 
-Svarbesked fra mailserveren: $1',
+Besked fra mailserveren: $1',
 'confirmemail_invalid' => 'Ugyldig bekræftelseskode. Kodens gyldighed er muligvis udløbet.',
-'confirmemail_needlogin' => 'Du skal $1 for at bekræfte e-mail-adressen.',
-'confirmemail_success' => 'E-mail-adressen er nu bekræftet. Du kan nu logge på.',
-'confirmemail_loggedin' => 'E-mail-adressen er nu bekræftet.',
-'confirmemail_error' => 'Der skete en fejl ved bekræftelsen af e-mail-adressen.',
-'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mail-adressen',
+'confirmemail_needlogin' => 'Du skal $1 for at bekræfte din e-mailadresse.',
+'confirmemail_success' => 'E-mailadressen er blevet bekræftet.
+Du kan nu [[Special:UserLogin|logge på]].',
+'confirmemail_loggedin' => 'Din e-mailadresse er nu bekræftet.',
+'confirmemail_error' => 'Der skete en fejl under lagring af din bekræftelse.',
+'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mailadresse',
 'confirmemail_body' => 'Hej,
 
-Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mail-adresse til brugerkontoen "$2" på {{SITENAME}}.
+Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mailadresse til brugerkontoen "$2" på {{SITENAME}}.
 
-For at aktivere e-mail-funktionen for {{SITENAME}} (igen) og for at bekræfte, at denne brugerkonto virkelig hører til din e-mail-adresse og dermed til dig, bedes du åbne det følgende link i din browser: $3
+For at aktivere e-mailfunktionen for {{SITENAME}} og for at bekræfte, at denne brugerkonto virkelig hører til din e-mailadresse og dermed til dig, bedes du åbne det følgende link i din browser: $3
 
 Bekræftelseskoden er gyldig indtil følgende tidspunkt: $4
 
-Hvis denne e-mail-adresse *ikke* hører til den anførte brugerkonto, skal du i stedet åbne dette link i din browser: $5
+Hvis denne e-mailadresse *ikke* hører til den anførte brugerkonto, skal du i stedet åbne dette link i din browser: $5
 
 --
 {{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}',
-'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret emailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
+'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret e-mailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
 
-For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere emailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
+For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere e-mailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
 
 $3
 
index afea089..baba696 100644 (file)
@@ -2919,11 +2919,8 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
 'ipb_blocked_as_range' => 'Fehler: Die IP-Adresse $1 wurde als Teil der Bereichssperre $2 indirekt gesperrt. Eine Entsperrung von $1 alleine ist nicht möglich.',
 'ip_range_invalid' => 'Ungültiger IP-Adressbereich.',
 'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
-'blockme' => 'Sperre mich',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Diese Funktion ist deaktiviert.',
 'proxyblockreason' => 'Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.',
-'proxyblocksuccess' => 'Erledigt.',
 'sorbsreason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.',
 'sorbs_create_account_reason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.',
 'xffblockreason' => 'Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1',
@@ -4208,12 +4205,12 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
 'revdelete-uname-unhid' => 'Benutzername freigegeben',
 'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren',
 'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben',
-'logentry-move-move' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4',
-'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
-'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
-'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung, ohne selbst eine Weiterleitung anzulegen',
-'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} Version $4 von Seite $3 als kontrolliert',
-'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch Version $4 von Seite $3 als kontrolliert',
+'logentry-move-move' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4 und überschrieb dabei eine Weiterleitung, ohne selbst eine Weiterleitung anzulegen',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} die Version $4 von Seite $3 als kontrolliert',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch die Version $4 von Seite $3 als kontrolliert',
 'logentry-newusers-newusers' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
 'logentry-newusers-create' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
 'logentry-newusers-create2' => 'Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}}',
index d87a09c..bf37f54 100644 (file)
@@ -2805,11 +2805,8 @@ belka ver-grewtış wedariyayo.',
 labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no wedari.',
 'ip_range_invalid' => 'Rêza IPi nêvêrena.',
 'ip_range_toolarge' => 'Menzilan ke /$1 ra girdêrê inan rê izin nidano.',
-'blockme' => 'Mi blok bik',
 'proxyblocker' => 'blokarê proxyi',
-'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.',
 'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.',
-'proxyblocksuccess' => 'Qeyd ke.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra  DNSBL de proxy hesibyayo u liste biyo.',
 'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo.
index c87a1e4..ef04517 100644 (file)
@@ -2508,11 +2508,8 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 'ipb_blocked_as_range' => 'Zmólka: IP-adresa $1 njejo direktnje blokěrowana a njeda se wótblokěrowaś. Jo pak ako źěl wobcerka $2 blokěrowana, kótaryž da se wótblokěrowaś.',
 'ip_range_invalid' => 'Njepłaśecy wobłuk IP-adresow.',
 'ip_range_toolarge' => 'Wobcerkowe bloki, kótarež su wětše ako /$1, njejsu dowólone.',
-'blockme' => 'blokěruj mě',
 'proxyblocker' => 'Blokěrowanje proxy',
-'proxyblocker-disabled' => 'Toś ta funkcija jo znjemóžnjona.',
 'proxyblockreason' => 'Twója IP-adresa jo se blokěrowała, dokulaž jo wócynjony proxy. Pšosym kontaktěruj swójogo seśowego providera abo swóje systemowe administratory a informěruj je wó toś tom móžnem wěstotnem problemje.',
-'proxyblocksuccess' => 'Gótowe.',
 'sorbsreason' => 'Twója IP-adresa jo w DNSBL we {{GRAMMAR:lokatiw|{{SITENAME}}}} zapisana ako wócynjony proxy.',
 'sorbs_create_account_reason' => 'Twója IP-adresa jo w DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} ako wócynjony proxy zapisana. Njejo móžno, nowe wužywarske konta załožowaś.',
 'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twója pak ta proksy-serwera, kótaryž wužywaš, jo se zablokěrowała. Spócetna pśicyna za blokěrowanje jo była: $1',
index 04b7ff0..87c5aeb 100644 (file)
@@ -734,7 +734,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'blocklink' => 'ފިޔަވަޅުއަޅުއްވާ',
 'unblocklink' => 'ފިޔަވަޅުއެޅުން ބަދަލުކުރައްވާ',
 'contribslink' => 'ޙިއްޞާ',
-'proxyblocksuccess' => 'ފުރިހަމަވެއްޖެ.',
 
 # Developer tools
 'lockdb' => 'ކޮށާރު ބަންދުކުރައްވާ',
index 22e7b4e..ab4f228 100644 (file)
@@ -2828,11 +2828,8 @@ $1',
 'ipb_blocked_as_range' => 'Σφάλμα! Η φραγή της διεύθυνσης IP $1 δεν είναι άμεση και δεν μπορεί να αρθεί. Όμως αποτελεί μέρος της περιοχής $2, της οποίας η φραγή μπορεί να αρθεί.',
 'ip_range_invalid' => 'Το εύρος των διευθύνσεων IP δεν είναι έγκυρο.',
 'ip_range_toolarge' => 'Φραγές range μεγαλύτερων από /$1 δεν επιτρέπονται.',
-'blockme' => 'Φραγή σε μένα',
 'proxyblocker' => 'Εργαλείο φραγής διακομιστών (proxy blocker)',
-'proxyblocker-disabled' => 'Η λειτουργία αυτή έχει απενεργοποιηθεί.',
 'proxyblockreason' => 'Η διεύθυνση IP σας έχει υποστεί φραγή γιατί είναι open proxy. Παρακαλούμε επικοινωνείστε με τον παροχέα υπηρεσιών Διαδικτύου που χρησιμοποιείτε ή με την τεχνική υποστήριξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαρό θέμα ασφάλειας.',
-'proxyblocksuccess' => 'Ολοκληρώθηκε!',
 'sorbsreason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.',
 'sorbs_create_account_reason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί open proxy στο DNSBL. Δεν μπορείτε να δημιουργήσετε λογαριασμό χρήστη.',
 'cant-block-while-blocked' => 'Δεν μπορείτε να φράξετε άλλους χρήστες ενώ είστε φραγμένος/η.',
index e247442..0c1b560 100644 (file)
@@ -392,7 +392,6 @@ $specialPageAliases = array(
        'Badtitle'                  => array( 'Badtitle' ),
        'Blankpage'                 => array( 'BlankPage' ),
        'Block'                     => array( 'Block', 'BlockIP', 'BlockUser' ),
-       'Blockme'                   => array( 'BlockMe' ),
        'Booksources'               => array( 'BookSources' ),
        'BrokenRedirects'           => array( 'BrokenRedirects' ),
        'Categories'                => array( 'Categories' ),
@@ -791,7 +790,7 @@ future releases. Also note that since each list value is wrapped in a unique
 'broken-file-category'           => 'Pages with broken file links',
 'categoryviewer-pagedlinks'      => '($1) ($2)', # only translate this message to other languages if you have to change it
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD', # only translate this message to other languages if you have to change it
 
 'about'         => 'About',
 'article'       => 'Content page',
@@ -874,7 +873,7 @@ future releases. Also note that since each list value is wrapped in a unique
 'articlepage'        => 'View content page',
 'talk'               => 'Discussion',
 'views'              => 'Views',
-'toolbox'            => 'Toolbox',
+'toolbox'            => 'Tools',
 'userpage'           => 'View user page',
 'projectpage'        => 'View project page',
 'imagepage'          => 'View file page',
@@ -3400,12 +3399,9 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
 It is, however, blocked as part of the range $2, which can be unblocked.',
 'ip_range_invalid'                => 'Invalid IP range.',
 'ip_range_toolarge'               => 'Range blocks larger than /$1 are not allowed.',
-'blockme'                         => 'Block me',
 'proxyblocker'                    => 'Proxy blocker',
-'proxyblocker-disabled'           => 'This function is disabled.',
 'proxyblockreason'                => 'Your IP address has been blocked because it is an open proxy.
 Please contact your Internet service provider or technical support of your organization and inform them of this serious security problem.',
-'proxyblocksuccess'               => 'Done.',
 'sorbs'                           => 'DNSBL', # only translate this message to other languages if you have to change it
 'sorbsreason'                     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.',
 'sorbs_create_account_reason'     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.
@@ -3855,6 +3851,8 @@ This is probably caused by a link to a blacklisted external site.',
 'spam_reverting'      => 'Reverting to last revision not containing links to $1',
 'spam_blanking'       => 'All revisions contained links to $1, blanking',
 'spam_deleting'       => 'All revisions contained links to $1, deleting',
+'simpleantispam-label' => "Anti-spam check.
+Do '''NOT''' fill this in!",
 
 # Info page
 'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
index fb5be50..2144c40 100644 (file)
@@ -2764,11 +2764,8 @@ La kialo donita por la forbaro de $1 estis: "$2"',
 'ipb_blocked_as_range' => 'Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.',
 'ip_range_invalid' => 'Malvalida IP-adresa intervalo.',
 'ip_range_toolarge' => 'IP-adresaj intervaloj pli grandaj ol /$1 estas malpermesataj.',
-'blockme' => 'Forbari min',
 'proxyblocker' => 'Forbarilo por prokuriloj.',
-'proxyblocker-disabled' => 'Ĉi tiu funkcio estas malŝaltita.',
 'proxyblockreason' => 'Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aŭ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.',
-'proxyblocksuccess' => 'Farita.',
 'sorbsreason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.',
 'cant-block-while-blocked' => 'Vi ne povas forbari aliajn uzantojn dum vi estas forbarita.',
index be82bc2..05f6804 100644 (file)
@@ -2893,11 +2893,8 @@ Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueo
 Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado.',
 'ip_range_invalid' => 'El rango de IP no es válido.',
 'ip_range_toolarge' => 'Los bloqueos de rango superiores a /$1 no están permitidos.',
-'blockme' => 'Bloquearme',
 'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
 'proxyblockreason' => 'Su dirección IP ha sido bloqueada porque es un proxy abierto. Por favor, contacte con su proveedor de servicios de Internet o con su servicio de asistencia técnica e infórmeles de este grave problema de seguridad.',
-'proxyblocksuccess' => 'Hecho.',
 'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.',
 'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
 'xffblockreason' => 'Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1',
index 74f1332..505d090 100644 (file)
@@ -749,6 +749,9 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'userlogin-resetpassword-link' => 'Lähtesta oma parool',
 'helplogin-url' => 'Help:Sisselogimine',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
+'userlogin-loggedin' => 'Oled juba sisse logitud nimega {{GENDER:$1|$1}}.
+Kasuta allolevat vormi, et logida sisse teise kasutajaga.',
+'userlogin-createanother' => 'Loo teine konto',
 'createacct-join' => 'Sisesta allapoole oma andmed.',
 'createacct-another-join' => 'Sisesta allpool uue konto andmed.',
 'createacct-emailrequired' => 'E-posti aadress',
@@ -1230,10 +1233,10 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 'revdelete-no-file' => 'Faili ei ole.',
 'revdelete-show-file-confirm' => 'Kas oled kindel, et soovid häha faili "<nowiki>$1</nowiki>" kustutatud redaktsiooni, mis tehti $2 kell $3?',
 'revdelete-show-file-submit' => 'Jah',
-'revdelete-selected' => "'''{{PLURAL:$2|Valitud versioon|Valitud versioonid}} artiklist [[:$1]]:'''",
+'revdelete-selected' => "'''Valitud {{PLURAL:$2|redaktsioon|redaktsioonid}} leheküljest [[:$1]]:'''",
 'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''",
-'revdelete-text' => "'''Kustutatud redaktsioonid kajastuvad endiselt lehe ajaloos ja logides, kuid osa nende sisust pole tavakasutajatele nähtav.'''
-{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad varjatud sisu siiski vaadata ning seda vajadusel taastada, kui see pole just täiendavalt ära keelatud.",
+'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.'''
+{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.",
 'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
 'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel:
 * Sobimatu isiklik teave
@@ -2452,10 +2455,12 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s
 'deletecomment' => 'Põhjus:',
 'deleteotherreason' => 'Muu või täiendav põhjus:',
 'deletereasonotherlist' => 'Muu põhjus',
-'deletereason-dropdown' => '*Harilikud kustutamise põhjused
-** Autori palve
+'deletereason-dropdown' => '* Harilikud kustutamise põhjused
+** Rämpspostitus
+** Vandalism
 ** Autoriõiguse rikkumine
-** Vandalism',
+** Autori palve
+** Katkine ümbersuunamine',
 'delete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
 'delete-toobig' => 'See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.
 Selle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.',
@@ -2776,11 +2781,8 @@ Blokeering võib juba eemaldatud olla.',
 See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.',
 'ip_range_invalid' => 'Vigane IP-vahemik.',
 'ip_range_toolarge' => 'Suuremad aadressiblokid kui /$1 pole lubatud.',
-'blockme' => 'Blokeeri mind',
 'proxyblocker' => 'Proksiblokeerija',
-'proxyblocker-disabled' => 'See funktsioon ei toimi.',
 'proxyblockreason' => 'Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.',
-'proxyblocksuccess' => 'Tehtud.',
 'sorbsreason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.',
 'sorbs_create_account_reason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.
 Sa ei saa kasutajakontot luua.',
index 825466d..7749d0d 100644 (file)
@@ -2438,11 +2438,8 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak
 Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
 'ip_range_invalid' => 'Baliogabeko IP eremua.',
 'ip_range_toolarge' => '/$1 baino handiagoak diren blokeo eremuak ezin dira eskuratu.',
-'blockme' => 'Blokea nazazu',
 'proxyblocker' => 'Proxy blokeatzailea',
-'proxyblocker-disabled' => 'Funtzio hau ez-gaitua dago.',
 'proxyblockreason' => 'Zure IP helbidea blokeatu egin da proxy ireki baten zaudelako. Mesedez, zure Interneteko Zerbitzu Hornitzailearekin harremanetan jar zaitez segurtasun arazo honetaz ohartarazteko.',
-'proxyblocksuccess' => 'Egina.',
 'sorbsreason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan.',
 'sorbs_create_account_reason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan. Ezin duzu kontua sortu.',
 'cant-block-while-blocked' => 'Blokeatuta zauden bitartean ezin dituzu beste lankideak blokeatu.',
@@ -2510,7 +2507,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 'move-subpages' => 'Azpiorrialde guztiak ($1-tik gora) mugitu',
 'move-talk-subpages' => 'Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu',
 'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.',
-'movepage-page-moved' => '$1 orria $2 izenera aldatu da.',
+'movepage-page-moved' => '«$1» orria «$2» izenera aldatu da.',
 'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
 'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
 'movelogpage' => 'Mugimendu erregistroa',
@@ -3584,9 +3581,9 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'revdelete-uname-unhid' => 'lankide ezkutua erakutsi',
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
-'logentry-move-move' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du',
+'logentry-move-move' => '$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du, birzuzenketarik utzi gabe',
-'logentry-move-move_redir' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
 'logentry-patrol-patrol' => '$1(e)k $3 orrialdearen $4 berrikuzpena patruilatutzat {{GENDER:$2|markatu}} du',
 'logentry-newusers-newusers' => '$1 erabiltzaile kontua sortu da',
index 6b0eefb..cf6a54d 100644 (file)
@@ -1663,11 +1663,8 @@ Escrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan
 'ipb_cant_unblock' => "Marru: Nu s'á alcuentrau el tarugu con ID $1. Es posibri que ya aiga siu desatarugau.",
 'ipb_blocked_as_range' => "Marru: La IP $1 nu s'alcuentra atarugá diretamenti, polo que nu puei sel desatarugá. Nu ostanti, hue atarugá cumu parti el intervalu $2, que puei sel desatarugau.",
 'ip_range_invalid' => "Rangu d'IP nu premitiu.",
-'blockme' => 'Atarugami',
 'proxyblocker' => 'Tarugaol de proxys',
-'proxyblocker-disabled' => "Esta hunción s'alcuentra desativá.",
 'proxyblockreason' => "La tu direción IP á siu atarugá polque es un proxy abiertu. Pol favol, contauta con el tu proveol de sirvicius d'Internet u con el tu sirviciu d'asisténcia télefónica i enhórmalus desti gravi pobrema e seguráncia.",
-'proxyblocksuccess' => 'Hechu.',
 'sorbsreason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}.',
 'sorbs_create_account_reason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}. Nu se te premiti crial una cuenta',
 
index de17d41..91af22c 100644 (file)
@@ -606,7 +606,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' => 'نمایش تاریخچه',
@@ -655,7 +655,7 @@ $messages = array(
 'articlepage' => 'نمایش مقاله',
 'talk' => 'بحث',
 'views' => 'بازدیدها',
-'toolbox' => 'جعبÙ\87â\80\8cابزار',
+'toolbox' => 'ابزارÙ\87ا',
 'userpage' => 'نمایش صفحهٔ کاربر',
 'projectpage' => 'دیدن صفحهٔ پروژه',
 'imagepage' => 'نمایش صفحهٔ پرونده',
@@ -761,11 +761,11 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'چنین عملی وجود ندارد',
-'nosuchactiontext' => 'عمل مشخص‌شده در نشانی اینترنتی غیرمجاز است.
+'nosuchactiontext' => 'عمل مشخص‌شده در نشانی اینترنتی نامجاز است.
 ممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا پیوند مشکل‌داری را دنبال کرده باشید.
 همچنین ممکن است ایرادی در نرم‌افزار استفاده‌شده در {{SITENAME}} وجود داشته باشد.',
 'nosuchspecialpage' => 'چنین صفحهٔ ویژه‌ای وجود ندارد',
-'nospecialpagetext' => '<strong>شما یک صفحهٔ ویژهٔ غیرمجاز را درخواست کرده‌اید.</strong>
+'nospecialpagetext' => '<strong>شما یک صفحهٔ ویژهٔ نامجاز را درخواست کرده‌اید.</strong>
 
 فهرستی از صفحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.',
 
@@ -1402,11 +1402,11 @@ $2
 'rev-delundel' => 'نمایش/نهفتن',
 'rev-showdeleted' => 'نمایش',
 'revisiondelete' => 'حذف/احیای نسخه‌ها',
-'revdelete-nooldid-title' => 'نسخه هدف غیرمجاز',
+'revdelete-nooldid-title' => 'نسخهٔ هدف نامجاز',
 'revdelete-nooldid-text' => 'شما نسخه‌های هدف را برای انجام این عمل مشخص نکرده‌اید یا این نسخه‌ها وجود ندارند، یا این که شما می‌خواهید آخرین نسخه را پنهان کنید.',
 'revdelete-nologtype-title' => 'نوع سیاهه مشخص نشده‌است',
 'revdelete-nologtype-text' => 'شما هیچ نوع سیاهه‌ای را برای این کار مشخص نکردید.',
-'revdelete-nologid-title' => 'مورد غیرمجاز در سیاهه',
+'revdelete-nologid-title' => 'مدخل نامجاز سیاهه',
 'revdelete-nologid-text' => 'شما یا رویدادی را در سیاههٔ هدف مشخص نکردید یا موردی را مشخص کردید که وجود ندارد.',
 'revdelete-no-file' => 'پروندهٔ مشخص شده وجود ندارد.',
 'revdelete-show-file-confirm' => 'آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذف شده از پروندهٔ «<nowiki>$1</nowiki>» مورخ $2 ساعت $3 را ببینید؟',
@@ -1665,8 +1665,8 @@ $1",
 'yourvariant' => 'گویش زبان محتوا:',
 'prefs-help-variant' => 'گویش انتخابی شما برای نمایش محتوای صفحه‌ها در این ویکی.',
 'yournick' => 'امضای جدید:',
-'prefs-help-signature' => 'نظرهای نوشته شده در صفحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به طور خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.',
-'badsig' => 'امضای خام غیرمجاز.
+'prefs-help-signature' => 'نظرهای نوشته‌شده در صفحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.',
+'badsig' => 'امضای خام نامجاز.
 لطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.',
 'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
 امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.',
@@ -1675,7 +1675,7 @@ $1",
 'gender-male' => 'مرد',
 'gender-female' => 'زن',
 'prefs-help-gender' => 'انجام این تنظیم اختیاری است.
-نرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت شما و ذکر شما برای دیگران با استفاده از قوائد درست دستور زبان استفاده می‌کند.
+نرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت و ذکر شما برای دیگران با استفاده از دستور زبان درست استفاده می‌کند.
 این اطلاعات عمومی خواهند بود.',
 'email' => 'رایانامه',
 'prefs-help-realname' => 'نام واقعی اختیاری است.
@@ -1809,7 +1809,7 @@ $1",
 'right-editmyprivateinfo' => 'داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)',
 'right-editmyoptions' => 'ترجیحات خود را ویرایش',
 'right-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
-'right-markbotedits' => 'علامت زدن ویرایش‌های واگردانی شده به عنوان ویرایش ربات',
+'right-markbotedits' => 'علامت‌زدن ویرایش‌های واگردانی‌شده به‌عنوان ویرایش ربات',
 'right-noratelimit' => 'تاثیر نپذیرفتن از محدودیت سرعت',
 'right-import' => 'وارد کردن صفحه از ویکی‌های دیگر',
 'right-importupload' => 'وارد کردن صفحه از طریق بارگذاری پرونده',
@@ -1856,7 +1856,7 @@ $1",
 'action-undelete' => 'احیای این صفحه',
 'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذف شده',
 'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
-'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن',
+'action-block' => 'قطع دسترسی این کاربر از ویرایشکردن',
 'action-protect' => 'تغییر سطح محافظت این صفحه',
 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
 'action-import' => 'وارد کردن صفحه از ویکی های دیگر',
@@ -1945,7 +1945,7 @@ $1",
 *'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
 'upload-permitted' => 'انواع مجاز پرونده‌ها: $1.',
 'upload-preferred' => 'انواع ترجیح‌داده شده پرونده‌ها: $1.',
-'upload-prohibited' => 'انواع غیرمجاز پرونده‌ها: $1.',
+'upload-prohibited' => 'انواع نامجاز پرونده‌ها: $1.',
 'uploadlog' => 'سیاههٔ بارگذاری‌ها',
 'uploadlogpage' => 'سیاههٔ بارگذاری‌ها',
 'uploadlogpagetext' => 'فهرست زیر فهرستی از آخرین بارگذاری پرونده‌ها است.
@@ -1966,11 +1966,11 @@ $1",
 'badfilename' => 'نام پرونده به «$1» تغییر کرد.',
 'filetype-mime-mismatch' => 'پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.',
 'filetype-badmime' => 'پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.',
-'filetype-bad-ie-mime' => 'این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ غیرمجاز و احتمالاً خطرناک است.',
+'filetype-bad-ie-mime' => 'این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به‌عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ نامجاز و احتمالاً خطرناک است.',
 'filetype-unwanted-type' => "'''«‎.‎$1»''' یک نوع پرونده ناخواسته است.
 {{PLURAL:$3|نوع پرونده ترجیح داده شده|انواع پرونده ترجیح داده شده}} از این قرار است: $2 .",
-'filetype-banned-type' => '&lrm;\'\'\'".$1"\'\'\' {{PLURAL:$4|یک نوع پرونده غیرمجاز است|انواعی پرونده غیرمجاز هستند}}.
-{{PLURAL:$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: $2 .',
+'filetype-banned-type' => '&lrm;\'\'\'".$1"\'\'\' {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواعی پروندهٔ نامجاز هستند}}.
+{{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.',
 'filetype-missing' => 'این پرونده پسوند (مثلاً «‎.jpg») ندارد.',
 'empty-file' => 'پرونده‌ای که ارسال کردید خالی بود.',
 'file-too-large' => 'پرونده‌ای که ارسال کردید بیش از اندازه بزرگ بود.',
@@ -2367,7 +2367,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'popularpages' => 'صفحه‌های محبوب',
 'wantedcategories' => 'رده‌های مورد نیاز',
 'wantedpages' => 'صفحه‌های مورد نیاز',
-'wantedpages-badtitle' => 'عنوان غیرمجاز در مجموعهٔ نتایج: $1',
+'wantedpages-badtitle' => 'عنوان نامجاز در مجموعهٔ نتایج: $1',
 'wantedfiles' => 'پرونده‌های مورد نیاز',
 'wantedfiletext-cat' => 'پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del> علاوه بر این، صفحاتی که پرونده‌هایی ناموجود را در خود جای داده‌اند در [[:$1]] فهرست شده‌اند.',
 'wantedfiletext-nocat' => 'پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del>',
@@ -2911,7 +2911,7 @@ $1',
 'ipb-disableusertalk' => 'جلوگیری از ویرایشی صفحهً بحث توسط خود کاربر در زمانی که بسته است',
 'ipb-change-block' => 'بستن دوبارهٔ کاربر با این تنظیم‌ها',
 'ipb-confirm' => 'تأیید بستن',
-'badipaddress' => 'نشانی آی‌پی غیر مجاز',
+'badipaddress' => 'نشانی آی‌پی نامجاز',
 'blockipsuccesssub' => 'بستن با موفقیت انجام شد',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بسته شد.<br />
 برای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.',
@@ -2991,12 +2991,9 @@ $1',
 این نشانی به همراه بازه $2 بسته شده که قابل باز شدن است.',
 'ip_range_invalid' => 'بازهٔ آی‌پی نامعتبر.',
 'ip_range_toolarge' => 'قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.',
-'blockme' => 'دسترسی مرا قطع کن',
 'proxyblocker' => 'مسدود کننده پروکسی',
-'proxyblocker-disabled' => 'این عملکرد غیرفعال شده‌است.',
 'proxyblockreason' => 'نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.
 لطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.',
-'proxyblocksuccess' => 'انجام شد.',
 'sorbsreason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.',
 'sorbs_create_account_reason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.
 شما اجازهٔ ساختن حساب کاربری ندارید.',
@@ -3068,7 +3065,7 @@ $1',
 'movenotallowedfile' => 'شما اجازهٔ انتقال پرونده‌ها را ندارید.',
 'cant-move-user-page' => 'شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.',
 'cant-move-to-user-page' => 'شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).',
-'newtitle' => 'به عنوان جدید',
+'newtitle' => 'بهعنوان جدید',
 'move-watch' => 'پی‌گیری صفحه‌های مبدأ و مقصد',
 'movepagebtn' => 'صفحه منتقل شود',
 'pagemovedsub' => 'انتقال با موفقیت انجام شد',
@@ -3112,7 +3109,7 @@ $1',
 'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد',
 'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد',
 'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
-'imageinvalidfilename' => 'نام پروندهٔ هدف غیرمجاز است',
+'imageinvalidfilename' => 'نام پروندهٔ هدف نامجاز است',
 'fix-double-redirects' => 'به روز کردن تمامی تغییرمسیرهایی که به مقالهٔ اصلی اشاره می‌کنند',
 'move-leave-redirect' => 'بر جا گذاشتن یک تغییرمسیر',
 'protectedpagemovewarning' => "'''هشدار:''' این صفحه قفل شده‌است به طوری که تنها کاربران با دسترسی مدیریت می‌توانند آن را انتقال دهند.
@@ -3173,7 +3170,7 @@ $2',
 'djvu_no_xml' => 'امکان پیدا کردن پروندهٔ XML برای استفادهٔ DjVu وجود نداشت.',
 'thumbnail-temp-create' => 'نمی‌توان پروندهٔ بندانگشتی موقت را ساخت',
 'thumbnail-dest-create' => 'نمی‌توان تصویر بندانگشتی را در مقصد ذخیره کرد',
-'thumbnail_invalid_params' => 'پارامترهای غیرمجاز در تصویر بندانگشتی (thumbnail)',
+'thumbnail_invalid_params' => 'پارامترهای نامجاز در تصویر بندانگشتی (thumbnail)',
 'thumbnail_dest_directory' => 'اشکال در ایجاد پوشهٔ مقصد',
 'thumbnail_image-type' => 'تصویر از نوع پشتیبانی نشده',
 'thumbnail_gd-library' => 'تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد',
@@ -3223,7 +3220,7 @@ $2',
 'import-error-edit' => 'صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ویرایش آن نیستید.',
 'import-error-create' => 'صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ایجاد آن نیستید.',
 'import-error-interwiki' => 'صفحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.',
-'import-error-special' => 'صفحه «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام غیرمجاز است.',
+'import-error-special' => 'صفحهٔ «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام نامجاز است.',
 'import-error-invalid' => 'صفحه "$1" به دلیل نامعتبر بودن نامش وارد نمی‌شود.',
 'import-error-unserialize' => 'امکان خارج کردن نسخهٔ $2 از صفحهٔ «$1» از حالت سریال‌شده وجود نداشت. گزارش شد که نسخه از مدل محتوای $3 استفاده می‌کند که به صورت $4 سریال شده‌است.',
 'import-options-wrong' => '{{PLURAL:$2|جزئیات|جزئیات}} اشتباه: <nowiki>$1</nowiki>',
@@ -3361,7 +3358,7 @@ $2',
 'pageinfo-language' => 'زبان محتوای صفحه',
 'pageinfo-robot-policy' => '‌فهرست‌کردن توسط ربات‌ها',
 'pageinfo-robot-index' => 'مجاز',
-'pageinfo-robot-noindex' => 'غیر مجاز',
+'pageinfo-robot-noindex' => 'نامجاز',
 'pageinfo-views' => 'شمار بازدیدها',
 'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان صفحه',
 'pageinfo-few-watchers' => 'کمتر از  $1 {{PLURAL:$1| پی‌گیر|پی‌گیر}}',
@@ -3436,7 +3433,7 @@ $1',
 'mediawarning' => "'''هشدار''': این پرونده ممکن است حاوی کدهای مخرب باشد.
 با اجرای آن رایانهٔ شما ممکن است آسیب ببیند.",
 'imagemaxsize' => "محدودیت ابعاد تصویر:<br />''(برای صفحه‌های توصیف پرونده)''",
-'thumbsize' => 'اندازهٔ Thumbnail:',
+'thumbsize' => 'اندازهٔ بنداگشتی:',
 'widthheight' => '$1 در $2',
 'widthheightpage' => '$1×$2، $3 {{PLURAL:$3|صفحه|صفحه}}',
 'file-info' => 'اندازهٔ پرونده: $1، نوع  MIME $2',
@@ -3445,7 +3442,7 @@ $1',
 'file-nohires' => 'تفکیک‌پذیری بالاتری در دسترس نیست.',
 'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
 'svg-long-desc-animated' => 'پروندهٔ اس‌وی‌جی متحرک، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
-'svg-long-error' => 'پرونده SVG غیرمجاز: $1',
+'svg-long-error' => 'پرونده SVG نامجاز: $1',
 'show-big-image' => 'تصویر با تفکیک‌پذیری بالاتر',
 'show-big-image-preview' => 'اندازهٔ این پیش‌نمایش: $1.',
 'show-big-image-other' => '{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.',
@@ -4365,7 +4362,7 @@ $5
 'api-error-file-too-large' => 'پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.',
 'api-error-filename-tooshort' => 'نام پرونده بیش از اندازه کوتاه است.',
 'api-error-filetype-banned' => 'این نوع پرونده ممنوع است.',
-'api-error-filetype-banned-type' => '&lrm;$1 {{PLURAL:$4|یک نوع پرونده غیرمجاز است|انواعی پرونده غیرمجاز هستند}}. {{PLURAL:$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: $2 .',
+'api-error-filetype-banned-type' => '&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.',
 'api-error-filetype-missing' => 'پرونده فرمت ندارد.',
 'api-error-hookaborted' => 'اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.',
 'api-error-http' => 'خطای داخلی: قادر به اتصال به سرور نیست.',
index 804552b..1fd5da9 100644 (file)
@@ -360,7 +360,7 @@ $messages = array(
 'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
 'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
 'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
-'tog-prefershttps' => 'Käytä aina turvallista yhteyttä kun olet kirjautunut sisään',
+'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään',
 
 'underline-always' => 'Aina',
 'underline-never' => 'Ei koskaan',
@@ -809,7 +809,7 @@ Salli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi k
 'nocookiesfornew' => 'Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.',
 'noname' => 'Et ole määritellyt kelvollista käyttäjänimeä.',
 'loginsuccesstitle' => 'Sisäänkirjautuminen onnistui',
-'loginsuccess' => "'''Olet nyt kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
+'loginsuccess' => "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
 'nosuchuser' => 'Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:UserLogin/signup|luo uusi käyttäjätunnus]].',
 'nosuchusershort' => 'Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?',
 'nouserspecified' => 'Käyttäjätunnusta ei ole määritelty.',
@@ -854,8 +854,8 @@ Odota $1 ennen kuin yrität uudelleen.',
 'login-abort-generic' => 'Kirjautuminen epäonnistui – keskeytetty',
 'loginlanguagelabel' => 'Kieli: $1',
 'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
-'createacct-another-realname-tip' => 'Oikea nimi on vapaaehtoinen.
-Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisältöä on tuottanut.',
+'createacct-another-realname-tip' => 'Vapaaehtoinen.
+Nimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.',
 
 # Email sending
 'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
@@ -871,7 +871,7 @@ Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisält
 'newpassword' => 'Uusi salasana:',
 'retypenew' => 'Uusi salasana uudelleen:',
 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
-'changepassword-success' => 'Salasanasi vaihtaminen onnistui.',
+'changepassword-success' => 'Salasanan vaihto onnistui.',
 'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.',
 'resetpass-no-info' => 'Et voi nähdä tätä sivua kirjautumatta sisään.',
 'resetpass-submit-loggedin' => 'Muuta salasana',
@@ -884,7 +884,7 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
 # Special:PasswordReset
 'passwordreset' => 'Salasanan vaihto',
 'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
-'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä nollataksesi salasanasi.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä alustaaksesi salasanasi.}}',
 'passwordreset-legend' => 'Salasanan vaihto',
 'passwordreset-disabled' => 'Salasanojen vaihtaminen ei ole mahdollista tässä wikissä.',
 'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
@@ -932,15 +932,15 @@ Väliaikainen salasana: $2',
 'changeemail-cancel' => 'Peruuta',
 
 # Special:ResetTokens
-'resettokens' => 'Uudista tunnisteet',
-'resettokens-text' => 'Tällä sivulla voit uudistaa tunnisteesi, joiden avulla hallitaan pääsyä käyttäjätiliisi liittyviin yksityisiin tietoihin.
+'resettokens' => 'Uudista avaimet',
+'resettokens-text' => 'Tällä sivulla voit uudistaa avaimesi, jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.
 
-Sinun pitää tehdä tämä jos olet vahingossa jakanut ne jonkun kanssa tai käyttäjätiliisi on saatettu kajota.',
-'resettokens-no-tokens' => 'Tunnisteita ei löydy uudistettavaksi.',
-'resettokens-legend' => 'Uudista tunnisteet',
-'resettokens-tokens' => 'Tunnisteet:',
+Sinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.',
+'resettokens-no-tokens' => 'Avaimia ei ole uudistettavaksi.',
+'resettokens-legend' => 'Uudista avaimet',
+'resettokens-tokens' => 'Avaimet:',
 'resettokens-token-label' => '$1 (nykyinen arvo: $2)',
-'resettokens-watchlist-token' => 'Tarkkailulistan verkkosyötteen tunniste',
+'resettokens-watchlist-token' => '[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain',
 'resettokens-done' => 'Avaimet on uudistettu.',
 'resettokens-resetbutton' => 'Uudista valitut avaimet',
 
@@ -1445,7 +1445,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'prefs-rendering' => 'Ulkoasu',
 'saveprefs' => 'Tallenna asetukset',
 'resetprefs' => 'Tyhjennä tallentamattomat muutokset',
-'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa asetusten osastoissa)',
+'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa osioissa)',
 'prefs-editing' => 'Muokkaus',
 'rows' => 'Rivejä',
 'columns' => 'Sarakkeita',
@@ -1457,8 +1457,10 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
 'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.',
-'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen. Kuka tahansa joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä. [[Special:ResetTokens|Napsauta tästä jos sinun pitää uudistaa se]].',
-'savedprefs' => 'Asetuksesi tallennettiin onnistuneesti.',
+'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.
+Kuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.
+[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].',
+'savedprefs' => 'Asetuksesi on tallennettu.',
 'timezonelegend' => 'Aikavyöhyke',
 'localtime' => 'Paikallinen aika',
 'timezoneuseserverdefault' => 'Käytä oletusta ($1)',
@@ -1502,8 +1504,8 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'badsiglength' => 'Allekirjoitus on liian pitkä – sen on oltava alle $1 {{PLURAL:$1|merkki|merkkiä}}.',
 'yourgender' => 'Mikä seuraavista kuvaa sinua?',
 'gender-unknown' => 'En halua määritellä',
-'gender-male' => 'Hän on miespuolinen käyttäjä',
-'gender-female' => 'Hän on naispuolinen käyttäjä',
+'gender-male' => 'Mies',
+'gender-female' => 'Nainen',
 'prefs-help-gender' => 'Tämän asetuksen määrittäminen on vapaaehtoista.
 Ohjelmisto käyttää annettua arvoa viitaten sinuun oikealla kieliopillisella suvulla.
 Tämä tieto on julkinen.',
@@ -1545,10 +1547,10 @@ Tämä tieto on julkinen.',
 'saveusergroups' => 'Tallenna nämä käyttäjäryhmät',
 'userrights-groupsmember' => 'Jäsenenä ryhmissä:',
 'userrights-groupsmember-auto' => 'Automaattisesti jäsenenä ryhmissä:',
-'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on:
+'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on.
 * Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.
 * Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.
-* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä kun olet hänet siihen lisännyt tai päinvastoin',
+* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä, kun olet hänet siihen lisännyt tai päinvastoin',
 'userrights-reason' => 'Syy:',
 'userrights-no-interwiki' => 'Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.',
 'userrights-nodatabase' => 'Tietokantaa $1 ei ole tai se ei ole paikallinen.',
@@ -1631,7 +1633,7 @@ Tämä tieto on julkinen.',
 'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja',
 'right-editmyusercss' => 'Muokata omia CSS-tiedostojaan',
 'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostojaan',
-'right-viewmywatchlist' => 'Katsoa tarkkailulistaasi',
+'right-viewmywatchlist' => 'Tarkastella tarkkailulistaasi',
 'right-editmywatchlist' => 'Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.',
 'right-viewmyprivateinfo' => 'Nähdä omat yksityiset tietosi (esim. sähköpostiosoite, oikea nimi)',
 'right-editmyprivateinfo' => 'Muokata omia yksityisiä tietojasi (esim. sähköpostiosoite, oikea nimi)',
@@ -1698,7 +1700,7 @@ Tämä tieto on julkinen.',
 'action-siteadmin' => 'lukita tai avata tietokantaa',
 'action-sendemail' => 'lähettää sähköpostia',
 'action-editmywatchlist' => 'muokata tarkkailulistaasi',
-'action-viewmywatchlist' => 'katsoa tarkkailulistaasi',
+'action-viewmywatchlist' => 'tarkastella tarkkailulistaasi',
 'action-viewmyprivateinfo' => 'katsoa omia yksityisiä tietojasi',
 'action-editmyprivateinfo' => 'muokata omia yksityisiä tietojasi',
 
@@ -2097,11 +2099,11 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
 'randompage-nopages' => '{{PLURAL:$2|Nimiavaruudessa|Nimiavaruuksissa}} $1 ei ole sivuja.',
 
 # Random page in category
-'randomincategory' => 'Satunnainen sivu, joka kuuluu luokkaan',
-'randomincategory-invalidcategory' => '" $1 " ei ole kelvollinen luokan nimi.',
-'randomincategory-nopages' => 'Luokassa [[:Category:$1]] ei ole sivuja.',
-'randomincategory-selectcategory' => 'Etsi satunnainen sivu luokasta: $1 $2.',
-'randomincategory-selectcategory-submit' => 'Etsi',
+'randomincategory' => 'Satunnainen sivu luokasta',
+'randomincategory-invalidcategory' => '$1 ei ole kelvollinen luokan nimi.',
+'randomincategory-nopages' => 'Luokassa [[:Category:$1|$1]] ei ole sivuja.',
+'randomincategory-selectcategory' => 'Hae satunnainen sivu luokasta: $1 $2',
+'randomincategory-selectcategory-submit' => 'Hae',
 
 # Random redirect
 'randomredirect' => 'Satunnainen ohjaus',
@@ -2314,7 +2316,8 @@ Vaaditaan vähintään ylätason verkkotunnus, esimerkiksi "*.org".<br />
 'listgrouprights' => 'Käyttäjäryhmien oikeudet',
 'listgrouprights-summary' => 'Tämä lista sisältää tämän wikin käyttäjäryhmät sekä ryhmiin liitetyt käyttöoikeudet.
 Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWiki:Listgrouprights-helppage}}|erilliseltä ohjesivulta]].',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Myönnetyt oikeudet</span>
+'listgrouprights-key' => 'Selite:
+* <span class="listgrouprights-granted">Myönnetyt oikeudet</span>
 * <span class="listgrouprights-revoked">Kumotut oikeudet</span>',
 'listgrouprights-group' => 'Ryhmä',
 'listgrouprights-rights' => 'Oikeudet',
@@ -2467,10 +2470,12 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'deletecomment' => 'Syy',
 'deleteotherreason' => 'Muu syy tai tarkennus',
 'deletereasonotherlist' => 'Muu syy',
-'deletereason-dropdown' => '*Yleiset poistosyyt
-** Tekijän poistopyyntö
+'deletereason-dropdown' => '* Yleiset poistosyyt
 ** Tekijänoikeusrikkomus
-** Vandalismi',
+** Tekijän poistopyyntö
+** Testisivu
+** Vandalismi
+** Virheellinen ohjaus',
 'delete-edit-reasonlist' => 'Muokkaa poistosyitä',
 'delete-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.',
 'delete-warning-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.',
@@ -2537,7 +2542,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'protect-otherreason-op' => 'Muu syy',
 'protect-dropdown' => '*Yleiset suojaussyyt
 ** Jatkuva vandalismi
-** Jatkuva roskalinkkien lisääminen
+** Jatkuva mainoslinkkien lisääminen
 ** Muokkaussota
 ** Suuri näkyvyys',
 'protect-edit-reasonlist' => 'Muokkaa suojaussyitä',
@@ -2776,11 +2781,8 @@ Alla on ote häivytyslokista.',
 'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa',
 'ip_range_invalid' => 'Virheellinen IP-alue.',
 'ip_range_toolarge' => 'Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.',
-'blockme' => 'Estä minut',
 'proxyblocker' => 'Välityspalvelinesto',
-'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.',
 'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.',
-'proxyblocksuccess' => 'Valmis.',
 'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.',
 'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. 
 Et voi luoda käyttäjätunnusta.',
@@ -2996,7 +2998,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'import-error-interwiki' => 'Sivua $1 ei voitu tuoda, koska sen nimi on varattu ulkoisen linkittämisen (interwiki).',
 'import-error-special' => 'Sivua $1 ei tuoda, koska se kuuluu nimitilaan, joka ei salli sivuja.',
 'import-error-invalid' => 'Sivua $1 ei tuoda, koska sen nimi ei kelpaa.',
-'import-error-unserialize' => 'Revisiota $2 sivusta "$1" ei voida jakaa osiin. Revision kerrottiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.',
+'import-error-unserialize' => 'Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.',
 'import-options-wrong' => '{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Annettu sivun nimi ei kelpaa.',
 'import-rootpage-nosubpage' => 'Annetun sivun nimiavaruus $1 ei salli alasivuja.',
@@ -3792,7 +3794,7 @@ Varmista, että haluat luoda sivun uudelleen.",
 'confirm-unwatch-top' => 'Poistetaanko tämä sivu tarkkailulistaltasi?',
 
 # Separators for various lists, etc.
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← edellinen sivu',
@@ -3885,7 +3887,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
 'version-license' => 'Lisenssi',
 'version-poweredby-credits' => "Tämä wiki käyttää '''[//www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'muut',
-'version-poweredby-translators' => 'translatewiki.net kääntäjät',
+'version-poweredby-translators' => 'translatewiki.net-kääntäjät',
 'version-credits-summary' => 'Haluaisimme kiittää seuraavia henkilöitä heidän panoksestaan [[Special:Version|MediaWiki-ohjelmistoon]].',
 'version-license-info' => 'MediaWiki on vapaa ohjelmisto – voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai halutessasi minkä tahansa myöhemmän version mukaisesti.
 
@@ -3900,13 +3902,13 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => 'Ohjaus tiedostonimen, käyttäjänumeron tai versionumeron mukaan',
-'redirect-legend' => 'Uudelleenohjaa tiedostoon tai sivulle',
-'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedoston nimen mukaan), sivulle (sivun versionumeron mukaan) tai käyttäjäsivulle (käyttäjätunnuksen numeron mukaan).',
+'redirect' => 'Ohjaus tiedostonimen, käyttäjätunnisteen tai versiotunnisteen mukaan',
+'redirect-legend' => 'Ohjaus tiedostoon tai sivulle',
+'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (versiotunnisteen mukaan) tai käyttäjäsivulle (käyttäjätunnisteen numeron mukaan).',
 'redirect-submit' => 'Siirry',
 'redirect-lookup' => 'Hae:',
 'redirect-value' => 'Arvo:',
-'redirect-user' => 'Käyttäjän tunnusnumero',
+'redirect-user' => 'Käyttäjätunniste',
 'redirect-revision' => 'Sivun versio',
 'redirect-file' => 'Tiedostonimi',
 'redirect-not-exists' => 'Arvoa ei löytynyt',
index 2cda462..556170a 100644 (file)
@@ -2484,10 +2484,7 @@ Fjalingarloggurin er vístur niðanfyri til kunningar:',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Onnur sperring|Aðrar sperringar}}',
 'unblock-hideuser' => 'Tú kanst ikki taka burtur sperringina hjá hesum brúkara, eftirsum brúkaranavnið hjá viðkomandi er fjalt.',
 'ipb_cant_unblock' => 'Feilur: Sperring ID $1 ikki funnin. Tað er møguligt, at sperringin longu er tikin burtur.',
-'blockme' => 'Sperra meg',
 'proxyblocker' => 'Proxy sperring',
-'proxyblocker-disabled' => 'Henda funksjónin er ikki virkin.',
-'proxyblocksuccess' => 'Liðugt.',
 'sorbsreason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.',
 'sorbs_create_account_reason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.
 Tú kanst ikki upprætta eina konto.',
index 1206c92..bb9395f 100644 (file)
@@ -608,7 +608,7 @@ $messages = array(
 'articlepage' => 'Voir la page de contenu',
 'talk' => 'Discussion',
 'views' => 'Affichages',
-'toolbox' => 'Boîte à outils',
+'toolbox' => 'Outils',
 'userpage' => 'Page utilisateur',
 'projectpage' => 'Page méta',
 'imagepage' => 'Voir la page du fichier',
@@ -2907,12 +2907,9 @@ Il est possible qu'un déblocage ait déjà été effectué.",
 Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.",
 'ip_range_invalid' => 'Plage IP incorrecte.',
 'ip_range_toolarge' => 'Les blocages de plages plus grandes que /$1 ne sont pas autorisées.',
-'blockme' => 'Bloquez-moi',
 'proxyblocker' => 'Bloqueur de mandataires',
-'proxyblocker-disabled' => 'Cette fonction est désactivée.',
 'proxyblockreason' => "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.
 Veuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
-'proxyblocksuccess' => 'Fait.',
 'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.
 Vous ne pouvez pas créer un compte.',
@@ -3953,7 +3950,7 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
 # Separators for various lists, etc.
 'semicolon-separator' => '&nbsp;;&#32;',
 'colon-separator' => '&nbsp;:&#32;',
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← page précédente',
index 58df14c..7c5a5cb 100644 (file)
@@ -2832,12 +2832,9 @@ O est possiblo qu’un dèblocâjo èye ja étâ fêt.',
 Portant, el est avouéc la plage $2 que pôt étre dèblocâ.',
 'ip_range_invalid' => 'Plage d’adrèces IP fôssa.',
 'ip_range_toolarge' => 'Los blocâjos de plages d’adrèces IP ples grantes que /$1 sont pas ôtorisâs.',
-'blockme' => 'Blocâd-mè',
 'proxyblocker' => "Bloquior de sèrvors mandatèros (''proxies'')",
-'proxyblocker-disabled' => 'Cela fonccion est dèsactivâ.',
 'proxyblockreason' => "Voutra adrèce IP at étâ blocâ perce qu’o est un sèrvor mandatèro (''proxy'') uvèrt.
 Vos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra assistance tècnica et l’enformar de cél problèmo de sècuritât sèriox.",
-'proxyblocksuccess' => 'Chavonâ.',
 'sorbsreason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.",
 'sorbs_create_account_reason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.
 Vos pouede pas fâre un compto.",
@@ -3846,7 +3843,7 @@ Volyéd confirmar que vos voléd franc refâre cela pâge.",
 # Separators for various lists, etc.
 'semicolon-separator' => '&nbsp;;&#32;',
 'colon-separator' => '&nbsp;:&#32;',
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pâge devant',
index 689339a..4c740a7 100644 (file)
@@ -2487,12 +2487,9 @@ Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
 'ipb_blocked_as_range' => 'Feeler: Det IP-adres $1 as auer det widjloftag sper $2 speret. Det sper faan $1 alian koon ei apheewen wurd.',
 'ip_range_invalid' => 'Ferkiard IP-adresrüm',
 'ip_range_toolarge' => 'Adresrümen mut ei grater üs /$1 wees.',
-'blockme' => 'Spere mi',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Detdiar funktjuun as ei aktiif',
 'proxyblockreason' => 'Din IP-adres as speret wurden, auer det tu en eebenen proxy hiart.
 Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun fraag.',
-'proxyblocksuccess' => 'Klaar.',
 'sorbsreason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd.',
 'sorbs_create_account_reason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd. Dü könst nian brükerkonto maage.',
 'xffblockreason' => 'En IP-adres uun di X-Forwarded-For-Header as speret wurden, det as din aanj of det faan dan proxy server. Di spergrünj as: $1',
index 4fdeab1..db3b20d 100644 (file)
@@ -1913,7 +1913,6 @@ Meld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
 'ipb_expiry_invalid' => 'Tiid fan ferrinnen is net goed.',
 'ipb_already_blocked' => '"$1" is al útsluten',
 'ipb_cant_unblock' => 'Flater: It útsluten fan ID $1 kin net fûn wurde. It is miskien al net mear útsluten.',
-'proxyblocksuccess' => 'Dien.',
 
 # Developer tools
 'lockdb' => "Meitsje de database 'Net-skriuwe'",
index 52e6280..782df49 100644 (file)
@@ -218,7 +218,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'ar lean.',
 'index-category' => 'Leathanaigh innéacsaithe',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Maidir leis',
 'article' => 'Leathanach ábhair',
@@ -1551,7 +1551,6 @@ liosta a fháil de coisc atá i bhfeidhm faoi láthair.',
 'proxyblockreason' => "Coisceadh do sheoladh IP dá bharr gur seachfhreastalaí
 neamhshlándála is ea é. Déan teagmháil le do chomhlacht idirlín nó le do lucht cabhrach teicneolaíochta
 go mbeidh 'fhios acu faoin fadhb slándála tábhachtach seo.",
-'proxyblocksuccess' => 'Rinneadh.',
 'sorbsreason' => 'Liostalaítear do sheoladh IP mar sheachfhreastalaí oscailte sa DNSBL.',
 
 # Developer tools
index b8a07a8..eeca569 100644 (file)
@@ -1515,11 +1515,8 @@ $1',
 'ipb_already_blocked' => '锁到嘞"$1"',
 'ipb_cant_unblock' => '错误: 冇发现Block ID $1。个只IP话伓定拖解封喽。',
 'ip_range_invalid' => '冇用𠮶IP范围。',
-'blockme' => '封吥偶去',
 'proxyblocker' => '代理封锁器',
-'proxyblocker-disabled' => '个只功能用伓正喽。',
 'proxyblockreason' => '倷𠮶IP系一只公开𠮶代理,佢拖封到嘞。请联络倷𠮶Internet服务提供商或技术帮助再告诵佢俚个只严重𠮶安全问题。',
-'proxyblocksuccess' => '扤正啰。',
 'sorbsreason' => '{{SITENAME}}用𠮶 DNSBL 查到倷𠮶IP地址系只公开代理服务器。',
 'sorbs_create_account_reason' => '{{SITENAME}}用𠮶 DNSBL 检查到倷𠮶IP地址系只公开代理服务器,倷也就新开伓正帐户。',
 
index f9b3f76..4628ab3 100644 (file)
@@ -1537,11 +1537,8 @@ $1',
 'ipb_already_blocked' => '鎖到哩"$1"',
 'ipb_cant_unblock' => '錯誤: 冇發現Block ID $1。箇隻IP話伓定拕解封哩。',
 'ip_range_invalid' => '冇用嗰IP範圍。',
-'blockme' => '封吥我去',
 'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => '箇隻功能用伓正哩。',
 'proxyblockreason' => '汝嗰IP係一隻公開嗰代理,佢拕封到哩。請聯絡汝嗰Internet服務提供商或技術幫助再告誦佢俚箇隻嚴重嗰安全問題。',
-'proxyblocksuccess' => '舞正哩。',
 'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到汝嗰IP地址係隻公開代理服務器。',
 'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到汝嗰IP地址係隻公開代理服務器,汝也就新開伓正帳戶。',
 
index 04d2471..a65a09d 100644 (file)
@@ -1450,7 +1450,6 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'block-log-flags-nocreate' => 'cruthachadh de chunntasan ùra à comas',
 'ipb_expiry_invalid' => 'Tha an t-àm-crìochnachaidh mì-dhligheach.',
 'ip_range_invalid' => 'Raon IP neo-iomchaidh.',
-'proxyblocksuccess' => 'Dèanta.',
 
 # Developer tools
 'lockdb' => 'Glais an stòr-dàta',
index 3683045..a170f92 100644 (file)
@@ -471,7 +471,7 @@ $messages = array(
 'articlepage' => 'Ver a páxina de contido',
 'talk' => 'Conversa',
 'views' => 'Vistas',
-'toolbox' => 'Caixa de ferramentas',
+'toolbox' => 'Ferramentas',
 'userpage' => 'Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}',
 'projectpage' => 'Ver a páxina do proxecto',
 'imagepage' => 'Ver a páxina do ficheiro',
@@ -2810,12 +2810,9 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent
 'ipb_blocked_as_range' => 'Erro: O enderezo IP $1 non está bloqueado directamente e non se pode desbloquear. Porén, está bloqueado por estar no rango $2, que si se pode desbloquear.',
 'ip_range_invalid' => 'Rango IP non válido.',
 'ip_range_toolarge' => 'Non están permitidos os rangos de bloqueo maiores que /$1.',
-'blockme' => 'Bloquearme',
 'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
 'proxyblockreason' => 'O seu enderezo IP foi bloqueado porque é un proxy aberto.
 Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.',
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.
 Polo tanto, non pode crear unha conta',
index 876608d..f1161fd 100644 (file)
@@ -1811,10 +1811,7 @@ $1',
 'ipb_cant_unblock' => 'Σφάλμα: Ἡ φραγὴ τῆς ID $1 οὐχ εὑρέθη.
 Εἰκότως ἀποπεφραγμένη ἤδη ἐστίν.',
 'ip_range_invalid' => 'Ἄκυρον IP-εὖρος.',
-'blockme' => 'Φράξον με',
 'proxyblocker' => 'Ἐργαλεῖον φραγῆς διακομιστῶν',
-'proxyblocker-disabled' => 'Ἥδε ἡ ἐνέργεια κατεσταλμένη εστίν.',
-'proxyblocksuccess' => 'Γενομένη.',
 'cant-block-while-blocked' => 'Οὐκ ἔξεστί σοι φράττειν ἑτέρους χρωμένους ἐν ὅσῳ πεφραγμένος εἶ.',
 
 # Developer tools
index 042bc74..46e3e29 100644 (file)
@@ -2462,11 +2462,8 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 'ipb_blocked_as_range' => 'Fähler: D IP-Adräss $1 isch as Teil vu dr Beryychssperri $2 indirekt gsperrt. S isch nit megli, nume $1 z entsperre.',
 'ip_range_invalid' => 'Uugiltige IP-Adrässberyych.',
 'ip_range_toolarge' => 'Adrässberyych, wu greßer sin wie /$1, sin nit erlaubt.',
-'blockme' => 'Sperr mi',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Die Funktion isch deaktiviert.',
 'proxyblockreason' => 'Dyni IP-Adrässe isch gsperrt wore, wel si ne ufige Proxy isch. Bitte kontaktier Dyyn Internet-Provider oder Dyni Systemadministratore un informier si iber des Sicherheitsproblem.',
-'proxyblocksuccess' => 'Fertig.',
 'sorbsreason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet.',
 'sorbs_create_account_reason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet. S Aalege vu neije Benutzer isch nit megli.',
 'cant-block-while-blocked' => 'Du derfsch kei anderi Benutzer sperre, derwylscht Du sälber gsperrt bisch.',
index 100e2ad..35edb97 100644 (file)
@@ -291,7 +291,7 @@ $messages = array(
 'noindex-category' => 'અનુક્રમણિકા નહી બનાવેલા પાનાં',
 'broken-file-category' => 'ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં',
 
-'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])(?<!ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|અં|અઃ|અઁ)(?<!ક્ષ્|જ્ઞ્)(?<!અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)))(.+)$/sD',
 
 'about' => 'વિષે',
 'article' => 'લેખનું પાનું',
@@ -2652,12 +2652,9 @@ $1',
 જો કે આને સામૂહિક $2 રોક લગાવાઇ હોવાથી તે સમૂ હની રોક હટાવી શકાશે.',
 'ip_range_invalid' => 'અવૈધ IP શ્રેણી',
 'ip_range_toolarge' => '/$1થી મોટા વિસ્તાર પ્રતિબંધની પરવાનગી નથી.',
-'blockme' => 'મને પ્રતિબંધિત કરો',
 'proxyblocker' => 'અવેજી (પ્રોક્સી) રોક લગાડનાર',
-'proxyblocker-disabled' => 'આ સુવિધા નિષ્ક્રીય કરી છે.',
 'proxyblockreason' => 'તમારા IP સરનામા પરા રોક લગાડાઈ છે કેમકે તેએક ખુલ્લી પ્રોક્સી છે.
 કૃપયા તમારા ઇંટરનેટ સેવા પ્રદાતા કે તકનીકી સહાય વિભાગનો સંપર્ક કરી જણાવો કે આ એક ભયંકર સુરક્ષા મામલો છે.',
-'proxyblocksuccess' => 'સંપન્ન',
 'sorbsreason' => '{{SITENAME}} દ્વારા વપરાયેલા DNSBL માં તમારું IP સરનામું એક ખુલ્લી પ્રોક્સી તરીકે નોંધાયું છે.',
 'sorbs_create_account_reason' => '{{SITENAME}} માં વપરાતા DNSBL દ્વારા તમારા IP  સરનામાને ખુલી પ્રોક્સી જણાવાઇ છે.
 તમે ખાતાની રચના નહીં કરી શકો.',
index cfd1c48..1e2aafe 100644 (file)
@@ -1186,7 +1186,6 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':",
 'unblocklogentry' => '$1 er ny neughlassey magh',
 'block-log-flags-anononly' => 'ymmydeyryn neuenmyssit ynrican',
 'block-log-flags-nocreate' => 'gyn kiart coontyssyn y chroo',
-'proxyblocksuccess' => 'Jeant.',
 
 # Move page
 'move-page' => '$1 y scughey',
index 3176244..770bd89 100644 (file)
@@ -1560,7 +1560,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ip_range_invalid' => '無效嘅IP範圍。',
 'proxyblocker' => '代理封鎖器',
 'proxyblockreason' => '汝嘅IP地址係一隻開放嘅代理,其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.',
 'sorbs_create_account_reason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.',
 
index 23c203f..b0084fa 100644 (file)
@@ -736,7 +736,6 @@ E ʻike iā $2 no ka papa o nā kāpae ʻana hou.',
 'unblocklink' => 'mai pale',
 'change-blocklink' => 'hoʻololi ka palena',
 'contribslink' => 'nā ha‘awina',
-'blockme' => 'E ke‘a ia‘u',
 
 # Move page
 'move-page-legend' => 'Hoʻoneʻe i ka ʻaoʻao',
index d26e1b7..4400c4d 100644 (file)
@@ -579,7 +579,7 @@ $messages = array(
 'articlepage' => 'צפייה בדף התוכן',
 'talk' => 'שיחה',
 'views' => 'צפיות',
-'toolbox' => 'ת×\99×\91ת ×\9b×\9c×\99×\9d',
+'toolbox' => 'כלים',
 'userpage' => 'צפייה בדף המשתמש',
 'projectpage' => 'צפייה בדף המיזם',
 'imagepage' => 'צפייה בדף הקובץ',
@@ -2900,12 +2900,9 @@ $1',
 'ipb_blocked_as_range' => 'שגיאה: כתובת ה־IP $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה. עם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.',
 'ip_range_invalid' => 'טווח IP שגוי.',
 'ip_range_toolarge' => 'לא ניתן לחסום טווחים גדולים מ־<span dir="ltr">/$1</span>.',
-'blockme' => 'חסום אותי',
 'proxyblocker' => 'חוסם פרוקסי',
-'proxyblocker-disabled' => 'אפשרות זו מבוטלת.',
 'proxyblockreason' => 'כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח.
 אנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.',
-'proxyblocksuccess' => 'בוצע.',
 'sorbsreason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו.',
 'sorbs_create_account_reason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו. אינכם יכולים ליצור חשבון.',
 'xffblockreason' => 'כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1',
index bf00410..1a6a7a0 100644 (file)
@@ -402,7 +402,7 @@ $messages = array(
 'specialpage' => 'विशेष पृष्ठ',
 'personaltools' => 'वैयक्तिक औज़ार',
 'postcomment' => 'नया अनुभाग',
-'articlepage' => 'लà¥\87à¤\96 देखें',
+'articlepage' => 'सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठ देखें',
 'talk' => 'चर्चा',
 'views' => 'दर्शाव',
 'toolbox' => 'साधन पेटी',
@@ -436,7 +436,7 @@ $1',
 'aboutsite' => '{{SITENAME}} के बारे में',
 'aboutpage' => 'Project:परिचय',
 'copyright' => 'उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।',
-'copyrightpage' => '{{ns:project}}:सरà¥\8dवाधिà¤\95ार',
+'copyrightpage' => '{{ns:project}}:à¤\95à¥\89पà¥\80राà¤\87à¤\9f',
 'currentevents' => 'हाल की घटनाएँ',
 'currentevents-url' => 'Project:हाल की घटनाएँ',
 'disclaimers' => 'अस्वीकरण',
@@ -480,7 +480,7 @@ $1',
 'hidetoc' => 'छिपाएँ',
 'collapsible-collapse' => 'छोटा करें',
 'collapsible-expand' => 'विस्तार करें',
-'thisisdeleted' => '$1 à¤¦à¥\87à¤\96à¥\87à¤\82 à¤¯à¤¾ à¤¬à¤¦à¤²à¥\87à¤\82?',
+'thisisdeleted' => '$1 à¤¦à¥\87à¤\96à¥\87à¤\82 à¤¯à¤¾ à¤µà¤¾à¤ªà¤¿à¤¸ à¤²à¤¾à¤\8fà¤\81?',
 'viewdeleted' => '$1 दिखायें?',
 'restorelink' => '{{PLURAL:$1|एक हटाया हुआ|$1 हटाये हुए}} बदलाव',
 'feedlinks' => 'फ़ीड:',
@@ -1344,10 +1344,10 @@ $1",
 'prefs-personal' => 'सदस्य व्यक्तिरेखा',
 'prefs-rc' => 'हाल में हुए बदलाव',
 'prefs-watchlist' => 'ध्यानसूची',
-'prefs-watchlist-days' => 'ध्यानसूचीमें दिखाने के दिन:',
+'prefs-watchlist-days' => 'ध्यानसूची में दिखाने के दिन:',
 'prefs-watchlist-days-max' => 'अधिकतम $1 {{PLURAL:$1|दिन}}',
 'prefs-watchlist-edits' => 'बढ़ाई हुई ध्यानसूची में दिखाने हेतु अधिकतम बदलाव:',
-'prefs-watchlist-edits-max' => 'à¤\85धिà¤\95तम à¤¸à¤\82à¤\96à¥\8dया: à¥§à¥¦à¥¦à¥¦',
+'prefs-watchlist-edits-max' => 'à¤\85धिà¤\95तम à¤¸à¤\82à¤\96à¥\8dया: à¤\8fà¤\95 à¤¹à¤\9c़ार',
 'prefs-watchlist-token' => 'ध्यानसूची टोकन',
 'prefs-misc' => 'अन्य',
 'prefs-resetpass' => 'कूटशब्द बदलें',
@@ -1576,7 +1576,7 @@ HTML टैग की जाँच करें।',
 'newuserlogpagetext' => 'यह सदस्य खातों के निर्माण का लॉग है।',
 
 # User rights log
-'rightslog' => 'सदसà¥\8dय à¤\85धिà¤\95ार à¤¸à¥\82à¤\9aà¥\80',
+'rightslog' => 'सदसà¥\8dय à¤\85धिà¤\95ार à¤²à¥\89à¤\97',
 'rightslogtext' => 'यह सदस्य अधिकारों में हुए बदलावों की सूची है।',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1605,7 +1605,7 @@ HTML टैग की जाँच करें।',
 'action-block' => 'इस सदस्य को संपादन करने से ब्लॉक करने',
 'action-protect' => 'इस पृष्ठ के सुरक्षा स्तर बदलने',
 'action-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लेने',
-'action-import' => 'à¤\95िसà¥\80 à¤\94र à¤µà¤¿à¤\95ि à¤¸à¥\87 à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤\86यात à¤\95रनà¥\87',
+'action-import' => 'किसी और विकि से पृष्ठ आयात करने',
 'action-importupload' => 'फ़ाइल अपलोड द्वारा यह पृष्ठ आयात करे',
 'action-patrol' => 'अन्य सदस्यों के सम्पादन परीक्षित करने',
 'action-autopatrol' => 'अपने सम्पादन स्वचालित रूप से परीक्षित करने',
@@ -2086,7 +2086,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 
 'withoutinterwiki' => 'बिना अंतरविकि कड़ियों वाले पृष्ठ',
 'withoutinterwiki-summary' => 'निम्न पृष्ठ अन्य भाषाओं के अवतरणों से नहीं जुड़ते हैं।',
-'withoutinterwiki-legend' => 'à¤\89पपद',
+'withoutinterwiki-legend' => 'à¤\89पसरà¥\8dà¤\97',
 'withoutinterwiki-submit' => 'दिखायें',
 
 'fewestrevisions' => 'सबसे कम अवतरणों वाले पृष्ठ',
@@ -2143,7 +2143,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'listusers' => 'सदस्यसूची',
 'listusers-editsonly' => 'केवल संपादन कर चुके सदस्य दिखाएँ',
 'listusers-creationsort' => 'निर्माण तिथि के आधार पर क्रमांकन करें',
-'usereditcount' => '$1 {{PLURAL:$1|सà¤\82पादन|सà¤\82पादन}}',
+'usereditcount' => '$1 {{PLURAL:$1|समà¥\8dपादन}}',
 'usercreated' => '$1 को $2 बजे बनाया गया, सदस्यनाम $3 है',
 'newpages' => 'नए पृष्ठ',
 'newpages-username' => 'सदस्यनाम:',
@@ -2172,7 +2172,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 
 # Special:Log
 'specialloguserlabel' => 'कर्ता:',
-'speciallogtitlelabel' => 'प्रयोजन (शीर्षक):',
+'speciallogtitlelabel' => 'प्रयोजन (शीर्षक अथवा सदस्यनाम):',
 'log' => 'लॉग',
 'all-logs-page' => 'सभी सार्वजनिक लॉग',
 'alllogstext' => '{{SITENAME}} की सभी उपलब्ध लॉगों की प्रविष्टियों का मिला-जुला प्रदर्शन।
@@ -2406,9 +2406,11 @@ $UNWATCHURL
 'deleteotherreason' => 'अन्य/अतिरिक्त कारण:',
 'deletereasonotherlist' => 'अन्य कारण',
 'deletereason-dropdown' => '*हटाने के सामान्य कारण
-** लेखक की बिनती
+** स्पैम
+** बर्बरता
 ** कॉपीराइट उल्लंघन
-** बर्बरता',
+** लेखक का अनुरोध
+** टूटा अनुप्रेषण',
 'delete-edit-reasonlist' => 'हटाने के कारण संपादित करें',
 'delete-toobig' => 'इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।
 {{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।',
@@ -2431,7 +2433,7 @@ $UNWATCHURL
 इस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।',
 'editcomment' => "संपादन सारांश था: \"''\$1''\"।",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया',
-'revertpage-nouser' => '(सदसà¥\8dय à¤¨à¤¾à¤® à¤¹à¤\9fाया à¤\97या à¤¹à¥\88) à¤¦à¥\8dवारा à¤\95िà¤\8f à¤\97à¤\8f à¤¸à¤\82पादन à¤\95à¥\8b à¤µà¤¾à¤ªà¤¿à¤¸ à¤ªà¥\81रानà¥\80 à¤¸à¥\8dथिति à¤®à¥\87à¤\82 à¤²à¤¾ à¤\95र à¤\87सà¤\95à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\95à¥\87 [[User:$1|$1]] à¤¦à¥\8dवारा à¤¬à¤¨à¥\87 à¤\85वतरण à¤\95à¥\8b à¤«à¤¿à¤° à¤¸à¥\87 à¤¤à¤¾à¤\9c़ा à¤\85वतरण à¤¬à¤¨à¤¾या।',
+'revertpage-nouser' => '(सदसà¥\8dय à¤¨à¤¾à¤® à¤¹à¤\9fाया à¤\97या à¤¹à¥\88) à¤\95à¥\87 à¤¸à¤\82पादनà¥\8bà¤\82 à¤\95à¥\8b à¤¹à¤\9fाà¤\95र {{GENDER:$1|[[User:$1|$1]]}} à¤\95à¥\87 à¤\85नà¥\8dतिम à¤\85वतरण à¤\95à¥\8b à¤ªà¥\82रà¥\8dववत à¤\95िया।',
 'rollback-success' => '$1 के संपादन हटाए;
 $2 द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।',
 
@@ -2489,7 +2491,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 **अफलदायी सम्पादन युद्ध
 **अधिक यातायात वाला पृष्ठ',
 'protect-edit-reasonlist' => 'सुरक्षा के कारण बदलें',
-'protect-expiry-options' => '१ à¤\98à¤\82à¤\9fा:1 hour,१ à¤¦à¤¿à¤¨:1 day,१ à¤¸à¤ªà¥\8dताह:1 week,२ à¤¸à¤ªà¥\8dताह:2 weeks,१ à¤®à¤¹à¥\80ना:1 month,३ à¤®à¤¹à¥\80नà¥\87:3 months,६ à¤®à¤¹à¥\80नà¥\87:6 months,१ साल:1 year,हमेशा के लिए:infinite',
+'protect-expiry-options' => 'à¤\8fà¤\95 à¤\98à¤\82à¤\9fा:1 hour,à¤\8fà¤\95 à¤¦à¤¿à¤¨:1 day,à¤\8fà¤\95 à¤¸à¤ªà¥\8dताह:1 week,दà¥\8b à¤¸à¤ªà¥\8dताह:2 weeks,à¤\8fà¤\95 à¤®à¤¹à¥\80ना:1 month,तà¥\80न à¤®à¤¹à¥\80नà¥\87:3 months,à¤\9bà¤\83 à¤®à¤¹à¥\80नà¥\87:6 months,à¤\8fà¤\95 साल:1 year,हमेशा के लिए:infinite',
 'restriction-type' => 'अधिकार:',
 'restriction-level' => 'सुरक्षा-स्तर:',
 'minimum-size' => 'न्यूनतम आकार',
@@ -2508,7 +2510,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'restriction-level-all' => 'कोई भी स्तर',
 
 # Undelete
-'undelete' => 'हà¤\9fाया पृष्ठ देखें',
+'undelete' => 'हà¤\9fाà¤\8f पृष्ठ देखें',
 'undeletepage' => 'हटाए गए पृष्ठ देखें और पुनर्स्थापित करें',
 'undeletepagetitle' => "'''नीचे [[:$1|$1]] के हटाए गए अवतरण दर्शाए गये हैं।'''",
 'viewdeletedpage' => 'हटाए गए पृष्ठ देखें',
@@ -2517,46 +2519,46 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'undelete-fieldset-title' => 'अवतरण पुरानी स्थिति पर लाएँ',
 'undeleteextrahelp' => "पृष्ठ का संपूर्ण इतिहास वापस लाने के लिए सभी बक्सों से सही का निशान हटा दें और '''''{{int:undeletebtn}}''''' पर क्लिक करें।
 चुनिंदा इतिहास को वापस लाने के लिए उन अवतरणों के बगल के बक्सों पर सही का निशान लगाएँ और '''''{{int:undeletebtn}}''''' पर क्लिक करें।",
-'undeleterevisions' => '$1 {{PLURAL:$1|अवतरण}} लेखागार में हैं',
+'undeleterevisions' => '$1 अवतरण लेखागार में {{PLURAL:$1|है|हैं}}',
 'undeletehistory' => 'यदि आप पृष्ठ को पुनर्स्थापित करते हैं तो सभी अवतरण इतिहास में पुनर्स्थापित हो जायेंगे।
 हटाने के बाद यदि एक नया पृष्ठ उसी नाम से बनाया गया है तो पुनर्स्थापित अवतरण पिछले इतिहास में दर्शित होंगे।',
 'undeleterevdel' => 'यदि पुनर्स्थापन के फलस्वरूप शीर्ष पृष्ठ या फ़ाइल अवतरण आंशिक रूप से मिट सकता है, तो इसे नहीं किया जायेगा।
 ऐसी स्थिति में, आपको नवीनतम मिटाए गए अवतरण को बिना सही के निशान लगाये हुए या बिना छुपाये रखना होगा।',
-'undeletehistorynoadmin' => 'यह à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤\95ाल दिया गया है।
-निà¤\95ालà¥\87 à¤\9cानà¥\87 à¤\95ा à¤\95ारन à¤¨à¥\80à¤\9aà¥\87 à¤¸à¤¾à¤°à¤¾à¤\82श à¤®à¥\87à¤\82 à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤\89न à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤µà¤¿à¤¸à¥\8dतार à¤­à¥\80 à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\9cिनà¥\8dहà¥\8bà¤\82नà¥\87 à¤¨à¤¿à¤\95ालà¥\87 à¤\9cानà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¸à¤\82पादित à¤\95िया à¤¹à¥\88
-à¤\87न à¤¹à¤\9fायà¥\87 à¤\97à¤\8f à¤\85वतरणà¥\8bà¤\82 à¤\95à¥\87 à¤µà¤¿à¤¦à¥\8dयमान à¤µà¤¿à¤·à¤¯ à¤µà¤¸à¥\8dतà¥\81 à¤\95à¥\87वल à¤ªà¥\8dरशासकों को ही उपलब्ध है।',
+'undeletehistorynoadmin' => 'यह à¤ªà¥\83षà¥\8dठ à¤¹à¤\9fा दिया गया है।
+हà¤\9fाà¤\8f à¤\9cानà¥\87 à¤\95ा à¤\95ारन à¤¨à¥\80à¤\9aà¥\87 à¤¸à¤¾à¤°à¤¾à¤\82श à¤®à¥\87à¤\82 à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤\89न à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤µà¤¿à¤¸à¥\8dतार à¤­à¥\80 à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\9cिनà¥\8dहà¥\8bà¤\82नà¥\87 à¤¹à¤\9fाà¤\8f à¤\9cानà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¸à¤\82पादित à¤\95िया à¤¥à¤¾
+à¤\87न à¤¹à¤\9fायà¥\87 à¤\97à¤\8f à¤\85वतरणà¥\8bà¤\82 à¤\95ा à¤ªà¤¾à¤  à¤\95à¥\87वल à¤ªà¥\8dरबà¤\82धकों को ही उपलब्ध है।',
 'undelete-revision' => '$1 ($4 को $5 बजे $3 द्वारा बनाया गया) का मिटाया हुआ संस्करण:',
 'undeleterevision-missing' => 'अमान्य अथवा अनुपस्थित अवतरण।
-या à¤¤à¥\8b à¤\86प à¤\97़लत à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95र à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82, à¤¯à¤¾ à¤¯à¤¹ à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95िया à¤\9cा à¤\9aà¥\81à¤\95ा à¤¹à¥\88, à¤\85थवा à¤\87सà¥\87 à¤²à¥\87à¤\96ाà¤\97ार à¤¸à¥\87 à¤¨à¤¿à¤\95ाल दिया गया है।',
-'undelete-nodiff' => 'पà¥\81रान à¤\85वतरण à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88à¤\82।',
+या à¤¤à¥\8b à¤\86प à¤\97़लत à¤\95ड़à¥\80 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95र à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82, à¤¯à¤¾ à¤¯à¤¹ à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95िया à¤\9cा à¤\9aà¥\81à¤\95ा à¤¹à¥\88, à¤\85थवा à¤\87सà¥\87 à¤²à¥\87à¤\96ाà¤\97ार à¤¸à¥\87 à¤¹à¤\9fा दिया गया है।',
+'undelete-nodiff' => 'à¤\95à¥\8bà¤\88 à¤ªà¥\81राना à¤\85वतरण à¤¨à¤¹à¥\80à¤\82 à¤®à¤¿à¤²à¤¾।',
 'undeletebtn' => 'वापस ले आयें',
-'undeletelink' => 'दà¥\87à¤\96à¥\87à¤\82/पà¥\81रानà¥\80 à¤¸à¥\8dथिति à¤ªà¤° à¤²à¤¾à¤\8fà¤\81',
+'undeletelink' => 'दà¥\87à¤\96à¥\87à¤\82/पà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87à¤\82',
 'undeleteviewlink' => 'देखें',
 'undeletereset' => 'पूर्ववत करें',
 'undeleteinvert' => 'चुनाव उलटें',
 'undeletecomment' => 'कारण:',
-'undeletedrevisions' => '{{PLURAL:$1|à¤\8fà¤\95 à¤°à¥\82पानà¥\8dतर à¤µà¤¾à¤ªà¤¸ à¤²à¤¾à¤¯à¤¾ à¤\97या|$1 à¤°à¥\82पानà¥\8dतर à¤µà¤¾à¤ªà¤¸ à¤²à¤¾à¤¯à¥\87 à¤\97यà¥\87}} à¤¹à¥\88',
-'undeletedrevisions-files' => '{{PLURAL:$1|1 à¤\85वतरण|$1 à¤\85वतरण}} à¤\94र {{PLURAL:$2|1 à¤«à¤¼à¤¾à¤\88ल|$2 à¤«à¤¼à¤¾à¤\87लà¥\87à¤\82}} à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95र à¤¦à¤¿à¤¯à¥\87ं',
-'undeletedfiles' => '{{PLURAL:$1|1 à¤«à¤¼à¤¾à¤\88ल|$1 à¤«à¤¼à¤¾à¤\88लें}} पुनर्स्थापित',
+'undeletedrevisions' => '{{PLURAL:$1|à¤\8fà¤\95 à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95िया|$1 à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95ियà¥\87}}',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 à¤\85वतरण|$1 à¤\85वतरण}} à¤\94र {{PLURAL:$2|1 à¤«à¤¼à¤¾à¤\87ल|$2 à¤«à¤¼à¤¾à¤\87लà¥\87à¤\82}} à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95र à¤¦à¥\80ं',
+'undeletedfiles' => '{{PLURAL:$1|1 à¤«à¤¼à¤¾à¤\87ल|$1 à¤«à¤¼à¤¾à¤\87लें}} पुनर्स्थापित',
 'cannotundelete' => 'पुनर्स्थापित नहीं कर सके:
 $1',
 'undeletedpage' => "'''$1 को पुनर्स्थापित कर दिया गया है'''
 
 हाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।",
-'undelete-header' => 'हाल में हटाये गये पृष्ठ देखने के लियें [[Special:Log/delete|हटाने की सूची]] देखें।',
+'undelete-header' => 'हाल में हटाये गये पृष्ठ देखने के लिये [[Special:Log/delete|हटाने का लॉग]] देखें।',
 'undelete-search-title' => 'हटाये गये पृष्ठ खोजें',
 'undelete-search-box' => 'हटाये गये पृष्ठ खोजें',
 'undelete-search-prefix' => 'शुरूआती शब्द अनुसार पृष्ठ खोजें:',
 'undelete-search-submit' => 'खोजें',
-'undelete-no-results' => 'हà¤\9fायà¥\87à¤\82 à¤\97यà¥\87à¤\82 à¤ªà¤¨à¥\8dनà¥\8bà¤\82à¤\95à¥\87 à¤\86रà¥\8dà¤\9aिवà¥\8dहमà¥\87à¤\82 à¤®à¥\87ल à¤\96ानà¥\87 à¤µà¤¾à¤²à¥\87 à¤ªà¥\83षà¥\8dठ à¤®à¤¿à¤²à¥\87 à¤¨à¤¹à¥\80à¤\82।',
-'undelete-filename-mismatch' => '$1 à¤¸à¤®à¤¯à¤\95à¥\87 à¤«à¤¼à¤¾à¤\87लà¤\95à¥\87 à¤¹à¤\9fायà¥\87 à¤\97यà¥\87 à¤\85वतरणà¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता: à¤«à¤¼à¤¾à¤\88ल का नाम मेल नहीं खाता',
-'undelete-bad-store-key' => '$1 à¤¸à¤®à¤¯à¤\95ा à¤«à¤¼à¤¾à¤\88ल à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤¸à¤\95तà¥\87à¤\82 à¤¹à¥\88à¤\82: à¤¹à¤\9fानà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤«à¤¼à¤¾à¤\88ल à¤\85सà¥\8dतितà¥\8dवमà¥\87à¤\82 नहीं थी।',
-'undelete-cleanup-error' => 'à¤\87सà¥\8dतà¥\87मालमà¥\87à¤\82 à¤¨ à¤²à¤¾à¤\88 à¤\97à¤\88 "$1" à¤\86रà¥\8dà¤\9aिवà¥\8dह à¤«à¤¼à¤¾à¤\88ल à¤¹à¤\9fानà¥\87 à¤®à¥\87à¤\82 à¤¸à¤®à¤¸à¥\8dया à¤¹à¥\81à¤\88 à¤¹à¥\88à¤\82।',
-'undelete-missing-filearchive' => 'सिà¤\9aिà¤\95ा à¤ªà¥\81रालà¥\87à¤\96 à¤\95à¥\8dरमाà¤\82à¤\95 $1 à¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤\85सà¤\95à¥\8dषम à¤¹à¥\88à¤\82, à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ à¤\86à¤\81à¤\95ड़ाà¤\95à¥\8bष में उपलब्ध नहीं है।
+'undelete-no-results' => 'हà¤\9fाà¤\8f à¤\97à¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\87 à¤²à¥\87à¤\96ाà¤\97ार à¤®à¥\87à¤\82 à¤®à¥\87ल à¤\96ातà¥\87 à¤\95à¥\8bà¤\88 à¤ªà¥\83षà¥\8dठ à¤¨à¤¹à¥\80à¤\82 à¤®à¤¿à¤²à¥\87।',
+'undelete-filename-mismatch' => '$1 à¤\95à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\95à¥\87 à¤¹à¤\9fायà¥\87 à¤\97यà¥\87 à¤\85वतरण à¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता: à¤«à¤¼à¤¾à¤\87ल का नाम मेल नहीं खाता',
+'undelete-bad-store-key' => '$1 à¤\95ा à¤«à¤¼à¤¾à¤\87ल à¤\85वतरण à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82: à¤¹à¤\9fानà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤­à¥\80 à¤«à¤¼à¤¾à¤\87ल à¤®à¥\8cà¤\9cà¥\82द नहीं थी।',
+'undelete-cleanup-error' => 'पà¥\81रालà¥\87à¤\96 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\85पà¥\8dरयà¥\81à¤\95à¥\8dत à¤«à¤¼à¤¾à¤\87ल "$1" à¤¹à¤\9fानà¥\87 à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि।',
+'undelete-missing-filearchive' => 'फ़ाà¤\87ल à¤ªà¥\81रालà¥\87à¤\96 à¤\86à¤\88॰डà¥\80 $1 à¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤\85सà¤\95à¥\8dषम à¤¹à¥\88à¤\82, à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ à¤¡à¤¾à¤\9fाबà¥\87स में उपलब्ध नहीं है।
 या ऐसा भी हो सकता है कि इसे पहले से ही पुनर्स्थापित किया जा चुका हो।',
-'undelete-error' => 'पà¥\83षà¥\8dठ à¤\85विलà¥\8bपन में त्रुटि',
-'undelete-error-short' => 'फ़ाà¤\88ल à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤¸à¤®à¤¸à¥\8dया: $1',
-'undelete-error-long' => 'फ़ाà¤\88ल à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤\86à¤\88 à¤¹à¥\81à¤\88 à¤¸à¤®à¤¸à¥\8dयाà¤\8fà¤\82:
+'undelete-error' => 'पà¥\83षà¥\8dठ à¤ªà¥\81नरà¥\8dसà¥\8dथापन में त्रुटि',
+'undelete-error-short' => 'फ़ाà¤\87ल à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि: $1',
+'undelete-error-long' => 'फ़ाà¤\87ल à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤®à¥\87à¤\82 à¤\86à¤\88 à¤¤à¥\8dरà¥\81à¤\9fियाà¤\81:
 
 $1',
 'undelete-show-file-confirm' => 'क्या आप वाकई फ़ाइल "<nowiki>$1</nowiki>" के $2 को $3 बजे बने, हटाए जा चुके अवतरण को देखना चाहते हैं?',
@@ -2644,7 +2646,7 @@ $1',
 'ipbenableautoblock' => 'इस सदस्यद्वारा इस्तेमाल किया गया आखिरी आईपी एड्रेस और यहां से आगे इस सदस्य द्वारा इस्तेमालमें लाये जाने वाले सभी एड्रेस ब्लॉक करें।',
 'ipbsubmit' => 'इस सदस्य को और बदलाव करने से रोकें',
 'ipbother' => 'अन्य समय:',
-'ipboptions' => '२ à¤\98à¤\82à¤\9fà¥\87:2 hours,१ à¤¦à¤¿à¤¨:1 day,३ à¤¦à¤¿à¤¨:3 days,१ à¤¹à¤«à¥\8dता:1 week,२ à¤¹à¤«à¥\8dतà¥\87:2 weeks,१ à¤®à¤¹à¤¿à¤¨à¤¾:1 month,३ à¤®à¤¹à¤¿à¤¨à¥\87:3 months,६ à¤®à¤¹à¤¿à¤¨à¥\87:6 months,१ साल:1 year,हमेशा के लिये:infinite',
+'ipboptions' => 'दà¥\8b à¤\98à¤\82à¤\9fà¥\87:2 hours,à¤\8fà¤\95 à¤¦à¤¿à¤¨:1 day,तà¥\80न à¤¦à¤¿à¤¨:3 days,à¤\8fà¤\95 à¤¸à¤ªà¥\8dताह:1 week,दà¥\8b à¤¸à¤ªà¥\8dताह:2 weeks,à¤\8fà¤\95 à¤®à¤¹à¥\80ना:1 month,तà¥\80न à¤®à¤¹à¥\80नà¥\87:3 months,à¤\9bà¤\83 à¤®à¤¹à¥\80नà¥\87:6 months,à¤\8fà¤\95 साल:1 year,हमेशा के लिये:infinite',
 'ipbotheroption' => 'अन्य',
 'ipbotherreason' => 'अन्य/दूसरा कारण:',
 'ipbhidename' => 'संपादन व सूचियों से सदस्य नाम छिपाएँ',
@@ -2732,12 +2734,9 @@ $1 को बाध्य करने का कारण है: "$2"',
 फिर भी, $2 प्रकार को बाध्य किया जा सकता है, जिनको अबाध्य किया जा सकता है।',
 'ip_range_invalid' => 'गलत आईपी रेंज',
 'ip_range_toolarge' => '/$1 से अधिक बड़े रेञ्ज ब्लॉकों की अनुमति नहीं है।',
-'blockme' => 'मुझे ब्लॉक करो',
 'proxyblocker' => 'प्रॉक्सी ब्लॉकर',
-'proxyblocker-disabled' => 'यह कार्य रद्द कर दिया गया हैं।',
 'proxyblockreason' => 'आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है।
 कृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।',
-'proxyblocksuccess' => 'हो गया।',
 'sorbsreason' => '{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।',
 'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।',
 'cant-block-while-blocked' => 'आप खुद ही अवरोधित हैं इसलिए इस समय आप औरों को अवरोधित नहीं कर सकते हैं।',
@@ -3005,7 +3004,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'tooltip-ca-protect' => 'इस पृष्ठको सुरक्षित किजीयें',
 'tooltip-ca-unprotect' => 'इस पृष्ठ की सुरक्षा बदलें ।',
 'tooltip-ca-delete' => 'इस पृष्ठ को हटाएं',
-'tooltip-ca-undelete' => 'इस पृष्ठको हटाने से पहले किये गये बदलाव पुनर्स्थापित करें',
+'tooltip-ca-undelete' => 'इस पृष्ठ को हटाने से पहले किये गये बदलाव पुनर्स्थापित करें',
 'tooltip-ca-move' => 'यह पृष्ठ स्थानांतरित करें',
 'tooltip-ca-watch' => 'इस पृष्ठ को अपनी ध्यानसूची में डालें',
 'tooltip-ca-unwatch' => 'यह पृष्ठ अपने ध्यानसूचीसे हटाएं',
index d27923c..ac292cb 100644 (file)
@@ -2558,12 +2558,9 @@ Saait iske pahile khol dewa gais hoi.',
 Lekin iske, as part of the range $2, block karaa gais hai, jiske unblock karaa jaawe sake hai.',
 'ip_range_invalid' => 'IP ke range me galti hai.',
 'ip_range_toolarge' => '/$1 se barraa range blocks ke ijajat nai hae.',
-'blockme' => 'Ham ke roko',
 'proxyblocker' => 'Proxy roke waala',
-'proxyblocker-disabled' => 'Ii function pe rukawat hai.',
 'proxyblockreason' => 'Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai.
 Meharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.',
-'proxyblocksuccess' => 'Hoe gais hai.',
 'sorbsreason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.',
 'sorbs_create_account_reason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.
 Aap ke ek account banae ke ijajat nai hai',
index 0869055..baeb6b8 100644 (file)
@@ -2590,7 +2590,7 @@ $1',
 'contributions' => 'Doprinosi {{GENDER:$1|suradnika|suradnice}}',
 'contributions-title' => 'Suradnički doprinosi za $1',
 'mycontris' => 'Moji doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nema promjena koje udovoljavaju ovim kriterijima.',
 'uctop' => '(vrh)',
 'month' => 'Od mjeseca (i ranije):',
@@ -2748,11 +2748,8 @@ Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokir
 'ipb_blocked_as_range' => 'Pogreška: IP adresa $1 nije blokirana direktno te stoga ne može biti odblokirana. Blokirana je kao dio opsega $2, koji može biti odblokiran.',
 'ip_range_invalid' => 'Raspon IP adresa nije valjan.',
 'ip_range_toolarge' => 'Opsezi blokiranja veći od /$1 nisu dozvoljeni.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Zaštita od otvorenih posrednika (proxyja)',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša je IP adresa blokirana jer se radi o otvorenom posredniku (proxyju). Molimo stupite u vezu s Vašim davateljem internetskih usluga (ISP-om) ili službom tehničke podrške i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Napravljeno.',
 'sorbsreason' => 'Vaša IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL. Ne možete otvoriti račun.',
 'cant-block-while-blocked' => 'Ne možete blokirati druge suradnike dok ste blokirani.',
@@ -3958,6 +3955,7 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'tags' => 'Valjane oznake izmjena',
 'tag-filter' => 'Filtar [[Special:Tags|oznaka]]:',
 'tag-filter-submit' => 'Filtar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
 'tags-title' => 'Oznake',
 'tags-intro' => 'Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.',
 'tags-tag' => 'Naziv oznake',
index f362223..55add6b 100644 (file)
@@ -2569,11 +2569,8 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
 'ipb_blocked_as_range' => 'Zmylk: IP $1 njeje direktnje zablokowana a njeda so wublokować. Blokuje so wšak jako dźěl wobwoda $2, kotryž da so wublokować.',
 'ip_range_invalid' => 'Njepłaciwy wobłuk IP-adresow.',
 'ip_range_toolarge' => 'Wobłukowe bloki, kotrež su wjetše hač /$1, njejsu dowolene.',
-'blockme' => 'Blokować',
 'proxyblocker' => 'Awtomatiske blokowanje wotewrjenych proksy-serwerow',
-'proxyblocker-disabled' => 'Tuta funkcija je deaktiwizowana.',
 'proxyblockreason' => 'Twoja IP-adresa bu zablokowana, dokelž je wotewrjeny proksy. Prošu skontaktuj swojeho prowidera abo syćoweho administratora a informuj jeho wo tutym chutnym wěstotnym problemje.',
-'proxyblocksuccess' => 'Dokónčene.',
 'sorbs' => 'SORBS DNSbl',
 'sorbsreason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana.',
 'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. Njemóžeš konto wutworić.',
index a6e681f..5ad847a 100644 (file)
@@ -2746,11 +2746,8 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
 'ipb_blocked_as_range' => 'Hiba: a(z) $1 IP-cím nem blokkolható közvetlenül, és nem lehet feloldani. A(z) $2 tartomány részeként van blokkolva, amely feloldható.',
 'ip_range_invalid' => 'Érvénytelen IP-tartomány.',
 'ip_range_toolarge' => 'Nem engedélyezettek azok a tartományblokkok, melyek nagyobbak mint /$1.',
-'blockme' => 'Saját magam blokkolása',
 'proxyblocker' => 'Proxyblokkoló',
-'proxyblocker-disabled' => 'Ez a funkció le van tiltva.',
 'proxyblockreason' => "Az IP-címeden ''nyílt proxy'' üzemel. Amennyiben nem használsz proxyt, vedd fel a kapcsolatot egy informatikussal vagy az internetszolgáltatóddal ezen súlyos biztonsági probléma ügyében.",
-'proxyblocksuccess' => 'Kész.',
 'sorbsreason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán.',
 'sorbs_create_account_reason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán. Nem hozhatsz létre fiókot.',
 'cant-block-while-blocked' => 'Nem blokkolhatsz más szerkesztőket, miközben te magad blokkolva vagy.',
index e358141..aa7b289 100644 (file)
@@ -2163,7 +2163,6 @@ $1',
 'ip_range_invalid' => 'IP-հասցեների անթույլատրելի լայնույթ։',
 'proxyblocker' => 'Փոխանորդի արգելափակում',
 'proxyblockreason' => 'Ձեր IP-հասցեն արգելափակվել է, քանի որ այն պատկանում է հանրային միջնորդ (պրոքսի) սեռվերին։ Խնդրում ենք կապվել ձեր ցանցային կամ տեխնիկական ծառայության տրամադրողի հետ և տեղեկացնել այս լուրջ անվտանգության խնդրի մասին։',
-'proxyblocksuccess' => 'Արված է։',
 'sorbsreason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։',
 'sorbs_create_account_reason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։ Դուք չեք կարող ստեղծել մասնակցային հաշիվ։',
 'ipbnounblockself' => 'Դուք չեք կարող արգելափակել ինքներդ ձեզ',
index cb7b4d2..438d9a7 100644 (file)
@@ -362,7 +362,7 @@ $messages = array(
 'articlepage' => 'Vider pagina de contento',
 'talk' => 'Discussion',
 'views' => 'Representationes',
-'toolbox' => 'Instrumentario',
+'toolbox' => 'Instrumentos',
 'userpage' => 'Vider pagina del usator',
 'projectpage' => 'Vider pagina de projecto',
 'imagepage' => 'Vider le pagina del file',
@@ -2392,10 +2392,12 @@ Tote le horas es in le fuso horari del servitor.',
 'deletecomment' => 'Motivo:',
 'deleteotherreason' => 'Motivo altere/additional:',
 'deletereasonotherlist' => 'Altere motivo',
-'deletereason-dropdown' => '*Motivos habitual pro deler paginas
-** Requesta del autor
+'deletereason-dropdown' => '*Motivos commun pro deler
+** Spam
+** Vandalismo
 ** Violation de copyright
-** Vandalismo',
+** Requesta del autor
+** Redirection rupte',
 'delete-edit-reasonlist' => 'Modificar le motivos pro deletion',
 'delete-toobig' => 'Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.
 Le deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.',
@@ -2725,12 +2727,9 @@ Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e bl
 Illo es, nonobstante, blocate como parte del intervallo $2, le qual pote esser disblocate.',
 'ip_range_invalid' => 'Intervallo de adresses IP invalide.',
 'ip_range_toolarge' => 'Non es permittite blocar un gamma de adresses IP plus grande que /$1.',
-'blockme' => 'Blocar me',
 'proxyblocker' => 'Blocator de proxy',
-'proxyblocker-disabled' => 'Iste function es disactivate.',
 'proxyblockreason' => 'Tu adresse IP ha essite blocate proque illo es un proxy aperte.
 Per favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.',
-'proxyblocksuccess' => 'Succedite.',
 'sorbsreason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.
 Tu non pote crear un conto',
index b070bde..2c3b33d 100644 (file)
@@ -481,7 +481,7 @@ $messages = array(
 'broken-file-category' => 'Halaman dengan gambar rusak',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Tentang',
 'article' => 'Halaman isi',
@@ -2856,11 +2856,8 @@ Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat in
 'ipb_blocked_as_range' => 'Kesalahan: IP $1 tidak diblok secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.',
 'ip_range_invalid' => 'Blok IP tidak sah.',
 'ip_range_toolarge' => 'Rentang blok lebih besar dari /$1 tidak diperbolehkan.',
-'blockme' => 'Blokir saya',
 'proxyblocker' => 'Pemblokir proxy',
-'proxyblocker-disabled' => 'Fitur ini sedang tidak diakfifkan.',
 'proxyblockreason' => 'Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.',
-'proxyblocksuccess' => 'Selesai.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.',
 'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.',
index 2d5a126..d80520c 100644 (file)
@@ -1285,8 +1285,6 @@ Ngá bu ihe hé mèkwàrà nà ihü '''$1''':",
 'unblocklogentry' => 'àkwáchị gị $1',
 'block-log-flags-nocreate' => "Í ké ọ'bànifé bàchìrì",
 'block-log-flags-noemail' => 'ha kwàchịrị e-mail',
-'blockme' => 'Kwàchím',
-'proxyblocksuccess' => 'Ọméchá.',
 
 # Developer tools
 'lockdb' => 'Gbàchí uche nsónùsòrò',
index d87b481..3449654 100644 (file)
@@ -2596,12 +2596,9 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi
 Ngem, nupay kasta, naserran a kas paset ti sakup ti $2, a mabalin a malukatan ti serrana.',
 'ip_range_invalid' => 'Imbalido a sakup ti IP.',
 'ip_range_toolarge' => 'Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.',
-'blockme' => 'Serraannak',
 'proxyblocker' => 'Pannakbagi a panagserra',
-'proxyblocker-disabled' => 'Daytoy a panagaramid ket nabaldado.',
 'proxyblockreason' => 'Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.
 Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti kaurnusam ken ibagam kaniada ti nakaro a parikut ti seguridad.',
-'proxyblocksuccess' => 'Nalpasen.',
 'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.',
 'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.
 Saanka a makaaramid ti pakabilangan',
index 7ef3b09..0626ea7 100644 (file)
@@ -182,8 +182,8 @@ $messages = array(
 'help' => 'Куцтохкам',
 'search' => 'Лахаp',
 'searchbutton' => 'Хьалаха',
-'go' => 'Дехьавала',
-'searcharticle' => 'Дехьавала',
+'go' => 'Дехьа гӀо',
+'searcharticle' => 'Дехьа гӀо',
 'history' => 'искар',
 'history_short' => 'Искар',
 'updatedmarker' => 'Со ханача денца хувцамаш хиннaд',
@@ -228,7 +228,7 @@ $messages = array(
 'lastmodifiedat' => 'Укх оагӀув тӀехьара  хувцам: $2, $1.',
 'viewcount' => 'Укх оагӀув тӀа бӀаргтасса хиннад {{PLURAL:$1|цхьазза|$1 шозза}}.',
 'protectedpage' => 'Лорама оагӀув',
-'jumpto' => 'Укхаза дехьавала/яла:',
+'jumpto' => 'Укхаза дехьа гӀо:',
 'jumptonavigation' => 'никътохкарг',
 'jumptosearch' => 'леха',
 'pool-timeout' => 'ЧIегатохара сабаран ха чакхаяьннай',
@@ -909,8 +909,6 @@ $messages = array(
 'blocklogentry' => '[[$1]] чIега белаб,  $2 $3 ха ялалца',
 'unblocklogentry' => '$1 юха яста я',
 'block-log-flags-nocreate' => 'ЛархIамий дагарчена цIи яьккхар пурам янза я.',
-'blockme' => 'ЧIега бола сона',
-'proxyblocksuccess' => 'Хьадаьд.',
 
 # Move page
 'move-page-legend' => 'ОагIува цIи хувца',
@@ -956,7 +954,7 @@ $messages = array(
 'allmessagesdefault' => 'Сатийна улла яздам',
 'allmessages-filter-all' => 'Дерригаш',
 'allmessages-language' => 'Мотт:',
-'allmessages-filter-submit' => 'Дехьавала/яла',
+'allmessages-filter-submit' => 'Дехьа гӀо',
 
 # Thumbnails
 'thumbnail-more' => 'Хьадоккхаде',
@@ -1102,7 +1100,7 @@ $messages = array(
 'confirm_purge_button' => 'ХIаа',
 
 # Multipage image navigation
-'imgmultigo' => 'Дехьавала/яла!',
+'imgmultigo' => 'Дехьа гӀо!',
 'imgmultigoto' => '$1 оагIув тIа дехьавала',
 
 # Table pager
index e93d0c2..599890c 100644 (file)
@@ -1246,7 +1246,6 @@ Videz [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.',
 'unblocklogentry' => 'desblokusis "$1"',
 'ipb_expiry_invalid' => 'Nevalida expiro-tempo.',
 'ip_range_invalid' => 'Nevalida IP-rango.',
-'proxyblocksuccess' => 'Facita.',
 
 # Developer tools
 'lockdb' => 'Blokusar datumaro',
index 2eb6224..86b8281 100644 (file)
@@ -371,7 +371,7 @@ $messages = array(
 'noindex-category' => 'Óraðaðar skrár',
 'broken-file-category' => 'Síður með brotna myndatengla',
 
-'linkprefix' => '/^(.*?)([áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z-–]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z-–])))(.+)$/sDu',
 
 'about' => 'Um',
 'article' => 'Efnissíða',
@@ -2689,12 +2689,9 @@ Sjá [[Special:BlockList|ítarlegri lista]] fyrir öll núgildandi bönn.',
 Vistfangið var bannað sem hluti af fjöldabanninu $2, sem er hægt að afbanna.',
 'ip_range_invalid' => 'Ógilt vistfangasvið.',
 'ip_range_toolarge' => 'Fjöldabönn stærri en /$1 eru óheimil.',
-'blockme' => 'Banna mig',
 'proxyblocker' => 'Vefsels bann',
-'proxyblocker-disabled' => 'Þessi virkni er óvirk.',
 'proxyblockreason' => 'Vistfangið þitt hefur verið bannað því það er opið vefsel.
 Vinsamlegast hafðu samband við internetþjónustuaðilann þinn eða netstjóra félagsins og láttu þá vita af þessu alvarlegu öryggisvandamáli.',
-'proxyblocksuccess' => 'Búinn.',
 'sorbsreason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er í notkun á {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er notað af {{SITENAME}}.
 Þú getur ekki stofnað aðgang.',
index a625b42..f554aed 100644 (file)
@@ -2767,11 +2767,8 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
 'ipb_blocked_as_range' => "Errore: L'indirizzo IP $1 non è soggetto a blocco individuale e non può essere sbloccato. Il blocco è invece attivo a livello dell'intervallo $2, che può essere sbloccato.",
 'ip_range_invalid' => 'Intervallo di indirizzi IP non valido.',
 'ip_range_toolarge' => 'Non è possibile bloccare range superiori al /$1',
-'blockme' => 'Bloccami',
 'proxyblocker' => 'Blocco dei proxy aperti',
-'proxyblocker-disabled' => 'Questa funzione è disabilitata.',
 'proxyblockreason' => 'Questo indirizzo IP è stato bloccato perché risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.',
-'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
 'xffblockreason' => "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1",
@@ -3785,7 +3782,7 @@ Per favore, conferma che vuoi veramente ricreare questa pagina.",
 'confirm-unwatch-top' => 'Elimina questa pagina dalla tua lista degli osservati speciali?',
 
 # Separators for various lists, etc.
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pagina precedente',
index fddfca2..29a2f53 100644 (file)
@@ -585,7 +585,7 @@ $messages = array(
 'articlepage' => '本文を表示',
 'talk' => '議論',
 'views' => '表示',
-'toolbox' => 'ツールボックス',
+'toolbox' => 'ツール',
 'userpage' => '利用者ページを表示',
 'projectpage' => 'プロジェクトのページを表示',
 'imagepage' => 'ファイルのページを表示',
@@ -841,7 +841,7 @@ $2',
 'createacct-emailoptional' => 'メールアドレス (省略可能)',
 'createacct-email-ph' => 'メールアドレスを入力',
 'createacct-another-email-ph' => 'メールアドレスを入力',
-'createaccountmail' => 'ä¸\80æ\99\82ç\9a\84ã\81§ã\83©ã\83³ã\83\80ã\83 ã\81ªã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¦ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«é\80\81ä¿¡ã\81\99ã\82\8b',
+'createaccountmail' => 'ä¸\80æ\99\82ç\9a\84ã\81ªç\84¡ä½\9cç\82ºã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¦ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«é\80\81ä¿¡',
 'createacct-realname' => '本名 (省略可能)',
 'createaccountreason' => '理由:',
 'createacct-reason' => '理由',
@@ -1560,7 +1560,7 @@ $1",
 'prefs-rendering' => '表示',
 'saveprefs' => '保存',
 'resetprefs' => '保存していない変更を破棄',
-'restoreprefs' => 'すべて初期設定に戻す',
+'restoreprefs' => 'すべて初期設定に戻す (すべての節について)',
 'prefs-editing' => '編集',
 'rows' => '行数:',
 'columns' => '列数:',
@@ -2969,12 +2969,9 @@ $1 のブロックの理由は「''$2''」です。",
 ただし、$2の範囲でブロックされており、こちらのブロックは別途解除できます。',
 'ip_range_invalid' => 'IP範囲が無効です。',
 'ip_range_toolarge' => '/$1より広範囲の範囲ブロックは許可されていません。',
-'blockme' => '自分をブロック',
 'proxyblocker' => 'プロキシブロック係',
-'proxyblocker-disabled' => 'この機能は無効になっています。',
 'proxyblockreason' => 'このIPアドレスは公開プロキシであるためブロックされています。
 ご使用中のインターネットサービスプロバイダーまたは所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。',
-'proxyblocksuccess' => '完了。',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
@@ -3360,7 +3357,7 @@ $2',
 'pageinfo-length' => 'ページの長さ (バイト単位)',
 'pageinfo-article-id' => 'ページ ID',
 'pageinfo-language' => 'ページ本文の言語',
-'pageinfo-robot-policy' => 'ロボットによるインデックス',
+'pageinfo-robot-policy' => 'ロボットによるインデックス作成',
 'pageinfo-robot-index' => '許可',
 'pageinfo-robot-noindex' => '不許可',
 'pageinfo-views' => '閲覧回数',
index ca273a2..6c315de 100644 (file)
@@ -2396,12 +2396,9 @@ Mangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo dafta
 'ipb_blocked_as_range' => 'Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.',
 'ip_range_invalid' => 'Blok IP ora absah.',
 'ip_range_toolarge' => 'Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.',
-'blockme' => 'Blokiren aku',
 'proxyblocker' => 'Pamblokir proxy',
-'proxyblocker-disabled' => 'Fungsi iki saiki lagi dipatèni.',
 'proxyblockreason' => "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''.
 Mangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
-'proxyblocksuccess' => 'Bubar.',
 'sorbsreason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
 'sorbs_create_account_reason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
 'cant-block-while-blocked' => 'Panjenengan ora bisa mblokir panganggo liya nalika panjenengan dhéwé pinuju diblokir.',
index b43f299..18dd6be 100644 (file)
@@ -15,6 +15,7 @@
  * @author Dawid Deutschland
  * @author ITshnik
  * @author Kaganer
+ * @author MIKHEIL
  * @author Malafaya
  * @author Nemo bis
  * @author Nodar Kherkheulidze
@@ -309,7 +310,7 @@ $messages = array(
 'broken-file-category' => 'გვერდები ფაილების არასწორი ბმულებით',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'შესახებ',
 'article' => 'სტატია',
@@ -1583,7 +1584,7 @@ $1",
 'enhancedrc-history' => 'ისტორია',
 'recentchanges' => 'ბოლო ცვლილებები',
 'recentchanges-legend' => 'ბოლო ცვლილებების პარამეტრები',
-'recentchanges-summary' => 'á\83£á\83\97á\83\95á\83\90á\83\9aá\83\97á\83\95á\83\90á\83\9aá\83\94á\83\97 á\83\95á\83\98á\83\99á\83\98á\83¨á\83\98 ბოლო ცვლილებებს ამ გვერდზე.',
+'recentchanges-summary' => 'á\83£á\83\97á\83\95á\83\90á\83\9aá\83\97á\83\95á\83\90á\83\9aá\83\94á\83\97 á\83\95á\83\98á\83\99á\83\98á\83¡ ბოლო ცვლილებებს ამ გვერდზე.',
 'recentchanges-feed-description' => 'ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.',
 'recentchanges-label-newpage' => 'ამ რედაქტირებით შეიქმნა ახალი გვერდი',
 'recentchanges-label-minor' => 'ეს არის მცირე შესწორება',
@@ -1877,6 +1878,7 @@ $1',
 'listfiles_description' => 'აღწერილობა',
 'listfiles_count' => 'ვერსიები',
 'listfiles-show-all' => 'სურათების ძველი ვერსიების ჩართვა',
+'listfiles-latestversion' => 'მიმდინარე ვერსია',
 'listfiles-latestversion-yes' => 'დიახ',
 'listfiles-latestversion-no' => 'არა',
 
@@ -2672,11 +2674,8 @@ $1',
 'ipb_blocked_as_range' => 'შეცდომა:  IP-მისამართი $1 არ იყო პირდაპირ დაბლოკილი, შესაბამისად ვერ მოხდება მისი განბლოკვა.თუმცა იგი ეკუთვნის დიაპაზონს $2, რომლის განბლოკვა შესაძლებელია.',
 'ip_range_invalid' => 'არასწორი IP მისამართი',
 'ip_range_toolarge' => 'დაბლოკვა /$1 დიაპაზონზე ზემოთ აკრძალულია.',
-'blockme' => 'დამბლოკე',
 'proxyblocker' => 'პროქსის ბლოკირება',
-'proxyblocker-disabled' => 'ეს ფუნქცია გაუქმებულია.',
 'proxyblockreason' => 'თქვენი IP მისამართი დაიბლოკა, ვინაიდან ის ღია პროქსია. გთხოვთ დაუკავშირდეთ თქვენ ინტერნეტ პროვაიდერს ან ტექ. სამსახურს და აცნობოთ მათ ამ სერიოზული უსაფრთხოების პრობლემის შესახებ.',
-'proxyblocksuccess' => 'შესრულებულია.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'თქვენი IP-მისამართი მიჩნევა ღია პროქსიდ DNSBL-ის თანახმად.',
 'sorbs_create_account_reason' => 'თქვენი IP-მისამართი ითვლება ღია პროქსიდ DNSBL-ის ანახმად. თქვენ ვერ შექმნით ანგარიშს.',
index 5800a8b..3bac5f9 100644 (file)
@@ -264,7 +264,7 @@ $messages = array(
 'category-file-count-limited' => "Usı kategoriyada to'mendegi {{PLURAL:$1|fayl|$1 fayl}} bar.",
 'listingcontinuesabbrev' => 'dawamı',
 
-'linkprefix' => '/^(.*?)([a-zıA-Zİ\\x80-\\xff]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zıA-Zİ\\x80-\\xff])))(.+)$/sDu',
 
 'about' => 'Haqqında',
 'article' => "Mag'lıwmat beti",
@@ -1580,8 +1580,6 @@ Basqa bloklawlar ushın [[Special:BlockList|IP bloklaw dizimin]] ko'rip shıg'ı
 'block-log-flags-noemail' => "e-mail bloklang'an",
 'ipb_expiry_invalid' => "Ku'shin joytıw waqtı nadurıs.",
 'ipb_already_blocked' => '"$1" a\'lle qashan bloklang\'an',
-'proxyblocker-disabled' => "Bul funktsiya o'shirilgen.",
-'proxyblocksuccess' => 'Tamamlandı.',
 
 # Developer tools
 'lockdb' => "Mag'lıwmatlar bazasın qulpla",
index 23e206a..27bff4d 100644 (file)
@@ -2239,7 +2239,6 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
-'proxyblocksuccess' => 'D ayen.',
 'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
 Ur tezmireḍ ara ad snulfuḍ amiḍan.',
index 8f18ce2..8ae5a10 100644 (file)
@@ -177,7 +177,7 @@ $messages = array(
 'noindex-category' => 'Pelê bêendeksıni',
 'broken-file-category' => 'Peli be gıreunê dosyeunê sıkıtau',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Heqa',
 'article' => 'Pela tedeesteyu',
index 906b356..0e98531 100644 (file)
@@ -2015,12 +2015,9 @@ $1 بۇعاتتاۋى ٴۇشىن كەلتىرىلگەن سەبەبى: «$2».',
 'ipb_blocked_as_range' => 'قاتەلىك: IP $1 تىكەلەي بۇعاتتالماعان جانە بۇعاتتاۋى وشىرىلمەيدى.
 بىراق, بۇل بۇعاتتاۋى ٴوشىرىلۋى مۇمكىن $2 اۋقىمى بولىگى بوپ بۇعاتتالعان.',
 'ip_range_invalid' => 'IP مەكەنجاي اۋقىمى جارامسىز.',
-'blockme' => 'وزدىكتىك_بۇعاتتاۋ',
 'proxyblocker' => 'پروكسىي سەرۆەرلەردى بۇعاتتاۋىش',
-'proxyblocker-disabled' => 'بۇل جەتە وشىرىلگەن.',
 'proxyblockreason' => 'IP مەكەنجايىڭىز اشىق پروكسىي سەرۆەرگە جاتاتىندىقتان بۇعاتتالعان.
 ىينتەرنەت قىزمەتىن جابدىقتاۋشىڭىزبەن, نە تەحنىيكالىق قولداۋ قىزمەتىمەن قاتىناسىڭىز, جانە ولارعا وسى وتە كۇردەلى قاۋىپسىزدىك شاتاق تۋرالى اقپارات بەرىڭىز.',
-'proxyblocksuccess' => 'ٴبىتتى.',
 'sorbsreason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.',
 'sorbs_create_account_reason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.
 جاڭا تىركەلگى جاساي المايسىز.',
index 23528c1..8163914 100644 (file)
@@ -2619,12 +2619,9 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 'ipb_blocked_as_range' => 'Қателік: IP $1 тікелей бұғатталмаған және бұғаттауы өшірілмейді.
 Бірақ, бұл бұғаттауы өшірілуі мүмкін $2 ауқымы бөлігі боп бұғатталған.',
 'ip_range_invalid' => 'IP мекенжай ауқымы жарамсыз.',
-'blockme' => 'Тіркелгімді бұғатта',
 'proxyblocker' => 'Прокси серверлерді бұғаттауыш',
-'proxyblocker-disabled' => 'Бұл жете өшірілген.',
 'proxyblockreason' => 'IP мекенжайыңыз ашық прокси серверге жататындықтан бұғатталған.
 Интернет қызметін жабдықтаушыңызбен, не техникалық қолдау қызметімен қатынасыңыз, және оларға осы оте күрделі қауыпсіздік шатақ туралы ақпарат беріңіз.',
-'proxyblocksuccess' => 'Орындалды.',
 'sorbsreason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады.',
 'sorbs_create_account_reason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады.
 Жаңа тіркелгі жасай алмайсыз.',
@@ -3673,7 +3670,9 @@ $5
 'tags-tag' => 'Тег атауы',
 'tags-display-header' => 'Өзгеріс тізіміндегі көрінісі',
 'tags-description-header' => 'Толық сипаттама мәні',
-'tags-hitcount-header' => 'Телгіленген өзгерістер',
+'tags-active-header' => 'Белсенді ме?',
+'tags-hitcount-header' => 'Тегтелген өзгерістер',
+'tags-active-yes' => 'Иә',
 'tags-edit' => 'өңдеу',
 'tags-hitcount' => '$1 {{PLURAL:$1|өзгеріс|өзгеріс}}',
 
@@ -3713,7 +3712,7 @@ $5
 'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}}',
 'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)',
 'logentry-newusers-newusers' => '$1 жаңадан қатысушы тіркелгісін {{GENDER:$2|жасады}}',
-'logentry-newusers-create' => '$1 жаңадан қатысушы тіркелгісі {{GENDER:$2|жасады}}',
+'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді',
 'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді',
 'logentry-newusers-autocreate' => '$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}',
 'logentry-rights-rights' => '$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгерті}}',
index 22622eb..67e7cf7 100644 (file)
@@ -1978,12 +1978,9 @@ Ağımdağı belsendi tïımdar men buğattawlardı [[{{#special:Ipblocklist}}|I
 'ipb_blocked_as_range' => 'Qatelik: IP $1 tikeleý buğattalmağan jäne buğattawı öşirilmeýdi.
 Biraq, bul buğattawı öşirilwi mümkin $2 awqımı böligi bop buğattalğan.',
 'ip_range_invalid' => 'IP mekenjaý awqımı jaramsız.',
-'blockme' => 'Özdiktik_buğattaw',
 'proxyblocker' => 'Proksï serverlerdi buğattawış',
-'proxyblocker-disabled' => 'Bul jete öşirilgen.',
 'proxyblockreason' => 'IP mekenjaýıñız aşıq proksï serverge jatatındıqtan buğattalğan.
 Ïnternet qızmetin jabdıqtawşıñızben, ne texnïkalıq qoldaw qızmetimen qatınasıñız, jäne olarğa osı ote kürdeli qawıpsizdik şataq twralı aqparat beriñiz.',
-'proxyblocksuccess' => 'Bitti.',
 'sorbsreason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.',
 'sorbs_create_account_reason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.
 Jaña tirkelgi jasaý almaýsız.',
index b962cdd..912e930 100644 (file)
@@ -402,7 +402,7 @@ $messages = array(
 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -2732,13 +2732,10 @@ $1',
 
 វាប្រហែលជាត្រូវបានគេដកការហាមឃាត់ហើយ។',
 'ip_range_invalid' => 'ដែនកំណត់ IP គ្មានសុពលភាព។',
-'blockme' => 'ហាមឃាត់ខ្ញុំ',
 'proxyblocker' => 'កម្ម​វិធី​​រាំង​ផ្ទប់​ប្រូកស៊ី (Proxy)',
-'proxyblocker-disabled' => 'មុខងារនេះត្រូវបានអសកម្ម។',
 'proxyblockreason' => 'អាសយដ្ឋាន IP របស់អ្នកត្រូវបានរាំងខ្ទប់ហើយ ពីព្រោះវាជាប្រុកស៊ី(proxy)ចំហ។
 
 សូមទំនាក់ទំនងអ្នកផ្ដល់សេវាអ៊ីនធឺណិតឬអ្នកបច្ចេកទេសរបស់អ្នក ហើយប្រាប់ពួកគេពីបញ្ហាសុវត្ថិភាពដ៏សំខាន់នេះ។',
-'proxyblocksuccess' => 'រួចរាល់ជាស្ថាពរ។',
 'sorbsreason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។',
 'sorbs_create_account_reason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។
 
index 71ac4a7..060371e 100644 (file)
@@ -1711,8 +1711,6 @@ $2',
 'block-log-flags-nocreate' => 'ಖಾತೆ ಸೃಷ್ಟಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
 'block-log-flags-noemail' => 'ಇ-ಅಂಚೆ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
 'ipb_already_blocked' => '"$1" ಆಗಲೆ ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ',
-'blockme' => 'ನನ್ನನ್ನು ತಡೆಹಿಡಿ',
-'proxyblocksuccess' => 'ಮುಗಿಯಿತು.',
 
 # Developer tools
 'lockdb' => 'ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚು',
index fc1999f..7906d14 100644 (file)
@@ -569,7 +569,7 @@ $messages = array(
 'articlepage' => '문서 보기',
 'talk' => '토론',
 'views' => '보기',
-'toolbox' => '도구모음',
+'toolbox' => '도구',
 'userpage' => '사용자 문서 보기',
 'projectpage' => '프로젝트 문서 보기',
 'imagepage' => '파일 문서 보기',
@@ -805,7 +805,7 @@ $2',
 'userlogin-noaccount' => '계정이 없나요?',
 'userlogin-joinproject' => '{{SITENAME}}에 가입하세요',
 'nologin' => '계정이 없나요? $1.',
-'nologinlink' => 'ê³\84ì \95ì\9d\84 ë§\8cë\93\9cì\84¸ì\9a\94',
+'nologinlink' => 'ê³\84ì \95ì\9d\84 ë§\8cë\93¤ê¸°',
 'createaccount' => '계정 만들기',
 'gotaccount' => '계정이 이미 있다면, $1.',
 'gotaccountlink' => '로그인하세요',
@@ -2598,7 +2598,7 @@ $UNWATCHURL
 'deletereasonotherlist' => '다른 이유',
 'deletereason-dropdown' => '* 일반적인 삭제 이유
 ** 스팸
-** 훼손 행위
+** 문서 훼손 행위
 ** 저작권 침해
 ** 작성자의 요청
 ** 깨진 넘겨주기',
@@ -2929,12 +2929,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 하지만 $2로 광역 차단되었기 때문에, 광역 차단 해제로 차단을 해제할 수 있습니다.',
 'ip_range_invalid' => 'IP 범위가 잘못되었습니다.',
 'ip_range_toolarge' => '/$1보다 넓은 범위의 광역 차단을 할 수 없습니다.',
-'blockme' => '자가 차단',
 'proxyblocker' => '프록시 차단',
-'proxyblocker-disabled' => '이 기능은 비활성되어 있습니다.',
 'proxyblockreason' => '당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다.
 만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.',
-'proxyblocksuccess' => '완료.',
 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.',
 'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.
 계정을 만들 수 없습니다.',
index 171fd70..b886dce 100644 (file)
@@ -2438,12 +2438,9 @@ $1',
 Алай  а, бу  $2 диапазонну кесеги кибик тыйылгъанды, диапазонну блокдан чыгъарыргъа боллукъсуз.',
 'ip_range_invalid' => 'Джараусуз IP диапазон.',
 'ip_range_toolarge' => '/$1 кёб диапазонланы блокга салыргъа джарамайды.',
-'blockme' => 'Мени блокга сал',
 'proxyblocker' => 'Проксилени тыйыу',
-'proxyblocker-disabled' => 'Бу функция джукълатылыбды.',
 'proxyblockreason' => 'IP-адресигиз ачыкъ прокси болгъаны ючюн тыйылдыгъыз.
 Тилейбиз, кесигизни интернет-провайдеригиз бла, неда дагъан болгъан къуллукъла бла байланыб, къоркъуусузлукъну бу проблемасын билдиригиз.',
-'proxyblocksuccess' => 'Тындырылды.',
 'sorbsreason' => 'IP-адресигиз, {{SITENAME}} сайтда  хайырланнган DNSBL-де ачыкъ прокси кибик саналады.',
 'sorbs_create_account_reason' => 'IP-адресигиз, translatewiki.net сайтда хайырланнган DNSBL-де ачыкъ прокси кибик саналады. Тергеу джазыу къураяллыкъ тюлсюз.',
 'cant-block-while-blocked' => 'Сиз кесигиз блокда заманда, башха къошулуучуланы блок этеллик тюлсюз.',
index 649567c..b9a9ac7 100644 (file)
@@ -2860,14 +2860,11 @@ Automattesch jesperrte <i lang="en>IP</i>-Addräße sin nit heh, ävver en de [[
 'ipb_blocked_as_range' => 'Dat jeit nit. De IP-Adress „$1“ es nit tirek jesperrt. Se es ävver en däm jesperrte Bereich „$2“ dren. Die Sperr kam_mer ophevve. Donoh kam_mer och kleiner Aandeile fun däm Bereich widder neu sperre. Di Adress alleins kam_mer ävver nit freijevve.',
 'ip_range_invalid' => 'Dä Bereich vun IP_Adresse es nit en Oodnung.',
 'ip_range_toolarge' => 'Berette övver /$1 ze sperre is nit zohjelohße, bloß kleiner.',
-'blockme' => 'Open_Proxy_Blocker',
 'proxyblocker' => 'Open_Proxy_Blocker',
-'proxyblocker-disabled' => 'Di Funxjon es ußjeschalldt.',
 'proxyblockreason' => 'Unger Ding IP_Adress läuf ene offe Proxy.
 Dröm kanns De heh em Wiki nix maache.
 Schwaad met Dingem System-Minsch udder Netzwerk-Techniker udder ISP (<i lang="en">Internet Service Provider</i>)
 un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rääschnere!',
-'proxyblocksuccess' => 'Jedonn.',
 'sorbs' => '<i lang="en">DNSBL</i>',
 'sorbsreason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
 'sorbs_create_account_reason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Dröm kanns De Dich heh em Wiki nit als ene neue Metmaacher aanmelde. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker oder (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
index 2a8eca3..09da332 100644 (file)
@@ -1711,8 +1711,6 @@ Sedemekê binivîse!",
 'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
 'ipb-needreblock' => '$1 berê hatiye astengkirin. Tu dixwazî eyaran biguherînî?',
 'ipb_cant_unblock' => "Şaşbûn: ID'ya astengkirinê $1 nehate dîtin. Astengkirinê xwe niha belkî hatîye rakirin.",
-'blockme' => 'Min astengbike',
-'proxyblocksuccess' => 'Çêbû.',
 'sorbsreason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin.",
 'sorbs_create_account_reason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin. Tu nikarê account'ekê ji xwe ra çêkê.",
 
index 45e12ea..bac3319 100644 (file)
@@ -1309,7 +1309,6 @@ To include a file in a page, use a link in one of the following forms:
 'block-log-flags-nocreate' => 'эсеп жазуусун жаратуу өчүрүлгөн',
 'block-log-flags-noemail' => 'кат жөнөтүүгө тыюу салынган',
 'block-log-flags-hiddenname' => 'колдонуучу аты жашырылган',
-'blockme' => 'Мени бөгөттө',
 'proxyblocker' => 'Проксини блокировкалоо',
 
 # Developer tools
index ff7a910..178251c 100644 (file)
@@ -1833,10 +1833,7 @@ Commodule notatio obstructionum subter datur.',
 'ipb_already_blocked' => '"$1" iam obstructus est',
 'ipb-needreblock' => '$1 iam obstructus est. Visne obstructionem modificare?',
 'ip_range_invalid' => 'Latitudo IP irrita.',
-'blockme' => 'Usor obstructus',
 'proxyblocker' => 'Instrumentum obstructionis moderatorum',
-'proxyblocker-disabled' => 'Haec functio prohibita est.',
-'proxyblocksuccess' => 'Factum.',
 'cant-block-while-blocked' => 'Dum obstructus es, non potes usores alios obstruere.',
 
 # Developer tools
index 73cc82c..3838aaf 100644 (file)
@@ -403,7 +403,7 @@ $messages = array(
 'articlepage' => 'Säit',
 'talk' => 'Diskussioun',
 'views' => 'Affichagen',
-'toolbox' => 'Geschirkëscht',
+'toolbox' => 'Geschir (Tools)',
 'userpage' => 'Benotzersäit',
 'projectpage' => 'Meta-Text',
 'imagepage' => 'Billersäit kucken',
@@ -2685,11 +2685,8 @@ Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
 Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.",
 'ip_range_invalid' => 'Ongëltegen IP Block.',
 'ip_range_toolarge' => 'Späre vu Beräicher déi méi grouss wéi /$1 si sinn net erlaabt.',
-'blockme' => 'Spär mech',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Dës Funktioun ass ausgeschalt.',
 'proxyblockreason' => 'Är IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. ären Internet-Provider oder ärs Systemadministrateuren und informéiert si iiwwer dëses méigleche Sécherheetsprobleem.',
-'proxyblocksuccess' => 'Gemaach.',
 'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.',
 'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.',
 'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1',
index 95b479f..f038432 100644 (file)
@@ -141,7 +141,7 @@ $messages = array(
 'cancel' => 'Cansela',
 'moredotdotdot' => 'Plu...',
 'mypage' => 'Me paje',
-'mytalk' => 'Me discutes',
+'mytalk' => 'Discutes',
 'anontalk' => 'Discutes per esta IP',
 'navigation' => 'Naviga',
 'and' => '&#32;e',
@@ -444,7 +444,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 
 # Preferences page
 'preferences' => 'Preferis',
-'mypreferences' => 'Me preferis',
+'mypreferences' => 'Preferis',
 'skin-preview' => 'Previde',
 'saveprefs' => 'Fisa',
 'rows' => 'Linias:',
@@ -473,6 +473,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'gender-female' => 'Fema',
 'email' => 'Eposta',
 'prefs-help-realname' => 'Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.',
+'prefs-signature' => 'Suscrive',
 
 # User rights
 'userrights' => 'Dirije de la diretos de usores',
@@ -518,7 +519,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Cualce',
-'rc-enhanced-expand' => 'Mostra detalias (JavaScript es nesesada)',
+'rc-enhanced-expand' => 'Mostra detalias',
 'rc-enhanced-hide' => 'Asconde detalias',
 
 # Recent changes linked
@@ -554,7 +555,7 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'
 'filehist-dimensions' => 'Mesuras',
 'filehist-filesize' => 'Grandia de fix',
 'filehist-comment' => 'Comenta',
-'imagelinks' => 'Lias de fix',
+'imagelinks' => 'Usas de fix',
 'linkstoimage' => 'Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:',
 'nolinkstoimage' => 'Es no pajes ce lia a esta fix.',
 'sharedupload' => 'Esta fix es parte de $1 e pote es usada par otra projetas.',
@@ -663,7 +664,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Watchlist
 'watchlist' => 'Pajes oservada',
-'mywatchlist' => 'Me lista de pajes oservada',
+'mywatchlist' => 'Lista de pajes oservada',
 'nowatchlist' => 'Tu ave no cosas en tu lista oservada',
 'addedwatchtext' => "La paje \"[[:\$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].
 Cambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada.
index 222c7fd..44efb2f 100644 (file)
@@ -2450,11 +2450,8 @@ Wils se de instellinge wiezige?',
 'ipb_blocked_as_range' => "Fout: 't IP-adres $1 is neet direct geblokkeerd en de blokkade kan neet opgeheve waere. De blokkade is ongerdeil van de reeks $2, wovan de blokkade waal opgeheve kan waere.",
 'ip_range_invalid' => 'Ongeldige IP-reeks',
 'ip_range_toolarge' => 'Reeksblokkades groeater es /$1 kènne neet.',
-'blockme' => 'Blokkeer mich',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Deze functie is oetgesjakeld.',
 'proxyblockreason' => "Dien IP-adres is geblokkeerd ómdat 't 'n aope proxy is. Contacteer estebleef diene internet service provider of technische óngersjteuning en informeer ze euver dit serjeus veiligheidsprebleem.",
-'proxyblocksuccess' => 'Klaor.',
 'sorbsreason' => 'Dien IP-adres is opgenaome in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek.',
 'sorbs_create_account_reason' => 'Dien IP-adres is opgenómme in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek. De kèns gein gebroekersaccount aanmake.',
 'cant-block-while-blocked' => 'De kins anger gebroekers neet blokkere terwiel se zelf geblokkeerd bös.',
index 6adb664..0fafbb0 100644 (file)
@@ -837,7 +837,6 @@ Petohoni di petulo '''$1''' sa:",
 'contribslink' => 'afina',
 'blocklogpage' => 'Desu di bolok',
 'blocklogentry' => 'sa bolok [[$1]] e simpekile sa $2 $3',
-'proxyblocksuccess' => 'Afi.',
 
 # Move page
 'move-page-legend' => 'Nyanganyisize petulo',
index 0efe4a3..c29b9dc 100644 (file)
@@ -2600,11 +2600,8 @@ Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|
 'ipb_blocked_as_range' => 'Klaida: IP $1 nebuvo užblokuotas tiesiogiai, tad negali būti atblokuotas. Tačiau jis buvo užblokuotas kaip srities $2 dalis, kuri gali būti atblokuota.',
 'ip_range_invalid' => 'Neleistina IP sritis.',
 'ip_range_toolarge' => 'Didesni nei /$1 blokai neleidžiami.',
-'blockme' => 'Užblokuoti mane',
 'proxyblocker' => 'Tarpinių serverių („proxy“) blokavimo priemonė',
-'proxyblocker-disabled' => 'Ši funkcija yra išjungta.',
 'proxyblockreason' => 'Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.',
-'proxyblocksuccess' => 'Atlikta.',
 'sorbsreason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.',
 'sorbs_create_account_reason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros',
 'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų, pats būdamas užblokuotas.',
index 1b4b7f5..49460da 100644 (file)
@@ -105,7 +105,7 @@ $messages = array(
 'category-article-count' => '{{PLURAL:$2|Itymā kategorejā ir vīn dūtuo puslopa.|{{PLURAL:$1|Paruodeita $1 puslopa|Paruodeitys $1 puslopys}} nu $2.}}',
 'listingcontinuesabbrev' => '(tuoļuojums)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Aproksts',
 'article' => 'Rakstīņs',
index c97461d..87965a9 100644 (file)
@@ -1939,10 +1939,12 @@ Papildinformācija:
 'deletecomment' => 'Iemesls:',
 'deleteotherreason' => 'Cits/papildu iemesls:',
 'deletereasonotherlist' => 'Cits iemesls',
-'deletereason-dropdown' => '*Izplatīti dzēšanas iemesli
-** Autora pieprsījums
+'deletereason-dropdown' => '* Izplatīti dzēšanas iemesli
+** Spams
+** Vandālisms
 ** Autortiesību pārkāpums
-** Vandālisms',
+** Autora pieprasījums
+** Nederīga pāradresācija',
 'delete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
 'delete-toobig' => 'Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}.
 Šādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.',
@@ -2079,6 +2081,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Vārdtelpa:',
 'invert' => 'Izvēlēties pretēji',
+'namespace_association' => 'Saistītā vārdtelpa',
 'blanknamespace' => '(Pamatlapa)',
 
 # Contributions
@@ -2231,10 +2234,7 @@ Tas, iespējams, jau ir atbloķēts.',
 'ipb_blocked_as_range' => 'Kļūda: IP $1 nav bloķēta tieši, tāpēc to nevar atbloķēt.
 Tā ir bloķēta kā daļa no IP adrešu diapazona $2, kuru var atbloķēt.',
 'ip_range_invalid' => 'Nederīgs IP diapazons',
-'blockme' => 'Bloķēt mani',
 'proxyblocker' => 'Starpniekservera bloķētājs',
-'proxyblocker-disabled' => 'Šī funkcija ir atspējota.',
-'proxyblocksuccess' => 'Darīts.',
 'cant-block-while-blocked' => 'Tu nevari bloķēt citus lietotājus, kamēr pats esi bloķēts.',
 'ipbblocked' => 'Tu nevar bloķēt vai atbloķēt lietotājus, jo Tu pats esi bloķēts',
 'ipbnounblockself' => 'Tev nav atļauts sevi atbloķēt',
@@ -2641,6 +2641,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-imagelength' => 'augstums',
 'exif-bitspersample' => 'biti komponentē',
 'exif-compression' => 'Saspiešanas veids',
+'exif-photometricinterpretation' => 'Pikseļu sastāvs',
 'exif-orientation' => 'Orientācija',
 'exif-samplesperpixel' => 'Komponentu skaits',
 'exif-planarconfiguration' => 'Datu izkārtojums',
index 1af650a..c57b0a5 100644 (file)
@@ -2212,9 +2212,7 @@ $1',
 'ipb_blocked_as_range' => '錯:該IP $1 無直禁也,無赦之。唯它在 $2 之範禁內,其範可赦之。',
 'ip_range_invalid' => 'IP址圍不格',
 'ip_range_toolarge' => '大於 /$1 之禁段乃無容也。',
-'blockme' => '自禁',
 'proxyblocker' => '禁Proxy',
-'proxyblocksuccess' => '成矣。',
 'cant-block-while-blocked' => '爾然被禁,勿施於人。',
 'cant-see-hidden-user' => '簿禁或藏矣。
 爾無藏之權,無視纂禁也。',
index 187fbcb..70e2146 100644 (file)
@@ -2300,12 +2300,9 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 ई, मुदा, क्षेत्र $2 क अन्दर प्रतिबन्धित अछि, जे अप्रतिबन्धित कएल जा सकैए।',
 'ip_range_invalid' => 'अमान्य अनिकेत क्षेत्र।',
 'ip_range_toolarge' => 'समूह खण्ड पैघ अछि /$1 सभकेँ अनुमति नै छै।',
-'blockme' => 'हमरा प्रतिबन्धित करू',
 'proxyblocker' => 'दोसराइत प्रतिबन्धक',
-'proxyblocker-disabled' => 'ई प्रकार्य प्रतिबन्धित अछि।',
 'proxyblockreason' => 'अहाँक अनिकेत पता प्रतिबन्धित भेल अछि कारण ई सोझे-सोझ दोसराइत अछि।
 अहाँ अपन अन्तर्जाल सेवा दाता वा तकनीकी सहायकसँ सम्पर्क करू आ ऐ गम्भीर सुरक्षा समस्याक सूचना दिअ।',
-'proxyblocksuccess' => 'भेल।',
 'sorbsreason' => 'अहाँक अनिकेत सूचित अछि सोझे-सोझ दोसराइतक रूपमे {{जालस्थल}} क डी.एन.एस.बी.एल.मे।',
 'sorbs_create_account_reason' => 'अहाँक अनिकेत एतए सूचित अछि खुजल दोसराइत सन डी.एन.बी.एस.एल. मे जे प्रयोग कएल जाइए {{अन्तर्जाल}} द्वारा।',
 'cant-block-while-blocked' => 'अहाँ जाधरि स्वयं प्रतिबन्धित छी दोसराकेँ प्रतिबन्धित नै कऽ सकै छी।',
index 2468aab..746a2e1 100644 (file)
@@ -2029,12 +2029,9 @@ $1',
 'ipb_blocked_as_range' => 'Эльбятькс: IP $1 аф кардаф видеста ди соннеда аш кода кардафкссь валхтомс.
 Сон, интай улема, кардафоль кода  $2-нь потмонц пакшец, конань эзда ули кода кардафксонь валхтомс.',
 'ip_range_invalid' => 'Аф кондясти IP потмоц.',
-'blockme' => 'Кардамань монь',
 'proxyblocker' => 'Ётка якаень сёлгома',
-'proxyblocker-disabled' => 'Тя функциесь аф тиеви.',
 'proxyblockreason' => 'Тонь IP адрес пякстафоль сонь панжада прокси-серверонь эзда.
 Тондейть эряви сотомс тонь интернет ладяйть эли текникань нежедемать мархта ди пачфтемс тя прябалать колга.',
-'proxyblocksuccess' => 'Тиф.',
 'sorbsreason' => 'Тонь IP адресце лувови панжада ётка якай сервероннекс DNSBL-са, конась нолдаф тевс {{SITENAME}}са.',
 'sorbs_create_account_reason' => 'Тонь IP адресце лувови панжада ётка якань сервероннекс DNSBL-са конась нолнезь тевс {{SITENAME}}са.
 Тондейть аш кода сёрматфтомать тиемс',
index 5e71254..a5ae666 100644 (file)
@@ -464,7 +464,7 @@ $1',
 # 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).
 'aboutsite' => 'Mombamomba ny {{SITENAME}}',
 'aboutpage' => 'Project:Mombamomba',
-'copyright' => '$1 no mifehy ny fampiasana ny votoatin-kevitra eto.',
+'copyright' => 'Ny lisansa $1 no mamehy ny fampiasana ity voatoatiny ity.',
 'copyrightpage' => '{{ns:project}}:Copyright',
 'currentevents' => 'Ny vaovao',
 'currentevents-url' => 'Project:Vaovao',
@@ -1428,7 +1428,7 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1",
 'gender-unknown' => 'Tsy tia hanome ny antsipirihany aho',
 'gender-male' => 'Manova pejy wiki izy (lehilahy)',
 'gender-female' => 'Manova pejy wiki izy (vehivavy)',
-'prefs-help-gender' => "Ankifidy : Ampiasaina mba hifanaraka amin'ny lahi-vavy. Ho sarababem-bahoaka io fampahalalàna io.",
+'prefs-help-gender' => "Ankifidy : ampiasaina ho an'ny fifandraisan'ny rindrankajy aminao. Ho sarababem-bahoaka ity fampahalalana ity.",
 'email' => 'Imailaka',
 'prefs-help-realname' => "Anarana marina (afaka tsy fenoina): raha fenoinao ity dia hampiasaina hanomezana anao tambin'ny asa izay efainao eto.",
 'prefs-help-email' => 'Azo tsy omena ny adiresy imailaka, fa ilaina izy io raha sendra hadino ny tenimiafinao.',
@@ -1610,8 +1610,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'action-block' => 'manakana am-panoratana ny mpikambana iray',
 'action-protect' => "manova ny fanovàn'ity pejy ity",
 'action-rollback' => "Manafoana haingana ny fanovan'ny mpikambana farany nanova pejy iray",
-'action-import' => 'mampiditra ity pejy ity avy amina wiki hafa',
-'action-importupload' => 'hampiditra ity pejy ity avy amina rakitra nampidirina',
+'action-import' => "hampiditra ity pejy ity avy amin'ny wiki hafa",
+'action-importupload' => "hampiditra ity pejy ity amin'ny fampidirana rakitra",
 'action-patrol' => 'marihana ho hita ity version ity',
 'action-autopatrol' => 'manana ny fanovanao voamarina',
 'action-unwatchedpages' => 'hijery ny lisitry ny pejy tsy arahina',
@@ -2519,7 +2519,7 @@ $1',
 'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
 'contributions-title' => "Fandraisan'anjaran'i $1",
 'mycontris' => "Fandraisan'anjara",
-'contribsub2' => "ho an'ny $1 ($2)",
+'contribsub2' => "Ho an'ny $1 ($2)",
 'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
 'uctop' => '(ankehitriny)',
 'month' => "Tamin'ny volana (sy teo aloha) :",
@@ -2594,8 +2594,8 @@ Fenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).",
 'ipb-confirm' => 'Sakanana marina',
 'badipaddress' => 'Tsy mety ny adiresy IP (invalid)',
 'blockipsuccesssub' => 'Vita soa aman-tsara ny sakana',
-'blockipsuccesstext' => 'Voasakana i [[Special:Contributions/$1|$1]].
-<br />Jereo ny [[Special:BlockList|lisitry ny IP voasakana]] raha hanala ny sakana efa misy.',
+'blockipsuccesstext' => 'Voasakana i [[Special:Contributions/$1|$1]].<br />
+Jereo ny [[Special:BlockList|lisitry ny voasakana]] raha hanala ny sakana efa misy.',
 'ipb-blockingself' => 'Hanakana ny kaontinao ianao ! Tena hanao izany ve ?',
 'ipb-confirmhideuser' => "Eo ampanakanana mpikambana miaraka amin'ny \"fanakonana mpikambana\" ampiasaina. Izany dia mamafa ny anaran'ilay mpikambana amin'ny listra ary amin'ny iditra laogy. Tena hanao izany ve ianao?",
 'ipb-edit-dropdown' => 'Hanova ny antony fanakanana tsipalotra',
@@ -2648,9 +2648,9 @@ Eo ambany ny laogim-panakanana.',
 Eo ambany ny laogim-pamafana.',
 'blocklogentry' => 'voasakana i "[[$1]]" mandritra ny $2 ; antony : $3',
 'reblock-logentry' => "nanova ny parametatry ny sakan'i [[$1]], ary tapitra amin'ny $2. Ny antony dia ''$3''",
-'blocklogtext' => "Eto no ahitana ny tantaran'ny hetsika momba ny fisakanana sy ny fanafoanana fisakanana mpandray anjara.
-Ireo adiresy IP voasakana ho azy dia tsy miseho eto. Jereo ao amin'ny [[Special:BlockList|lisitry ny IP voasakana]]
-ny lisitry ny fisakanana sy fandrarana na tanteraka misy ankehitriny.",
+'blocklogtext' => "Eto no ahitana ny tantaran'ny hetsika momba ny fisakanana sy ny famoanana ny fisakanana mpandray anjara.
+Tsy aseho eto ny adiresy IP voasakana ho azy.
+Jereo ao amin'ny [[Special:BlockList|lisitry ny sakana]] hahitana ny lisitry ny sakana mihatra amin'izao fotoana izao",
 'unblocklogentry' => "voaaisotra ny sakana an'i $1",
 'block-log-flags-anononly' => 'mpikambana tsy nisoratra anarana ihany',
 'block-log-flags-nocreate' => 'tsy mahazo manokatra kaonty',
@@ -2673,11 +2673,8 @@ Mety efa natao angamba ny fanalana sakana.',
 Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.",
 'ip_range_invalid' => 'Tsy mety io IP io.',
 'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.',
-'blockme' => 'Sakano ahy',
 'proxyblocker' => 'Mpisakana proxy',
-'proxyblocker-disabled' => 'Tsy mandeha io asa io.',
 'proxyblockreason' => "Voasakana ny adiresy IP-nao satria adiresy proxy malalaka izy io. Azafady mba lazao amin'ny mpanome internet anao io olana io.",
-'proxyblocksuccess' => 'Vita.',
 'sorbsreason' => "Voasokokajin'ny DNSBL ho ao anatin'ny proxy midanadana ny adiresy IP-nao.",
 'sorbs_create_account_reason' => "Voasokajy ho isan'ny proxy midanadana ao amin'ny DNSBL ny adiresy IP-nao. Ireo IP ireo dia ahiana ho fitaovana azon'ny mpandefa spam ampiasaina. Tsy afaka manokatra kaonty ianao.",
 'cant-block-while-blocked' => 'Tsy azo sakananao ny mpikambana hafa raha mbola voasakana ianao.',
@@ -2718,15 +2715,15 @@ Mba hahafahany manidy na mamoha ny banky angona, mila azo soratan'ny lohamilin-t
 # Move page
 'move-page' => "Hanova anarana an'i $1",
 'move-page-legend' => 'Afindrao toerana ny pejy',
-'movepagetext' => "Ampiasao ilay formulaire eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy-na redirection ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy).
-Afaka manao ''update'' ny redirect ianao.
+'movepagetext' => "Ampiasao ilay fôrmiolera eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy fihodinana ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy).
+
+Afaka manavao ho azy ny fihodinana mankany amin'ny lohateny taloha ianao. Raha tsy fidinao ny manao izany, marino tsara ny fisian'ireo [[Special:DoubleRedirects|fihodinana roa]] na [[Special:BrokenRedirects|fihodinana tapaka]]. Ianao no manana andrikitra amin'ny fanamarinana ny tsi-fitapahan'ireo rohy.
 
 Jereo koa fa '''tsy afaka''' akisaka ilay pejy ra mitovy anarana amin'ny pejy efa misy ny anarana ny anarana vaovaon'ilay pejy tianao akisaka, fa mety atao ihany io asa io ra tsy misy nininona ilay pejy. Afaka manolo anarana pejy efa manondro ny fihisiny taloha ianao ra diso ianao, fa tsy afaka ataonao no manitsaka pejy efa misy.
 
 '''TANDREMO'''
 
-Mety fanom-panona ihany ny mpitsidika ra be mpitsidika io pejy ovainao anarana io ;
-Tsy maintsy fantatrao tsara ny vokany aloha no mitohy.",
+Mety ho fiovana lehibe ary tsy ampoizina ny fanaovana izany ho an'ny pejy voatsidika mateetika ; fantaro tsara ny fiantraika alohan'ny manao izany.",
 'movepagetalktext' => "Voasikaka koa ny pejin-dresak'ity pejy ity '''ra''' :
 
 * Efa misy pejin-dresaka efa misy votoatiny amin'ilay anarana vaovao, na
@@ -3029,7 +3026,7 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 'pageinfo-recent-authors' => "Isa vao haingan'ny mpanoratra misongadina",
 'pageinfo-hidden-categories' => 'Sokajy nafenina{{PLURAL:$1}} ($1)',
 'pageinfo-templates' => 'Endrika natsofoka{{PLURAL:$1}} ($1)',
-'pageinfo-transclusions' => "Pejy natsofoka tanatin'i ($1)",
+'pageinfo-transclusions' => "Pejy natsofoka tanatin'i ($1){{PLURAL:}}",
 'pageinfo-toolboxlink' => 'Fampahalalana mikasika ny pejy',
 'pageinfo-redirectsto' => "Fihdinana mankany amin'ny",
 'pageinfo-redirectsto-info' => 'fampahalalana',
@@ -3089,7 +3086,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'svg-long-error' => 'Rakitra SVG tsy ekena : $1',
 'show-big-image' => "Hijery ny tena haben'ny sary",
 'show-big-image-preview' => "Haben'ny topi-maso: $1.",
-'show-big-image-other' => 'Habe hafa: $1{{PLURAL:$1}}',
+'show-big-image-other' => 'Habe hafa: $1{{PLURAL:$2}}',
 'show-big-image-size' => '$1 × $2 teboka',
 'file-info-gif-looped' => 'miverimberina',
 'file-info-gif-frames' => 'sary{{PLURAL:$1}} $1',
@@ -3354,7 +3351,9 @@ raha vao nanokatra kaonty ianao, dia miandrasa minitra vitsivitsy mba ho tonga i
 'confirmemail_sent' => 'Lasa ny fanamarinana ny imailaka.',
 'confirmemail_oncreate' => "Nalefa tany amin'ny adiresy imailakao ny kaody fanamarinana.
 Tsy ilaina ampaisaina io tenimiafina io rehefa hiditra eto amin'ity wiki ity ianao, fa tsy maintsy omenao ilay izy rehefa mampiasa tao mifototra amin'ny imailaka.",
-'confirmemail_sendfailed' => 'Tsy lasa ny fanamarinana ny imailaka. Hamarino ny adiresy fandrao misy litera tsy mety.',
+'confirmemail_sendfailed' => "Tsy lasa ny fanamarinana ny imailaka. Hamarino ny adiresy fandrao misy litera tsy mety.
+
+Ity no naverin'ny mpandefa mailaka : $1",
 'confirmemail_invalid' => 'Tsy mety ilay fango fanamarinana. Angamba efa lany daty?',
 'confirmemail_needlogin' => 'Mila $1 ianao raha hanamarina ny adiresy imailakao.',
 'confirmemail_success' => 'Voamarina ny adiresy imailakao. Afaka [[Special:UserLogin|miditra]] ianao ankehitriny ary mankafia ny wiki.',
@@ -3481,7 +3480,7 @@ Andramo ny topi-maso tsotra',
 'specialpages-group-highuse' => 'Pejy ampiasaina mafy',
 'specialpages-group-pages' => 'Lisitra ny pejy',
 'specialpages-group-pagetools' => "Fitaovna ho an'ny pejy",
-'specialpages-group-wiki' => "Datan'ny wiki sy fitaovana",
+'specialpages-group-wiki' => 'Data sy fitaovana',
 'specialpages-group-redirects' => 'Pejy manokana voaodina',
 'specialpages-group-spam' => 'Fitaovana fanalana spam',
 
@@ -3546,13 +3545,13 @@ Andramo ny topi-maso tsotra',
 'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra",
 'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra",
 'logentry-move-move' => "nanova ny anaran'i $3 ho $4 i $1",
-'logentry-newusers-newusers' => 'Noforonina ny kaontim-pikambana $1',
-'logentry-newusers-create' => 'Noforonina ny kaontim-pikambana $1',
-'logentry-newusers-create2' => "Noforonin'i $1 ny kaomtim-pikambana $3",
-'logentry-newusers-autocreate' => 'Noforonina ho azy ny kaontim-pikambana $1',
-'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5",
-'logentry-rights-rights-legacy' => "$1 nanova ny vonodrom-pikambana isian'i $3",
-'logentry-rights-autopromote' => 'Lasa $5 ho azy i $1 izay $4 taloha',
+'logentry-newusers-newusers' => '{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1',
+'logentry-newusers-create' => '{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1',
+'logentry-newusers-create2' => "{{GENDER:$2|Noforonin}}'i $1 ny kaomtim-pikambana $3",
+'logentry-newusers-autocreate' => '{{GENDER:$2|Noforonina}} ho azy ny kaontim-pikambana $1',
+'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5{{GENDER:$2}}",
+'logentry-rights-rights-legacy' => "{{GENDER:$2}}$1 nanova ny vonodrom-pikambana isian'i $3",
+'logentry-rights-autopromote' => '{{GENDER:$2}}Lasa $5 ho azy i $1 izay $4 taloha',
 'rightsnone' => '(tsy misy)',
 
 # Feedback
index d215781..1354166 100644 (file)
@@ -2058,9 +2058,7 @@ Caliak [[Special:BlockList|daftar sakek]] untuak kasado pangguno nan kini kanai
 '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',
index d467be4..754fcf8 100644 (file)
@@ -489,7 +489,7 @@ $messages = array(
 'noindex-category' => 'Неиндексирани страници',
 'broken-file-category' => 'Страници со прекинати врски до податотеки',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'За {{SITENAME}}',
 'article' => 'Статија',
@@ -569,7 +569,7 @@ $messages = array(
 'articlepage' => 'Преглед на содржината',
 'talk' => 'Разговор',
 'views' => 'Посети',
-'toolbox' => 'Ð\90лаÑ\82ник',
+'toolbox' => 'Ð\90лаÑ\82ки',
 'userpage' => 'Преглед на корисничката страница',
 'projectpage' => 'Преглед на проектната страница',
 'imagepage' => 'Преглед на страницата на податотеката',
@@ -2924,12 +2924,9 @@ $1',
 Таа е блокирана како дел од блокот адреси $2, кој не може да се деблокира.',
 'ip_range_invalid' => 'Неважечки IP дијапазон на адреси.',
 'ip_range_toolarge' => 'Не се дозволени опсежни блокирања поголеми од /$1.',
-'blockme' => 'Блокирај ме',
 'proxyblocker' => 'Блокер на застапници (proxy)',
-'proxyblocker-disabled' => 'Оваа функција е оневозможена.',
 'proxyblockreason' => 'Вашата IP-адреса е блокирана бидејќи претставува отворен застапник (proxy).
 Ве молиме контактирајте со вашиот доставувач на Интернет услуги или техничката поддршка и информирајте ги за овој сериозен безбедносен проблем.',
-'proxyblocksuccess' => 'Готово.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..',
 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.
@@ -4037,7 +4034,7 @@ $5
 'confirm-unwatch-top' => 'Да ја отстранам страницава од списокот на набљудувања?',
 
 # Separators for various lists, etc.
-'percent' => '$1 %',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr; претходна страница',
index 6da9f87..d7f57b1 100644 (file)
@@ -2506,9 +2506,11 @@ $UNWATCHURL
 'deleteotherreason' => 'മറ്റ്/കൂടുതൽ കാരണങ്ങൾ:',
 'deletereasonotherlist' => 'മറ്റു കാരണങ്ങൾ',
 'deletereason-dropdown' => '*മായ്ക്കാനുള്ള സാധാരണ കാരണങ്ങൾ
-** സ്രഷ്ടാവ് ആവശ്യപ്പെട്ടതു പ്രകാരം
+** പാഴെഴുത്ത്
+** നശീകരണ പ്രവർത്തനം
 ** പകർപ്പവകാശ ലംഘനം
-** നശീകരണ പ്രവർത്തനം',
+** സ്രഷ്ടാവ് ആവശ്യപ്പെട്ടതു പ്രകാരം
+** പൊട്ടിയ തിരിച്ചുവിടൽ',
 'delete-edit-reasonlist' => 'മായ്ക്കലിന്റെ കാരണം തിരുത്തുക',
 'delete-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.',
 'delete-warning-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.',
@@ -2823,11 +2825,8 @@ $1',
 'ipb_blocked_as_range' => 'പിഴവ്:  $1 എന്ന ഐ.പി.യെ നേരിട്ടല്ല തടഞ്ഞിട്ടുള്ളത്. അതിനാൽ തടയൽ നീക്കം ചെയ്യുവാൻ സാദ്ധ്യമല്ല. അതിനെ $2ന്റെ ഭാഗമായുള്ള റേഞ്ചിൽ ആണ്‌ തടഞ്ഞിട്ടുള്ളത്. അത് ഒഴിവാക്കാവുന്നതാണ്.',
 'ip_range_invalid' => 'അസാധുവായ ഐ.പി. റേഞ്ച്.',
 'ip_range_toolarge' => 'പരിധി നിശ്ചയിച്ചുള്ള തടയലുകൾ /$1 എന്നതിലും കൂടുതലാകാൻ അനുവദിക്കുന്നില്ല.',
-'blockme' => 'എന്നെ തടയുക',
 'proxyblocker' => 'പ്രോക്സി തടയൽ',
-'proxyblocker-disabled' => 'ഈ പ്രക്രിയ സജ്ജമാക്കിയിട്ടില്ല.',
 'proxyblockreason' => 'ഓപ്പൺ പ്രോക്സി ആയതിനാൽ താങ്കളുടെ ഐ.പി. വിലാസത്തെ തടഞ്ഞിരിക്കുന്നു. ഇതു എന്തെങ്കിലും പിഴവ് മൂലം സംഭവിച്ചതാണെങ്കിൽ താങ്കളുടെ ഇന്റർനെറ്റ് സേവന ദാതാവിനെ സമീപിച്ചു ഈ സുരക്ഷാ പ്രശ്നത്തെ കുറിച്ച് ബോധിപ്പിക്കുക.',
-'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
 'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
index b158fe3..04734d6 100644 (file)
@@ -2398,12 +2398,9 @@ $1',
 Харин энэ нь $2 хэсгийн хэсэг болж түгжигдсэн байгаа бөгөөд үүнийг тайлах боломжтой.',
 'ip_range_invalid' => 'Хүчингүй IP-н хүрээ.',
 'ip_range_toolarge' => '/$1-с том хэмжээтэй түгжээ нь хориотой.',
-'blockme' => 'Намайг түгж',
 'proxyblocker' => 'Түгжигч прокси',
-'proxyblocker-disabled' => 'Энэ функцийг хаасан байна.',
 'proxyblockreason' => 'Таны IP хаяг нь чөлөөт прокси учраас түгжигдсэн байна.
 Та өөрийн ISP-тэйгээ холбоо барьж техникийн зөвлөгөө авч энэ асуудлынхаа тухай хэлнэ үү.',
-'proxyblocksuccess' => 'Гүйцэтгэсэн.',
 'sorbsreason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси хэмээн тодорхойлсон байна.',
 'sorbs_create_account_reason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси гэж тэмдэглэсэн байна.
 Та бүртгэл үүсгэх боломжгүй.',
index d5a7690..b59092b 100644 (file)
@@ -541,7 +541,7 @@ $messages = array(
 'articlepage' => 'लेख पृष्ठ',
 'talk' => 'चर्चा',
 'views' => 'दृष्ये',
-'toolbox' => 'साधनपà¥\87à¤\9fà¥\80',
+'toolbox' => 'साधनà¥\87',
 'userpage' => 'सदस्य पृष्ठ',
 'projectpage' => 'प्रकल्प पान पहा',
 'imagepage' => 'संचिका पृष्ठ पहा',
@@ -657,6 +657,9 @@ $1',
 'databaseerror-text' => 'विदागार पृच्छा त्रूटी घडलेली आहे.
 ते संचेतनात गणकदोष असण्याची शक्यता निर्देशित करते.',
 'databaseerror-textcl' => 'विदागार पृच्छा त्रूटी घडलेली आहे.',
+'databaseerror-query' => 'पृच्छा:$1',
+'databaseerror-function' => 'क्रिया: $1',
+'databaseerror-error' => 'त्रुटी: $1',
 'laggedslavemode' => "'''सुचना:''' पानावर अद्ययावत बदल नसतील.",
 'readonly' => 'विदागारास (डाटाबेस) ताळे आहे.',
 'enterlockreason' => 'विदागारास ताळे ठोकण्याचे कारण, ताळे उघडले जाण्याच्या अदमासे कालावधीसहीत द्या.',
@@ -777,6 +780,8 @@ $2',
 'userlogin-resetpassword-link' => 'परवलीचा शब्द पुन्हा जुळवा (रिसेट)',
 'helplogin-url' => 'Help:सनोंद प्रवेशासाठी(लॉगिंग-ईन)',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|सनोंद-प्रवेशासाठी(लॉग-ईन) सहाय्य]]',
+'userlogin-loggedin' => 'आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.',
+'userlogin-createanother' => 'दुसरे नवीन खाते तयार करा',
 'createacct-join' => 'खाली आपली माहिती भरा',
 'createacct-another-join' => 'नविन खात्याबाबतची माहिती येथे खाली टाका.',
 'createacct-emailrequired' => 'विपत्र पत्ता(ई-मेल)',
@@ -1515,6 +1520,7 @@ $1",
 'prefs-displaywatchlist' => 'दर्शन पर्याय',
 'prefs-tokenwatchlist' => 'ओळखचिन्ह',
 'prefs-diffs' => 'फरक',
+'prefs-help-prefershttps' => 'हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'विपत्रपत्ता वैध दिसत आहे',
@@ -1672,8 +1678,8 @@ $1",
 'action-block' => 'या सदस्यास संपादन करण्यापासून प्रतिबंधित करा',
 'action-protect' => 'या पानाचा सुरक्षास्तर बदला',
 'action-rollback' => 'या आधीच्या सदस्याने नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर पूर्वस्थितीत न्या',
-'action-import' => 'दà¥\81सऱà¥\8dया à¤µà¤¿à¤\95à¥\80वरà¥\81न à¤¹à¥\87 à¤ªà¤¾à¤¨ आयात करा',
-'action-importupload' => 'अपभारीत संचिकेतून पान आयात करा',
+'action-import' => 'दà¥\81सऱà¥\8dया à¤µà¤¿à¤\95à¥\80वरà¥\81न à¤ªà¤¾à¤¨à¥\87 आयात करा',
+'action-importupload' => 'अपभारीत संचिकेतून पान आयात करा',
 'action-patrol' => "इतरांची संपादनांवर 'पहारा दिला' म्हणून खूण करा",
 'action-autopatrol' => 'आपल्या संपादनांवर पहारा दिल्याची खूण करा',
 'action-unwatchedpages' => 'पहारा न दिलेल्या पानांची यादी पहा',
@@ -1689,6 +1695,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|बदल}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|मागील भेटीनंतर}}',
 'enhancedrc-history' => 'इतिहास',
 'recentchanges' => 'अलीकडील बदल',
 'recentchanges-legend' => 'अलीकडील बदलाएवजी पर्याय',
@@ -1972,6 +1979,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'listfiles_size' => 'आकार (बाईट्स)',
 'listfiles_description' => 'वर्णन',
 'listfiles_count' => 'आवृत्त्या',
+'listfiles-show-all' => 'या चित्राच्या जून्या आवृत्त्या अंतर्भूत करा.',
+'listfiles-latestversion' => 'सध्याची आवृत्ती',
 'listfiles-latestversion-yes' => 'हो',
 'listfiles-latestversion-no' => 'नाही',
 
@@ -2178,6 +2187,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listusers' => 'सदस्यांची यादी',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा',
+'listusers-desc' => 'उतरत्या क्रमाने निवडा',
 'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
 'usercreated' => 'दि. $1 ला, $2 वाजता, सदस्य खाते{{GENDER:$3|द्वारे बनविल्या गेले}}',
 'newpages' => 'नवीन पाने',
@@ -2436,9 +2446,11 @@ $UNWATCHURL
 'deleteotherreason' => 'दुसरे/अतिरिक्त कारण:',
 'deletereasonotherlist' => 'दुसरे कारण',
 'deletereason-dropdown' => '* वगळण्याची सामान्य कारणे
-** लेखकाची(लेखिकेची) विनंती
+** स्पॅम
+** उत्पात
 ** प्रताधिकार उल्लंघन
-** उत्पात',
+** लेखकाची(लेखिकेची) विनंती
+** तुटकी पुनर्निर्देशने',
 'delete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
 'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}}पेक्षा जास्त वेळा बदलण्यात आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये म्हणून शक्य केलेले नाही.',
 'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}} पेक्षा जास्त वेळा बदलण्यात आलेले आहे.
@@ -2458,7 +2470,7 @@ $UNWATCHURL
 शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
 'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => '(सदस्यनाम लपवले) यांनी केलेले बदल उलटवून [[User:$1|$1]] यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
+'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
@@ -2590,7 +2602,7 @@ $1',
 'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => '$1 साठी सदस्य-योगदान',
 'mycontris' => 'योगदान',
-'contribsub2' => '$1 ($2) साठी',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) साठी',
 'nocontribs' => 'या मानदंडाशी जुळणारे बदल सापडले नाहीत.',
 'uctop' => '(सद्य)',
 'month' => 'या महिन्यापासून (आणि पूर्वीचे):',
@@ -2746,11 +2758,8 @@ $1',
 'ipb_blocked_as_range' => 'त्रूटी:अंकपत्ता IP $1 हा प्रत्यक्षपणे प्रतिबंधित केलेला नाही आणि अप्रतिबंधीत करता येत नाही.तो,अर्थात,$2पल्ल्याचा भाग म्हाणून तो प्रतिबंधित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
 'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'blockme' => 'मला प्रतिबंधित करा',
 'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
-'proxyblocker-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
 'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
-'proxyblocksuccess' => 'झाले.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
 'xffblockreason' => '(X-Forwarded-For header) मधील अंकपत्ता,आपला किंवा आपण वापरत असलेल्या सर्व्हरचा,प्रतिबंधित केल्या गेला आहे.प्रतिबंधित करण्याचे मुळ कारण होते:$1',
@@ -3913,7 +3922,10 @@ $5
 'tags-tag' => 'खूण नाव',
 'tags-display-header' => 'बदल सुचीवर कसे दिसेल',
 'tags-description-header' => 'अर्थाची पूर्ण माहिती',
+'tags-active-header' => 'सक्रिय?',
 'tags-hitcount-header' => 'खुणा केलेले बदल',
+'tags-active-yes' => 'होय',
+'tags-active-no' => 'नाही',
 'tags-edit' => 'संपादन करा',
 'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}',
 
@@ -3934,6 +3946,7 @@ $5
 'dberr-problems' => 'माफ करा, हे संकेतस्थळ सध्या तांत्रिक अडचणींना सामोरे जात आहे.',
 'dberr-again' => 'थोडा वेळ थांबून पुन्हा पहा.',
 'dberr-info' => '( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)',
+'dberr-info-hidden' => '( विदादात्याशी संपर्क साधण्यात  असमर्थ)',
 'dberr-usegoogle' => 'तोपर्यंत गूगलवर शोधून पहा',
 'dberr-outofdate' => 'लक्षात घ्या, आमच्या मजकुराबाबत त्यांची सूची कालबाह्य असू शकते',
 'dberr-cachederror' => 'ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.',
@@ -4072,7 +4085,7 @@ $5
 'limitreport-cputime' => 'CPU वापराचा वेळ',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|सेकंद}}',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|सेकंद}}',
-'limitreport-postexpandincludesize-value' => '$1/$2 बाईटस्',
-'limitreport-templateargumentsize-value' => '$1/$2 बाईटस्',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
 
 );
index fea4ebe..3774bd6 100644 (file)
@@ -338,7 +338,7 @@ $messages = array(
 'noindex-category' => 'Laman tak diindeks',
 'broken-file-category' => 'Laman yang ada pautan fail yang terputus',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Perihal',
 'article' => 'Laman kandungan',
@@ -2699,12 +2699,9 @@ Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan
 'ipb_blocked_as_range' => 'Ralat: IP $1 tidak boleh dinyahsekat kerana ia tidak disekat secara langsung. Sebaliknya, ia disekat kerana merupakan sebahagian daripada sekatan julat $2, yang mana boleh dinyahsekat.',
 'ip_range_invalid' => 'Julat IP tidak sah.',
 'ip_range_toolarge' => 'Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan.',
-'blockme' => 'Sekat saya',
 'proxyblocker' => 'Penyekat proksi',
-'proxyblocker-disabled' => 'Fungsi ini dimatikan.',
 'proxyblockreason' => 'Alamat IP anda telah disekat kerana ia merupakan proksi terbuka.
 Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal dan beritahu mereka mengenai masalah keselamatan yang berat ini.',
-'proxyblocksuccess' => 'Berjaya.',
 'sorbsreason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}. Oleh itu, anda tidak dibenarkan membuka akaun baru.',
 'xffblockreason' => 'Alamat IP yang terdapat dalam pengepala X-Forwarded-For, sama ada milik anda ataupun pelayan proksi yang anda gunakan, telah disekat. Sebab asal sekatan adalah: $1',
index 360f61d..f1d67a7 100644 (file)
@@ -411,7 +411,7 @@ $messages = array(
 'noindex-category' => 'Paġni mhux indiċizzati',
 'broken-file-category' => "Paġni b'ħoloq lejn fajls miksura",
 
-'linkprefix' => '/^(.*?)([a-żA-Ż\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-żA-Ż\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Dwar',
 'article' => 'artiklu',
@@ -2608,11 +2608,8 @@ Ara l-[[Special:BlockList|lista tal-blokki]] sabiex tara l-blokki attivi.',
 'ipb_blocked_as_range' => "Problema: L-Indirizz tal-IP $1 ma jistax jiġi blokkat waħdu u ma jistax jiġi sblokkat. L-Imblokk huwa attiv però f'livell ta' interval $2, li jista' jkun sblokkat.",
 'ip_range_invalid' => "Interval ta' indirizzi ta' IP mhux validi.",
 'ip_range_toolarge' => "Mhumiex permessi firxa ta' blokki ikbar minn /$1.",
-'blockme' => 'Imblukkani',
 'proxyblocker' => "Blokki ta' proxy miftuħa",
-'proxyblocker-disabled' => 'Din il-funzjoni mhijiex attivata.',
 'proxyblockreason' => "L-indirizz IP tiegħek ġie imblukkat peress li huwa proxy miftuħ. Jekk jogħġbok, ikkuntattja lill-provdituri tas-servizz tal-internet (ISP) jew lis-''support'' tekniku tiegħek u infurmahom b'din il-problema serja ta' sigurtà.",
-'proxyblocksuccess' => 'Blokk esegwit.',
 'sorbsreason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}.',
 'sorbs_create_account_reason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}. Ma tistax toħloq kont.',
 'cant-block-while-blocked' => 'Ma tistax timblokka lil utenti oħra waqt li inti mblukkat.',
index 227cad4..4edacf7 100644 (file)
@@ -1509,8 +1509,6 @@ Your e-mail address is not revealed when other users contact you.
 'block-log-flags-hiddenname' => 'အသုံးပြုသူအမည် ဝှက်ထားသည်',
 'ipb_expiry_invalid' => 'သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။',
 'ipb_already_blocked' => '"$1" ကို အစကတည်းက ပိတ်ထားသည်',
-'blockme' => 'ကျွန်ုပ်ကို ပိတ်ရန်',
-'proxyblocksuccess' => 'ပြီးပါပြီ။',
 
 # Move page
 'move-page' => '$1 ကို ရွှေ့ရန်',
index 9fad6c7..e24ad45 100644 (file)
@@ -1638,8 +1638,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'block-log-flags-noemail' => 'е-сёрма озавтозь саймес',
 'block-log-flags-hiddenname' => 'лисиенть-совиенть лемезэ кекшезь',
 'ipb_already_blocked' => '"$1" уш саймас саезь',
-'blockme' => 'Озавтомак саймес',
-'proxyblocksuccess' => 'Озавтовсь.',
 
 # Developer tools
 'lockdb' => 'Сёлгомс датабазанть',
index 77b0acf..a9224e7 100644 (file)
@@ -1173,8 +1173,6 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'change-blocklink' => 'Ticpatlaz tlatzacualli',
 'contribslink' => 'tlapatlaliztli',
 'blocklogpage' => 'Tlatequitiltilīlli ōmotzacuili',
-'blockme' => 'Timitzcuilīz',
-'proxyblocksuccess' => 'Ōmochīuh.',
 
 # Move page
 'move-page' => 'Ticzacāz $1',
index 91c0d6e..1df949a 100644 (file)
@@ -2810,11 +2810,8 @@ Skjulingsloggen vises nedenfor.',
 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikke blokkert direkte, og kan ikke avblokkeres. Den er imidlertid blokkert som del av blokkeringa av IP-rangen $2, som kan avblokkeres.',
 'ip_range_invalid' => 'Ugyldig IP-rad.',
 'ip_range_toolarge' => 'Blokkering av IP-serier større enn /$1 er ikke tillatt.',
-'blockme' => 'Blokker meg',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
 'proxyblockreason' => 'IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
-'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
 'xffblockreason' => 'En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1',
index 10cc0d0..2159551 100644 (file)
@@ -2194,12 +2194,9 @@ Kiek [[Special:BlockList|IP-Blocklist]] för en List vun den blockten Brukern.',
 'ipb_cant_unblock' => 'Fehler: Block-ID $1 nich funnen. De Sperr is villicht al wedder ophoven.',
 'ipb_blocked_as_range' => 'Fehler: De IP-Adress $1 is as Deel vun de IP-Reeg $2 indirekt sperrt worrn. De Sperr trüchnehmen för $1 alleen geiht nich.',
 'ip_range_invalid' => 'Ungüllig IP-Addressrebeet.',
-'blockme' => 'Sperr mi',
 'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Disse Funkschoon is afstellt.',
 'proxyblockreason' => 'Dien IP-Adress is blockt, vun wegen dat se en apenen Proxy is.
 Kontakteer dien Provider oder diene Systemtechnik un informeer se över dat möögliche Sekerheitsproblem.',
-'proxyblocksuccess' => 'Trech.',
 'sorbsreason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY.',
 'sorbs_create_account_reason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY. Du kannst keen Brukerkonto nee opstellen.',
 'cant-block-while-blocked' => 'Du kannst kene annern Brukers sperren, wenn du sülvst sperrt büst.',
index 4c6ba0e..707bcb3 100644 (file)
@@ -2802,11 +2802,8 @@ Wi'j de instellingen wiezigen?",
 De blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven kan wörden.',
 'ip_range_invalid' => 'Ongeldige IP-reeks',
 'ip_range_toolarge' => 'Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.',
-'blockme' => 'Mien blokkeren',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Disse funksie is uutezet.',
 'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.",
-'proxyblocksuccess' => 'Suksesvol.',
 'sorbsreason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.",
 'sorbs_create_account_reason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken.
 Je kunnen gien gebrukerszied anmaken.",
index cd42746..b96da5a 100644 (file)
@@ -193,7 +193,7 @@ $messages = array(
 'noindex-category' => 'क्रमांकन नगरिएका पृष्ठहरु',
 'broken-file-category' => 'टुटेको फाइल लिंकसितको पृष्ठ',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'बारेमा',
 'article' => 'सामाग्री पृष्ठ',
@@ -273,7 +273,7 @@ $messages = array(
 'articlepage' => 'कन्टेन्ट पृष्ठ हेर्नुहोस्',
 'talk' => 'वार्तालाप',
 'views' => 'अवलोकनहरू',
-'toolbox' => 'à¤\94à¤\9cारबà¤\9fà¥\8dà¤\9fा',
+'toolbox' => 'à¤\94à¤\9cारहरà¥\82',
 'userpage' => 'प्रयोगकर्ता पृष्ठ हेर्ने',
 'projectpage' => 'प्रोजेक्ट पृष्ठ हेर्ने',
 'imagepage' => 'फाइल पृष्ठ हेर्नुहोस्',
@@ -336,6 +336,9 @@ $1',
 'newmessageslink' => 'नयाँ सन्देशहरू',
 'newmessagesdifflink' => 'आखिरी परिवर्तन',
 'youhavenewmessagesfromusers' => 'तपाईंको लागि  {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1',
+'youhavenewmessagesmanyusers' => 'तपाईँलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।',
+'newmessageslinkplural' => '{{PLURAL:$1|नयाँ सन्देश|नयाँ सन्देशहरू}}',
+'newmessagesdifflinkplural' => 'अन्तिम {{PLURAL:$1|सम्पादन|सम्पादनहरू}}',
 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्',
 'editsection' => 'सम्पादन',
 'editold' => 'सम्पादन गर्ने',
@@ -389,6 +392,12 @@ $1',
 # General errors
 'error' => 'त्रुटि',
 'databaseerror' => 'डेटावेस त्रुटि',
+'databaseerror-text' => 'डेटाबेस क्वेरीमा खराबी देखा पर्‌यो ।
+यसले सफ्टवेयरमा त्रुटी रहेको इङ्गित गर्न सक्छ ।',
+'databaseerror-textcl' => 'डेटावेस क्वेरीमा खराबी देखियो ।',
+'databaseerror-query' => 'क्वेरी: $1',
+'databaseerror-function' => 'फङ्सन : $1',
+'databaseerror-error' => 'खराबी: $1',
 'laggedslavemode' => "'''चेतावनी:''' पृष्ठमा हालका अद्यतनहरु नहुनसक्छन् ।",
 'readonly' => 'डेटाबेस बन्द गरिएको छ',
 'enterlockreason' => 'ताल्चा मार्नुको कारण दिनुहोस्, साथै ताल्चा हटाउने समयको अवधि अनुमान लगाउनुहोस्।',
@@ -419,6 +428,8 @@ $1',
 'cannotdelete' => '"$1" पृष्ठ वा फ़ाइल मेट्नसकिएन।
 यो अघिबाट नैं मेटिएको हुनुपर्छ।',
 'cannotdelete-title' => 'पृष्ठ  "$1" लाई मेट्न सकिएन',
+'delete-hook-aborted' => 'हुकले सम्पादनकार्य बन्द गरिदियो ।
+कुनै कारण दिइएन ।',
 'badtitle' => 'गलत शीर्षक',
 'badtitletext' => 'अनुरोध गरेको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।',
 'perfcached' => 'तलको डाटाहरु क्याचमा रहेका कुराहरु हुन्। अपटुडेट नहुनपनि सक्छन्।अधिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} क्यासमा उपलब्ध छ।',
@@ -433,10 +444,11 @@ $1',
 'actionthrottled' => 'कार्य रोकियो',
 'actionthrottledtext' => 'स्पामबाट बच्ने तरिकाको रुपमा , तपाईँलाई यो कार्य थोरै समयमा धेरै पटक गर्नबाट सिमित गरिएको छ, र तपाईले आफ्नो सिमा पार गरिसक्नु भयो ।
 कृपया केही मिनेटहरु पछि पुन: प्रयास गर्नुहोस्  ।',
-'protectedpagetext' => 'यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤¹à¥\81नबाà¤\9f à¤¬à¤\9aाà¤\89न à¤¸à¤®à¥\8dपादनमा à¤°à¥\8bà¤\95  लगाइएको छ।',
+'protectedpagetext' => 'यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤¹à¥\81नबाà¤\9f à¤¬à¤\9aाà¤\89न à¤¸à¤®à¥\8dपादनमा à¤¤à¤¥à¤¾ à¤\85नà¥\8dयà¤\95ारà¥\8dयमा à¤°à¥\8bà¤\95 लगाइएको छ।',
 'viewsourcetext' => 'तपाईँले यस पृष्ठको स्रोत हेर्न र प्रतिलिपी गर्न सक्नुहुन्छ ।',
 'viewyourtext' => "यस पृष्ठमा रहेका '''तपाईँका सम्पादनहरु''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :",
-'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन ताल्चा मारिएको छ।',
+'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन सुरक्षा प्रादन गरिएको छ।
+सम्पूर्ण विकिहरूका लागि अनुवादमा परिवर्तन गर्नको लागि [//translatewiki.net/ translatewiki.net], प्रयोग गर्नुहोस् ,  मिडियाविकि स्थानियकरण परियोजना ।',
 'editinginterface' => "'''चेतावनी:''' तपाईं यस्तो पृष्ठलाई सम्पादन गर्नुहुँदैछ, जसले सफ्टवेयरको लागि अन्तरमोहोड़ा (interface) पाठ प्रदान गर्दछ।
 यसको परिवर्तनले यस विकिमा अरु प्रयोगकर्ताको अन्तरमोहोड़ाको प्रदर्शनमा प्रभाव पार्छ।
 सबै विकिका निम्ति अनुवाद जोड्न अथवा परिबर्तन गर्न कृपया यहाँ जानुहोस् [//translatewiki.net/ translatewiki.net], मीडियाविकि स्थानीयकरण पारियोजना।",
@@ -448,9 +460,9 @@ $2',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादन गर्न सकिदैन ।',
 'titleprotected' => ' [[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।
 कारण   "\'\'$2\'\'" हो ।',
-'filereadonlyerror' => 'फाà¤\87ल "$1" à¤²à¤¾à¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\82दà¥\88न à¤\95िन à¤­à¤¨à¥\87à¤\82 फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
+'filereadonlyerror' => 'फाà¤\87ल "$1" à¤²à¤¾à¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\81दà¥\88न à¤\95िन à¤­à¤¨à¥\87 फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
 
-à¤\95ारण à¤¯à¥\8b à¤¦à¤¿à¤\8fà¤\95à¥\8bà¤\9b: "\'\'$3\'\'"।',
+यसलाà¤\88 à¤¸à¥\81रà¤\95à¥\8dषित à¤\97रà¥\8dनà¥\87 à¤ªà¥\8dरवनà¥\8dधà¤\95लà¥\87  à¤¯à¥\8b à¤\95ारण à¤¦à¤¿à¤\8fà¤\95ाà¤\9bनà¥\8d : \'\'$3\'\'।',
 'exception-nologin' => 'प्रवेश (लग ईन) नगरिएको',
 
 # Virus scanner
@@ -460,14 +472,25 @@ $2',
 
 # Login and logout pages
 'logouttext' => "'''तपाईं अहिले बाहिर निस्कनु भएको छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट <span class='plainlinks'>[$1 फेरि प्रवेश गर्न]</span> पनि सक्नुहुन्छ।
-याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤¸à¥\8dमरण à¤­à¤£à¥\8dडार खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
+
+याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤\95à¥\8dयाश खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
 'welcomeuser' => '$1जी स्वागत छ!',
 'yourname' => 'प्रयोगकर्ता नाम:',
+'userlogin-yourname' => 'प्रयोगकर्ता नाम',
+'userlogin-yourname-ph' => 'तपाईँको प्रयोगकर्तानाम लेख्नुहोस्',
+'createacct-another-username-ph' => 'प्रयोगकर्तानाम लेख्नुहोस्',
 'yourpassword' => 'पासवर्ड',
+'userlogin-yourpassword' => 'पासवर्ड',
+'userlogin-yourpassword-ph' => 'तपाईँको पासवर्ड लेख्नुहोस्',
+'createacct-yourpassword-ph' => 'पासवर्ड लेख्नुहोस्',
 'yourpasswordagain' => 'पासवर्ड फेरि टाईप गर्नुहोस्',
+'createacct-yourpasswordagain' => 'पासवर्ड निश्चित गर्नुहोस्',
+'createacct-yourpasswordagain-ph' => 'फेरि पासवर्ड लेख्नुहोस्',
 'remembermypassword' => 'यो कम्प्युटरमा मेरो प्रवेश याद गर । (धेरैमा $1 {{PLURAL:$1|दिन|दिनहरु}})',
+'userlogin-remembermypassword' => 'मलाई प्रवेश गराइराख्ने',
+'userlogin-signwithsecure' => 'सुक्षित जडान प्रयोग गर्ने',
 'yourdomainname' => 'तपाईंको ज्ञानक्षेत्र(डोमेन)',
+'password-change-forbidden' => 'यो विकिमा पासवर्ड परिवर्तन गर्न सक्नुहुन्न ।',
 'externaldberror' => 'यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।',
 'login' => 'प्रवेश',
 'nav-login-createaccount' => 'प्रवेश गर्ने/नयाँ खाता बनाउने',
@@ -477,14 +500,33 @@ $2',
 'logout' => 'निर्गमन',
 'userlogout' => 'निर्गमन (लग आउउ)',
 'notloggedin' => 'प्रवेश (लग ईन) नगरिएको',
+'userlogin-noaccount' => 'के खाता छैन ?',
+'userlogin-joinproject' => '{{SITENAME}} मा खाता खोल्नुहोस् ।',
 'nologin' => 'तपाईको खाता छैन? $1 ।',
 'nologinlink' => 'नयाँ खाता खोल्नुहोस्',
 'createaccount' => 'खाता खोल्नुहोस्',
 'gotaccount' => "के तपाईँसँग पहिले देखि नै खाता छ ? '''$1''' ।",
 'gotaccountlink' => 'लग इन',
 'userlogin-resetlink' => 'प्रवेश सम्बन्धी विवरणहरु बिर्सनु भयो?',
-'createaccountmail' => 'इ-मेलबाट',
+'userlogin-resetpassword-link' => 'पासवर्ड परिवर्तन गर्नुहोस्',
+'userlogin-createanother' => 'अर्को खाता खोल्नुहोस्',
+'createacct-join' => 'तपाईँका जानकारीहरू तल थप्नुहोस् ।',
+'createacct-another-join' => 'नयाँ खाताको जानकारी तल थप्नुहोस ।',
+'createacct-emailrequired' => 'इमेल ठेगाना',
+'createacct-emailoptional' => 'इमेल ठेगाना (ऐच्छिक)',
+'createacct-email-ph' => 'तपाईँको इमेल ठेगाना भर्नुहोस्',
+'createacct-another-email-ph' => 'इमेल ठेगाना भर्नुहोस्',
+'createaccountmail' => 'कुनै अस्थाई र श्रिजित पासवर्ड प्रयोग गर्ने र खुलाईएको इमेलमा पठाउने',
+'createacct-realname' => 'वास्तविक नाम(ऐच्छिक)',
 'createaccountreason' => 'कारण :',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'किन नयाँ खाता खोलिरहनु भएको हो ?',
+'createacct-captcha' => 'सुरक्षा जाँच',
+'createacct-imgcaptcha-ph' => 'माथि देखिए अनुसारको पाठ भर्नुहोस्',
+'createacct-submit' => 'तपाईँको खाता सिर्जना गर्नुहोस',
+'createacct-another-submit' => 'अर्को खाता सिर्जना गर्नुहोस्',
+'createacct-benefit-heading' => '{{SITENAME}} तपाईँ जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|सम्पादन|सम्पादनहरू}}',
 'badretype' => 'तपाईंले दिनुभएको पासवर्ड मिल्दैन।',
 'userexists' => 'तपाईले प्रविष्ट गर्नुभएको प्रयोगकर्ताको नाम पहिले देखिनै प्रयोगमा छ ।
 कृपया फरक नाम छान्नुहोस् ।',
@@ -541,12 +583,11 @@ $2',
 'cannotchangeemail' => 'यस विकिमा तपाईको खातासँग सम्बन्धित इमेल ठेगाना परिवर्तन गर्न सकिन्न ।',
 'emaildisabled' => 'यो साइटले इमेलहरु पठाउन सक्तैन।',
 'accountcreated' => 'खाता खोलियो',
-'accountcreatedtext' => '$1 कोलागि प्रयोगकर्ता खाता खोलियो।',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]])$1 प्रयोगकर्ताको लागि खाता खोलिएको छ ।',
 'createaccount-title' => '{{SITENAME}}कोलागि खाता खोल्ने काम',
 'createaccount-text' => 'कसैले तपाईको इमेल ठेगानालाई {{SITENAME}} ($4) मा "$2" नामको खाता बनाएको छ, जसको पासवर्ड "$3" छ।',
 'usernamehasherror' => 'प्रयोगकर्तानाममा ह्यास अक्षरहरु राख्न मिल्दैन।',
-'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभयो।
-कृपया पर्खेर केही समयपछि मात्र प्रयास गर्नुहोस्।',
+'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ ,कृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।',
 'login-abort-generic' => 'तपाईंको प्रवेश असफल भयो - छोड़ियो',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।',
@@ -565,7 +606,7 @@ $2',
 'newpassword' => 'नयाँ पासवर्ड:',
 'retypenew' => 'प्रवेश शव्द पुन: दिनुहोस् :',
 'resetpass_submit' => 'पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने',
-'changepassword-success' => 'तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¥\8dरवà¥\87शशवà¥\8dद à¤¸à¤«à¤²à¤¤à¤¾à¤ªà¥\82रà¥\8dवà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤¯à¥\8b ! à¤¤à¤ªà¤¾à¤\88लाà¤\88 à¤ªà¥\8dरवà¥\87श à¤\97राà¤\87à¤\81दà¥\88à¤\9b ...',
+'changepassword-success' => 'तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¸à¤«à¤²à¤¤à¤¾à¤ªà¥\82रà¥\8dवà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤¯à¥\8b !',
 'resetpass_forbidden' => 'प्रवेशशव्द परिवर्तन गर्न मिल्दैन',
 'resetpass-no-info' => 'यो पृष्ठ सिधै हेर्नको लागि तपाईँले प्रवेश गर्नुपर्छ ।',
 'resetpass-submit-loggedin' => 'प्रवेशशव्द परिवर्तन गर्ने',
@@ -598,8 +639,8 @@ $2
 तपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड चुन्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनु हुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।',
 'passwordreset-emailelement' => 'प्रयोगकर्ताको नाम: $1
 अस्थाई पासवर्ड: $2',
-'passwordreset-emailsent' => 'à¤\8fà¤\89à¤\9fा à¤\85नà¥\81सà¥\8dमारà¤\95 à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87यà¥\8b।',
-'passwordreset-emailsent-capture' => 'à¤\85नà¥\81सà¥\8dमारà¤\95 à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87यà¥\8b, à¤\9cà¥\8b तल देखाइएकोछ।',
+'passwordreset-emailsent' => 'पासवरà¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤\9b।',
+'passwordreset-emailsent-capture' => 'पासवरà¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87यà¥\8b, à¤\9cà¥\81न तल देखाइएकोछ।',
 
 # Special:ChangeEmail
 'changeemail' => 'इमेल ठेगाना परिवर्तन गर्नुहोस',
@@ -856,8 +897,8 @@ $2
 लिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमा अंतर, '''({{int:last}})''' = पहिलाका अवतरणको बीचमा अंतर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।",
 'history-fieldset-title' => 'इतिहासको विचरण गर्ने',
 'history-show-deleted' => 'मेटिएका मात्र',
-'histfirst' => 'पहिलो',
-'histlast' => 'à¤\85नà¥\8dतिम',
+'histfirst' => 'पà¥\81रानो',
+'histlast' => 'नयाà¤\81',
 'historysize' => '({{PLURAL:$1|१ बाइट |$1 बाइटहरु}})',
 'historyempty' => '(खाली)',
 
@@ -1040,7 +1081,7 @@ $1",
 'search-interwiki-default' => '$1 नतिजाहरु:',
 'search-interwiki-more' => '(अझै)',
 'search-relatedarticle' => 'सम्बन्धित',
-'mwsuggest-disable' => 'AJAX सुझाव निस्क्रिय पार्नुहोस्',
+'mwsuggest-disable' => 'खोज सुझावहरु अक्षम पार्ने',
 'searcheverything-enable' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्',
 'searchrelated' => 'सम्बन्धित',
 'searchall' => 'सबै',
@@ -1092,7 +1133,7 @@ $1",
 'prefs-rendering' => 'स्वरुप',
 'saveprefs' => 'संग्रह',
 'resetprefs' => 'संग्रह नगरिएका परिवर्तनहरु सफागर्ने',
-'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने',
+'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)',
 'prefs-editing' => 'सम्पादन',
 'rows' => 'हरफहरु :',
 'columns' => 'स्तम्भहरु :',
@@ -1136,8 +1177,8 @@ $1",
 'prefs-emailconfirm-label' => 'इ-मेल एकिन प्रक्रिया :',
 'youremail' => 'ईमेल',
 'username' => '{{GENDER:$1|प्रयोगकर्ता नाम}}:',
-'uid' => 'प्रोगकर्ता आइडी:',
-'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को सदस्य :',
+'uid' => '{{GENDER:$1|प्रयोगकर्ता}} ID:',
+'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदस्य}} :',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'दर्ता समय:',
 'prefs-registration-date-time' => '$1',
@@ -1150,10 +1191,10 @@ $1",
 HTML ट्यागहरु जाँच्नुहोस् ।',
 'badsiglength' => 'तपाईको दस्तखत धेरै लामो छ।
 यो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।',
-'yourgender' => 'लिà¤\99à¥\8dà¤\97:',
-'gender-unknown' => 'नà¤\96à¥\81लà¥\87à¤\95à¥\8b',
-'gender-male' => 'पà¥\81रà¥\82ष',
-'gender-female' => 'महिला',
+'yourgender' => 'à¤\95सरà¥\80 à¤µà¤¤à¤¾à¤\89न à¤\9aाहनà¥\81हà¥\81नà¥\8dà¤\9b ?',
+'gender-unknown' => 'म à¤\96à¥\81लाà¤\89न à¤\9aाहनà¥\8dन',
+'gender-male' => 'à¤\89सलà¥\87 à¤µà¤¿à¤\95ि à¤ªà¥\83षà¥\8dठहरà¥\82 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dà¤\9b',
+'gender-female' => 'à¤\89नलà¥\87 à¤µà¤¿à¤\95ि à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dà¤\9bिन',
 'prefs-help-gender' => 'वैकल्पिक: सफ्टवेयरले लिङगानुसार सम्बोधन गर्नको लागि प्रयोग गरिन्छ ।
 यो जानकारी सार्वजनिक हुनेछ ।',
 'email' => 'ईमेल',
@@ -1167,7 +1208,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'prefs-signature' => 'हस्ताक्षर',
 'prefs-dateformat' => 'मिति ढाँचा',
 'prefs-timeoffset' => 'समय अफसेट',
-'prefs-advancedediting' => 'सामान्य',
+'prefs-advancedediting' => 'सामान्य विकल्पहरू',
 'prefs-advancedrc' => 'उन्नत विकल्पहरू',
 'prefs-advancedrendering' => 'उन्नत विकल्पहरु',
 'prefs-advancedsearchoptions' => 'उन्नत विकल्पहरू',
@@ -2242,12 +2283,9 @@ $1को बन्देजको कारण : "$2" हो',
 यो एक रेन्ज रोक $2, को अन्तर्गत रहेको छ जसलाई रोक खोल्न मिल्छ ।',
 'ip_range_invalid' => 'IP क्षेत्र अमान्य ।',
 'ip_range_toolarge' => ' /$1 भन्दा ठूलो रेन्ज रोक लगाउन पाइदैन ।.',
-'blockme' => 'मलाई निषेध गर्ने',
 'proxyblocker' => 'प्रोक्सी निषेध गर्ने',
-'proxyblocker-disabled' => 'यो कार्य निष्कृय पारिएको छ।',
 'proxyblockreason' => 'तपाईको IP ठेगानामा रोक लगाइएको छ किनकी यो खुला प्रोक्सी हो ।
 कृपया तपाईको इन्टरनेट सेवा प्रदायक या प्राविधिक सहायतालाई सम्पर्क गरी यस सुरक्षा समस्याको बारेमा जानकारी गराउनुहोस् ।',
-'proxyblocksuccess' => 'सकियो.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा  DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।',
 'sorbs_create_account_reason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा  DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।
index 5e17a4d..ae86c2f 100644 (file)
@@ -1637,7 +1637,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'prefs-signature' => 'Ondertekening',
 'prefs-dateformat' => 'Datumopmaak:',
 'prefs-timeoffset' => 'Tijdverschil',
-'prefs-advancedediting' => 'Algemene opties',
+'prefs-advancedediting' => 'Algemene instellingen',
 'prefs-editor' => 'Tekstverwerker',
 'prefs-preview' => 'Voorvertoning',
 'prefs-advancedrc' => 'Gevorderde instellingen',
@@ -2243,7 +2243,7 @@ Invoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.',
 # Unused templates
 'unusedtemplates' => 'Ongebruikte sjablonen',
 'unusedtemplatestext' => 'Deze pagina geeft alle pagina\'s weer in de naamruimte {{ns:template}} die op geen enkele pagina gebruikt worden.
-Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens deze sjabloon te verwijderen.',
+Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabloon te verwijderen.',
 'unusedtemplateswlh' => 'andere koppelingen',
 
 # Random page
@@ -2961,12 +2961,9 @@ Misschien is de blokkade al opgeheven.',
 De blokkade is onderdeel van de reeks $2, waarvan de blokkade wel opgeheven kan worden.',
 'ip_range_invalid' => 'Ongeldige IP-reeks.',
 'ip_range_toolarge' => 'Reeksblokkades groter dan /$1 zijn niet toegestaan.',
-'blockme' => 'Mij blokkeren',
 'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Deze functie is uitgeschakeld.',
 'proxyblockreason' => 'Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver.
 Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
-'proxyblocksuccess' => 'Afgerond.',
 'sorbsreason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
 'sorbs_create_account_reason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
 U kunt geen gebruiker registreren.',
index 74eddc5..f9ffcda 100644 (file)
@@ -457,7 +457,7 @@ $messages = array(
 'noindex-category' => 'Ikkje-indekserte sider',
 'broken-file-category' => 'Sider med brotne fillenkjer',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Om',
 'article' => 'Innhaldsside',
@@ -2721,11 +2721,8 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikkje direkte blokkert og kan ikkje opphevast. Adressa er blokkert som ein del av blokkeringa av IP-intervallet $2. Denne blokkeringa kan opphevast.',
 'ip_range_invalid' => 'Ugyldig IP-adresseserie.',
 'ip_range_toolarge' => 'Blokkering av IP-seriar større enn /$1 er ikkje tillate.',
-'blockme' => 'Blokker meg',
 'proxyblocker' => 'Proxy-blokkerar',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
 'proxyblockreason' => 'Du er blokkert frå å endre fordi IP-adressa di tilhøyrer ein open mellomtenar (proxy). Du bør kontakte internettleverandøren din eller kundesørvis og gje dei beskjed, ettersom dette er eit alvorleg sikkerheitsproblem.',
-'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL.',
 'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor får du ikkje registrert deg.',
 'xffblockreason' => 'Ei IP-adresse i X-Forwarded-For-tittelen, anten di eller den som høyrer til ein proksytenar du nyttar, er blokkert. Den opphavlege blokkeringsgrunnen var: $1',
index 114fb92..99cea76 100644 (file)
@@ -1028,7 +1028,6 @@ Seemo sa go lota ga letlakala '''$1''':",
 'unblocklogentry' => 'Gago thibelo $1',
 'block-log-flags-nocreate' => 'Go hloma tšhupaleloko gago dumelege',
 'block-log-flags-noemail' => 'e-mail e thibilwe',
-'proxyblocksuccess' => 'Phetilwe.',
 
 # Move page
 'move-page-legend' => 'Huduša letlakala',
index d53a578..34503b0 100644 (file)
@@ -2745,11 +2745,8 @@ Consultatz la [[Special:BlockList|lista dels utilizaires blocats]] per veire los
 'ipb_blocked_as_range' => "Error : L'adreça IP $1 es pas estada blocada dirèctament e doncas pòt pas èsser deblocada. Çaquelà, es estada blocada per la plaja $2 la quala pòt èsser deblocada.",
 'ip_range_invalid' => 'Plaja IP incorrècta.',
 'ip_range_toolarge' => 'Los blocatges de plajas mai grandas que /$1 son pas autorizadas.',
-'blockme' => 'Blocatz-me',
 'proxyblocker' => 'Blocaire de mandatari (proxy)',
-'proxyblocker-disabled' => 'Aquesta foncion es desactivada.',
 'proxyblockreason' => "Vòstra ip es estada blocada perque s’agís d’un proxy dobèrt. Mercé de contactar vòstre fornidor d’accès internet o vòstre supòrt tecnic e de l’informar d'aqueste problèma de seguretat.",
-'proxyblocksuccess' => 'Acabat.',
 'sorbsreason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.
 Podètz pas crear un compte',
index cb687eb..6ab6ef9 100644 (file)
@@ -2732,12 +2732,9 @@ $1ର ଅଟକ ପାଇଁ ଦିଆଯାଇଥିବା କାରଣଟି 
 ଏହା, $2 ଭିତରେ ଥିବାରୁ ତାହାକୁ ଅଟକରୁ ଛାଡ଼ କରାଯାଇପାରିବ ନାହିଁ ।',
 'ip_range_invalid' => 'ଅଚଳ IP ସୀମା ।',
 'ip_range_toolarge' => '/$1 ଠାରୁ ବଡ଼ ସୀମା ଅଟକ ଅନୁମୋଦିତ ନୁହେଁ ।',
-'blockme' => 'ମୋତେ ଅଟକାଇବେ',
 'proxyblocker' => 'ପ୍ରକ୍ସି ଅଟକ',
-'proxyblocker-disabled' => 'ଏହି କାମଟି ଅଚଳ କରାଯାଇଅଛି ।',
 'proxyblockreason' => 'ଏକ ଖୋଲା ପ୍ରକ୍ସି ହୋଇଥିବାରୁ ଆପଣଙ୍କ IP ଠିକଣାଟିକୁ ଅଟକାଇଦିଆଗଲା ।
 ଦୟାକରି ଆପଣଙ୍କ ଇଣ୍ଟରନେଟ ସେବାପ୍ରଦାନକାରୀ, କାରିଗରି ସହଯୋଗ କିମ୍ବା ସଙ୍ଗଠନ ସହିତ କଥା ହୋଇ ଏହି ବିରାଟ ଅସୁବିଧା ବାବଦରେ ବତାଇଦିଅନ୍ତୁ ।',
-'proxyblocksuccess' => 'ଶେଷ ହେଲା ।',
 'sorbsreason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।',
 'sorbs_create_account_reason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।
 ଆପଣ ନୂଆ ଖାତାଟିଏ ଖୋଲି ପାରିବେ ନାହିଁ',
index 270fa0d..c3b48e1 100644 (file)
@@ -2081,8 +2081,6 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'ipb-otherblocks-header' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}',
 'unblock-hideuser' => 'ਤੁਸੀਂ ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਕਿਉਂਕਿ ਇਸਦਾ ਮੈਂਬਰ-ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ ਹੈ।',
 'ipb_cant_unblock' => 'ਗ਼ਲਤੀ: ਪਾਬੰਦੀ ਪਤਾ $1 ਨਹੀਂ ਲੱਭਿਆ। ਸ਼ਾਇਦ ਇਹ ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀ-ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ।',
-'blockme' => 'ਮੇਰੇ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ',
-'proxyblocksuccess' => 'ਪੂਰਾ ਹੋਇਆ',
 'cant-block-while-blocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਜਦੋਂ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ।',
 'ipbblocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਜਾਂ ਪਾਬੰਦੀ-ਮੁਕਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ',
 'ipbnounblockself' => 'ਤੁਹਾਨੂੰ ਖ਼ੁਦ ਨੂੰ ਪਾਬੰਦੀ-ਮੁਕਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
index 572a001..0788b05 100644 (file)
@@ -1655,12 +1655,9 @@ Lon me ing [[Special:BlockList|IP block list]] para king tala da reng kasalungsu
 'ipb_blocked_as_range' => 'Mali: E diretsung makasabat ing IP $1, at e maliaring ilako pangasabat.
 Pero makasabat ya antimong kayabe king range $2, a maliaring ilako pangasabat.',
 'ip_range_invalid' => 'E matatanggap a IP range.',
-'blockme' => 'Sabatan muku',
 'proxyblocker' => 'Maniabat a proxy',
-'proxyblocker-disabled' => 'Makapatda (disabled) ya ing gamit (function) a ini.',
 'proxyblockreason' => 'Mesabat ya ing kekang IP address uling metung yang open proxy.
 Pakiyaus me ing kekang Internet service provider o tech support at pabaluan me kaniting mabayat a prublema king seguridad.',
-'proxyblocksuccess' => 'Merapat na.',
 'sorbsreason' => 'Makalista ya ing kekang IP address antimong open proxy king DNSBL a gagamitan ning {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Makalista yang open proxy king DNSBL a gagamitan ning {{SITENAME}} ing kekang IP address.
 E ka maliaring maglalang account.',
index 25ddedf..4d12a58 100644 (file)
@@ -790,7 +790,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'infiniteblock' => 'fer immer',
 'blocklink' => 'Aabinne',
 'contribslink' => 'Ardickele',
-'proxyblocksuccess' => 'Geduh.',
 
 # Move page
 'move-page' => '„$1“ ziehe',
@@ -935,7 +934,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 
 # Separators for various lists, etc.
 'ellipsis' => '…',
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← letscht Blatt',
index 839037b..289e770 100644 (file)
@@ -2687,7 +2687,7 @@ $1',
 'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}',
 'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
 'mycontris' => 'Edycje',
-'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}}$1 ($2)',
+'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)',
 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.',
 'uctop' => '(ostatnia)',
 'month' => 'Do miesiąca (włącznie)',
@@ -2845,12 +2845,9 @@ By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:Blo
 Należy on do zablokowanego zakresu adresów $2. Odblokować można tylko cały zakres.',
 'ip_range_invalid' => 'Niepoprawny zakres adresów IP.',
 'ip_range_toolarge' => 'Zakresy IP większe niż /$1 są niedozwolone.',
-'blockme' => 'Zablokuj mnie',
 'proxyblocker' => 'Blokowanie proxy',
-'proxyblocker-disabled' => 'Ta funkcja jest wyłączona.',
 'proxyblockreason' => 'Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.
 O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.',
-'proxyblocksuccess' => 'Wykonano.',
 'sorbsreason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
 'sorbs_create_account_reason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.
 Nie możesz utworzyć konta',
@@ -3891,7 +3888,7 @@ Czy na pewno chcesz ją ponownie utworzyć?",
 'confirm-unwatch-top' => 'Usunąć tę stronę z listy obserwowanych?',
 
 # Separators for various lists, etc.
-'percent' => '$1&nbsp;%',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← poprzednia strona',
index 1d3f755..c9bce10 100644 (file)
@@ -260,7 +260,7 @@ $messages = array(
 'articlepage' => 'Vëdde la pàgina ëd contnù',
 'talk' => 'Discussion',
 'views' => 'Vìsite',
-'toolbox' => "Bòita dj'utiss",
+'toolbox' => 'Utiss',
 'userpage' => 'Che a varda la pàgina Utent',
 'projectpage' => 'Che a varda la pàgina ëd proget',
 'imagepage' => "Vëdde la pàgina dl'archivi",
@@ -811,46 +811,45 @@ test ch'a-i é già. Sossì dle vire a riva quand un a deuvra un servent anònim
 'editingsection' => 'Modìfica ëd $1 (session)',
 'editingcomment' => 'Modìfica ëd $1 (neuva session)',
 'editconflict' => 'Conflit ëd modìfica: $1',
-'explainconflict' => "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentré che chiel (chila) as prontava la soa.
+'explainconflict' => "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentre che chiel as prontava la soa.
 Ël quàder ëd modìfica dë dzora a mostra ël test ëd l'artìcol coma a resta adess (visadì, lòn che a-i é ant sla Ragnà). Soe modìfiche a stan ant ël quàder dë sota.
 Ën volend a peul gionté soe modìfiche ant ël quàder dë dzora.
 '''Mach''' ël test ant ël quàder dë dzora a sarà salvà, ën sgnacand ël boton \"{{int:savearticle}}\".",
 'yourtext' => 'Sò test',
-'storedversion' => 'Version memorisà',
-'nonunicodebrowser' => "'''A L'EUJ! Sò programa ëd navigassion (browser) a travaja pa giust con lë stàndard unicode. I soma obligà a dovré dij truschin përchè a peula salvesse sò artìcoj sensa problema: ij caràter che a son nen ASCII a jë s-ciairerà ant ël quàder ëd modìfica test coma còdes esadecimaj.'''",
-'editingold' => "'''CHE A FASA MACH ATENSION: che a sta fasend-je dle modìfiche a na version nen agiornà dl'artìcol.<br />
+'storedversion' => 'La version memorisà',
+'nonunicodebrowser' => "'''A L'EUJ! Sò programa ëd navigassion a marcia pa giust con lë stàndard Unicode. I soma obligà a dovré dij truschin përchè a peula salvesse sò artìcoj sensa problema: ij caràter che a son nen ASCII a jë s-ciairerà ant ël quàder ëd modìfica dël test coma còdes esadecimaj.'''",
+'editingold' => "'''CHE A FASA MACH ATENSION: che a l'é an camin ch'a modìfica na version nen agiornà dl'artìcol.<br />
 Se a la salva parèj, lòn che a l'era stàit fàit dapress a sta revision-sì as perdrà d'autut.'''",
 'yourdiff' => 'Diferense',
-'copyrightwarning' => "Che a ten-a për piasì present che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj).
-Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ansima a {{SITENAME}}, ma pitòst che as lo pùblica ansima a un sò sit përsonal.<br />
-Ën mandand ës test-sì chiel (chila) as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel (daspërchila) coma original, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt, ò pura che chiel (chila) a l'ha arseivù autorisassion scrita a dovré sto test e che sòn a peul dimostrelo.<br />
-'''DOVRÉ PA MAI DËL MATERIAL COATÀ DA DRIT D'AUTOR (c) SENSA AVÈJ N'AUTORISASSION SCRITA PËR FELO!!!'''",
-'copyrightwarning2' => "Për piasì, che a ten-a present che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da dj'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />
-Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel (ò daspërchila), ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).
-'''CHE A MANDA PA DËL MATERIAL COATÀ DA DRIT D'AUTOR SENSA AVÈJ AVÙ ËL PËRMESS SCRIT DË FELO!'''",
-'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobyte}} , che a resta pì che ël
-lìmit màssim ëd {{PLURAL:$2|un kilobyte|$2 kilobyte}}. Parèj as peul pa salvesse.",
-'readonlywarning' => "'''Avis: La base dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''
+'copyrightwarning' => "Che a ten-a për piasì da ment che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj).
+Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ambelessì.<br />
+Ën mandand ës test-sì chiel as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt.
+'''Anserì mai dël material coatà da drit d'autor sensa avèj n'autorisassion për felo!'''",
+'copyrightwarning2' => "Për piasì, che a ten-a da ment che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da d'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />
+Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel, ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).
+'''Che a manda pa dël material coata da drit d'autor sensa avèj avù ël përmess ëd felo!'''",
+'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobytes}}, che a resta pì che ël lìmit màssim {{PLURAL:$2|d'un kilobyte|ëd $2 kilobyte}}.''' Parèj as peul pa salvesse.",
+'readonlywarning' => "'''Avis: La base ëd dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''
 A peul esse che a-j ven-a còmod copiesse via sò test e ancoless-lo an n'archivi ëd test e goernelo për pi tard.
 
 L'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
-'protectedpagewarning' => "'''Avis: costa pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.'''
+'protectedpagewarning' => "'''Avis: costa pàgina-sì a l'é stàita protegiùa an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.'''
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
 'semiprotectedpagewarning' => "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela.
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'cascadeprotectedwarning' => "'''Tension:''' sta pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che {{PLURAL:\$1|a l'é proteta|a-i intra ant le pàgine protete}} col sistema \"a cascada\":",
+'cascadeprotectedwarning' => "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
 'titleprotectedwarning' => "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.'''
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'templatesused' => '{{PLURAL:$1|Stamp|Stamp}} dovrà dzora a sta pàgina-sì:',
-'templatesusedpreview' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta preuva-sì:',
-'templatesusedsection' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta session-sì:',
+'templatesused' => '{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:',
+'templatesusedpreview' => '{{PLURAL:$1|Stamp}} dovrà an costa preuva:',
+'templatesusedsection' => '{{PLURAL:$1|Stamp}} dovrà an costa session-sì:',
 'template-protected' => '(protet)',
 'template-semiprotected' => '(mes-protet)',
 'hiddencategories' => 'Sta pàgina-sì a fa part ëd {{PLURAL:$1|na categorìa|$1 categorìe}} stërmà:',
-'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd mòdifica e 'd càrich d'archivi. -->",
-'nocreatetext' => "Cost sit-sì a l'ha limità la possibilità ëd creé dle pàgine neuve.
+'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd modìfica e 'd carie d'archivi. -->",
+'nocreatetext' => "{{SITENAME}} a l'ha limità la possibilità ëd creé dle pàgine neuve.
 A peul torné andaré e modifiché na pàgina che a-i é già, ò pura [[Special:UserLogin|rintré ant ël sistema ò deurb-se un cont]].",
-'nocreate-loggedin' => "A l'ha pa ij përmess për creé dle pàgine neuve.",
+'nocreate-loggedin' => "A l'ha pa ël përmess ëd creé dle pàgine neuve.",
 'sectioneditnotsupported-title' => "La modìfica dla session a l'é nen prevëdùa",
 'sectioneditnotsupported-text' => "La modìfica dla session a l'é nen prevëdùa an costa pàgina ëd modìfica.",
 'permissionserrors' => 'Eror ant ij përmess',
@@ -2569,12 +2568,9 @@ coj che sio ij blocagi ativ al dì d'ancheuj.",
 'ipb_blocked_as_range' => "Eror: L'adrëssa IP $1 a l'ha gnun blocagi diret ansima e donca a peul pa esse dësblocà. A resta blocà mach për via ch'a l'é ciapà andrinta al ragg $2, e lolì as peul pa dësblochesse.",
 'ip_range_invalid' => 'Nùmer IP nen bon.',
 'ip_range_toolarge' => "Ij blocagi d'antërvaj pi gròss che /$1 a son pa përmëttù.",
-'blockme' => 'Blòch-me',
 'proxyblocker' => "Blocador dj'arpetitor",
-'proxyblocker-disabled' => "Sta funsion-sì a l'é pa abilità.",
 'proxyblockreason' => "Soa adrëssa IP a l'é stàita blocà përchè a l'é cola ëd n'arpetitor duvèrt.
 Për piasì che a contata sò fornitor ëd conession e che a lo anforma. As trata d'un problema ëd sigurëssa motobin serios.",
-'proxyblocksuccess' => 'Bele fàit.',
 'sorbsreason' => "Soa adrëssa IP a l'é listà coma arpetitor duvert (open proxy) ansima al DNSBL dovrà da {{SITENAME}}.",
 'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor duvèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.",
 'xffblockreason' => "N'adrëssa IP ant l'antestassion X-Forwarded-For, la soa o cola d'un servent fantasma che chiel a deuvra, a l'é stàita blocà. La rason dël blocagi inissial a l'era: $1",
index fceb4c7..5af5a56 100644 (file)
@@ -2330,12 +2330,9 @@ $1',
 اینوں $2 دی رینج چ روکیا گیا، جینوں کھولیا جاسکدا اے۔',
 'ip_range_invalid' => 'ناں منی جان والی آئی پی رینج۔',
 'ip_range_toolarge' => 'رینج روکاں /$1 توں وڈیاں دی اجازت نئیں۔',
-'blockme' => 'مینوں روکو',
 'proxyblocker' => 'دوروں روکن والا',
-'proxyblocker-disabled' => 'اس کم نوں روک دتا گیا اے۔',
 'proxyblockreason' => 'تواڈا آئی پی پتہ تے روک لگادتی گئی جے کیوں جے اے اک کھلا پراکسی اے۔
 مہربانی کرکے اپنے انٹرنٹ سروس دین والے نال  یا تکنیکی مدد دین والے نال تے اوناں ایس بچاؤ خطرے بارے دسو۔',
-'proxyblocksuccess' => 'ہوگیا۔',
 'sorbsreason' => 'تیرا آئی پی پتہ اک کھلی پراکسی وانگوں دتا گیا اے ڈی این ایس بی ایل چ {{سائیٹناں}} نے۔',
 'sorbs_create_account_reason' => 'تواڈا پتہ اک کھلا پراکسی لسٹ چ اے ڈی این ایس بی ایل نال {{سائیٹناں}} چ۔
 تسیں اک کھاتہ نئیں کھول سکدے۔',
index 1d8834f..ad44e5a 100644 (file)
@@ -1102,8 +1102,6 @@ $messages = array(
 'blocklogentry' => 'εσπάλισεν [[$1]] για $2 $3',
 'unblocklogentry' => 'άνοιγμαν ασπαλιγματί τη $1',
 'block-log-flags-nocreate' => "ποίσιμον λογαρίας 'κ ίνεται",
-'blockme' => 'Ασπάλισον με',
-'proxyblocksuccess' => 'Εγέντον.',
 
 # Developer tools
 'lockdb' => 'Ασπάλιγμαν βάσης δογμενίων',
index 51ec75c..ebbde80 100644 (file)
@@ -1855,10 +1855,7 @@ Jaīs en [[Special:BlockList|IP blōkisenin listin]] ki widālai wissans tēnti
 Sta ast, šlāit, blōkitan kāigi delīks stesse $2 ebīmtan, kawīdan mazzi būtwei etblōkitan.',
 'ip_range_invalid' => 'Nitikrōmiskas IP ebīmtan.',
 'ip_range_toolarge' => 'Ebīmtas blōkisenei mūiseisan nikāi /$1 ni ast preiēminan.',
-'blockme' => 'Blōkis min',
 'proxyblocker' => 'Proxy blōkisna',
-'proxyblocker-disabled' => 'Šī funkciōni ast izklaūtan.',
-'proxyblocksuccess' => 'Segītan.',
 'sorbsreason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}.
 Tū ni mazzi teīktun rekkenan',
index 378334f..60bef83 100644 (file)
@@ -652,7 +652,7 @@ $1',
 'mailerror' => 'د برېښليک د لېږلو ستونزه: $1',
 'acct_creation_throttle_hit' => 'د همدې ويکي کارنانو په وروستيو ورځو کې ستاسې د IP پتې په کارولو سره {{PLURAL:$1|1 گڼون|$1 گڼونونه}} جوړ کړي، چې دا په همدې مودې کې د گڼونونو د جوړولو تر ټولو ډېر شمېر دی چې اجازه يې ورکړ شوې.
 نو په همدې خاطر د اوس لپاره د همدې IP پتې کارنان نه شي کولای چې نور گڼونونه جوړ کړي.',
-'emailauthenticated' => 'ستاسÛ\90 Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ù¾ØªÙ\87 Ù¾Ù\87 $2 Ù\86Û\90Ù¼Ù\87 Ù¾Ù\87 $3 Ø¨Ø¬Ù\88 Ø¯ Ù\85Ù\86Ù\84Ù\88 Ù\88Ú\93 Ù\88Ú«رځېده.',
+'emailauthenticated' => 'ستاسÛ\90 Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ù¾ØªÙ\87 Ù¾Ù\87 $2 Ù\86Û\90Ù¼Ù\87 Ù¾Ù\87 $3 Ø¨Ø¬Ù\88 Ø¯ Ù\85Ù\86Ù\84Ù\88 Ù\88Ú\93 Ù\88Ú¯رځېده.',
 'emailnotauthenticated' => 'لا تر اوسه ستاسې برېښليک پته د منلو وړ نه ده ګرځېدلې. د لاندې ځانګړتياو لپاره به تاسې ته هېڅ کوم برېښليک و نه لېږل شي.',
 'noemailprefs' => 'ددې لپاره چې دا کړنې کار وکړي نو تاسو يو برېښليک وټاکۍ.',
 'emailconfirmlink' => 'د خپل د برېښليک پتې پخلی وکړی',
@@ -2002,8 +2002,6 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipb-needreblock' => 'پر $1 د پخوا نه بنديز لگېدلی.
 آيا تاسې د امستنو بدلول غواړۍ؟',
 'ipb-otherblocks-header' => '{{PLURAL:$1|بل بنديز|نور بنديزونه}}',
-'blockme' => 'پر ما بنديز لگول',
-'proxyblocksuccess' => 'ترسره شو.',
 
 # Developer tools
 'lockdb' => 'توکبنسټ تړل',
index f9fe2b2..9a6ff9e 100644 (file)
@@ -1391,6 +1391,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 'compareselectedversions' => 'Comparar as versões selecionadas',
 'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas',
 'editundo' => 'desfazer',
+'diff-empty' => '(Sem diferenças)',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})',
 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
@@ -2061,6 +2062,8 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 'listfiles_size' => 'Tamanho',
 'listfiles_description' => 'Descrição',
 'listfiles_count' => 'Versões',
+'listfiles-show-all' => 'Incluir versões antigas de imagens',
+'listfiles-latestversion-no' => 'Não',
 
 # File description page
 'file-anchor-link' => 'Ficheiro',
@@ -2156,6 +2159,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
 # Random page in category
+'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
 'randomincategory-selectcategory-submit' => 'Ir',
 
 # Random redirect
@@ -2247,7 +2251,7 @@ Agora redirecciona para [[$2]].',
 'mostinterwikis' => 'Páginas com mais interwikis',
 'mostrevisions' => 'Páginas com mais revisões',
 'prefixindex' => 'Todas as páginas iniciadas por',
-'prefixindex-namespace' => 'Todas as páginas com prefixo (domínio $1)',
+'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
 'prefixindex-strip' => 'Remover prefixo',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
@@ -2850,12 +2854,9 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.',
 'ip_range_invalid' => 'Gama de IPs inválida.',
 'ip_range_toolarge' => 'Não são permitidas gamas de IPs maiores do que /$1.',
-'blockme' => 'Bloquear-me',
 'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta função foi impossibilitada.',
 'proxyblockreason' => "O seu endereço IP foi bloqueado por ser um ''proxy'' público.
 Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
 'sorbs_create_account_reason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
 'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1',
@@ -4053,6 +4054,7 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparência nas listas de modificações',
 'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativa?',
 'tags-hitcount-header' => 'Modificações etiquetadas',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
@@ -4212,6 +4214,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 # Limit report
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamanho dos argumentos da predefinição',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 
 );
index c7d1660..d60517a 100644 (file)
@@ -2862,11 +2862,8 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta, não podendo ser desbloqueado deste modo. Se encontra bloqueado como parte do "range" $2, o qual pode ser desbloqueado.',
 'ip_range_invalid' => 'Gama de IPs inválida.',
 'ip_range_toolarge' => 'Intervalos de bloqueio maiores do que /$1 não são permitidos',
-'blockme' => 'Bloquear-me',
 'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta função está desabilitada.',
 'proxyblockreason' => 'O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.',
-'proxyblocksuccess' => 'Concluído.',
 'sorbsreason' => 'O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta',
 'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1',
index 74d13ac..bbe797c 100644 (file)
@@ -653,7 +653,7 @@ See also:
 \'\'\'Note:\'\'\' This is "views" as in "appearances"/"representations", \'\'\'not\'\'\' as in "visits"/"accesses".
 {{Identical|View}}',
 'toolbox' => 'The title of the toolbox below the search menu.
-{{Identical|Toolbox}}',
+{{Identical|Tool}}',
 'userpage' => '',
 'projectpage' => 'Used as link text in Talk page of project page.',
 'imagepage' => 'Used as link text in Talk page of file page.',
@@ -4508,7 +4508,8 @@ Example: [[:Image:Addon-icn.png]]',
 'filehist-dimensions' => 'Used as label in file description page.
 
 Followed by length, filesize, and width x height. e.g. "1.5 s (13 KB)".',
-'filehist-filesize' => 'In image description page',
+'filehist-filesize' => 'Used in image description page.
+{{Identical|File size}}',
 'filehist-comment' => 'In file description page
 
 {{Identical|Comment}}',
@@ -6617,33 +6618,18 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
-'blockme' => '{{doc-special|BlockMe|unlisted=1}}
-This feature is disabled by default.',
 'proxyblocker' => 'Used in [[Special:BlockMe]].
 
 See also:
 * {{msg-mw|proxyblocker-disabled}}
 * {{msg-mw|proxyblockreason}}
 * {{msg-mw|proxyblocksuccess}}',
-'proxyblocker-disabled' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-* {{msg-mw|proxyblocksuccess}}',
 'proxyblockreason' => 'Used as explanation of the reason in [[Special:BlockMe]].
 
 See also:
 * {{msg-mw|proxyblocker-disabled}}
 * {{msg-mw|proxyblocker}}
 * {{msg-mw|proxyblocksuccess}}',
-'proxyblocksuccess' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker-disabled}}
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-{{Identical|Done}}',
 'sorbs' => '{{optional}}',
 'sorbsreason' => 'See also:
 * {{msg-mw|Sorbsreason}}
index 7da7374..c03c5bf 100644 (file)
@@ -272,12 +272,12 @@ $messages = array(
 'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay",
 'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay",
 'tog-extendwatchlist' => "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu",
-'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas (JavaScript nisqallawanmi llamk'an)",
+'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas",
 'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay",
 'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy",
-'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan (JavaScript)",
+'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan",
 'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan",
-'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)",
+'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
 'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
 'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
 'tog-watchcreations' => "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
@@ -295,7 +295,7 @@ $messages = array(
 'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna",
 'tog-oldsig' => "Kachkaqña silq'uy:",
 'tog-fancysig' => "Silq'uyta wiki qillqa hinata llamk'achiy (mana kikinmanta t'inkichaq silq'uy)",
-'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (JavaScript) (llamiy aknaraq)",
+'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (llamiy aknaraq)",
 'tog-forceeditsummary' => "Ch'usaq llamk'apuy waqaychasqa kachkaptinqa ch'itiyay.",
 'tog-watchlisthideown' => "Watiqasqaykunapiqa ñuqap llamk'apusqaykunata pakay",
 'tog-watchlisthidebots' => "Watiqasqaykunapiqa rurana antachakunap llamk'apusqankunata pakay",
@@ -309,6 +309,7 @@ $messages = array(
 'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
 'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
 'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
+'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay",
 
 'underline-always' => "Hayk'appas",
 'underline-never' => "Mana hayk'appas",
@@ -409,7 +410,7 @@ $messages = array(
 'newwindow' => '(Musuq wintanam kichakun)',
 'cancel' => 'Ama niy',
 'moredotdotdot' => 'Aswan...',
-'morenotlisted' => 'Aswanqa sutisuyupi manam kanchu...',
+'morenotlisted' => "Kay sutisuyuqa manaraqmi hunt'asqachu.",
 'mypage' => "P'anqay",
 'mytalk' => 'Rimachinay',
 'anontalk' => 'Kay IP huchhapaq rimanakuy',
@@ -512,7 +513,7 @@ $1",
 # 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).
 'aboutsite' => '{{SITENAME}}manta',
 'aboutpage' => 'Project:{{SITENAME}}manta',
-'copyright' => "Ch'aqtasqakunataqa llamk'achinkiman <i>$1</i> nisqap ruraq hayñinkama",
+'copyright' => "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.",
 'copyrightpage' => '{{ns:project}}:Ruraqpa hayñin',
 'currentevents' => 'Kunan pacha',
 'currentevents-url' => 'Project:Kunan pacha',
@@ -673,7 +674,7 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 # Login and logout pages
 'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
 
-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.",
+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.',
@@ -716,7 +717,7 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay
 'createacct-emailrequired' => 'E-chaski imamayta',
 'createacct-emailoptional' => 'E-chaski imamayta (munaspayki)',
 'createacct-email-ph' => 'E-chaski imamaytaykita yaykuchiy',
-'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
+'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay",
 'createacct-realname' => 'Chiqap suti (munaspayki)',
 'createaccountreason' => 'Kayrayku:',
 'createacct-reason' => 'Kayrayku',
@@ -783,7 +784,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 
 Kay willay pantasqa kaptinqa, qhawarparillay.',
 'usernamehasherror' => 'Ruraqpa sutinqa ama iskaychakana (<nowiki>#</nowiki>) sananchayuqchu kachun',
-'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, suyariy manaraq musuqmanta yaykuykachaspa.',
+'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, $1 suyariy manaraq musuqmanta yaykuykachaspa.',
 'login-abort-generic' => 'Yaykuykachaspayki manam ayparqankichu - Allqasqa',
 'loginlanguagelabel' => 'Rimay: $1',
 'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
@@ -802,7 +803,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
 'newpassword' => 'Musuq yaykuna rima:',
 'retypenew' => 'Musuq yaykuna rimaykita takyachiy:',
 'resetpass_submit' => 'Yaykuna rimata hukchaspa yaykuy',
-'changepassword-success' => 'Yaykuna rimaykiqa hukchasqañam. Yaykamuchkankim...',
+'changepassword-success' => 'Yaykuna rimaykiqa aypalla hukchasqañam.',
 'resetpass_forbidden' => 'Manam saqillanchu yaykuna rimata hukchayta',
 'resetpass-no-info' => "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
 'resetpass-submit-loggedin' => 'Yaykuna rimata hukchay',
@@ -815,7 +816,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 # Special:PasswordReset
 'passwordreset' => 'Yaykuna rimata kutichiy',
 'passwordreset-text-one' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
-'passwordreset-text-many' => '{{PLURAL:$1|Kay willa rakikunamanta hukta yaykuchiy, yaykuna rimaykita kutichinaykipaq.}}',
+'passwordreset-text-many' => "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
 'passwordreset-legend' => 'Yaykuna rimata kutichiy',
 'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.',
 'passwordreset-emaildisabled' => "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
@@ -935,7 +936,7 @@ Astasqachá icha qullusqachá qhawachkaptiyki.',
 'accmailtitle' => 'Yaykuna rimaqa kachasqañam.',
 'accmailtext' => "Kikinmanta kamarisqa [[User talk:$1|$1]]-paq yaykuna rimaqa $2-manmi kachasqaña.
 
-Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay musuq rakiqunapaq yaykuna rimata hukchaytam atinki.",
+Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay yaykuna rimata hukchaytam atinki.",
 'newarticle' => '(Musuq)',
 'newarticletext' => "Manaraq kachkaq p'anqatam llamk'apuchkanki. Musuq p'anqata kamariyta munaspaykiqa, qillqarillay. Astawan ñawiriyta munaspaykiqa, [[{{MediaWiki:Helppage}}|yanapana p'anqata]] qhaway. Mana munaspaykitaq, ñawpaq p'anqaman ripuy.",
 'anontalkpagetext' => "---- ''Kayqa huk sutinnaq icha mana sutinta llamk'achiq ruraqpa rimanakuyninmi. IP huchhantam hallch'asunchik payta sutinchanapaq. Achka ruraqkunam huklla IP huchhanta llamk'achiyta atin. Sutinnaq ruraq kaspaykiqa, mana qampa rurasqaykimanta willamusqakunata rikuspaykiqa, ama hina kaspa [[Special:UserLogin/signup|rakiqunaykita kamariy]] icha [[Special:UserLogin|yaykuy]] huk sutinnaq ruraqkunawan ama pantasqa kanaykipaq.''",
@@ -1027,7 +1028,7 @@ Hallch'api qhipaq kaq yaykuchisqataqa kay qatiqpim rikunki willasunaykipaq:",
 'nocreate-loggedin' => "Manam saqillasunkichu musuq p'anqakunata kamariyta.",
 'sectioneditnotsupported-title' => "Raki allichayqa manam q'imisqachu",
 'sectioneditnotsupported-text' => "Raki allichayqa kay p'anqapi manam q'imisqachu.",
-'permissionserrors' => 'Saqillay pantasqakuna',
+'permissionserrors' => 'Saqillay pantasqa',
 'permissionserrorstext' => 'Manam saqillasunkichu, {{PLURAL:$1|kayraykum|kayraykum}}:',
 'permissionserrorstext-withaction' => 'Manam saqillasunkichu $2-ta, {{PLURAL:$1|kayraykum|kayraykum}}:',
 'recreate-moveddeleted-warn' => "'''Paqtataq: Ñawpaqta qullusqaña p'anqatam musuqmanta kamarichkanki.'''
@@ -1112,8 +1113,8 @@ $3-qa nirqan kayraykum: ''$2''",
 (ñawpaq) = ñawpaq kachkasqanwan huk kaykuna, a = aslla hukchasqa",
 'history-fieldset-title' => 'Wiñay kawsaypi maskay',
 'history-show-deleted' => 'Qullusqalla',
-'histfirst' => 'Ã\91awpaqkuna',
-'histlast' => 'Qhipaqkuna',
+'histfirst' => 'ñawpaqkuna',
+'histlast' => 'qhipaqkuna',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => "(ch'usaq)",
 
@@ -1362,7 +1363,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'prefs-rendering' => "Rikch'akuynin",
 'saveprefs' => 'Allinkachinakunata waqaychay',
 'resetprefs' => 'Mana waqaychasqa hukchasqakunaman ama niy',
-'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy',
+'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)',
 'prefs-editing' => "Llamk'apusqa",
 'rows' => 'Sinrukuna:',
 'columns' => 'Wachukuna:',
@@ -1418,11 +1419,11 @@ Chaytataq manam kutichiyta atinkichu.",
 'badsig' => "Chawa silq'usqaykiqa manam allinchu; HTML sananchakunata llanchiy.",
 'badsiglength' => 'Chutu sutiykiqa nisyu sunim.
 $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
-'yourgender' => 'Qhari icha warmi:',
-'gender-unknown' => 'Mana riqsisqa',
-'gender-male' => 'Qhari',
-'gender-female' => 'Warmi',
-'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq. Kay willayqa sapsim kanqa.",
+'yourgender' => 'Ima hina nisunkikutaq munanki?',
+'gender-unknown' => 'Manam willayta munanichu',
+'gender-male' => "Qharim wikita llamk'apun",
+'gender-female' => "Warmim wikita llamk'apun",
+'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq huk runakunaman willananpaqpas. Kay willayqa sapsim kanqa.",
 'email' => 'E-chaski',
 'prefs-help-realname' => "* Chiqap sutiyki (munaspaqa): quwaptiykiqa, llamk'apusqaykikunam paywan sananchasqa kanqa.",
 'prefs-help-email' => 'E-chaskita munaspayki akllayta atinki. Arí nispaykiqa, yaykuna rimata qunqaspayki musuq yaykuna rimata e-chaski imamaytaykiman kachachikamuyta atinki.',
@@ -1433,7 +1434,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'prefs-signature' => "Silq'uy",
 'prefs-dateformat' => "P'unchaw rikch'ay",
 'prefs-timeoffset' => 'Pacha wakinyay',
-'prefs-advancedediting' => 'Ñawparikusqa akllanakuna',
+'prefs-advancedediting' => 'Sapsi akllanakuna',
 'prefs-advancedrc' => 'Ñawparikusqa akllanakuna',
 'prefs-advancedrendering' => 'Ñawparikusqa akllanakuna',
 'prefs-advancedsearchoptions' => 'Ñawparikusqa akllanakuna',
@@ -1468,7 +1469,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'userrights-notallowed' => 'Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.',
 'userrights-changeable-col' => 'Hukchanayki huñukuna',
 'userrights-unchangeable-col' => 'Mana hukchanayki huñukuna',
-'userrights-conflict' => 'Ruraqpa hayñin tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.',
+'userrights-conflict' => 'Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.',
 
 # Groups
 'group' => 'Huñu:',
@@ -1512,7 +1513,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-reupload-shared' => 'Rakinakusqa midya waqaychanallapi kaq willañiqikunata huknachay',
 'right-upload_by_url' => 'URL tiyaymanta willañiqita churkuy',
 'right-purge' => "''Cache'' nisqa pakasqa hallch'ata ch'usaqchay mana takyachina p'anqawan",
-'right-autoconfirmed' => "Kuskan amachasqa p'anqakunata llamk'apuy",
+'right-autoconfirmed' => 'IP-pi tiksisqa achura saywakunapa manam saywachasqan kanqachu',
 'right-bot' => 'Rurana antachap ruraykachasqanta hina hatalliy',
 'right-nominornewtalk' => 'Kikinpa rimachinanpi uchuylla hukchasqakunata "musuq willaykuna" nisqapi mana rikuy',
 'right-apihighlimits' => "API maskanakunapi aswan hanaq saywakunata llamk'achiy",
@@ -1533,8 +1534,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-ipblock-exempt' => "IP hark'ayta, kikinmanta hark'ayta, tawqa hark'aytapas pulqaspa pasay",
 'right-proxyunbannable' => "Kikinmanta ''proxy'' nisqa sirwiq hark'ayta pulqaspa pasay",
 'right-unblockself' => "Kikinta hark'asqamanta qispikuy",
-'right-protect' => "Amachasqa kachkayta hukchay, amachasqa p'anqakunata llamk'apuy",
-'right-editprotected' => "Amachasqa p'anqakunata llamk'apuy (mana phaqcha amachasqa)",
+'right-protect' => "Amachasqa kachkayta hukchay, ch'aqtasqa amachasqa p'anqakunata llamk'apuy",
+'right-editprotected' => 'Amachasqa p\'anqakunata "{{int:protect-level-sysop}}" hina llamk\'apuy',
 'right-editinterface' => "Ruraqpaq uyapurata llamk'apuy",
 'right-editusercssjs' => "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy",
 'right-editusercss' => "Huk ruraqkunap CSS willañiqinkunata llamk'apuy",
@@ -1592,8 +1593,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'action-block' => "kay ruraqta llamk'apuymanta hark'ay",
 'action-protect' => "kay p'anqapaq amachana kamachisqakunata hukchay",
 'action-rollback' => "huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
-'action-import' => "kay p'anqata hawa wikimanta chaskimuy",
-'action-importupload' => "kay p'anqata willañiqi churkusqamanta chaskimuy",
+'action-import' => "p'anqakunata hawa wikimanta chaskimuy",
+'action-importupload' => "p'anqakunata willañiqi churkusqamanta chaskimuy",
 'action-patrol' => "huk ruraqpa llamk'apusqanta patrullasqa nispa sananchay",
 'action-autopatrol' => "kikiykip llamk'apusqaykita patrullasqa nispa sananchakuy",
 'action-unwatchedpages' => "mana watiqasqa p'anqa sutisuyuta qhaway",
@@ -1635,7 +1636,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'rc_categories_any' => 'Imallapas',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña',
 'newsectionsummary' => 'Musuq raki: /* $1 */',
-'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
+'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy',
 'rc-enhanced-hide' => 'Imaymanachakunata pakay',
 'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
 
@@ -1654,7 +1655,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'reuploaddesc' => "Churkuna hunt'ana p'anqaman kutimuy.",
 'upload-tryagain' => 'Hukchasqa willañiqimanta willaykunata kachay',
 'uploadnologin' => 'Manaraqmi yaykurqunkichu',
-'uploadnologintext' => '[[Special:UserLogin|Yaykunaykim]] tiyan willañiqikunata churkunaykipaq.',
+'uploadnologintext' => '$1 tiyan willañiqikunata churkunaykipaq.',
 'upload_directory_missing' => 'Churkuna willañiqi churanaqa ($1) manam kanchu. Llika sirwiqpas manam atinchu churkuna willañiqi churanata kamariyta.',
 'upload_directory_read_only' => "Llika sirwiqqa manam atinchu churkuna hallch'aman ($1) qillqayta.",
 'uploaderror' => 'Willañiqita churkunayaptiyki pantasqam tukurqan',
@@ -1873,8 +1874,7 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
 'upload_source_file' => ' (antañiqiqniykipi willañiqi)',
 
 # Special:ListFiles
-'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.
-Ruraqkama ch'illchispaykiqa, chay ruraq qhipaq churkuq kaptillan willañiqikunatam sutisuyup patanpi rikunki.",
+'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.",
 'listfiles_search_for' => 'Rikchap sutinta maskay:',
 'imgfile' => 'willañiqi',
 'listfiles' => 'Rikchakuna',
@@ -2184,7 +2184,8 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayq
 'listgrouprights' => 'Ruraq huñup hayñinkuna',
 'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
 Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgrouprights-helppage}}|kaypi qhaway]].",
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Qusqa hayñi</span>
+'listgrouprights-key' => 'T\'iktuna:
+* <span class="listgrouprights-granted">Qusqa hayñi</span>
 * <span class="listgrouprights-revoked">Qichusqa hayñi</span>',
 'listgrouprights-group' => 'Huñu',
 'listgrouprights-rights' => 'Hayñikuna',
@@ -2339,9 +2340,11 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 'deleteotherreason' => 'Huk rayku:',
 'deletereasonotherlist' => 'Huk rayku',
 'deletereason-dropdown' => "*Qulluypaq sapsi raykukuna
-** Kikin kamariqpa mañakusqan
+** Spam nisqa millay rurasqa
+** Wandaluchasqa
 ** Ruraqpa hayñinta k'irisqa
-** Wandaluchasqa",
+** Kikin kamariqpa mañakusqan
+** P'itisqa pusapuna",
 'delete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy",
 'delete-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqakunata qulluyqa saywachasqam, {{SITENAME}}ta mana waqllinapaq.",
 'delete-warning-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqata qulluspaykiqa, {{SITENAME}}ta waqllinkimanchá. Kay ruraymanta anchata yuyaychakuspa hamut'ay.",
@@ -2359,7 +2362,7 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 Qhipaq kaq llamk'apusqaqa [[User:$3|$3]]-pa ([[User talk:$3|rimanakuy]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) rurasqanmi.",
 'editcomment' => "Llamk'apusqakunamanta pisichasqaqa kay hinam: \"''\$1''\".",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|rimachina]]) sutiyuq ruraqpa hukchasqankunaqa kutichisqam [[User:$1|$1]]-pa ñawpaq hukchasqanman',
-'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam [[User:$1|$1]]-pa ñawpaq llamk'apusqanta paqarichispa",
+'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam {{GENDER:$1|[[User:$1|$1]]}}-pa ñawpaq llamk'apusqanta paqarichispa",
 'rollback-success' => "$1-pa hukchasqankunaqa kutichisqañam $2-pa ñawpaq llamk'apusqanta paqarichispa.",
 
 # Edit tokens
@@ -2493,7 +2496,7 @@ $1',
 'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
 'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna",
 'mycontris' => "Llamk'apusqaykuna",
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}}paq ($2)',
 'nocontribs' => 'Manam kay hina hukchasqakuna kanchu.',
 'uctop' => '(qhipaq hukchasqa)',
 'month' => 'Kay killamanta (ñawpaqmantapas):',
@@ -2644,11 +2647,8 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'ipb_blocked_as_range' => "Pantasqa: IP $1 huchhaqa manam chiqallachu hark'asqa kaptinmi manam paskanallachu. Chaywanpas, $2 patayayku kaspataq hark'asqam kachkan. Chay patayaykuqa hark'asqamanta paskanallam.",
 'ip_range_invalid' => "IP huchha k'itiqa manam chanichkanchu.",
 'ip_range_toolarge' => "/$1-manta aswan hatun k'iti hark'aykunaqa manam saqillasqachu.",
-'blockme' => "Hark'away",
 'proxyblocker' => "Proxy hark'aq",
-'proxyblocker-disabled' => 'Kay ruranamanqa ama nisqam.',
 'proxyblockreason' => "IP huchhaykiqa hark'asqam kichasqa proxy kaptinmi. Ama hina kaspa, internet mink'aqniykiman icha allwiya yanapaqniykiman kay hatun qasi sasachakuymanta willay.",
-'proxyblocksuccess' => 'Rurasqañam.',
 'sorbsreason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam.',
 'sorbs_create_account_reason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam. Manam atinkichu rakiqunata kichayta',
 'cant-block-while-blocked' => "Kikiyki hark'asqa kaspaykiqa, manam huk ruraqkunata hark'ayta atinkichu.",
@@ -3000,13 +3000,13 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'pageinfo-length' => "P'anqap chhikan (byte)",
 'pageinfo-article-id' => "P'anqap ID-nin",
 'pageinfo-language' => "P'anqap rimaynin",
-'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin',
-'pageinfo-robot-index' => 'Maskana yuyarinapaqpas',
-'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq',
+'pageinfo-robot-policy' => 'Maskana kuyuchinam yuyarinachan',
+'pageinfo-robot-index' => 'Saqillasqa',
+'pageinfo-robot-noindex' => 'Mana saqillasqa',
 'pageinfo-views' => "Hayk'a qhawaykuna",
 'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
 'pageinfo-few-watchers' => '$1-manta aswan pisi {{PLURAL:$1|qhawaq|qhawaqkuna}}',
-'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna",
+'pageinfo-redirects-name' => "Kay p'anqaman hayk'a pusampuqkuna",
 'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna",
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pusapuna|pusapunakuna}}; $3 {{PLURAL:$3|mana pusapuna|mana pusapunakuna}})',
 'pageinfo-firstuser' => "P'anqap kamariqnin",
@@ -3339,7 +3339,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 'exif-compression-4' => 'CCITT Huñu 4 tilifaks llawiy',
 
 'exif-copyrighted-true' => 'Iskaychay hayñi kan',
-'exif-copyrighted-false' => 'Sapsi kapuy',
+'exif-copyrighted-false' => "Ruraqpa iskaychay hayñin kachkayqa mana sut'ichasqachu",
 
 'exif-unknowndate' => "Mana riqsisqa p'unchaw",
 
@@ -3597,7 +3597,7 @@ Kay takyachina tuyruqa $4 pachapim puchukanqa.',
 'confirmemail_body_set' => 'Pipas, qamchiki, $1 IP huchhayuq tiyaymanta,
 hukcharqan {{SITENAME}}pi "$2" sutiyuq rakiqunapaq e-chaski imamaytatam kay imamaytaman.
 
-Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita musuqmanta takyachinaykipaq:
+Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita takyachinaykipaq:
 
 $3
 
index a83bdc3..f944b96 100644 (file)
@@ -2452,12 +2452,9 @@ Eventualmain è ella gia vegnida annulada.",
 Ella e bloccada en la zona d'adressas IP $2 che po vegnir debloccà.",
 'ip_range_invalid' => "Zona d'adressas IP nunvalida.",
 'ip_range_toolarge' => "Zonas da bloccadas pli grondas che /$1 n'èn betg lubidas.",
-'blockme' => 'Bloccar mai',
 'proxyblocker' => 'Bloccar proxys',
-'proxyblocker-disabled' => 'Questa funcziun è deactivada.',
 'proxyblockreason' => "Tia adressa IP è vegnida bloccada perquai ch'ella è in proxy avert. 
 Contactescha tes provider dals survetschs d'internet u ils administraturs dal sistem ed als infurmescha davart quest problem da segirezza pussaivel.",
-'proxyblocksuccess' => 'Terminà.',
 'sorbsreason' => 'Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.',
 'sorbs_create_account_reason' => "Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.
 Ti na pos betg crear in conto d'utilisader.",
index 81d6ae0..2304fb6 100644 (file)
@@ -438,7 +438,7 @@ $messages = array(
 'noindex-category' => 'Pagini neindexate',
 'broken-file-category' => 'Pagini cu legături invalide către fișiere',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Despre',
 'article' => 'Articol',
@@ -518,7 +518,7 @@ $messages = array(
 'articlepage' => 'Vedeți articolul',
 'talk' => 'Discuție',
 'views' => 'Vizualizări',
-'toolbox' => 'Trusa de unelte',
+'toolbox' => 'Unelte',
 'userpage' => 'Vizualizați pagina utilizatorului',
 'projectpage' => 'Vizualizați pagina proiectului',
 'imagepage' => 'Vizualizați pagina fișierului',
@@ -2824,12 +2824,9 @@ Jurnalul suprimărilor este indicat mai jos:',
 Face parte din area de blocare $2, care nu poate fi deblocată.',
 'ip_range_invalid' => 'Serie IP invalidă.',
 'ip_range_toolarge' => 'Blocările mai mari de /$1 nu sunt permise.',
-'blockme' => 'Blochează-mă',
 'proxyblocker' => 'Blocaj de proxy',
-'proxyblocker-disabled' => 'Această funcție este dezactivată.',
 'proxyblockreason' => 'Adresa dumneavoastră IP a fost blocată pentru că este un proxy deschis.
 Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii IT și să-i informați asupra acestei probleme serioase de securitate.',
-'proxyblocksuccess' => 'Realizat.',
 'sorbsreason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în DNSBL.',
 'sorbs_create_account_reason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în lista neagră DNS.
 Nu vă puteți crea un cont',
index 393d036..425d0e1 100644 (file)
@@ -165,7 +165,7 @@ $messages = array(
 'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Sus a',
 'article' => 'Pàgene de le condenute',
@@ -2615,12 +2615,9 @@ Pò essere ca ha state già sbloccate.",
 Jidde ha state bloccate cumme parte de l'indervalle $2, ca pò essere sbloccate.",
 'ip_range_invalid' => "L'indervalle de l'IP non g'è valide.",
 'ip_range_toolarge' => 'Le indervalle de le blocche cchiù larie de /$1 non ge sonde permesse.',
-'blockme' => 'Bloccheme',
 'proxyblocker' => 'Bloccaore de proxy',
-'proxyblocker-disabled' => "'A funzione ha state disabbilitete.",
 'proxyblockreason' => "L'indirizze IP tue ha state bloccate purcè jè 'nu proxy apirte.
 Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbormescele de stu serie probbleme de securezze.",
-'proxyblocksuccess' => 'Spicciete.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.",
 'sorbs_create_account_reason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.
index afcb7f7..a595abe 100644 (file)
@@ -55,6 +55,7 @@
  * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
+ * @author Ivan Shmakov
  * @author Jackie
  * @author JenVan
  * @author Jl
@@ -1449,9 +1450,10 @@ $1",
 'revdelete-concurrent-change' => 'Ошибка изменения записи от $2, $1: её статус был изменён кем-то другим, пока вы пытались изменить его.
 Пожалуйста, проверьте журналы.',
 'revdelete-only-restricted' => 'Ошибка сокрытия записи от $2 $1: вы не можете скрыть запись от просмотра администраторами без выбора одной из других настроек сокрытия.',
-'revdelete-reason-dropdown' => 'Стандартные причины удаления
+'revdelete-reason-dropdown' => 'Стандартные причины удаления
 ** Нарушение авторских прав
 ** Неуместные личные сведения
+** Неуместное имя участника
 ** Потенциально клеветнические сведения',
 'revdelete-otherreason' => 'Другая/дополнительная причина:',
 'revdelete-reasonotherlist' => 'Другая причина',
@@ -2965,11 +2967,8 @@ $1',
 'ipb_blocked_as_range' => 'Ошибка: IP-адрес $1 был заблокирован не напрямую и не может быть разблокирован. Однако, он принадлежит к заблокированному диапазону $2, который можно разблокировать.',
 'ip_range_invalid' => 'Недопустимый диапазон IP-адресов.',
 'ip_range_toolarge' => 'Блокировки диапазонов свыше /$1 запрещены.',
-'blockme' => 'Заблокируй меня',
 'proxyblocker' => 'Блокировка прокси',
-'proxyblocker-disabled' => 'Функция отключена.',
 'proxyblockreason' => 'Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.',
-'proxyblocksuccess' => 'Выполнено.',
 'sorbsreason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL.',
 'sorbs_create_account_reason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.',
 'xffblockreason' => 'Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1',
index a7375db..a82354e 100644 (file)
@@ -2586,12 +2586,9 @@ $1',
 'ipb_blocked_as_range' => 'Хыба: IP-адреса $1 не є блокована прямо а так єй не є можне одблоковати. Є частёв заблокованого россягу $2, котрый може быти одблокованый.',
 'ip_range_invalid' => 'Неплатный IP россяг.',
 'ip_range_toolarge' => 'Блокованя россягів векшых як  /$1 не є дозволене.',
-'blockme' => 'Заблокуй ня',
 'proxyblocker' => 'Блокованя проксі',
-'proxyblocker-disabled' => 'Тота фунція є выпнута.',
 'proxyblockreason' => 'Ваша IP-адреса была заблокована, зато же фунґує як отвореный проксі сервер. 
 Контактуйте свого Інтернет-провайдера або технічну підпору і інформуйте їх о тім серьёзнім беспечностнім проблемі.',
-'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'Ваша IP-адреса є веджена як отвореный проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса є веджена як одкрытый проксі в DNSBL. З той адресы собі не можете створити конто.',
 'xffblockreason' => 'IP адреса написана в голові X-Forwarded-For, ці уж ваша, або проксі сервера, што хоснуєете, была заблокована. Оріґінална прічіна того блокованя: $1',
index 36a4d5b..15635a1 100644 (file)
@@ -2639,12 +2639,9 @@ $1 इत्यस्य अवरोधस्य कारणं तु "$2" 
 $2 इति प्रकारस्य अवरोधं कर्तुं शक्यते यत् अनवरोधमिच्छति ।',
 'ip_range_invalid' => 'अमान्यः ऐपिप्रकारः',
 'ip_range_toolarge' => '/$1 तः अधिकं वृहत्प्रकारकः अवरोधः नानुमतः ।',
-'blockme' => 'माम् अवरुणद्धु ।',
 'proxyblocker' => 'प्रतिहस्तकः अवरोधकः ।',
-'proxyblocker-disabled' => 'अयं कार्यकलापः निष्क्रियः ।',
 'proxyblockreason' => 'भवतः ऐपि सङ्केतः अवरुद्धः  यतः अयं कश्चन मुक्तप्रतिहस्तकः । 
 अन्तर्जालसेवादायकं सम्पर्कयतु गभीरायाः सुरक्षासमस्यायाः विषये सूचयतु च',
-'proxyblocksuccess' => 'समापित ।',
 'sorbsreason' => 'DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः',
 'sorbs_create_account_reason' => 'DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।',
 'cant-block-while-blocked' => 'अन्ययोजकान् अवरोद्धुं भवान् नैव शक्नोति यतः भवान् अवरुद्धः ।',
index a525e96..ebc7d1c 100644 (file)
@@ -2543,11 +2543,8 @@ $1',
 'ipb_blocked_as_range' => 'Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа суох. Ол гынан баран IP бу $2 диапазон сорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун устуохха) сөп.',
 'ip_range_invalid' => 'IP-лар диапазоннара сатаммат.',
 'ip_range_toolarge' => 'Мантан  /$1 үөһэ диапазоннары хааччахтыыр сатаммат.',
-'blockme' => 'Миигин боп (блокируйдаа)',
 'proxyblocker' => 'Прокси бобуллуута',
-'proxyblocker-disabled' => 'Бу дьайыы араарыллыбыт.',
 'proxyblockreason' => 'Эн IP-ҥ аһаҕас прокси эбит, онон бобулунна. Интернет-провайдергын эбэтэр техническэй сулууспаны кытта сибээстэһэн кутталлаах суол баарын биллэр.',
-'proxyblocksuccess' => 'Сатанна.',
 'sorbsreason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.',
 'sorbs_create_account_reason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар. Саҥаттан бэлиэтэнэр кыаҕыҥ суох.',
 'xffblockreason' => 'X-Forwarded-For баһыгар баар IP-аадырыс бобуллубут. Бу IP Эйиэнэ эбэтэр туһанар проксиҥ гиэнэ буолуон сөп. Бобуу төрүөтэ маннык эбит: $1',
index 99e5c2b..0b18a5c 100644 (file)
@@ -1035,8 +1035,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
 'block-log-flags-noemail' => 'E-mail do esetgea',
 'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea',
-'blockme' => 'Esedińmẽ',
-'proxyblocksuccess' => 'Hoena',
 
 # Move page
 'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ',
index 9476231..705e417 100644 (file)
@@ -177,7 +177,7 @@ $messages = array(
 'index-category' => 'Pàginas indicizadas',
 'noindex-category' => 'Pàginas no indicitzadas',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'A propòsitu de',
 'article' => 'Artìculu',
@@ -1208,8 +1208,6 @@ Abbàida sa [[Special:BlockList|lista de IP bloccados]] pro bìder sas bloccadur
 'blocklogentry' => 'bloccau [[$1]] pro unu tempu de $2 $3',
 'unblocklogentry' => 'at sbloccau $1',
 'block-log-flags-nocreate' => 'creatzione account bloccada',
-'blockme' => 'Blocca·mi',
-'proxyblocksuccess' => 'Fatu.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
index 51ba6e0..4a257c8 100644 (file)
@@ -2145,11 +2145,8 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]]
 'ipb_cant_unblock' => 'Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.',
 'ipb_blocked_as_range' => 'Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.',
 'ip_range_invalid' => 'Ntervallu di ndirizzi IP nun vàlidu.',
-'blockme' => 'Blocca a mia',
 'proxyblocker' => 'Blocca proxy',
-'proxyblocker-disabled' => 'Sta funzioni nun è attiva.',
 'proxyblockreason' => "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
-'proxyblocksuccess' => 'Esiquitu.',
 'sorbsreason' => 'Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.',
 'sorbs_create_account_reason' => 'Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.',
 'cant-block-while-blocked' => 'Nun putiti bluccari àutri utenti ntô mentri ca vui stissi siti bluccati.',
index a0e2972..736c64f 100644 (file)
@@ -1230,7 +1230,6 @@ tae an afore-blockit IP address or uisername.',
 'block-log-flags-nocreate' => 'accoont-makkin blockit',
 'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.',
 'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.',
-'proxyblocksuccess' => 'Duin',
 'sorbsreason' => 'Yer IP address is leetit as an open proxy in the DNSBL.',
 'sorbs_create_account_reason' => 'Yer IP address is leetit as an open proxy in the DNSBL. Ye canna mak an accoont',
 
index fb2921f..2c4cb3b 100644 (file)
@@ -1513,11 +1513,8 @@ $1",
 'ipb_cant_unblock' => 'Errori: Impussìbiri acciappà lu broccu cun ID $1. Lu broccu pudia assé già isthaddu buggaddu.',
 'ipb_blocked_as_range' => "Errori: L'indirizzu IP $1 nò è broccaddu individuaimmenti e nò pó assé ibbruccaddu. Lu broccu è inveci attibu a libellu di l'intervallu  $2, chi pó assé ibbruccaddu.",
 'ip_range_invalid' => "Intervallu d'indirizzi ip nò vàriddu.",
-'blockme' => 'Broccami',
 'proxyblocker' => 'Broccu di li proxy abbérthi',
-'proxyblocker-disabled' => 'Chistha funzioni nò è attiba.',
 'proxyblockreason' => "Chisth'indirizzu IP è isthaddu broccaddu parchí risultha assé un proxy abbérthu. Pa piazeri cuntattà lu propriu frunidori di sivvìzi pa la reti pa infuimmalli di chisthu grabi probrema di sigguriddai.",
-'proxyblocksuccess' => 'Broggu eseguiddu.',
 'sorbsreason' => "Chisth'indirizzu IP è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
 'sorbs_create_account_reason' => "Nò è pussìbiri crià nobi registhrazioni da chisthu indirizzu IP parchí è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
 
index a58585c..3233988 100644 (file)
@@ -1214,7 +1214,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'blocklink' => 'hehtte',
 'contribslink' => 'rievdadusat',
 'blocklogentry' => 'esttii geavaheaddji dahje IP-čujuhusa [[$1]], eastima bistin lea $2 $3',
-'proxyblocksuccess' => 'Gárvvis.',
 
 # Developer tools
 'lockdb' => 'Gidde diehtovuođu',
index 322ec1e..95e53d8 100644 (file)
@@ -1532,7 +1532,6 @@ onkstiau ožbluokoutam IP adresō a nauduotuojō.',
 'ipb_expiry_invalid' => 'Galiuojėma čiesos nelaistėns.',
 'ipb_already_blocked' => '„$1“ jau ožblokouts',
 'ipb-needreblock' => '$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?',
-'proxyblocksuccess' => 'Padarīt.',
 
 # Developer tools
 'unlockdbtext' => 'Atrakėnos doumenū baze grōžėns galimībe vėsėm
index 34aeed9..5bafdd5 100644 (file)
@@ -2708,12 +2708,9 @@ Možda je već deblokirana.',
 Međutim, možda je blokirana kao dio bloka $2, koji se može deblokirati.',
 'ip_range_invalid' => 'Netačan raspon IP adresa.',
 'ip_range_toolarge' => 'Grupne blokade veće od /$1 nisu dozvoljene.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi.  
 Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
 'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
 Ne možete napraviti račun',
index adcee78..4f40b1f 100644 (file)
@@ -331,7 +331,7 @@ $messages = array(
 'noindex-category' => 'සූචිගත නොකළ පිටු',
 'broken-file-category' => 'භින්න වූ ගොනු සබැඳි සහිත පිටු',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'පිළිබඳ',
 'article' => 'පටුන',
@@ -2601,12 +2601,9 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 එනමුදු, එය, $2 පරාසයෙහි කොටසක් ලෙස වාරණයට ලක් කොට ඇති අතර, එහි වාරණය අත්හිටුවිය හැක.',
 'ip_range_invalid' => 'අනීතික අන්තර්ජාල ලිපින පරාසයකි.',
 'ip_range_toolarge' => '/$1 ට වඩා විශාල පරාස කොටස්වලට ඉඩ ලබා නොදේ.',
-'blockme' => 'මා වාරණය කරන්න',
 'proxyblocker' => 'ප්‍රතියුක්ත (ප්‍රොක්සි) වාරණකරු',
-'proxyblocker-disabled' => 'මෙම කෘත්‍යය අක්‍රීය කොට ඇත.',
 'proxyblockreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය විවෘත ප්‍රතියුක්තයක් (ප්‍රොක්සි) බැවින් එය වාරණය කොට ඇත.
 ඔබගේ අන්තර්ජාල සේවා ප්‍රතිපාදකයා හෝ තාක්ෂණික අනුග්‍රාහකයා හෝ අමතා මෙම බරපතළ ආරක්ෂණ ගැටළුව ඔවුනට නිරාවරණය කරන්න.',
-'proxyblocksuccess' => 'සිදුකලා.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත.',
 'sorbs_create_account_reason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත.
index eb8b9e4..65f1589 100644 (file)
@@ -2760,11 +2760,8 @@ blokované IP adresy nie sú zahrnuté. Pozri zoznam
 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 nie je blokovaná priamo a nie je ju teda možné odblokovať. Je však blokovaná v rámci rozsahu $2, ktorý je možné odblokovať.',
 'ip_range_invalid' => 'Neplatný IP rozsah.',
 'ip_range_toolarge' => 'Bloky rozsahov väčšie ako /$1 nie sú povolené.',
-'blockme' => 'Zablokuj ma',
 'proxyblocker' => 'Blokovač proxy',
-'proxyblocker-disabled' => 'Táto funkcia je vypnutá.',
 'proxyblockreason' => 'Vaša IP adresa bola zablokovaná, pretože je otvorená proxy. Prosím kontaktujte vášho internetového poskytovateľa alebo technickú podporu a informujte ich o tomto vážnom bezpečnostnom probléme.',
-'proxyblocksuccess' => 'Hotovo.',
 'sorbsreason' => 'Vaša IP adresa je vedená ako nezabezpečený proxy server v DNSBL.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je vedená ako nezabezpečený proxy server v databáze DNSBL, ktorú používa {{SITENAME}}. Nemôžete si vytvoriť účet.',
 'cant-block-while-blocked' => 'Nemôžete blokovať iných používateľov, kým ste zablokovaný.',
index bad752f..040fef7 100644 (file)
@@ -2746,12 +2746,9 @@ Ali želite spremeniti nastavitve blokade?',
 Je pa blokiran kot del območja $2, ki ga lahko odblokirate.',
 'ip_range_invalid' => 'Neveljaven IP-razpon.',
 'ip_range_toolarge' => 'Območja blokade večja od /$1 niso dovoljena.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Blokator posredniških strežnikov',
-'proxyblocker-disabled' => 'Funkcija je onemogočena.',
 'proxyblockreason' => 'Ker uporabljate odprti posredniški strežnik, je urejanje z vašega IP-naslova preprečeno.
 Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehnično podporo.',
-'proxyblocksuccess' => 'Storjeno.',
 'sorbsreason' => 'Vaš IP-naslov je v DNSBL uvrščen med odprte posredniške strežnike.',
 'sorbs_create_account_reason' => 'Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).
 Računa žal ne morete ustvariti.',
@@ -3769,7 +3766,7 @@ Prosimo, potrdite, da jo resnično želite znova ustvariti.",
 'confirm-unwatch-top' => 'Odstranim stran z vašega spiska nadzorov?',
 
 # Separators for various lists, etc.
-'percent' => '$1 %',
+'percent' => '$1&#160;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← prejšnja stran',
index bb2ca41..d9f0412 100644 (file)
@@ -1694,10 +1694,7 @@ Siehe de [[Special:BlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]] fi
 'ipb_cant_unblock' => 'Fahler: Sperr-ID $1 ne gefunda. De Sperre wurde bereits uffgehuba.',
 'ipb_blocked_as_range' => 'Fahler: De IP-Atresse $1 wurde ols Teel dar Bereichssperre $2 indirekt gesperrt. Anne Entsperrung vu $1 alleene ies ne meeglich.',
 'ip_range_invalid' => 'Ungiltiger IP-Atressbereich.',
-'blockme' => 'Sperre miech',
-'proxyblocker-disabled' => 'Diese Funksjonn ies deaktiviert.',
 'proxyblockreason' => 'Denne IP-Atresse wurde gesperrt, do se a offener Proxy ies. Bitte kontaktiere denn Internet-Provider oder denne Systemadministratoren und informiere se ieber dieses meegliche Sicherheetsproblem.',
-'proxyblocksuccess' => 'Fattich',
 'sorbsreason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet.',
 'sorbs_create_account_reason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet. Doas Oalega neuer Nutzer ies ne meeglich.',
 'cant-block-while-blocked' => 'Du koast kenne andern Nutzer sperra, während du selbst gesperrt best',
index 0ad5309..cfba54f 100644 (file)
@@ -1300,8 +1300,6 @@ Eeg [[Special:BlockList|Mamnuucyada]] si aad u aragto liiska mamnuucyada ee hadd
 'block-log-flags-nocreate' => 'sameynta gudagalah lamaogola',
 'block-log-flags-noemail' => 'e-mailka laga mamnuucay',
 'ipb-needreblock' => '$1 mar hore aa la mamnuucay. marabtaa in aad wax ka bedesho habka?',
-'blockme' => 'I mamnuuc',
-'proxyblocksuccess' => 'waa la sameeyay.',
 
 # Move page
 'movenologin' => 'Gudaha kuma jirtid',
index 7c2e633..35a67cb 100644 (file)
@@ -2601,11 +2601,8 @@ Mund të jetë zhbllokuar.',
 Ajo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.',
 'ip_range_invalid' => 'Shtrirje IP gabim.',
 'ip_range_toolarge' => 'Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.',
-'blockme' => 'Më blloko',
 'proxyblocker' => 'Bllokuesi i ndërmjetëseve',
-'proxyblocker-disabled' => 'Ky funksion është pamundësuar.',
 'proxyblockreason' => 'IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.',
-'proxyblocksuccess' => 'Mbaruar.',
 'sorbsreason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.',
 'sorbs_create_account_reason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.',
 'cant-block-while-blocked' => 'Ju nuk mund të bllokoni përdorues të tjerë ndërkohë që jeni i bllokuar.',
index b36c9c4..88c90c4 100644 (file)
@@ -536,7 +536,7 @@ $messages = array(
 'noindex-category' => 'Непописане странице',
 'broken-file-category' => 'Странице с неисправним везама до датотека',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'О нама',
 'article' => 'Страница са садржајем',
@@ -860,14 +860,15 @@ $2',
 'userlogin-resetpassword-link' => 'Ресетујте лозинку',
 'helplogin-url' => 'Help:Logging in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]',
+'userlogin-createanother' => 'Отвори још један налог',
 'createacct-join' => 'Унесите своје податке испод',
 'createacct-another-join' => 'Унесите податке за нови налог испод.',
 'createacct-emailrequired' => 'Адреса е-поште',
-'createacct-emailoptional' => 'Адреса е-поште (опцијоно)',
+'createacct-emailoptional' => 'Адреса е-поште (опционо)',
 'createacct-email-ph' => 'Унесите вашу адресу е-поште',
 'createacct-another-email-ph' => 'Унесите адресу е-поште',
 'createaccountmail' => 'Користите привремену, случајно створену лозинку и пошаљите на наведену адресу електронске поште',
-'createacct-realname' => 'Право име (опцијоно)',
+'createacct-realname' => 'Право име (опционо)',
 'createaccountreason' => 'Разлог:',
 'createacct-reason' => 'Разлог',
 'createacct-reason-ph' => 'Зашто правите још један налог?',
@@ -2775,7 +2776,7 @@ $1',
 'contributions' => '{{GENDER:$1|Кориснички}} доприноси',
 'contributions-title' => 'Доприноси {{GENDER:$1|корисника|кориснице|корисника}} $1',
 'mycontris' => 'Доприноси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Измене које одговарају овим условима нису пронађене.',
 'uctop' => '(последња)',
 'month' => 'од месеца (и раније):',
@@ -2933,12 +2934,9 @@ $1',
 Она је блокирана као део блокаде $2, која може бити деблокирана.',
 'ip_range_invalid' => 'Неисправан распод ИП адреса.',
 'ip_range_toolarge' => 'Опсежна блокирања већа од /$1 нису дозвољена.',
-'blockme' => 'Блокирај ме',
 'proxyblocker' => 'Блокер посредника',
-'proxyblocker-disabled' => 'Ова функција је онемогућена.',
 'proxyblockreason' => 'Ваша ИП адреса је блокирана јер представља отворени посредник.
 Обратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.',
-'proxyblocksuccess' => 'Урађено.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.
@@ -4103,7 +4101,7 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => 'Потпуно обрисана страница',
-'autosumm-replace' => 'Замена садржаја са „$1“',
+'autosumm-replace' => 'Замена садржаја странице са „$1“',
 'autoredircomment' => 'Преусмерење на [[$1]]',
 'autosumm-new' => 'Направљена страница са: „$1“',
 
index f1ea384..55ce97b 100644 (file)
@@ -444,7 +444,7 @@ $messages = array(
 'noindex-category' => 'Nepopisane stranice',
 'broken-file-category' => 'Stranice s neispravnim vezama do datoteka',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'O nama',
 'article' => 'Stranica sa sadržajem',
@@ -759,10 +759,10 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
 'createacct-join' => 'Unesite svoje podatke ispod.',
 'createacct-emailrequired' => 'Adresa e-pošte',
-'createacct-emailoptional' => 'Adresa e-pošte (opcijono)',
+'createacct-emailoptional' => 'Adresa e-pošte (opciono)',
 'createacct-email-ph' => 'Unesite vašu adresu e-pоšte',
 'createaccountmail' => 'Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adresu elektronske pošte',
-'createacct-realname' => 'Pravo ime (opcijono)',
+'createacct-realname' => 'Pravo ime (opciono)',
 'createaccountreason' => 'Razlog:',
 'createacct-reason' => 'Razlog',
 'createacct-reason-ph' => 'Zašto pravite još jedan nalog?',
@@ -2629,7 +2629,7 @@ $1',
 'contributions' => '{{GENDER:$1|Korisnički}} doprinosi',
 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
 'mycontris' => 'Doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.',
 'uctop' => '(poslednja)',
 'month' => 'od meseca (i ranije):',
@@ -2787,12 +2787,9 @@ Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
 Ona je blokirana kao deo blokade $2, koja može biti deblokirana.',
 'ip_range_invalid' => 'Neispravan raspod IP adresa.',
 'ip_range_toolarge' => 'Opsežna blokiranja veća od /$1 nisu dozvoljena.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker posrednika',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer predstavlja otvoreni posrednik.
 Obratite se vašem dobavljaču internet usluga ili tehničku podršku i obavestite ih o ovom ozbiljnom bezbednosnom problemu.',
-'proxyblocksuccess' => 'Urađeno.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.
@@ -3938,7 +3935,7 @@ Potvrdite da stvarno želite da napravite stranicu.",
 
 # Auto-summaries
 'autosumm-blank' => 'Potpuno obrisana stranica',
-'autosumm-replace' => 'Zamena sadržaja sa „$1“',
+'autosumm-replace' => 'Zamena sadržaja stranice sa „$1“',
 'autoredircomment' => 'Preusmerenje na [[$1]]',
 'autosumm-new' => 'Napravljena stranica sa: „$1“',
 
index 9fcdd63..89997c0 100644 (file)
@@ -2237,11 +2237,8 @@ Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässen un Benutsernoome
 'ipb_blocked_as_range' => 'Failer: Ju IP-Adresse $1 wuude as Deel fon ju Beräksspeere $2 indirekt speerd. Ne Äntspeerenge fon $1 alleene is nit muugelk.',
 'ip_range_invalid' => 'Uungultige IP-Adräsberäk.',
 'ip_range_toolarge' => 'Adräsberäkke, do der gratter sunt as /$1, sunt nit ferlööwed.',
-'blockme' => 'Speer mie',
 'proxyblocker' => 'Proxy blokker',
-'proxyblocker-disabled' => 'Disse Funktion is deaktivierd.',
 'proxyblockreason' => 'Jou IP-Adrässe wuude speerd, deer ju n eepenen Proxy is. Kontaktierje jädden Jou Provider af Jou Systemtechnik un informierje Jou jou uur dit muugelke Sicherhaidsproblem.',
-'proxyblocksuccess' => 'Kloor.',
 'sorbsreason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested.',
 'sorbs_create_account_reason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested. Du koast neen Benutser-Account anlääse.',
 'cant-block-while-blocked' => 'Du duurst neen uur Benutsere speere, wan du sälwen speerd bäst.',
index e8e7e2f..410e1ba 100644 (file)
@@ -2157,11 +2157,8 @@ Pikeun rujukan, logna dipidangkeun di handap ieu:',
 'unblock-hideuser' => 'Anjeun teu bisa muka peungpeuk ieu pamaké, kusabab landihanan keur disumputkeun.',
 'ipb_cant_unblock' => 'Éror: ID peungpeuk $1 teu kapanggih. Sigana mah geus dibuka.',
 'ip_range_invalid' => 'Angka IP teu bener.',
-'blockme' => 'Peungpeuk kuring',
 'proxyblocker' => 'Pameungpeuk proxy',
-'proxyblocker-disabled' => 'Ieu fungsi keur ditumpurkeun.',
 'proxyblockreason' => "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
-'proxyblocksuccess' => 'Réngsé.',
 'sorbsreason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL.",
 'sorbs_create_account_reason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
 'cant-block-while-blocked' => 'Lamun keur dipeungpeuk, anjeun teu bisa meungpeuk séjén kontributor.',
index 1ca2f1a..30dd4d0 100644 (file)
@@ -334,17 +334,17 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Göm patrullerade sidor från listan över nya sidor',
 'tog-extendwatchlist' => 'Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste',
 'tog-usenewrc' => 'Gruppera ändringar efter sida i senaste ändringar och bevakningslistan',
-'tog-numberheadings' => 'Numrerade rubriker',
-'tog-showtoolbar' => 'Visa redigerings-verktygsraden',
+'tog-numberheadings' => 'Automatisk numrerade rubriker',
+'tog-showtoolbar' => 'Visa redigeringsverktygsraden',
 'tog-editondblclick' => 'Redigera sidor med dubbelklick',
 'tog-editsection' => 'Aktivera redigering av avsnitt genom [redigera]-länkar',
 'tog-editsectiononrightclick' => 'Aktivera redigering av avsnitt genom högerklick på underrubriker',
-'tog-showtoc' => 'Visa innehållsförteckning (för sidor som har minst fyra rubriker)',
+'tog-showtoc' => 'Visa innehållsförteckning (för sidor med minst fyra rubriker)',
 'tog-rememberpassword' => 'Kom ihåg min inloggning på den här webbläsaren (i maximalt $1 {{PLURAL:$1|dygn|dygn}})',
-'tog-watchcreations' => 'Lägg till sidor jag skapar i min bevakningslista',
-'tog-watchdefault' => 'Lägg till sidor jag redigerar i min bevakningslista',
-'tog-watchmoves' => 'Lägg till sidor jag flyttar i min bevakningslista',
-'tog-watchdeletion' => 'Lägg till sidor jag raderar i min bevakningslista',
+'tog-watchcreations' => 'Lägg till sidor jag skapar och filer jag laddar upp till min bevakningslista',
+'tog-watchdefault' => 'Lägg till sidor och filer jag redigerar i min bevakningslista',
+'tog-watchmoves' => 'Lägg till sidor och filer jag flyttar i min bevakningslista',
+'tog-watchdeletion' => 'Lägg till sidor och filer jag raderar i min bevakningslista',
 'tog-minordefault' => 'Markera automatiskt ändringar som mindre',
 'tog-previewontop' => 'Visa förhandsgranskningen ovanför redigeringsrutan',
 'tog-previewonfirst' => 'Visa förhandsgranskning när redigering påbörjas',
@@ -544,7 +544,7 @@ $messages = array(
 'articlepage' => 'Visa innehållssida',
 'talk' => 'Diskussion',
 'views' => 'Visningar',
-'toolbox' => 'Verktygslåda',
+'toolbox' => 'Verktyg',
 'userpage' => 'Visa användarsida',
 'projectpage' => 'Visa projektsida',
 'imagepage' => 'Visa filsida',
@@ -1547,7 +1547,7 @@ Programvaran använder detta värde för att adressera dig till andra med rätt
 'prefs-help-realname' => 'Riktigt namn behöver inte anges.
 Om du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.',
 'prefs-help-email' => 'Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.',
-'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar-eller diskussionssida utan att avslöja din identitet.',
+'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar- eller diskussionssida utan att avslöja din identitet.',
 'prefs-help-email-required' => 'E-postadress måste anges.',
 'prefs-info' => 'Grundläggande information',
 'prefs-i18n' => 'Internationalisering',
@@ -1599,7 +1599,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 # Groups
 'group' => 'Grupp:',
 'group-user' => 'Användare',
-'group-autoconfirmed' => 'Bekräftade användare',
+'group-autoconfirmed' => 'Automatiskt bekräftade användare',
 'group-bot' => 'Robotar',
 'group-sysop' => 'Administratörer',
 'group-bureaucrat' => 'Byråkrater',
@@ -2844,11 +2844,8 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
 'ipb_blocked_as_range' => 'Fel: IP-adressen $1 är inte direkt blockerad, och kan därför inte avblockeras. Adressen är blockerad som en del av IP-intervallet $2, som kan avblockeras.',
 'ip_range_invalid' => 'Ogiltigt IP-intervall.',
 'ip_range_toolarge' => 'Blockering av block större än /$1 är inte tillåtna.',
-'blockme' => 'Blockera mig',
 'proxyblocker' => 'Proxy-block',
-'proxyblocker-disabled' => 'Den här funktionen är avaktiverad.',
 'proxyblockreason' => 'Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.',
-'proxyblocksuccess' => 'Gjort.',
 'sorbsreason' => 'Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.',
 'sorbs_create_account_reason' => 'Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.
 Du får inte skapa ett användarkonto',
index 499b2b0..d8ef376 100644 (file)
@@ -2294,8 +2294,6 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
 'block-log-flags-noemail' => 'barua pepe imezuiliwa',
 'block-log-flags-hiddenname' => 'jina la mtumiaji limefichwa',
 'ipb_already_blocked' => '"$1" tayari imeshazuiwa',
-'blockme' => 'Nizuie',
-'proxyblocksuccess' => 'Tayari.',
 
 # Developer tools
 'lockdb' => 'Funga hifadhidata',
index f915f20..c70d627 100644 (file)
@@ -2002,12 +2002,9 @@ Coby přejřeć lista uobecńy aktywnych zawarć, přyńdź na zajta [[Special:B
 'ipb_blocked_as_range' => 'Feler: Adres IP $1 ńy zostou zawarty bezpośredńo i ńy može zostać uodymkńjynty.
 Noležy uůn do zawartygo zakresu adresůw $2. Uodymknůńć možno ino couki zakres.',
 'ip_range_invalid' => 'Ńypoprowny zakres adresów IP.',
-'blockme' => 'Zawryj mi sprowjyńa',
 'proxyblocker' => 'Zawjyrańe proxy',
-'proxyblocker-disabled' => 'Ta fůnkcyjo je wůuůnčůna.',
 'proxyblockreason' => 'Twůj adres IP zostou zawarty, bo je to adres uotwartygo proxy.
 Sprawa noležy wyjaśńić s dostawcům Internetu abo půmocům techńičnům informujůnc uo tym powažnym problymje s bezpječyństwym.',
-'proxyblocksuccess' => 'Wykůnane.',
 'sorbsreason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
 'sorbs_create_account_reason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.
 Ńy možeš utwořić kůnta',
index e112f26..d2fd4c6 100644 (file)
@@ -2429,12 +2429,9 @@ $1',
 'ipb_blocked_as_range' => 'தவறு:இந்த ஐ.பி. $1 நேரடியாக தடைச் செய்யப்படவில்லை எனவே தடையை நீக்க முடியாது. இது $2 என்ற ஐ.பி. வீச்சு தடைச் செய்யப்பட்டதால் தடைச் செய்யப்பட்டுள்ளது இவ்வீச்சிற்கான தடையை நீக்க முடியும்.',
 'ip_range_invalid' => 'செல்லுபடியற்ற ஐ.பி. வீச்சு',
 'ip_range_toolarge' => '/$1 க்கு பெரிய வரம்பு தடுப்புகள் அனுமதிக்கப்படவில்லை.',
-'blockme' => 'என்னை தடைச் செய்',
 'proxyblocker' => 'மறைவணுக்கம் (புரொக்சி) தடுப்பி',
-'proxyblocker-disabled' => 'இந்தச் செயல் செயலிழக்கச் முடக்கப்பட்டுள்ளது.',
 'proxyblockreason' => 'உங்கள் IP முகவரி தடை செய்யப்பட்டுள்ளது ஏனெனில் இது ஒரு திறந்த பதிலி(proxy).
 தயவுசெய்து உங்கள் இணைய சேவை வழங்குபவரையோ அல்லது உங்கள் நிறுவனத்தின் தொழில்நுட்ப ஆதரவையோ தொடர்பு கொள்ளவும் மேலும் அவர்களிடம் இந்த கடுமையான பாதுகாப்பு பிரச்சினை பற்றி தெரிவியுங்கள்.',
-'proxyblocksuccess' => 'வெற்றி.',
 'sorbsreason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக  DNSBL  பயன்படுத்தப்படுவதாக  {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது.',
 'sorbs_create_account_reason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக  DNSBL  பயன்படுத்தப்படுவதாக  {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது.
 உங்களால் கணக்கை உருவாக்க இயலாது.',
index 2f40eb2..8e8cbb8 100644 (file)
@@ -2433,11 +2433,8 @@ $1',
 'ipb_blocked_as_range' => 'లోపం: ఐపీ $1 ను నేరుగా నిరోధించలేదు, అంచేత నిరోధాన్ని రద్దుపరచలేము.  అయితే, అది $2 శ్రేణిలో భాగంగా నిరోధానికి గురైంది, ఈ శ్రేణిపై ఉన్న నిరోధాన్ని రద్దుపరచవచ్చు.',
 'ip_range_invalid' => 'సరైన ఐపీ శ్రేణి కాదు.',
 'ip_range_toolarge' => '/$1  కంటే పెద్దవైన సామూహిక నిరోధాలు అనుమతించబడవు.',
-'blockme' => 'నన్ను నిరోధించు',
 'proxyblocker' => 'ప్రాక్సీ నిరోధకం',
-'proxyblocker-disabled' => 'ఈ ఫంక్షన్ను అశక్తం చేసాం.',
 'proxyblockreason' => 'మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీ కాబట్టి దాన్ని నిరోధించాం. మీ ఇంటర్నెట్ సేవాదారుని గానీ, సాంకేతిక సహాయకుని గానీ సంప్రదించి తీవ్రమైన ఈ భద్రతా వైఫల్యాన్ని గురించి తెలపండి.',
-'proxyblocksuccess' => 'పూర్తయింది.',
 'sorbsreason' => '{{SITENAME}} వాడే DNSBLలో మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీగా నమోదై ఉంది.',
 'sorbs_create_account_reason' => 'మీ ఐపీ అడ్రసు DNSBL లో ఓపెను ప్రాక్సీగా నమోదయి ఉంది. మీరు ఎకౌంటును సృష్టించజాలరు.',
 'cant-block-while-blocked' => 'నిరోధంలో ఉన్న మీరు ఇతర వాడుకరులపై నిరోధం అమలుచేయలేరు.',
index 46dcd5c..f7ea5cd 100644 (file)
@@ -1720,11 +1720,8 @@ $1',
 'ipb_cant_unblock' => 'Хато: Нишонаи баста шудани $1 ёфт нашуд. Мумкин аст пештар боз шуда бошад.',
 'ipb_blocked_as_range' => 'Хато: Нишонаи IP-и $1 ба шакли мустақим баста нашудааст ва наметавонад боз шавад. Ин нишона ҳамроҳи $2, баста шуда қобили боз шудан аст.',
 'ip_range_invalid' => 'Сафи IP номӯътабар аст.',
-'blockme' => 'Дастрасии манро қать кун',
 'proxyblocker' => 'Проксибанд',
-'proxyblocker-disabled' => 'Ин амал ғайрифаъол шудааст.',
 'proxyblockreason' => 'Аз сабаби пешкор боз (open proxy) буданаш, нишонаи IP-и шумо баста шудааст. Лутфан бо таъминкунандаи хизматҳои Интернетии худ ё пуштибони техникӣ тамос бигиред ва онҳоро бо ин мушкилии амниятии муҳим огоҳ кунед.',
-'proxyblocksuccess' => 'Анҷом шуд.',
 'sorbsreason' => 'Нишонаи IP-и шумо ҳамчун як проксии кушода дар DNSBL феҳрист шудааст, ки аз тарафи {{SITENAME}} истифода мешавад.',
 'sorbs_create_account_reason' => 'Нишонаи IP-и шумо ҳамчун проксии кушода дар DNSBL, ки аз тарафи {{SITENAME}} истифода мешавад, феҳрист шудааст. Шумо наметавонед ҳисоби корабариеро эҷод кунед',
 
index 07f31cc..40debf6 100644 (file)
@@ -1507,11 +1507,8 @@ Baroi fehristi mahrumijatho va basta şudanhoi amalijoti kununī ba [[Special:Bl
 'ipb_cant_unblock' => 'Xato: Nişonai basta şudani $1 joft naşud. Mumkin ast peştar boz şuda boşad.',
 'ipb_blocked_as_range' => 'Xato: Nişonai IP-i $1 ba şakli mustaqim basta naşudaast va nametavonad boz şavad. In nişona hamrohi $2, basta şuda qobili boz şudan ast.',
 'ip_range_invalid' => "Safi IP nomū'tabar ast.",
-'blockme' => 'Dastrasiji manro qatь kun',
 'proxyblocker' => 'Proksiband',
-'proxyblocker-disabled' => "In amal ƣajrifa'ol şudaast.",
 'proxyblockreason' => "Az sababi peşkor boz (open proxy) budanaş, nişonai IP-i şumo basta şudaast. Lutfan bo ta'minkunandai xizmathoi Internetiji xud jo puştiboni texnikī tamos bigired va onhoro bo in muşkiliji amnijatiji muhim ogoh kuned.",
-'proxyblocksuccess' => 'Ançom şud.',
 'sorbsreason' => 'Nişonai IP-i şumo hamcun jak proksiji kuşoda dar DNSBL fehrist şudaast, ki az tarafi {{SITENAME}} istifoda meşavad.',
 'sorbs_create_account_reason' => 'Nişonai IP-i şumo hamcun proksiji kuşoda dar DNSBL, ki az tarafi {{SITENAME}} istifoda meşavad, fehrist şudaast. Şumo nametavoned hisobi korabariero eçod kuned',
 
index c955c06..a0d9ec1 100644 (file)
@@ -647,6 +647,8 @@ $1',
 'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่',
 'helplogin-url' => 'Help:การล็อกอิน',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
+'userlogin-loggedin' => 'คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว
+ใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง',
 'userlogin-createanother' => 'สร้างอีกบัญชี',
 'createacct-join' => 'กรอกสารสนเทศของคุณด้านล่าง',
 'createacct-another-join' => 'กรอกข้อมูลของบัญชีใหม่ด้านล่าง',
@@ -1105,7 +1107,7 @@ $2
 คุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
 'rev-suppressed-diff-view' => "รุ่นหนึ่งของผลต่างนี้'''ถูกยับยั้ง'''
 คุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
-'rev-delundel' => 'à¹\81สà¸\94à¸\87/à¸\8bà¹\88อà¸\99',
+'rev-delundel' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\97ัศà¸\99วิสัย',
 'rev-showdeleted' => 'แสดง',
 'revisiondelete' => 'ลบ/กู้คืนรุ่น',
 'revdelete-nooldid-title' => 'ไม่มีรุ่นที่ต้องการ',
@@ -1429,6 +1431,8 @@ $1",
 'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้',
+'userrights-conflict' => 'พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ',
+'userrights-removed-self' => 'คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีกต่อไป',
 
 # Groups
 'group' => 'กลุ่ม:',
@@ -2107,6 +2111,8 @@ $1',
 'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1',
+'cachedspecial-viewing-cached-ts' => 'คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจไม่เป็นจริงทั้งหมด',
 'cachedspecial-refresh-now' => 'ดูล่าสุด',
 
 # Special:Categories
@@ -2130,7 +2136,7 @@ $1',
 'linksearch-ok' => 'ค้นหา',
 'linksearch-text' => 'สามารถใช้ตัวแทนเช่น "*.wikipedia.org" ได้
 ต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"<br />
-{PLURAL:$2|โพรโทคอล}}ที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)',
+{{PLURAL:$2|โพรโทคอล}}ที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)',
 'linksearch-line' => '$1 ถูกลิงก์จาก $2',
 'linksearch-error' => 'อักขระตัวแทนอยู่ได้เฉพาะหน้าชื่อโฮสต์เท่านั้น',
 
@@ -2309,9 +2315,11 @@ $UNWATCHURL
 'deleteotherreason' => 'เหตุผลอื่น/เพิ่มเติม:',
 'deletereasonotherlist' => 'เหตุผลอื่น',
 'deletereason-dropdown' => '* เหตุผลการลบทั่วไป
-** รับแจ้งจากผู้เขียน
+** สแปม
+** ก่อกวน
 ** ละเมิดลิขสิทธิ์
-** ก่อกวน',
+** ผู้เขียนร้องขอ
+** การเปลี่ยนทางเสีย',
 'delete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
 'delete-toobig' => 'หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ',
 'delete-warning-toobig' => 'หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง',
@@ -2329,7 +2337,7 @@ $UNWATCHURL
 ผู้แก้ไขล่าสุดของหน้านี้คือ [[User:$3|$3]] ([[User talk:$3|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])',
 'editcomment' => "คำอธิบายอย่างย่อคือ: \"''\$1''\"",
 'revertpage' => 'ย้อนการแก้ไขของ [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ไปยังรุ่นของ [[User:$1|$1]]',
-'revertpage-nouser' => 'ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88ระà¸\9aุà¸\8aืà¹\88อà¹\84à¸\9bยัà¸\87รุà¹\88à¸\99ลà¹\88าสุà¸\94à¹\82à¸\94ย [[User:$1|$1]]',
+'revertpage-nouser' => 'ยà¹\89อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88ระà¸\9aุà¸\8aืà¹\88อà¹\84à¸\9bยัà¸\87รุà¹\88à¸\99สุà¸\94à¸\97à¹\89ายà¹\82à¸\94ย {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'ย้อนรุ่นที่แก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2',
 
 # Edit tokens
@@ -2471,7 +2479,7 @@ $1',
 'contributions' => 'เรื่องที่เขียนโดย{{GENDER:$1|ผู้ใช้}}นี้',
 'contributions-title' => 'เรื่องที่เขียนโดย $1',
 'mycontris' => 'เรื่องที่เขียน',
-'contribsub2' => 'สำหรับ $1 ($2)',
+'contribsub2' => 'สำหรับ {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้',
 'uctop' => '(ปัจจุบัน)',
 'month' => 'จากเดือน (และก่อนหน้า):',
@@ -2629,11 +2637,8 @@ $1',
 อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้',
 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง',
 'ip_range_toolarge' => 'พิสัยบล็อกที่มีขนาดใหญ่กว่า /$1 จะไม่ได้รับอนุญาต',
-'blockme' => 'บล็อกฉัน',
 'proxyblocker' => 'บล็อกพร็อกซี',
-'proxyblocker-disabled' => 'ฟังก์ชันนี้ถูกปิดใช้งาน',
 'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้',
-'proxyblocksuccess' => 'สำเร็จ',
 'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้',
 'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ 
 คุณไม่สามารถสร้างบัญชีได้',
@@ -2659,6 +2664,7 @@ $1',
 'unlockdbsuccesstext' => 'ปลดล็อกฐานข้อมูลเรียบร้อย',
 'lockfilenotwritable' => 'ไม่สามารถล็อกฐานข้อมูลได้ เนื่องจากการเขียนลงฐานข้อมูล การล็อกและการปลดล็อกจำเป็นต้องทำที่เว็บเซิร์ฟเวอร์',
 'databasenotlocked' => 'ฐานข้อมูลไม่ได้ล็อก',
+'lockedbyandtime' => '(โดย {{GENDER:$1|$1}} เมื่อวันที่ $2 เวลา $3)',
 
 # Move page
 'move-page' => 'ย้าย $1',
@@ -2898,7 +2904,7 @@ $1',
 'tooltip-t-recentchangeslinked' => 'รายการปรับปรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้',
 'tooltip-feed-rss' => 'ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้',
 'tooltip-feed-atom' => 'ฟีดอะตอม (Atom) ของหน้านี้',
-'tooltip-t-contributions' => 'รายà¸\81ารà¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\84à¸\99à¸\99ีà¹\89',
+'tooltip-t-contributions' => 'รายการเรื่องที่เขียนโดยผู้ใช้นี้',
 'tooltip-t-emailuser' => 'ส่งอีเมลถึงผู้ใช้นี้',
 'tooltip-t-upload' => 'อัปโหลดไฟล์',
 'tooltip-t-specialpages' => 'รายการหน้าพิเศษทั้งหมด',
@@ -3057,8 +3063,8 @@ $1',
 'filedelete-archive-read-only' => 'ไดเรกทอรีกรุชื่อ "$1" ไม่สามารถเขียนลงได้โดยเว็บเซิร์ฟเวอร์',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ก่อนหน้า',
-'nextdiff' => 'à¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ถัดไป →',
+'previousdiff' => 'â\86\90 à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ก่อนหน้า',
+'nextdiff' => 'à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ถัดไป →',
 
 # Media information
 'mediawarning' => "'''คำเตือน''': ไฟล์รูปแบบนี้อาจมีโค้ดที่ไม่พึงประสงค์
index 4a29ea1..30a9c33 100644 (file)
@@ -778,8 +778,8 @@ $3 tarapyndan görkezilen sebäp: ''$2''",
 '''({{int:last}})''' = öňündäki wersiýadan tapawudy, '''{{int:minoreditletter}}''' = ujypsyzja özgerdiş.",
 'history-fieldset-title' => 'Geçmişe göz aýla',
 'history-show-deleted' => 'Diňe öçürilenler',
-'histfirst' => 'Iň irki',
-'histlast' => 'Ýaňy-ýakyndaky',
+'histfirst' => 'iň köne',
+'histlast' => 'iň täze',
 'historysize' => '({{PLURAL:$1|1 baýt|$1 baýt}})',
 'historyempty' => '(boş)',
 
@@ -1282,7 +1282,7 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'rc_categories' => 'Kategoriýalar bilen çäklendir ("|" bilen aýyr)',
 'rc_categories_any' => 'Islendik',
 'newsectionsummary' => '/* $1 */ täze bölüm',
-'rc-enhanced-expand' => 'Jikme-jiklikleri görkez (JavaScript gerekli)',
+'rc-enhanced-expand' => 'Jikme-jikligi görkez',
 'rc-enhanced-hide' => 'Jikme-jiklikleri gizle',
 
 # Recent changes linked
@@ -2055,9 +2055,9 @@ $1',
 'contributions' => '{{GENDER:$1|Ulanyjy}} goşantlary',
 'contributions-title' => '$1 üçin ulanyjy goşantlary',
 'mycontris' => 'Goşantlar',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} üçin ($2)',
 'nocontribs' => 'Bu kriteriýlere gabat gelýän üýtgeşme ýok.',
-'uctop' => '(iň soňky)',
+'uctop' => '(häzirki)',
 'month' => 'Aý:',
 'year' => 'Ýyl:',
 
@@ -2192,12 +2192,9 @@ Blokirlemesi eýýäm aýyrylan bolmagy mümkin.',
 Emma, bu adres $2 diapazonynyň bir bölegi hökmünde blokirlenipdir, diapazon blokirlemesini aýryp bilersiňiz.',
 'ip_range_invalid' => 'Nädogry IP diapazony.',
 'ip_range_toolarge' => '/$1 blokdan uly aralyk blokirlemelere rugsat berilmeýär',
-'blockme' => 'Meni blokirle',
 'proxyblocker' => 'Proksi blokirleýji',
-'proxyblocker-disabled' => 'Bu funksiýa ýapyk.',
 'proxyblockreason' => 'IP adresiňiz açyk proksidigi sebäpli blokirlenipdir.
 Internet üpjün edijiňiz ýa-da goldaw gullugy bilen habarlaşyp, olary bu çynlakaý howpsuzlyk problemasy barada habardar ediň.',
-'proxyblocksuccess' => 'Ýerine ýetirildi.',
 'sorbsreason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.',
 'sorbs_create_account_reason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.
 Hasap açyp bilmeýärsiňiz.',
index 8a0f804..1d33355 100644 (file)
@@ -285,7 +285,7 @@ $messages = array(
 'broken-file-category' => 'Mga pahina na may sirang mga kawing ng talaksan',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Patungkol',
 'article' => 'Pahina ng nilalaman',
@@ -2591,11 +2591,8 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
 'ipb_blocked_as_range' => 'Mali: Hindi diretsong nakaharang ang IP na $1 at hindi maaaring tanggalin sa pagkakaharang. Bagaman, bahagi ito sa sakop na $2, na maaaring tanggalin sa pagkaharang.',
 'ip_range_invalid' => 'Hindi tamang sakop ng IP.',
 'ip_range_toolarge' => 'Hindi pinapayagan ang mga saklaw ng pagharang na mas malaki kaysa /$1.',
-'blockme' => 'Harangin ako',
 'proxyblocker' => 'Pangharang ng proxy',
-'proxyblocker-disabled' => 'Nakapatay ang pagharang sa proxy.',
 'proxyblockreason' => 'Hinarang ang IP address mo dahil bukas na proxy ito. Makipag-ugnayan sa iyong tagabigay ng serbisyong Internet o suportang teknikal at ipaalam sa kanila itong seryesong suliranin sa seguridad.',
-'proxyblocksuccess' => 'Tapos na.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito.',
 'sorbs_create_account_reason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito. Hindi ka makakalikha ng akawnt',
index 5deddb1..1329371 100644 (file)
@@ -890,7 +890,6 @@ Vakai ki he [[Special:Log/delete|hokohoko tāmateʻi]] ki he lekooti ʻo e ngaah
 'ipb_already_blocked' => 'Kuo ʻosi taʻofi ʻa e "$1"',
 'ipb_cant_unblock' => 'Hala: naʻe ʻikai ʻilo ko e taʻofi fika $1. Mahalo pē kuo ʻosi ʻene taʻetaʻofi.',
 'ip_range_invalid' => 'ʻOku taʻeʻaonga ʻa e fakavā IP',
-'proxyblocksuccess' => 'Kuo fai.',
 
 # Developer tools
 'lockdb' => 'Lokaʻi ʻa e tānekingaʻilo',
index d9accb7..a32169b 100644 (file)
@@ -36,6 +36,7 @@
  * @author LuCKY
  * @author Mach
  * @author Manco Capac
+ * @author Meelo
  * @author Metal Militia
  * @author Mirzali
  * @author Mskyrider
@@ -1550,8 +1551,8 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
 'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
 'gender-unknown' => 'Söylemek istemiyorsanız',
-'gender-male' => 'Wiki düzenlemelerinde erkek olarak',
-'gender-female' => 'Wiki düzenlemelerinde kadın olarak',
+'gender-male' => 'Viki sayfalarını erkek olarak düzenliyorum',
+'gender-female' => 'Viki sayfalarını kadın olarak düzenliyorum',
 'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
 Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
 Bu bilgiler herkes tarafından görülebilir.',
@@ -2789,12 +2790,9 @@ Engelleme kaldırılmış olabilir.',
 Ancak, bu adres $2 aralığının parçası olarak engellenmiş, aralık engellemesini kaldırabilirsiniz.',
 'ip_range_invalid' => 'Geçersiz IP aralığı.',
 'ip_range_toolarge' => '/$1 bloktan daha büyük aralık bloklarına izin verilmez.',
-'blockme' => 'Beni engelle',
 'proxyblocker' => 'Proxy engelleyici',
-'proxyblocker-disabled' => 'Bu işlev devre dışı bırakıldı.',
 'proxyblockreason' => 'IP adresiniz açık bir proxy olduğu için engellendi.
 Lütfen İnternet sevis sağlayınız ile ya da teknik destek ile irtibat kurun ve bu ciddi güvenlik probleminden haberdar edin.',
-'proxyblocksuccess' => 'Tamamlanmıştır.',
 'sorbsreason' => "IP adresiniz, {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.",
 'sorbs_create_account_reason' => "IP adresiniz {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.
 Hesap oluşturamazsınız",
index bb8c4f5..479dea8 100644 (file)
@@ -348,7 +348,7 @@ $messages = array(
 'noindex-category' => 'Индексланмаган битләр',
 'broken-file-category' => 'Файлларга эшләми торган сылтамалар булган битләр',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Тасвирлама',
 'article' => 'Мәкалә',
@@ -1992,7 +1992,6 @@ $1',
 'block-log-flags-noemail' => 'хат җибәрү тыелган',
 'block-log-flags-hiddenname' => 'кулланучының исеме яшерелгән',
 'proxyblocker' => 'Прокси тыю',
-'proxyblocksuccess' => 'Эшләнде',
 'sorbsreason' => 'Сезнең IP адресыгыз DNSBLда ачык прокси дип санала.',
 
 # Developer tools
index 4fbc4eb..36d1197 100644 (file)
@@ -216,7 +216,7 @@ $messages = array(
 'index-category' => 'İndekslanğan bitlär',
 'noindex-category' => 'İndekslanmağan bitlär',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Taswirlama',
 'article' => 'Mäqälä',
@@ -1687,7 +1687,6 @@ $1',
 'ipb_expiry_invalid' => 'İskärü waqıtı xatalı.',
 'ip_range_invalid' => 'Xatalı IP arası.',
 'proxyblocker' => 'Proksi tıyu',
-'proxyblocksuccess' => 'Eşlände',
 'sorbsreason' => 'Sezneñ IP adresığız DNSBLda açıq proksi dip sanala.',
 
 # Developer tools
index 7c16f4a..ac03870 100644 (file)
@@ -151,7 +151,7 @@ $messages = array(
 'index-category' => 'Индексировать кароно бамъёс',
 'noindex-category' => 'Индексировать каронтэм бамъёс',
 
-'linkprefix' => '/^(.*?)(„|«)$/sDu',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'Та сярысь',
 'article' => 'Статья',
index f30bce4..16c052b 100644 (file)
@@ -173,7 +173,7 @@ $messages = array(
 'broken-file-category' => 'ھۆججەت ئۇلىنىشى بۇزۇلغان بەتلەر',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'ھەققىدە',
 'article' => 'مۇندەرىجە',
@@ -2518,12 +2518,9 @@ $1',
 ئەمما ئۇ $2 نىڭ چەكلەش دائىرىسى ئىچىدە، بۇ دائىرىنى چەكلەشتىن بىكار قىلغىلى بولىدۇ.',
 'ip_range_invalid' => 'IP دائىرىسى ئىناۋەتسىز.',
 'ip_range_toolarge' => '/$1 دىن چوڭ بولغان چەكلەش دائىرىسىگە يول قويۇلمايدۇ.',
-'blockme' => 'مېنى چەكلە',
 'proxyblocker' => 'ۋاكالەتچىنى چەكلىگۈچى',
-'proxyblocker-disabled' => 'بۇ ئىقتىدار چەكلەنگەن.',
 'proxyblockreason' => 'IP ئادرېسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن.
 ئىنتېرنېت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تېخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئېغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.',
-'proxyblocksuccess' => 'تامام',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.',
 'sorbs_create_account_reason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.
index 5fd2c79..da3ebcd 100644 (file)
@@ -504,7 +504,7 @@ $messages = array(
 'broken-file-category' => 'Сторінки, що посилаються на неіснуючі файли',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'Про',
 'article' => 'Стаття',
@@ -1595,9 +1595,9 @@ $1",
 'badsiglength' => 'Ваш підпис дуже довгий.
 Повинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.',
 'yourgender' => 'Як ви волієте бути описаним?',
-'gender-unknown' => 'Я Ð½Ðµ Ð²Ð¾Ð»Ñ\96Ñ\8e Ð´ÐµÑ\82алÑ\96зÑ\83ваÑ\82и',
-'gender-male' => 'Ð\92Ñ\96н Ñ\80едагÑ\83Ñ\94 Ð²Ñ\96кÑ\96\81Ñ\82оÑ\80Ñ\96нки',
-'gender-female' => 'Ð\92она Ñ\80едагÑ\83Ñ\94 Ð²Ñ\96кÑ\96\81Ñ\82оÑ\80Ñ\96нки',
+'gender-unknown' => 'Ð\9dе Ð²Ð¸Ð·Ð½Ð°Ñ\87ена',
+'gender-male' => 'ЧоловÑ\96Ñ\87а',
+'gender-female' => 'Ð\96Ñ\96ноÑ\87а',
 'prefs-help-gender' => "Задання цього параметру - необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.
 Ця інформація загальнодоступна.",
 'email' => 'Електронна пошта',
@@ -2913,12 +2913,9 @@ $1',
 'ipb_blocked_as_range' => 'Помилка: IP-адреса $1 була заблокована не напряму і не може бути розблокована. Однак, вона належить до заблокованого діапазону $2, який можна розблокувати.',
 'ip_range_invalid' => 'Неприпустимий діапазон IP-адрес.',
 'ip_range_toolarge' => 'Блокування діапазонів, більших за /$1, не дозволені.',
-'blockme' => 'Заблокуй мене',
 'proxyblocker' => 'Блокування проксі',
-'proxyblocker-disabled' => 'Функція відключена.',
 'proxyblockreason' => "Ваша IP-адреса заблокована, тому що це — відкритий проксі.
 Будь ласка, зв'яжіться з вашим Інтернет-провайдером чи службою підтримки й повідомте їм про цю серйозну проблему безпеки.",
-'proxyblocksuccess' => 'Виконано.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.',
index c33570f..cc5d0f7 100644 (file)
@@ -1427,7 +1427,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'contribslink' => 'شـراکـت',
 'blocklogpage' => 'نوشتۂ پابندی',
 'block-log-flags-nocreate' => 'کھاتے کی تخلیق غیرفعال',
-'proxyblocksuccess' => 'کردیا.',
 
 # Move page
 'move-page' => 'منتقلی',
index d89d929..41ba94b 100644 (file)
@@ -236,7 +236,7 @@ $messages = array(
 'noindex-category' => 'Indekslanmaydigan sahifalar',
 'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xffʻʼ«„])))(.+)$/sDu',
 
 'about' => 'Haqida',
 'article' => 'Sahifa',
@@ -1463,7 +1463,6 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'blocklogentry' => '$2 muddatga [[$1]]ni chetlashtirdi $3',
 'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
 'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi",
-'proxyblocksuccess' => 'Bajarildi.',
 
 # Move page
 'move-page' => '$1 — qayta nomlash',
index da6ccc3..cd96f55 100644 (file)
@@ -2567,11 +2567,8 @@ Qua soto ghe xe el registro de le sopression:',
 'ipb_blocked_as_range' => "Eror: L'indirizo IP $1 no'l xe sogeto a bloco individual e no'l pol èssar sblocà. El bloco el xe invesse ativo a livel de l'intervalo $2, che el pol èssar sblocà.",
 'ip_range_invalid' => 'Intervało de indirissi IP mìa vałido.',
 'ip_range_toolarge' => 'No se pol mia blocar intervali piassè grandi de /$1',
-'blockme' => 'Blòcheme',
 'proxyblocker' => 'Bloco dei proxy verti',
-'proxyblocker-disabled' => 'Sta funzion la xe disabilità.',
 'proxyblockreason' => 'Sto indirizo IP el xe stà blocà parché el risulta èssar un proxy verto. Se prega de contatar el proprio fornitor de acesso a Internet o el suporto tènico e dirghe de sto grave problema de sicureza.',
-'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Sto indirizo IP el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'No se pol crear acessi novi da sto indirizo IP parché el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
 'xffblockreason' => "Un indiriso IP presente ne l'intestasion X-Forwarded-For, tuo o del server proxy che te sì drio doparar, el xe stà blocà. La motivasion originale del bloco la xe: $1",
index 03321d2..a724c1e 100644 (file)
@@ -2075,12 +2075,9 @@ Alemba om anttud blokiruindaiglehtez:',
 'ipb_cant_unblock' => 'Petuz: ei voi löuta ID $1:n blokiruindad.
 Voib olda, se om jo heittud.',
 'ip_range_invalid' => 'Vär IP-diapazon.',
-'blockme' => 'Blokiruigat mindai',
 'proxyblocker' => 'Proxy-blokator',
-'proxyblocker-disabled' => 'Nece funkcii ei ole kävutamas.',
 'proxyblockreason' => 'Teiden IP-adres om blokiruidud, sikš miše se om avoin proksi.
 Olgat hüväd, säkat pagin teiden Internet-provaideranke i kirjutagat hänele necen varuitomuden problemas.',
-'proxyblocksuccess' => 'Vaumiž.',
 'sorbsreason' => 'Teiden IP-adres om ozutadud kut avaitud proksi {{SITENAME}}-saitan DNSBL-an mustas nimikirjuteses.',
 'cant-block-while-blocked' => 'Teile ei sa blokiruida toižid kävutajid, sikš miše tö iče olet blokiruidud.',
 
index f95d7c6..c5803ed 100644 (file)
@@ -854,8 +854,7 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỏ trống ô
 
 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 $1 rồi thử lại.',
+'login-throttled' => 'Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.',
 'login-abort-generic' => 'Thất bại khi đăng nhập',
 '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ư.',
@@ -1031,7 +1030,7 @@ Có thể nó đã bị di chuyển hoặc xóa đi trong khi bạn đang xem tr
 'accmailtitle' => 'Đã gửi mật khẩu.',
 'accmailtext' => "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
 'newarticle' => '(Mới)',
-'newarticletext' => '<div style="margin-top: 0px;" class="emptymwmsg mediawiki_newarticletext"></div>',
+'newarticletext' => "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [[{{MediaWiki:Helppage}}|trang trợ giúp]] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (''Back'') trong trình duyệt của bạn.",
 'anontalkpagetext' => "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.
 Do đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.
 Một địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.
@@ -2510,9 +2509,11 @@ Xin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy c
 'deleteotherreason' => 'Lý do khác/bổ sung:',
 'deletereasonotherlist' => 'Lý do khác',
 'deletereason-dropdown' => '*Các lý do xóa phổ biến
-** Tác giả yêu cầu
+** Đăng tỉ thư rác
+** Phá hoại
 ** Vi phạm bản quyền
-** Phá hoại',
+** Tác giả yêu cầu
+** Chuyển hướng sai',
 'delete-edit-reasonlist' => 'Sửa lý do xóa',
 'delete-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
 Việc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoại do vô ý cho {{SITENAME}}.',
@@ -2825,11 +2826,8 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'ipb_blocked_as_range' => 'Lỗi: Địa chỉ IP $1 không bị cấm trực tiếp và do đó không thể bỏ cấm. Tuy nhiên, nó bị cấm do là một bộ phận của dải IP $2, bạn có thể bỏ cấm dải này.',
 'ip_range_invalid' => 'Dải IP không hợp lệ.',
 'ip_range_toolarge' => 'Không được phép cấm dải IP lớn hơn /$1.',
-'blockme' => 'Cấm tôi',
 'proxyblocker' => 'Cấm proxy',
-'proxyblocker-disabled' => 'Chức năng này đã bị tắt.',
 'proxyblockreason' => 'Địa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bộ phận hỗ trợ kỹ thuật của bạn và thông báo với họ về vấn đề an ninh nghiêm trọng này.',
-'proxyblocksuccess' => 'Xong.',
 'sorbsreason' => 'Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.',
 'sorbs_create_account_reason' => 'Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.',
 'xffblockreason' => 'Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1',
index 832415e..11b0ea3 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Altaileopard
+ * @author Bua333
  * @author Matma Rex
  * @author Midnight Gambler
  * @author Silvicola
@@ -103,7 +104,12 @@ $messages = array(
 'friday' => 'Freidooch',
 'saturday' => 'Samsdooch',
 'sun' => 'Su',
+'mon' => 'Mon',
+'tue' => 'Die',
+'wed' => 'Mid',
 'thu' => 'Du',
+'fri' => 'Fre',
+'sat' => 'Sam',
 'january' => 'Januaar',
 'february' => 'Feebruaar',
 'march' => 'Märds',
@@ -150,6 +156,7 @@ $messages = array(
 'hidden-categories' => '{{PLURAL:$1|Fârschdegde ghadegorii|Fârschdegde ghadegoriin}}',
 'category-subcat-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a undâr-ghadegorii|dsam $2 undâr-ghadegoriâ, wofoo {{PLURAL:$1|nôr ôône| $1}}}} undn ôôdsajchd wärn.',
 'category-article-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a sajdn|$2 sajdn, wofoo hiir {{PLURAL:$1|aane undn ôôdsajchd wärd|l$1 ôôdsajchd undn wärn}}}}.',
+'category-file-count' => '{{PLURAL:$2|Di Gadegorii umfasd bloos a Dadei.|Di folgende {{PLURAL:$1|Dadei is|$1 Dadein sind}} in der Gadegorii, von insgsamd $2 Dadein anzeichd.}}',
 'listingcontinuesabbrev' => '(Fôrdsedsung)',
 'noindex-category' => 'Seidn, wou net indexierd sin',
 
@@ -220,7 +227,7 @@ $messages = array(
 'articlepage' => "D'inhalds-sajdn dsajchn",
 'talk' => 'Disghusjoon',
 'views' => 'Ôôsichdn',
-'toolbox' => 'Werchdsajch-ghisdn',
+'toolbox' => 'Werchdsajch',
 'userpage' => "D'benudsârsajdn dsajchn",
 'projectpage' => "D'brojägdsajdn dsjachn",
 'imagepage' => "D'dadhaj-sajdn dsajchn",
@@ -336,7 +343,8 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
 # Login and logout pages
 'yourname' => 'Benudsârnôômâ',
 'yourpassword' => 'Bhaswôrd:',
-'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourpasswordagain' => 'Bassworrd widderhulln:',
+'remembermypassword' => 'Miid den Brauser dauerhafd ogmeld bleim (maximal $1 {{PLURAL:$1|Dooch|Dooch}})',
 'login' => 'Ôômeldn',
 'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng',
 'loginprompt' => 'Zum Omelldn mäin Guggies agdivierd sei.',
@@ -345,7 +353,10 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
 'userlogout' => 'Abmeldn',
 'nologin' => 'Du hast ka Nutzergonto? $1',
 'nologinlink' => 'Sich als najâr Ôôgmeldâr ôômäldn',
+'createaccount' => 'Nutzergonto olegn',
+'gotaccount' => 'Du host scho a Benudtzergondo? $1',
 'gotaccountlink' => 'Omeldn',
+'userlogin-resetlink' => 'Omeldedadn vergessn?',
 'mailmypassword' => ' najs passwôrd iwâr iimejl dsuschign lasn',
 'loginlanguagelabel' => 'Sproch: $1',
 
@@ -406,7 +417,8 @@ Wen'D dich awâr hiirhäär bloos fârlaafn hasd, glig ââfach af '''Zurück'''
 'noarticletext' => 'Dii sajdn gibd\'s bis eds no ned.
 Duu ghâusch nach däm ausdrug aa [[Special:Search/{{PAGENAME}}|in alle sajdn suchng]],
 <span class="plainlinks"> [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} in di dsugheerichng log-biichâr suchng] odâr dii sajdn [{{fullurl:{{FULLPAGENAME}}|action=edit}} ôôleeng un najschrajm]</span>.',
-'previewnote' => "'''Hiir siggsd bloos, wii's wärn dääd, dii sajdn is ôbâr no ned gschbaichärd!'''",
+'noarticletext-nopermission' => 'Däi Seidn endhäld momendan nu kan Dexd, [[Special:Search/{{PAGENAME}}|Du derfsd däi Seidn a net derschdelln]].',
+'previewnote' => "'''Des is blouss a Vuurschau.''' Däi Seidn is nu net gschbeicherd worrn.",
 'editing' => 'Beärbâdn fon $1',
 'editingsection' => 'Beärwâdn fo $1 (bloos abschnid)',
 'copyrightwarning' => "''Ghobhiir jôô ghâ web-sajdn, dii där ned ghärn, un benuds ghâ uurheewarrechdlich gschidsde wärgghe oone geneemichung fom uurheewâr!'''<br />
@@ -418,15 +430,24 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'template-semiprotected' => '(ned ôôgmeldede un naje benudsär däfn hiir ned schrajm)',
 'hiddencategories' => 'Dii sajdn ghäärd dsu {{PLURAL:$1|aanâr fârschdegdn|$1 fârschdegde}} ghadegoriin:',
 'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:',
+'recreate-moveddeleted-warn' => "'''Achdung: Du derschdellsd a Seidn, däi wou bereids fräiers glöschd worrn is.'''
+
+Bidde dou sorgfälldig ieberbriefen, ob die erneide Seidnderschdellung die Richdlinien endschbrechn doud.
+
+Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begrindung vo der vuurherichen Löschung:",
+'moveddeleted-notice' => 'Däi Seidn is glöschd worrn. Zur Informadion folchds Lösch- un Verschäibungslogbuch vo dera Seidn.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Wannung''': Däi Gräiss vo eibundne Vuurloong is zu grouss, einiche Vuurloong könna net eibundn werrn.",
 'post-expand-template-inclusion-category' => 'Seidn, in dena wou däi maximale Gräiss vo eibundne Vuurloong ieberschriddn is.',
+'post-expand-template-argument-warning' => "'''Wannung:''' Däi Seidn endhäld mindesdens an Barameder in anner Vuurlooch, der wou exbandierd zu grouß is.",
+'post-expand-template-argument-category' => 'Seidn miid ignorierde Vuurloongbarameder',
 
 # History pages
 'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn',
 'currentrev-asof' => 'Jedsiche wärsjoon, am $2 um $3 gmachd',
 'revisionasof' => 'Wärsjoon fom $2 um $3 Uur',
+'revision-info' => 'Version vom $1 Uhr von $2',
 'previousrevision' => '← wärsjoon dâfoor',
 'nextrevision' => 'Nägsdnajâre wärsjoon →',
 'currentrevisionlink' => 'Geechnwärdiche wärsjoon',
@@ -436,9 +457,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 * '''({{int:cur}})''' = undârschiid dsur geechnwärdichn wärsjoon, '''({{int:last}})''' = undârschiid dsur foorichn wärsjoon
 * Uurdsajd/Daadum = wärsjoon dsu dära dsajd, '''{{int:minoreditletter}}''' = glane ändärung.",
 'history-fieldset-title' => 'Suchng in där wärsjoonsfolche',
+'history-show-deleted' => 'Blouss glöschde Versiona zeing',
 'histfirst' => 'älldsde',
 'histlast' => 'neisde',
 
+# Revision feed
+'history-feed-item-nocomment' => '$1 bis $2',
+
 # Revision deletion
 'rev-delundel' => 'ôôdsajng/fârbärng',
 'revdel-restore' => 'Ändârn, was oodsajchd wäd',
@@ -449,10 +474,11 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'revertmerge' => 'Dsrig fôr dii fârajnichung',
 
 # Diffs
-'history-title' => 'Wärsjoonsfolche fo „$1“',
+'history-title' => '$1: Versionsgschichd',
 'lineno' => 'Dsajln $1:',
 'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn',
 'editundo' => 'riggängich machng',
+'diff-multi' => '({{PLURAL:$1|A dazwischaliengde Version|$1 dazwischaliengde Versiona}} von {{PLURAL:$2|am Nutzer|$2 Nutzern}} {{PLURAL:$1|wird|werrn}} ned ozeichd)',
 
 # Search results
 'searchresults' => 'Bam suchng gfundne sachng',
@@ -465,8 +491,10 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}',
 'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
 'prevn-title' => '{{PLURAL:$1|Vuurherichs Ergebnis|Vuurheriche $1 Ergebniss}}',
+'nextn-title' => '{{PLURAL:$1|Folngnds Ergebnis|Folngnde $1 Ergebniss}}',
 'shown-title' => 'Zeich mer $1 {{PLURAL:$1|Ergebnis|Ergebniss}} bro Seidn',
 'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Es gidd a Seidn, däi wou´n Nooma „[[:$1]]“ hodd.'''",
 'searchmenu-new' => "'''Derschdell dai Seidn „[[:$1]]“ in diesn Wigi.'''",
 'searchprofile-articles' => 'Inhaldsseidn',
 'searchprofile-project' => 'Hilf- un Brojegdseidn',
@@ -479,6 +507,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'searchprofile-everything-tooltip' => 'Gsamdn Inhald durchsoung (aa Disgussionsseidn)',
 'searchprofile-advanced-tooltip' => 'Soung in weidere Namensraim',
 'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Seidn|$1 Seidn}} ({{PLURAL:$2|1 Untergadegorii|$2 Untergadegoriin}}, {{PLURAL:$3|1 Dadei|$3 Dadein}})',
 'search-result-score' => 'Âjschleechich: $1 %',
 'search-redirect' => '(Wajdalajdung fon „$1“ häa)',
 'search-section' => '(Abschnid $1)',
@@ -560,6 +589,8 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'allowemail' => 'Iimejl-embfang fon andrâ ôôschdeln',
 'youremail' => 'E-mail:',
 'yourrealname' => 'Bürcherlicher Noma:',
+'prefs-help-email' => 'Des Ogeem vo anner E-Mail-Adressn is obdional, ermöglichd obber däi Zusendung vo an Ersatzbassworrd, wennsd dei Bassworrd vergessn hosd.',
+'prefs-help-email-others' => 'Miid andre Benutzer koost a iber däi Benutzerdisgussionsseidn Kondagd afneha, ohne dass dei Idendidäd offenleeng moussd.',
 
 # Groups
 'group-sysop' => 'Adminisdradoorn',
@@ -580,13 +611,18 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'recentchanges' => 'ledsde änderunga',
 'recentchanges-legend' => 'Âjschdelunga, wii di ledsdn ändrunga dsajchd wärn solln',
 'recentchanges-feed-description' => 'Fârfolch mid dem Fiid dii ledsdn ändrungn in {{SITENAME}}.',
+'recentchanges-label-newpage' => 'Neie Seidn',
 'recentchanges-label-minor' => 'Blos a weng wôs is gändârd wôrn',
+'recentchanges-label-bot' => 'Ändrung durch an Bot',
+'recentchanges-label-unpatrolled' => 'Net-kondrollierde Ändrung',
 'rcnote' => "Des {{Plural:$1|is dii aane ändrung|sin dii '''$1''' ändrunga}}, dii in di {{Plural:$2|ledsdn 24 schdundn|ledsdn '''$2''' doochn}} gmachd wôrn {{Plural:$1|is|sin}}. Schdand is fom $4, $5 uur.",
+'rcnotefrom' => "Oozeichd werrn däi Ändrunga seid '''$2''' (max. '''$1''' Eidrääch).",
 'rclistfrom' => 'Bloos di ändrunga dsajchn sajd $1',
 'rcshowhideminor' => 'Glenâre Ändrungn $1',
 'rcshowhidebots' => 'Bods (bearbajdâr, dii ajchendlich brograme san) $1',
 'rcshowhideliu' => 'Ôôgmäldâde bearbajdâr $1',
 'rcshowhideanons' => '$1 uuôôgmäldâde bearbajdâr',
+'rcshowhidepatr' => 'Gondrollierde Ändrunga $1',
 'rcshowhidemine' => 'Ajchne bajdrääch $1',
 'rclinks' => 'Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.<br />$3',
 'diff' => 'undârschiid',
@@ -596,7 +632,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'minoreditletter' => 'g',
 'newpageletter' => 'N',
 'boteditletter' => 'B',
-'rc-enhanced-expand' => 'Ajndslhajdn ôôdsajchn (gäd bloos mid JavaScript)',
+'rc-enhanced-expand' => 'Eindslheidn oodseichn (gäd bloos mid JavaScript)',
 'rc-enhanced-hide' => 'Glaanichghajdn ned dsajng',
 
 # Recent changes linked
@@ -614,11 +650,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'uploadedimage' => 'had „[[$1]]“ naufglôôdn',
 
 'license' => 'Lizenz',
+'license-header' => 'Lizenz',
 
 # File description page
 'file-anchor-link' => 'Daddei',
 'filehist' => 'Wärsjoona bis eds',
 'filehist-help' => 'Glig af ân dsajdbhungd, um dii dôômôôliche fasung ôôdsuschaua',
+'filehist-revert' => 'zricksedzn',
 'filehist-current' => 'agduäl',
 'filehist-datetime' => 'Âjschdlungs-daadum un -dsajd',
 'filehist-thumb' => 'Schbigbildlâ',
@@ -652,6 +690,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'ncategories' => '$1 {{PLURAL:$1|GhadegoriiGhadegoriin}}',
 'nmembers' => '{{PLURAL:$1|1 âjdrôôch|$1 âjdrääch}}',
 'prefixindex' => 'Ale sajdn mid brääfigs',
+'usercreated' => '{{GENDER:$3|Ersschdelld}} am $1 um $2 Uhr',
 'newpages' => 'Naje sajdn',
 'move' => 'Umdaafn',
 'movethispage' => 'Sajdn umdaafn',
@@ -680,6 +719,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 
 # Special:LinkSearch
 'linksearch' => 'Linggs nach ausârhalb',
+'linksearch-line' => '$1 is verlingt vo $2',
 
 # Special:ListGroupRights
 'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
@@ -690,6 +730,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 # Watchlist
 'watchlist' => 'Beoobachdungslisdn',
 'mywatchlist' => 'Beoobachdungslisdn',
+'watchlistfor2' => 'Fär $1 ($2)',
 'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] .
 
 Wen sich af der sajdn oda iirâr disghusjoons-sajdn was duud, wärd se ab eds
@@ -712,6 +753,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'deletepage' => 'Sajdn leschn',
 'confirmdeletetext' => "Duu bisd grôd dâbaj, â sajdn midsamd alle dsugheeriche alde wärsjoona ds'leschn. Bide beschdäädich, das De wasd, was des als bewirgd, un das De Dich dâbaj aa an d'[[{{MediaWiki:Policy-url}}|richliinjen]] fo dem wighi hiir häldsd.",
 'actioncomplete' => 'Erleedichd',
+'actionfailed' => 'Agdsion fehlgschloong',
 'deletedtext' => '„$1“ is gleschd wôrn. Im $2 findsd â lisdn mid dâ ledsdn leschunga.',
 'dellogpage' => 'Logbuch fo di leschunga',
 'deletecomment' => 'Grund:',
@@ -763,10 +805,10 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'blanknamespace' => '(Sajdn)',
 
 # Contributions
-'contributions' => 'Ajchne bajdrääch',
+'contributions' => 'Eichne Beidrääch',
 'contributions-title' => 'Bajdrääch fo „$1“',
 'mycontris' => 'Bajdreech',
-'contribsub2' => 'Fär $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
 'uctop' => '(agduell)',
 'month' => 'bis moonad:',
 'year' => 'bis dsum jôôr:',
@@ -778,6 +820,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'sp-contributions-talk' => 'Disgussion',
 'sp-contributions-search' => 'Bajdreech suchng',
 'sp-contributions-username' => 'IP-adresn odär nôômâ fom Ôôgmeldn:',
+'sp-contributions-toponly' => 'Blouss agduelle Versiona zeing',
 'sp-contributions-submit' => 'Suchng',
 
 # What links here
@@ -785,6 +828,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'whatlinkshere-title' => 'Sajdn, di af „$1“ fârwajsn',
 'whatlinkshere-page' => 'Sajdn:',
 'linkshere' => "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':",
+'nolinkshere' => "Ka Seidn verlingt af '''„[[:$1]]“'''.",
 'isredirect' => 'Wajdârlajdungssajdn',
 'istemplate' => 'Foorlaachn-ajbindung',
 'isimage' => 'Daddeilink',
@@ -794,7 +838,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'whatlinkshere-hideredirs' => '$1 wajdârlajdungn',
 'whatlinkshere-hidetrans' => '$1 Foorlaachn-ajbindunga',
 'whatlinkshere-hidelinks' => '$1 Fârwajse',
-'whatlinkshere-hideimages' => '$1 Bild-fârwajse',
+'whatlinkshere-hideimages' => 'Daddeilings $1',
 'whatlinkshere-filters' => 'Fildhâr',
 
 # Block/unblock
@@ -850,6 +894,7 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '
 
 # Thumbnails
 'thumbnail-more' => 'Grässär machng',
+'thumbnail_error' => 'Fehler beim Derschdelln von Vuurschaubilld: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Daj benudsâr-sajdn',
@@ -977,7 +1022,23 @@ Bloos  dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
 'watchlisttools-edit' => 'Beobachdungslisdn dsajchn un ändârn',
 'watchlisttools-raw' => "In där beoobachdungslisdn ds'fuâs rumworschdln",
 
+# Core parser functions
+'duplicate-defaultsort' => 'Der Sordierungsschlissl „$2“ ieberschreibt den vuurher verwendten Schlissl „$1“.',
+
 # Special:SpecialPages
 'specialpages' => 'Schbedsjaal-sajdn',
 
+# External image whitelist
+'external_image_whitelist' => ' # Däi Zeiln net verändern.<pre>
+# Undnstehnd könna Fragmende vo reguläre Asdrigg (der Deil zwischa die //) eigeem werrn.
+# Däi werrn miid die URLs vo Bilder aus egsderne Gwelln verglichng.
+# A bositiver Vergleich fiehrt zur Ozeich vom Bild, sunsd werrds Bild blouss als Link ozeichd.
+# Zeiln, däi wou miid an # ofanga, werrn als Gommendar behandld.
+# Zwischa Grouß- un Klaaschreibung werrd net underschiedn.
+
+# Fragmende vo reguläre Asdrigg nach dera Zeiln eidroong. Däi Zeiln net verändern.</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Marrgierungs]]-Fillder:',
+
 );
index 4136315..b638e4a 100644 (file)
@@ -2053,12 +2053,9 @@ Logolös blokamis e xilis anu lonöfölis in [[Special:BlockList|lised blokamas]
 'ipb_blocked_as_range' => 'Pöl: ladet-IP $1 no peblokon stedöfiko e no kanon pasäblokön.
 Peblokon ye as dil ladetema: $2, kel kanon pasäblokön.',
 'ip_range_invalid' => 'Ladetem-IP no lonöföl.',
-'blockme' => 'Blokolöd obi',
 'proxyblocker' => 'Bloköm pladulömas',
-'proxyblocker-disabled' => 'Dun at penemogükon.',
 'proxyblockreason' => 'Ladet-IP olik peblokon bi binon pladulöm maifik.
 Kosikolös ko dünigevan bevüresodik u kaenastütans olik e nunolös ones sefasäkädi fefik at.',
-'proxyblocksuccess' => 'Peledunon.',
 'sorbsreason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.',
 'sorbs_create_account_reason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.
 No dalol jafön kali.',
index 6a082f4..3998ef4 100644 (file)
@@ -734,7 +734,6 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
 'blocklogentry' => 'piätteli cäüttijää vai IP-cislaa [[$1]]. Piättelemin lõpub $2 $3',
 'unblocklogentry' => 'rooci cäüttijält $1 muutuzpiäsüss',
 'block-log-flags-nocreate' => 'lukuloomin piäteltü',
-'proxyblocksuccess' => 'On tehtü.',
 
 # Move page
 'movepagetext' => "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle.
index 998d675..7ed5278 100644 (file)
@@ -1562,7 +1562,6 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
 'ip_range_invalid' => 'Viganõ puutri võrgoaadrõsi kujo.',
 'proxyblocker' => 'Vaihõserveri kinniqpidämine',
 'proxyblockreason' => "Su puutri võrgoaadrõs om kinniq peet, selle et taa om avalik vaihõserver. Otsiq üles uma võrgoliini pakja vai puutrias'atundja ja kõnõlõq näile taast hädäst.",
-'proxyblocksuccess' => 'Valmis.',
 'sorbsreason' => 'Su puutri võrgoaadrõs om SORBS-i mustan nimekirän ku avalik vaihõserver.',
 'sorbs_create_account_reason' => 'Su puutri võrgoaadrõs om pant SORBS-i musta nimekirjä ku avalik vaihõserver. Sa saa-i pruukjanimme tetäq',
 
index 714c552..52b3202 100644 (file)
@@ -1724,7 +1724,6 @@ Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po vey les blocaedjes 
 'ip_range_invalid' => "Fortchete d' adresses IP nén valide.",
 'proxyblocker' => 'Blocaedje di procsi',
 'proxyblockreason' => "Voste adresse IP a stî blokêye paski c' est on procsi k' est å lådje. Contactez vost ahesseu Internet ou l' siervice di sopoirt tecnike eyet lzî dire po çoula, la k' c' est on problinme di såvrité serieus.",
-'proxyblocksuccess' => 'Fwait.',
 'sorbsreason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL.",
 'sorbs_create_account_reason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL. Vos n' poloz nén ahiver on conte d' uzeu.",
 
index c9caa3c..62e75c9 100644 (file)
@@ -203,7 +203,7 @@ $messages = array(
 'noindex-category' => 'Mga diri nakatudlokan nga pagkli',
 'broken-file-category' => 'Mga pakli nga mayda utod nga mga sumpay hin paypay',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Mahitungod han',
 'article' => 'Pakli hin sulod',
@@ -1899,8 +1899,6 @@ Tanggala an pagpugong $1',
 'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli',
 'block-log-flags-hiddenname' => 'nakatago an agnay-hit-gumaramit',
 'ipb_already_blocked' => '"$1" in ginpugngan na',
-'blockme' => 'Pugngi ako',
-'proxyblocksuccess' => 'Human na.',
 'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon',
 
 # Developer tools
index 295b15f..092ea9d 100644 (file)
@@ -1850,11 +1850,8 @@ Dangaa bëgg a soppi anam yi?',
 'ipb_cant_unblock' => 'Njuumte: téyeg $1 gisuwul. Xéj-na dañ kaa téyedi ba noppi.',
 'ipb_blocked_as_range' => 'Njuumte: màkkaan mi $1 téyewuñ ko moom kase, kon doo ko man téyedi. Ci mbooloom $2 la bokk, faww nga téyedi mbooloo mépp.',
 'ip_range_invalid' => 'Mbooloom IP mi baaxul.',
-'blockme' => 'Téye ma',
 'proxyblocker' => 'Téyekatu yóbbantekat',
-'proxyblocker-disabled' => 'Bii solo doxul.',
 'proxyblockreason' => 'Dañ téye sa IP ndax dadi ab yóbbantekat bu ubbeeku. Di la ñaan nga jublu ci sa ki la jox internet yegge ko jafe-jafeb kaaraange bi.',
-'proxyblocksuccess' => 'Jàll na.',
 'sorbsreason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo.',
 'sorbs_create_account_reason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo. Kon sag mbindu du mana nekk.',
 'cant-block-while-blocked' => 'Manoo di téye yeneen jëfandikukat ci diir bi ñu la téye.',
index b8c6da0..69a4b97 100644 (file)
@@ -1545,7 +1545,6 @@ $1",
 'blocklogtext' => '箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。',
 'unblocklogentry' => '$1已经拨解封',
 'block-log-flags-nocreate' => '建账号禁用哉',
-'proxyblocksuccess' => '好哉。',
 
 # Developer tools
 'lockdb' => '鎖數據庫',
index 1bdd3ed..a0edc0c 100644 (file)
@@ -990,7 +990,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
 'blocklogentry' => '[[$1]] бүслсн $2 күртл, $3 учрта',
 'unblocklogentry' => '$1-г бүслсн биш болулв',
 'block-log-flags-nocreate' => 'бичгдлһиг бүтәҗ болшго',
-'blockme' => 'Намаг бүслчк',
 
 # Move page
 'movepagetext' => "Та дораһар цаасар, халхин сольлһна тууҗ көндәд, терүнә нериг сольх.
index 0a90da4..22c9ed3 100644 (file)
@@ -413,7 +413,7 @@ $messages = array(
 'articlepage' => 'זען אינהאַלט בלאַט',
 'talk' => 'שמועס',
 'views' => 'קוקן',
-'toolbox' => 'געצייג קאסטן',
+'toolbox' => 'געצייג',
 'userpage' => 'זען באַניצער בלאַט',
 'projectpage' => 'זען פראיעקט בלאַט',
 'imagepage' => 'זען טעקע בלאט',
@@ -658,6 +658,8 @@ $2',
 'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט',
 'helplogin-url' => 'Help:אריינלאגירן',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'userlogin-loggedin' => 'איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.
+ניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.',
 'userlogin-createanother' => 'שאפֿן נאך א קאנטע',
 'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
 'createacct-another-join' => 'ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.',
@@ -2679,11 +2681,8 @@ $1',
 דאך איז ער בלאקירט אַלס א טייל פֿון דעם אָפשטאַנד $2, וואָס מ'קען יא אויפֿבלאקירן.",
 'ip_range_invalid' => 'אומריכטיגער IP גרייך.',
 'ip_range_toolarge' => 'אָפשטאַנדן גרעסער ווי /$1 קען מען נישט בלאקירן.',
-'blockme' => 'בלאקירט מיך',
 'proxyblocker' => 'פראקסי בלאקער',
-'proxyblocker-disabled' => 'די  פֿונקציע איז אומאַקטיווירט.',
 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
-'proxyblocksuccess' => 'געטאן.',
 'cant-block-while-blocked' => 'איר קען נישט בלאקירן קיין אנדערע באניצער ווען איר זענט אליין בלאקירט.',
 'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.',
 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
index d5b9bda..1d2c0b2 100644 (file)
@@ -2530,11 +2530,8 @@ $1',
 Sùgbọ́n ó jẹ́ dídílọ́nà gẹ́gẹ́bí ìkan nínú ìgbàjá $2, èyí sì ṣe é mọ́ dí lọ́nà mọ́.',
 'ip_range_invalid' => 'Àdìmọ́ IP aláìníìbámu.',
 'ip_range_toolarge' => 'Ìgbàjá ìdínà tó tóbi ju /$1 kò jẹ́ gbígbà ní àyè.',
-'blockme' => 'Dínà mi',
 'proxyblocker' => 'Olùdínà ẹ̀rọ-ìwọ̀fà ẹlòmíràn',
-'proxyblocker-disabled' => 'Ìmúṣe yìí jẹ́ dídálẹ́kun.',
 'proxyblockreason' => 'Àdírẹ́ẹ̀sì IP yín ti jẹ́ dídílọ́nà nítorípé ó jẹ́ ẹ̀rọ alàìlórúkọ ẹlòmíràn ìgboro. Ẹ sọ ìsòro yìí fún olùpèsè ìwọ̀fà Internet yín tàbí aṣeàtìlẹyìn ẹ̀rọ-ìpèsè ibiiṣẹ́ yín.',
-'proxyblocksuccess' => 'Ṣetán',
 'sorbsreason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.',
 'sorbs_create_account_reason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.
 Ẹ kò le dá àpamọ́.',
index 284ecc6..f0a9494 100644 (file)
@@ -663,7 +663,7 @@ $1',
 'passwordsent' => '新嘅密碼已經寄咗畀呢位用戶 "$1" 嘅電郵地址。收到之後請重新登入。',
 'blocked-mailpassword' => '你嘅IP地址被鎖住,唔可以用密碼復原功能以防止濫用。',
 'eauthentsent' => '確認電郵已經傳送到指定嘅電郵地址。喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。',
-'throttled-mailpassword' => '一個密碼提醒已經響$1個鐘頭之前發送咗。為咗防止濫用,響$1個鐘頭之內只可以發送一個密碼提醒。',
+'throttled-mailpassword' => '一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。',
 'mailerror' => '傳送電郵錯誤: $1',
 'acct_creation_throttle_hit' => '利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。
 結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。',
@@ -2328,11 +2328,8 @@ $1',
 'ipb_blocked_as_range' => '錯誤:個IP $1 無直接封鎖,唔可以解封。但係佢係響 $2 嘅封鎖範圍之內,嗰段範圍係可以解封嘅。',
 'ip_range_invalid' => '無效嘅IP範圍',
 'ip_range_toolarge' => '大過 /$1 嘅封鎖範圍係唔容許嘅。',
-'blockme' => '封鎖我',
 'proxyblocker' => 'Proxy 封鎖器',
-'proxyblocker-disabled' => '呢個功能已經停用。',
 'proxyblockreason' => '你嘅IP係一個公開(指任何人都可以用,無須身份認證?)嘅代理地址,因此被封鎖。請聯絡你嘅Internet服務提供商或技術支援,向佢哋報告呢個嚴重嘅安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。',
 'sorbs_create_account_reason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。你唔可以開新戶口。',
 'cant-block-while-blocked' => '當你被封鎖嗰陣唔可以封鎖其他用戶。',
@@ -2715,6 +2712,12 @@ $1',
 'bydate' => '以時間',
 'sp-newimages-showfrom' => '顯示由$1 $2嘅新檔',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'hours' => '$1{{PLURAL:$1|個鐘}}',
+
+# Human-readable timestamps
+'hours-ago' => '$1{{PLURAL:$1|個鐘}}之前',
+
 # Bad image list
 'bad_image_list' => '請根據下面嘅格式去寫:
 
@@ -3019,7 +3022,7 @@ Variants for Chinese language
 'exif-gpsmeasuremode-3' => '三維量度',
 
 # Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'å\8d\83ç±³/小時',
+'exif-gpsspeed-k' => 'å\85¬é\87\8c/小時',
 'exif-gpsspeed-m' => '英里/小時',
 'exif-gpsspeed-n' => '浬/小時',
 
@@ -3310,4 +3313,7 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅
 'searchsuggest-search' => '搵嘢',
 'searchsuggest-containing' => '名單傳送緊...',
 
+# Durations
+'duration-hours' => '$1{{PLURAL:$1|個鐘}}',
+
 );
index 6682da4..9d66ede 100644 (file)
@@ -2085,7 +2085,7 @@ $1',
 
 # Random redirect
 'randomredirect' => '随机重定向',
-'randomredirect-nopages' => '在 "$1" 名字空间中没有重定向页面。',
+'randomredirect-nopages' => '“$1”名字空间中没有重定向。',
 
 # Statistics
 'statistics' => '统计',
@@ -2752,11 +2752,8 @@ $1被封禁的理由是:“$2”',
 'ipb_blocked_as_range' => '错误:IP地址$1未被直接封禁,故无法解除封禁。然而,它位于IP地址段$2的封禁范围内,后者可被解除封禁。',
 'ip_range_invalid' => '无效的IP地址段。',
 'ip_range_toolarge' => '不允许大于/$1的段封禁。',
-'blockme' => '封禁我',
 'proxyblocker' => '代理封禁器',
-'proxyblocker-disabled' => '此功能已禁用。',
 'proxyblockreason' => '您的IP地址为已被封禁的公开代理。请联系您的互联网服务提供商或技术支持者,并告知他们此严重的安全问题。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。',
 'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。',
 'xffblockreason' => '您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1',
@@ -4141,6 +4138,6 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'limitreport-templateargumentsize' => '模板参数大小',
 'limitreport-templateargumentsize-value' => '$1/$2 字节',
 'limitreport-expansiondepth' => '最高扩展深度',
-'limitreport-expensivefunctioncount' => '昂贵的函数分析技术器',
+'limitreport-expensivefunctioncount' => '高级函数分析器',
 
 );
index 3bc7673..992db6b 100644 (file)
@@ -2405,10 +2405,12 @@ $UNWATCHURL
 'deletecomment' => '理由:',
 'deleteotherreason' => '其它/附加的理由:',
 'deletereasonotherlist' => '其它理由',
-'deletereason-dropdown' => '*常用刪除理由
-** 作者請求
+'deletereason-dropdown' => '* 常見刪除理由
+** 濫發電郵
+** 破壞
 ** 侵犯版權
-** 破壞',
+** 作者請求
+** 損壞重定向頁',
 'delete-edit-reasonlist' => '編輯刪除理由',
 'delete-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。',
 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
@@ -2719,11 +2721,8 @@ $1被封禁的理由是“$2”',
 'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接查封,不可以解除封禁。但是它是在 $2 的查封範圍之內,該段範圍是可以解除封禁的。',
 'ip_range_invalid' => '無效的IP範圍。',
 'ip_range_toolarge' => '大於 /$1 的封鎖範圍是不容許的。',
-'blockme' => '查封我',
 'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => '這個功能已經停用。',
 'proxyblockreason' => '您的IP位址是一個開放的代理,它已經被封鎖。請聯繫您的網際網路服務提供商或技術支援者並告知告知他們該嚴重的安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。',
 'sorbs_create_account_reason' => '由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器,所以您無法建立賬號。',
 'xffblockreason' => '您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由:$1',
@@ -3939,6 +3938,8 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'tags-description-header' => '解釋完整描述',
 'tags-active-header' => '存檔?',
 'tags-hitcount-header' => '已加上標籤的更改',
+'tags-active-yes' => '是',
+'tags-active-no' => '否',
 'tags-edit' => '編輯',
 'tags-hitcount' => '$1次更改',
 
index 030e086..3079a5b 100644 (file)
@@ -13,20 +13,3 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag
 CREATE UNIQUE INDEX /*i*/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 /*i*/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 without ugly GROUP_CONCAT that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-       ts_rc_id int NULL,
-       ts_log_id int NULL,
-       ts_rev_id int NULL,
-       ts_tags BLOB NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-       vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql
new file mode 100644 (file)
index 0000000..a81b368
--- /dev/null
@@ -0,0 +1,12 @@
+-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/tag_summary (
+       ts_rc_id int NULL,
+       ts_log_id int NULL,
+       ts_rev_id int NULL,
+       ts_tags BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql
new file mode 100644 (file)
index 0000000..994a5d5
--- /dev/null
@@ -0,0 +1,4 @@
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/valid_tag (
+       vt_tag varchar(255) NOT NULL PRIMARY KEY
+) /*$wgDBTableOptions*/;
index 1e36363..8175891 100644 (file)
@@ -70,7 +70,13 @@ class DeleteEqualMessages extends Maintenance {
                                $default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain();
 
                                $messageInfo['relevantPages']++;
-                               if ( $actual === $default ) {
+
+                               if (
+                                       // Exclude messages that are empty by default, such as sitenotice, specialpage
+                                       // summaries and accesskeys.
+                                       $default !== '' && $default !== '-' &&
+                                               $actual === $default
+                               ) {
                                        $hasTalk = isset( $statuses['talks'][$key] );
                                        $messageInfo['results'][] = array(
                                                'title' => $key . $titleSuffix,
index 6b7f38a..548bb2f 100644 (file)
@@ -118,7 +118,6 @@ Wiki configuration for testing:
   // Enable weird and wonderful options:
                                                          // Increase default error reporting level.
   error_reporting (E_ALL);    // At a later date could be increased to E_ALL | E_STRICT
-  $wgBlockOpenProxies = true; // Some block pages require this to be true in order to test.
   $wgEnableUploads = true;    // enable uploads.
   $wgDBerrorLog = "/root/mediawiki-db-error-log.txt";  // log DB errors, replace with suitable path.
   $wgShowSQLErrors = true;    // Show SQL errors (instead of saying the query was hidden).
@@ -1483,24 +1482,6 @@ class watchlistTest extends pageTest {
        }
 }
 
-
-/**
- ** a page test for "Special:Blockme"
- */
-class specialBlockmeTest extends pageTest {
-       function __construct() {
-               $this->pagePath = "index.php?title=Special:Blockme";
-
-               $this->params = array ();
-
-               // sometimes we specify "ip", and sometimes we don't.
-               if ( wikiFuzz::randnum( 1 ) == 0 ) {
-                       $this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) );
-               }
-       }
-}
-
-
 /**
  ** a page test for "Special:Movepage"
  */
@@ -2161,7 +2142,7 @@ class GeSHi_Test extends pageTest {
 /**
  ** selects a page test to run.
  * @param $count
- * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBlockmeTest|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
+ * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
  */
 function selectPageTest( $count ) {
 
@@ -2197,7 +2178,6 @@ function selectPageTest( $count ) {
                case 20: return new redirectTest();
                case 21: return new confirmEmail();
                case 22: return new watchlistTest();
-               case 23: return new specialBlockmeTest();
                case 24: return new specialUndeletePageTest();
                case 25: return new specialMovePage();
                case 26: return new specialUnlockdbPageTest();
index cbbcf0f..54fd4e2 100644 (file)
@@ -230,14 +230,14 @@ if ( $count > 0 ) {
                } else {
                        $props = FSFile::getPropsFromPath( $file );
                        $flags = 0;
-                       $options = array();
+                       $publishOptions = array();
                        $handler = MediaHandler::getHandler( $props['mime'] );
                        if ( $handler ) {
-                               $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
                        } else {
-                               $options['headers'] = array();
+                               $publishOptions['headers'] = array();
                        }
-                       $archive = $image->publish( $file, $flags, $options );
+                       $archive = $image->publish( $file, $flags, $publishOptions );
                        if ( !$archive->isGood() ) {
                                echo "failed. (" .
                                        $archive->getWikiText() .
@@ -248,7 +248,7 @@ if ( $count > 0 ) {
                }
 
                $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
-               if ( !$summary ) {
+               if ( !isset( $options['summary'] ) ) {
                        $summary = $commentText;
                }
 
index e98e9c0..f96902d 100644 (file)
@@ -21,6 +21,7 @@
                                "classes": [
                                        "mw.Title",
                                        "mw.inspect",
+                                       "mw.inspect.reports",
                                        "mw.notification",
                                        "mw.user",
                                        "mw.util",
index ca3a4f5..a4fc922 100644 (file)
@@ -2378,11 +2378,8 @@ $wgMessageStructure = array(
                'ipb_blocked_as_range',
                'ip_range_invalid',
                'ip_range_toolarge',
-               'blockme',
                'proxyblocker',
-               'proxyblocker-disabled',
                'proxyblockreason',
-               'proxyblocksuccess',
                'sorbs',
                'sorbsreason',
                'sorbs_create_account_reason',
@@ -2779,6 +2776,7 @@ $wgMessageStructure = array(
                'spam_reverting',
                'spam_blanking',
                'spam_deleting',
+               'simpleantispam-label',
        ),
        'info' => array(
                'pageinfo-header',
diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php
deleted file mode 100644 (file)
index b52f20f..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 c033647..2c02de8 100644 (file)
@@ -655,7 +655,10 @@ return array(
        ),
        'mediawiki.inspect' => array(
                'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
-               'dependencies' => 'jquery.byteLength',
+               'dependencies' => array(
+                       'jquery.byteLength',
+                       'jquery.json',
+               ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.feedback' => array(
index bdc6675..b3d7bb3 100644 (file)
                        var name = mw.language.months.names[i].toLowerCase();
                        ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
-                       name = mw.language.months.genitive[i].toLowerCase().replace( '.', '' );
+                       name = mw.language.months.genitive[i].toLowerCase();
                        ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
-                       name = mw.language.months.abbrev[i].toLowerCase();
+                       name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
                        ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
                }
index f9a14b0..cdc6767 100644 (file)
                                                        tokenCache[tokenType] = params.token = undefined;
                                                        return api.post( params );
                                                }
+                                               // Pass the promise forward, so the caller gets error codes
+                                               return this;
                                        }
                                );
                        } else {
index 5cecc16..c895adf 100644 (file)
@@ -4,8 +4,16 @@
  * @author Ori Livneh
  * @since 1.22
  */
+/*jshint devel:true */
 ( function ( mw, $ ) {
 
+       function sortByProperty( array, prop, descending ) {
+               var order = descending ? -1 : 1;
+               return array.sort( function ( a, b ) {
+                       return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+               } );
+       }
+
        /**
         * @class mw.inspect
         * @singleton
                        return payload;
                },
 
+               /**
+                * Given CSS source, count both the total number of selectors it
+                * contains and the number which match some element in the current
+                * document.
+                *
+                * @param {string} css CSS source
+                * @return Selector counts
+                * @return {number} return.selectors Total number of selectors
+                * @return {number} return.matched Number of matched selectors
+                */
+               auditSelectors: function ( css ) {
+                       var selectors = { total: 0, matched: 0 },
+                               style = document.createElement( 'style' );
+
+                       style.textContent = css;
+                       document.body.appendChild( style );
+                       $.each( style.sheet.cssRules, function ( index, rule ) {
+                               selectors.total++;
+                               if ( document.querySelector( rule.selectorText ) !== null ) {
+                                       selectors.matched++;
+                               }
+                       } );
+                       document.body.removeChild( style );
+                       return selectors;
+               },
+
                /**
                 * Get a list of all loaded ResourceLoader modules.
                 *
                },
 
                /**
-                * Print a breakdown of all loaded modules and their size in kilobytes
-                * to the debug console. Modules are ordered from largest to smallest.
+                * Print tabular data to the console, using console.table, console.log,
+                * or mw.log (in declining order of preference).
+                *
+                * @param {Array} data Tabular data represented as an array of objects
+                *  with common properties.
+                */
+               dumpTable: function ( data ) {
+                       try {
+                               // Bartosz made me put this here.
+                               if ( window.opera ) { throw window.opera; }
+                               // Use Function.prototype#call to force an exception on Firefox,
+                               // which doesn't define console#table but doesn't complain if you
+                               // try to invoke it.
+                               console.table.call( console.table, data );
+                               return;
+                       } catch (e) {}
+                       try {
+                               console.log( $.toJSON( data, null, 2 ) );
+                               return;
+                       } catch (e) {}
+                       mw.log( data );
+               },
+
+               /**
+                * Generate and print one more reports. When invoked with no arguments,
+                * print all reports.
+                *
+                * @param {string...} [reports] Report names to run, or unset to print
+                *  all available reports.
                 */
-               inspectModules: function () {
-                       var console = window.console;
+               runReports: function () {
+                       var reports = arguments.length > 0 ?
+                               Array.prototype.slice.call( arguments ) :
+                               $.map( inspect.reports, function ( v, k ) { return k; } );
+
+                       $.each( reports, function ( index, name ) {
+                               inspect.dumpTable( inspect.reports[name]() );
+                       } );
+               },
 
-                       $( function () {
+               /**
+                * @class mw.inspect.reports
+                * @singleton
+                */
+               reports: {
+                       /**
+                        * Generate a breakdown of all loaded modules and their size in
+                        * kilobytes. Modules are ordered from largest to smallest.
+                        */
+                       size: function () {
                                // Map each module to a descriptor object.
                                var modules = $.map( inspect.getLoadedModules(), function ( module ) {
                                        return {
                                } );
 
                                // Sort module descriptors by size, largest first.
-                               modules.sort( function ( a, b ) {
-                                       return b.size - a.size;
-                               } );
+                               sortByProperty( modules, 'size', true );
 
                                // Convert size to human-readable string.
                                $.each( modules, function ( i, module ) {
                                                ( module.size !== null ? module.size + ' B' : null );
                                } );
 
-                               if ( console ) {
-                                       if ( console.table ) {
-                                               console.table( modules );
-                                       } else {
-                                               $.each( modules, function ( i, module ) {
-                                                       console.log( [ module.name, module.size ].join( '\t' ) );
-                                               } );
-                                       }
-                               }
-                       } );
+                               return modules;
+                       },
+
+                       /**
+                        * For each module with styles, count the number of selectors, and
+                        * count how many match against some element currently in the DOM.
+                        */
+                       css: function () {
+                               var modules = [];
+
+                               $.each( inspect.getLoadedModules(), function ( index, name ) {
+                                       var css, stats, module = mw.loader.moduleRegistry[name];
+
+                                       try {
+                                               css = module.style.css.join();
+                                       } catch (e) { return; } // skip
+
+                                       stats = inspect.auditSelectors( css );
+                                       modules.push( {
+                                               module: name,
+                                               allSelectors: stats.total,
+                                               matchedSelectors: stats.matched,
+                                               percentMatched: stats.total !== 0 ?
+                                                       ( stats.matched / stats.total * 100 ).toFixed( 2 )  + '%' : null
+                                       } );
+                               } );
+                               sortByProperty( modules, 'allSelectors', true );
+                               return modules;
+                       },
                }
        };
 
        if ( mw.config.get( 'debug' ) ) {
-               inspect.getModuleSize = function () { return null; };
-               mw.log( 'mw.inspect: Module sizes are not available in debug mode.' );
+               mw.log( 'mw.inspect: reports are not available in debug mode.' );
        }
 
        mw.inspect = inspect;
index 4138ac8..cc996e5 100644 (file)
@@ -1702,12 +1702,13 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * @inheritdoc mw.inspect#inspectModules
+                                * @inheritdoc mw.inspect#runReports
                                 * @method
                                 */
                                inspect: function () {
+                                       var args = slice.call( arguments );
                                        mw.loader.using( 'mediawiki.inspect', function () {
-                                               mw.inspect.inspectModules();
+                                               mw.inspect.runReports.apply( mw.inspect, args );
                                        } );
                                }
 
index 70f639c..4ede809 100644 (file)
                 * @param {HTMLElement|jQuery|mw.Message|string} message
                 * @param {Object} options The options to use for the notification.
                 *  See #defaults for details.
+                * @return {Object} Object with a close function to close the notification
                 */
                notify: function ( message, options ) {
                        var notif;
                        } else {
                                preReadyNotifQueue.push( notif );
                        }
+                       return { close: $.proxy( notif.close, notif ) };
                },
 
                /**
index 83d95b6..743d651 100644 (file)
@@ -1,22 +1,23 @@
 /**
  * @class mw.plugin.notify
  */
-( function ( mw ) {
+( function ( mw, $ ) {
        'use strict';
 
        /**
         * @see mw.notification#notify
         * @param message
         * @param options
+        * @return {jQuery.Promise}
         */
        mw.notify = function ( message, options ) {
+               var d = $.Deferred();
                // Don't bother loading the whole notification system if we never use it.
                mw.loader.using( 'mediawiki.notification', function () {
-                       // Don't bother calling mw.loader.using a second time after we've already loaded mw.notification.
-                       mw.notify = mw.notification.notify;
                        // Call notify with the notification the user requested of us.
-                       mw.notify( message, options );
-               } );
+                       d.resolve( mw.notification.notify( message, options ) );
+               }, d.reject );
+               return d.promise();
        };
 
        /**
@@ -24,4 +25,4 @@
         * @mixins mw.plugin.notify
         */
 
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
index 9c3a8b3..4334a9f 100644 (file)
@@ -13,7 +13,7 @@
                 * (don't call before document ready)
                 */
                init: function () {
-                       var profile, $tocTitle, $tocToggleLink, hideTocCookie;
+                       var profile;
 
                        /* Set tooltipAccessKeyPrefix */
                        profile = $.client.profile();
                        } )();
 
                        // Table of contents toggle
-                       $tocTitle = $( '#toctitle' );
-                       $tocToggleLink = $( '#togglelink' );
-                       // Only add it if there is a TOC and there is no toggle added already
-                       if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-                               hideTocCookie = $.cookie( 'mw_hidetoc' );
+                       mw.hook( 'wikipage.content' ).add( function () {
+                               var $tocTitle, $tocToggleLink, hideTocCookie;
+                               $tocTitle = $( '#toctitle' );
+                               $tocToggleLink = $( '#togglelink' );
+                               // Only add it if there is a TOC and there is no toggle added already
+                               if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+                                       hideTocCookie = $.cookie( 'mw_hidetoc' );
                                        $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
                                                .text( mw.msg( 'hidetoc' ) )
                                                .click( function ( e ) {
                                                        e.preventDefault();
                                                        util.toggleToc( $(this) );
                                                } );
-                               $tocTitle.append(
-                                       $tocToggleLink
-                                               .wrap( '<span class="toctoggle"></span>' )
-                                               .parent()
-                                                       .prepend( '&nbsp;[' )
-                                                       .append( ']&nbsp;' )
-                               );
-
-                               if ( hideTocCookie === '1' ) {
-                                       util.toggleToc( $tocToggleLink );
+                                       $tocTitle.append(
+                                               $tocToggleLink
+                                                       .wrap( '<span class="toctoggle"></span>' )
+                                                       .parent()
+                                                               .prepend( '&nbsp;[' )
+                                                               .append( ']&nbsp;' )
+                                       );
+
+                                       if ( hideTocCookie === '1' ) {
+                                               util.toggleToc( $tocToggleLink );
+                                       }
                                }
-                       }
+                       } );
                },
 
                /* Main body */
index 0939ebe..dec8e22 100644 (file)
@@ -40,7 +40,6 @@ $wgAutoloadClasses += array(
        'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
        'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php",
        'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
-       'MediaWikiProvide' => "$testDir/phpunit/includes/Providers.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
 
        # tests/phpunit/includes
@@ -56,10 +55,10 @@ $wgAutoloadClasses += array(
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
-       'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestCase.php",
-       'MockApi' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestContext.php",
+       'MockApi' => "$testDir/phpunit/includes/api/MockApi.php",
+       'UserWrapper' => "$testDir/phpunit/includes/api/UserWrapper.php",
        'RandomImageGenerator' => "$testDir/phpunit/includes/api/RandomImageGenerator.php",
-       'UserWrapper' => "$testDir/phpunit/includes/api/ApiTestCase.php",
 
        # tests/phpunit/includes/content
        'DummyContentHandlerForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
@@ -79,6 +78,9 @@ $wgAutoloadClasses += array(
        # tests/phpunit/includes/libs
        'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
 
+       # tests/phpunit/media
+       'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
+
        # tests/phpunit/includes/site
        'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
        'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
index 1fac2f5..58ea1ed 100644 (file)
  */
 class ParserTest {
        /**
-        * boolean $color whereas output should be colorized
+        * @var bool $color whereas output should be colorized
         */
        private $color;
 
        /**
-        * boolean $showOutput Show test output
+        * @var bool $showOutput Show test output
         */
        private $showOutput;
 
        /**
-        * boolean $useTemporaryTables Use temporary tables for the temporary database
+        * @var bool $useTemporaryTables Use temporary tables for the temporary database
         */
        private $useTemporaryTables = true;
 
        /**
-        * boolean $databaseSetupDone True if the database has been set up
+        * @var bool $databaseSetupDone True if the database has been set up
         */
        private $databaseSetupDone = false;
 
@@ -65,7 +65,7 @@ class ParserTest {
        private $dbClone;
 
        /**
-        * string $oldTablePrefix Original table prefix
+        * @var string $oldTablePrefix Original table prefix
         */
        private $oldTablePrefix;
 
index 8c1ad6c..02a66b5 100644 (file)
@@ -404,9 +404,12 @@ Simple list
 * Item 1
 * Item 2
 !! result
-<ul><li> Item 1
-</li><li> Item 2
-</li></ul>
+<ul>
+<li> Item 1
+</li>
+<li> Item 2
+</li>
+</ul>
 
 !! end
 
@@ -429,22 +432,38 @@ Italics and bold
 * plain l'''italic''plain
 * plain l''''bold''' plain
 !! result
-<ul><li> plain
-</li><li> plain<i>italic</i>plain
-</li><li> plain<i>italic</i>plain<i>italic</i>plain
-</li><li> plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<b>bold</b>plain
-</li><li> plain<i>italic</i>plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<i>italic</i>plain
-</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li><li> plain<i><b>bold-italic</b>italic</i>plain
-</li><li> plain<b><i>bold-italic</i>bold</b>plain
-</li><li> plain<i>italic<b>bold-italic</b></i>plain
-</li><li> plain<b>bold<i>bold-italic</i></b>plain
-</li><li> plain l'<i>italic</i>plain
-</li><li> plain l'<b>bold</b> plain
-</li></ul>
+<ul>
+<li> plain
+</li>
+<li> plain<i>italic</i>plain
+</li>
+<li> plain<i>italic</i>plain<i>italic</i>plain
+</li>
+<li> plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<b>bold</b>plain
+</li>
+<li> plain<i>italic</i>plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<i>italic</i>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i><b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b><i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b></i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i></b>plain
+</li>
+<li> plain l'<i>italic</i>plain
+</li>
+<li> plain l'<b>bold</b> plain
+</li>
+</ul>
 
 !! end
 
@@ -986,15 +1005,24 @@ nowiki 3
 *There is not nowiki.
 *There is <nowiki>nowiki</nowiki>.
 !! result
-<dl><dd>There is not nowiki.
-</dd><dd>There is nowiki.
-</dd></dl>
-<ol><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ol>
-<ul><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ul>
+<dl>
+<dd>There is not nowiki.
+</dd>
+<dd>There is nowiki.
+</dd>
+</dl>
+<ol>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ol>
+<ul>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ul>
 
 !! end
 
@@ -1748,8 +1776,10 @@ Templates: Strip leading and trailing whitespace from named-param values
 </p><p>b
 </p><p>c
 </p>
-<ul><li> d
-</li></ul>
+<ul>
+<li> d
+</li>
+</ul>
 
 !! end
 
@@ -1790,8 +1820,10 @@ Templates: Don't strip whitespace from positional-param values
 </pre>
 <p><br />
 </p>
-<ul><li> f
-</li></ul>
+<ul>
+<li> f
+</li>
+</ul>
 <p><br />
 </p>
 <pre>g
@@ -2241,8 +2273,11 @@ Simple definition
 !! input
 ; name : Definition
 !! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
+<dl>
+<dt> name&#160;</dt>
+<dd> Definition
+</dd>
+</dl>
 
 !! end
 
@@ -2251,8 +2286,10 @@ Definition list for indentation only
 !! input
 : Indented text
 !! result
-<dl><dd> Indented text
-</dd></dl>
+<dl>
+<dd> Indented text
+</dd>
+</dl>
 
 !! end
 
@@ -2261,8 +2298,11 @@ Definition list with no space
 !! input
 ;name:Definition
 !! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
+<dl>
+<dt>name</dt>
+<dd>Definition
+</dd>
+</dl>
 
 !!end
 
@@ -2271,8 +2311,11 @@ Definition list with URL link
 !! input
 ; http://example.com/ : definition
 !! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
+<dd> definition
+</dd>
+</dl>
 
 !! end
 
@@ -2281,8 +2324,11 @@ Definition list with bracketed URL link
 !! input
 ;[http://www.example.com/ Example]:Something about it
 !! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
-</dd></dl>
+<dl>
+<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
+<dd>Something about it
+</dd>
+</dl>
 
 !! end
 
@@ -2291,8 +2337,11 @@ Definition list with wikilink containing colon
 !! input
 ; [[Help:FAQ]]: The least-read page on Wikipedia
 !! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
-</dd></dl>
+<dl>
+<dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
+<dd> The least-read page on Wikipedia
+</dd>
+</dl>
 
 !! end
 
@@ -2302,8 +2351,11 @@ Definition list with news link containing colon
 !! input
 ;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
-</dd></dl>
+<dl>
+<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
+<dd> This isn't even a real newsgroup!
+</dd>
+</dl>
 
 !! end
 
@@ -2312,8 +2364,10 @@ Malformed definition list with colon
 !! input
 ;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
+<dl>
+<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
+</dt>
+</dl>
 
 !! end
 
@@ -2322,8 +2376,11 @@ Definition lists: colon in external link text
 !! input
 ; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
 !! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
+<dd> OK, I made that up
+</dd>
+</dl>
 
 !! end
 
@@ -2332,8 +2389,10 @@ Definition lists: colon in HTML attribute
 !! input
 ;<b style="display: inline">bold</b>
 !! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
+<dl>
+<dt><b style="display: inline">bold</b>
+</dt>
+</dl>
 
 !! end
 
@@ -2342,8 +2401,11 @@ Definition lists: self-closed tag
 !! input
 ;one<br/>two : two-line fun
 !! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
+<dl>
+<dt>one<br />two&#160;</dt>
+<dd> two-line fun
+</dd>
+</dl>
 
 !! end
 
@@ -2372,16 +2434,19 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 <ul><li>
 ; term : description
 * unordered
-</li>
-</ul>
+</li></ul>
 !! result
 <ul><li>
-<dl><dt> term&#160;</dt><dd> description
-</dd></dl>
-<ul><li> unordered
-</li></ul>
+<dl>
+<dt> term&#160;</dt>
+<dd> description
+</dd>
+</dl>
+<ul>
+<li> unordered
 </li>
 </ul>
+</li></ul>
 
 !! end
 
@@ -2392,8 +2457,11 @@ Definition list with empty definition and following paragraph
 ; term:
 Paragraph text
 !! result
-<dl><dt> term</dt><dd>
-</dd></dl>
+<dl>
+<dt> term</dt>
+<dd>
+</dd>
+</dl>
 <p>Paragraph text
 </p>
 !! end
@@ -2422,10 +2490,14 @@ Definition Lists: No nesting: Multiple dd's
 :a
 :b
 !! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dt>x
+</dt>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
 
 !! end
 
@@ -2436,12 +2508,18 @@ Definition Lists: Indentation: Regular
 ::i2
 :::i3
 !! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd>i1
+<dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2451,11 +2529,17 @@ Definition Lists: Indentation: Missing 1st level
 ::i2
 :::i3
 !! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2464,10 +2548,16 @@ Definition Lists: Indentation: Multi-level indent
 !! input
 :::i3
 !! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2502,7 +2592,9 @@ parsoid
 |a
 |} 
 !! result
-<dl><dd> <table><tr><td>a</td></tr></table> </dd></dl>
+<dl>
+<dd> <table><tr><td>a</td></tr></table> </dd>
+</dl>
 !! end
 ## The PHP parser treats : items (dd) without a corresponding ; item (dt)
 ## as an empty dt item.  It also ignores all but the last ";" when followed
@@ -2555,13 +2647,17 @@ Table / list interaction: indented table with lists in table contents
 
 <tr>
 <td> a
-<ul><li> b
-</li></ul>
+<ul>
+<li> b
+</li>
+</ul>
 </td></tr>
 <tr>
 <td> c
-<ul><li> d
-</li></ul>
+<ul>
+<li> d
+</li>
+</ul>
 </td></tr></table></dd></dl>
 
 !! end
@@ -2584,18 +2680,27 @@ Table / list interaction: lists nested in tables nested in indented lists
 <dl><dd><table>
 <tr>
 <td>
-<dl><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
 </td>
 <td>
-<ul><li>c
-</li><li>d
-</li></ul>
+<ul>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
 </td></tr></table></dd></dl>
-<ul><li>e
-</li><li>f
-</li></ul>
+<ul>
+<li>e
+</li>
+<li>f
+</li>
+</ul>
 
 !!end
 
@@ -2683,11 +2788,18 @@ Definition Lists: Nesting: Test 4
 ::;t3
 :::d3
 !! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dt>t3
+</dt>
+<dd>d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2704,13 +2816,22 @@ php
 ::* bar
 :; baz
 !! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
-</dt></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+<li> bar
+</li>
+</ul>
+</dt>
+</dl>
+<dl>
+<dt> baz
+</dt>
+</dl>
+</dd>
+</dl>
 
 !! end
 !! test
@@ -2722,9 +2843,19 @@ parsoid
 ::* bar
 :; baz
 !! result
-<dl><dd><dl><dt><ul><li> foo
-</li></ul></dt><dd><ul><li> bar
-</li></ul></dd><dt> baz</dt></dl></dd></dl>
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+</ul></dt>
+<dd><ul>
+<li> bar
+</li>
+</ul></dd>
+<dt> baz</dt>
+</dl></dd>
+</dl>
 !! end
 
 !! test
@@ -2733,10 +2864,15 @@ Definition Lists: Mixed Lists: Test 2
 *: d1
 *: d2
 !! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2747,12 +2883,21 @@ Definition Lists: Mixed Lists: Test 3
 *::: d1
 *::: d2
 !! result
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2763,10 +2908,17 @@ Definition Lists: Mixed Lists: Test 4
 *;d1 :d2
 *;d3 :d4
 !! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>d1&#160;</dt>
+<dd>d2
+</dd>
+<dt>d3&#160;</dt>
+<dd>d4
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2777,11 +2929,17 @@ Definition Lists: Mixed Lists: Test 5
 *:d1
 *:: d2
 !! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2792,13 +2950,23 @@ Definition Lists: Mixed Lists: Test 6
 #*:d1
 #*::: d3
 !! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</li></ol>
+<ol>
+<li><ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd><dl>
+<dd> d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</li>
+</ol>
 
 !! end
 
@@ -2809,10 +2977,15 @@ Definition Lists: Mixed Lists: Test 7
 :* d1
 :* d2
 !! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
 
 !! end
 
@@ -2823,12 +2996,20 @@ Definition Lists: Mixed Lists: Test 8
 :* d1
 ::* d2
 !! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+</ul>
+<dl>
+<dd><ul>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2838,9 +3019,14 @@ Definition Lists: Mixed Lists: Test 9
 !! input
 *;foo :bar
 !! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2850,10 +3036,17 @@ Definition Lists: Mixed Lists: Test 10
 !! input
 *#;foo :bar
 !! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
 
 !! end
 
@@ -2870,17 +3063,37 @@ php
 *#*#;*;;foo :bar
 *#*#;boo :baz
 !! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
-</dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dt><dl>
+<dt>bar
+</dt>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+<dl>
+<dt>boo&#160;</dt>
+<dd>baz
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
+</li>
+</ol>
+</li>
+</ul>
 
 !! end
 !! test
@@ -2907,9 +3120,17 @@ parsoid
 <dt>
 <dl>
 <dt>foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
-<dd data-parsoid='{"stx":"row"}'>bar</dd></dl></dt></dl></li></ul></dt>
+<dd data-parsoid='{"stx":"row"}'>bar</dd>
+</dl></dt>
+</dl></li>
+</ul></dt>
 <dt>boo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
-<dd data-parsoid='{"stx":"row"}'>baz</dd></dl></li></ol></li></ul></li></ol></li></ul>
+<dd data-parsoid='{"stx":"row"}'>baz</dd>
+</dl></li>
+</ol></li>
+</ul></li>
+</ol></li>
+</ul>
 !! end
 
 
@@ -2920,15 +3141,32 @@ php
 !! input
 *#;*::;; foo : bar (who uses this?)
 !! result
-<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
-</dt></dl>
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt> foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dt><dl>
+<dt> bar (who uses this?)
+</dt>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
 
 !! end
 !! test
@@ -2954,7 +3192,15 @@ parsoid
 <dt>
 <dl>
 <dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
-<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd></dl></dt></dl></dd></dl></dd></dl></li></ul></dt></dl></li></ol></li></ul>
+<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
+</dl></dt>
+</dl></dd>
+</dl></dd>
+</dl></li>
+</ul></dt>
+</dl></li>
+</ol></li>
+</ul>
 !! end
 
 ###
@@ -4428,7 +4674,9 @@ parsoid=wt2html,wt2wt
 !! result
 <table>
 <tr>
-<td><ul><li>a</li></ul></td>
+<td><ul>
+<li>a</li>
+</ul></td>
 </tr>
 </table>
 !! end
@@ -5112,9 +5360,12 @@ Interwiki link encoding conversion (bug 1636)
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
 !! result
-<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li></ul>
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+</ul>
 
 !! end
 
@@ -5542,10 +5793,14 @@ Common list
 * item 2
 *item 3
 !! result
-<ul><li>Common list
-</li><li> item 2
-</li><li>item 3
-</li></ul>
+<ul>
+<li>Common list
+</li>
+<li> item 2
+</li>
+<li>item 3
+</li>
+</ul>
 
 !! end
 
@@ -5556,10 +5811,14 @@ Numbered list
 #item 2
 # item 3
 !! result
-<ol><li>Numbered list
-</li><li>item 2
-</li><li> item 3
-</li></ol>
+<ol>
+<li>Numbered list
+</li>
+<li>item 2
+</li>
+<li> item 3
+</li>
+</ol>
 
 !! end
 
@@ -5582,35 +5841,67 @@ Mixed list
 *** Level 3
 #** Level 3, but ordered
 !! result
-<ul><li>Mixed list
-<ol><li> with numbers
-</li></ol>
-<ul><li> and bullets
-</li></ul>
-<ol><li> and numbers
-</li></ol>
-</li><li>bullets again
-<ul><li>bullet level 2
-<ul><li>bullet level 3
-<ol><li>Number on level 4
-</li></ol>
-</li></ul>
-</li><li>bullet level 2
-<ol><li>Number on level 3
-</li><li>Number on level 3
-</li></ol>
-</li></ul>
-<ol><li>number level 2
-</li></ol>
-</li><li>Level 1
-<ul><li><ul><li> Level 3
-</li></ul>
-</li></ul>
-</li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered
-</li></ul>
-</li></ul>
-</li></ol>
+<ul>
+<li>Mixed list
+<ol>
+<li> with numbers
+</li>
+</ol>
+<ul>
+<li> and bullets
+</li>
+</ul>
+<ol>
+<li> and numbers
+</li>
+</ol>
+</li>
+<li>bullets again
+<ul>
+<li>bullet level 2
+<ul>
+<li>bullet level 3
+<ol>
+<li>Number on level 4
+</li>
+</ol>
+</li>
+</ul>
+</li>
+<li>bullet level 2
+<ol>
+<li>Number on level 3
+</li>
+<li>Number on level 3
+</li>
+</ol>
+</li>
+</ul>
+<ol>
+<li>number level 2
+</li>
+</ol>
+</li>
+<li>Level 1
+<ul>
+<li><ul>
+<li> Level 3
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<ol>
+<li><ul>
+<li><ul>
+<li> Level 3, but ordered
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ol>
 
 !! end
 
@@ -5620,10 +5911,14 @@ Nested lists 1
 *foo
 **bar
 !! result
-<ul><li>foo
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>foo
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -5633,10 +5928,15 @@ Nested lists 2
 **foo
 *bar
 !! result
-<ul><li><ul><li>foo
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>foo
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
 
 !! end
 
@@ -5646,10 +5946,14 @@ Nested lists 3 (first element empty)
 *
 **bar
 !! result
-<ul><li>
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -5659,10 +5963,15 @@ Nested lists 4 (first element empty)
 **
 *bar
 !! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
 
 !! end
 
@@ -5672,10 +5981,15 @@ Nested lists 5 (both elements empty)
 **
 *
 !! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>
+</li>
+</ul>
 
 !! end
 
@@ -5685,10 +5999,14 @@ Nested lists 6 (both elements empty)
 *
 **
 !! result
-<ul><li>
-<ul><li>
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -5697,10 +6015,16 @@ Nested lists 7 (skip initial nesting levels)
 !! input
 *** foo
 !! result
-<ul><li><ul><li><ul><li> foo
-</li></ul>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li> foo
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -5712,13 +6036,21 @@ Nested lists 8 (multiple nesting transitions)
 ** baz
 * boo
 !! result
-<ul><li> foo
-<ul><li><ul><li> bar
-</li></ul>
-</li><li> baz
-</li></ul>
-</li><li> boo
-</li></ul>
+<ul>
+<li> foo
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+<li> baz
+</li>
+</ul>
+</li>
+<li> boo
+</li>
+</ul>
 
 !! end
 
@@ -5729,10 +6061,14 @@ Nested lists 8 (multiple nesting transitions)
 *<!--cmt-->bar
 <!--cmt-->*baz
 !! result
-<ul><li>foo
-</li><li>bar
-</li><li>baz
-</li></ul>
+<ul>
+<li>foo
+</li>
+<li>bar
+</li>
+<li>baz
+</li>
+</ul>
 
 !! end
 
@@ -5742,9 +6078,12 @@ Nested lists 8 (multiple nesting transitions)
 *foo {{echo|bar
 }}*baz
 !! result
-<ul><li>foo bar
-</li><li>baz
-</li></ul>
+<ul>
+<li>foo bar
+</li>
+<li>baz
+</li>
+</ul>
 
 !! end
 
@@ -5755,10 +6094,14 @@ List items are not parsed correctly following a <pre> block (bug 785)
 * <pre>bar</pre>
 * zar
 !! result
-<ul><li> <pre>foo</pre>
-</li><li> <pre>bar</pre>
-</li><li> zar
-</li></ul>
+<ul>
+<li> <pre>foo</pre>
+</li>
+<li> <pre>bar</pre>
+</li>
+<li> zar
+</li>
+</ul>
 
 !! end
 
@@ -5777,18 +6120,30 @@ List items from template
 * notSOL{{inner list}}
 * item 2
 !! result
-<ul><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> notSOL
-</li><li> item 1
-</li><li> item 2
-</li></ul>
+<ul>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> notSOL
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
 
 !! end
 
@@ -5801,14 +6156,22 @@ List interrupted by empty line or heading
 == A heading ==
 * Another list item
 !! result
-<ul><li> foo
-</li></ul>
-<ul><li><ul><li> bar
-</li></ul>
-</li></ul>
+<ul>
+<li> foo
+</li>
+</ul>
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+</ul>
 <h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<ul><li> Another list item
-</li></ul>
+<ul>
+<li> Another list item
+</li>
+</ul>
 
 !!end
 
@@ -5838,11 +6201,16 @@ Single-comment whitespace lines dont break lists, and neither do multi-comment w
  <!--foo--> <!----> <!--This line NOT split the list either--> 
 *d
 !!result
-<ul><li>a
-</li><li>b
-</li><li>c
-</li><li>d
-</li></ul>
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
 
 !!end
 
@@ -5858,11 +6226,16 @@ Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
         either-->       
 *d
 !!result
-<ul><li>a
-</li><li>b
-</li><li>c
-</li><li>d
-</li></ul>
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
 
 !!end
 
@@ -5882,13 +6255,17 @@ parsoid=wt2html,wt2wt
 </li>
 </ul>
 !!result
-<ul><li> foo</li>
+<ul>
+<li> foo</li>
 <li>li-hack</li>
 <li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}}]}'>templated li-hack</li>
-<li> <!--foo--> </li><li> li-hack with preceding comments</li></ul>
+<li> <!--foo--> </li>
+<li> li-hack with preceding comments</li>
+</ul>
 
 <ul>
-<li></li><li>not a li-hack
+<li></li>
+<li>not a li-hack
 </li>
 </ul>
 !!end
@@ -5905,7 +6282,19 @@ parsoid
 : foo
 :: bar
 !! result
-<ol><li> foo<ol><li> bar</li></ol></li></ol><ul><li> foo<ul><li> bar</li></ul></li></ul><dl><dd> foo<dl><dd> bar</dd></dl></dd></dl>
+<ol>
+<li> foo<ol>
+<li> bar</li>
+</ol></li>
+</ol><ul>
+<li> foo<ul>
+<li> bar</li>
+</ul></li>
+</ul><dl>
+<dd> foo<dl>
+<dd> bar</dd>
+</dl></dd>
+</dl>
 !! end
 
 !! test
@@ -5936,10 +6325,14 @@ parsoid
 *b</div>
 !! result
 <div>
-<ul><li>a
-</li></ul></div><div>
-<ul><li>b
-</li></ul></div>
+<ul>
+<li>a
+</li>
+</ul></div><div>
+<ul>
+<li>b
+</li>
+</ul></div>
 !! end
 
 !! test
@@ -5954,9 +6347,12 @@ parsoid
 !! result
 <p><span></span>
 </p>
-<ul><li>a<span></span>
-</li><li>b
-</li></ul>
+<ul>
+<li>a<span></span>
+</li>
+<li>b
+</li>
+</ul>
 !! end
 
 !! test
@@ -5968,9 +6364,12 @@ parsoid
 # <s> a
 # b </s>
 !! result
-<ol><li> <s> a </s>
-</li><li> <s> b </s>
-</li></ol>
+<ol>
+<li> <s> a </s>
+</li>
+<li> <s> b </s>
+</li>
+</ol>
 !! end
 
 !!test
@@ -6162,21 +6561,36 @@ Magic Words LOCAL (UTC)
 * {{LOCALDOW}}
 * {{LOCALTIMESTAMP}}
 !! result
-<ul><li> 01
-</li><li> 1
-</li><li> January
-</li><li> January
-</li><li> Jan
-</li><li> 1
-</li><li> 01
-</li><li> Thursday
-</li><li> 1970
-</li><li> 00:02
-</li><li> 00
-</li><li> 1
-</li><li> 4
-</li><li> 19700101000203
-</li></ul>
+<ul>
+<li> 01
+</li>
+<li> 1
+</li>
+<li> January
+</li>
+<li> January
+</li>
+<li> Jan
+</li>
+<li> 1
+</li>
+<li> 01
+</li>
+<li> Thursday
+</li>
+<li> 1970
+</li>
+<li> 00:02
+</li>
+<li> 00
+</li>
+<li> 1
+</li>
+<li> 4
+</li>
+<li> 19700101000203
+</li>
+</ul>
 
 !! end
 
@@ -7976,9 +8390,12 @@ unused}}}}
 *{{echo|b {{nonexistent|
 unused}}}}
 !!result
-<ul><li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li><li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li></ul>
+<ul>
+<li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+<li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+</ul>
 
 !!end
 
@@ -11675,8 +12092,10 @@ disabled
 !! result
 <ul>
 <li>One
-</li><li>Two
-</li></ul>
+</li>
+<li>Two
+</li>
+</ul>
 
 !! end
 
@@ -11707,8 +12126,10 @@ disabled
 !! result
 <ol>
 <li>One
-</li><li>Two
-</li></ol>
+</li>
+<li>Two
+</li>
+</ol>
 
 !! end
 
@@ -11753,12 +12174,16 @@ disabled
 !! result
 <ul>
 <li>One
-</li><li>Two:
+</li>
+<li>Two:
 <ul>
 <li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
+</li>
+<li>Sub-two
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -11803,21 +12228,27 @@ disabled
 !! result
 <ol>
 <li>One
-</li><li>Two:
+</li>
+<li>Two:
 <ol>
 <li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
+</li>
+<li>Sub-two
+</li>
+</ol>
+</li>
+</ol>
 
 !! end
 
 !! test
 HTML ordered list item with parameters oddity
 !! input
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
 !! result
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
 
 !! end
 
@@ -13042,9 +13473,13 @@ Handling of &#x0A; in URLs
 !! input
 **irc://&#x0A;a
 !! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li>
+</ul>
+</li>
+</ul>
 
 !!end
 
@@ -13104,29 +13539,52 @@ title=[[Parser test]]
 * {{SUBJECTSPACEE}}
 * {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
 !! result
-<ul><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> 
-</li><li> 
-</li><li> 0
-</li><li> Talk
-</li><li> Talk
-</li><li> 
-</li><li> 
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
+<ul>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Talk:Parser test
+</li>
+<li> Talk:Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> 
+</li>
+<li> 
+</li>
+<li> 0
+</li>
+<li> Talk
+</li>
+<li> Talk
+</li>
+<li> 
+</li>
+<li> 
+</li>
+<li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
+</li>
+</ul>
 
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
@@ -13514,13 +13972,25 @@ disabled
 !! input
 :;;;::
 !! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dt><dl>
+<dt><dl>
+<dt><dl>
+<dd><dl>
+<dd>
+</dd>
+</dl>
+</dd>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dd>
+</dl>
 
 !!end
 
@@ -13662,10 +14132,17 @@ Definition list code coverage
 ; title : def
 ;title: def
 !! result
-<dl><dt> title  &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
+<dl>
+<dt> title  &#160;</dt>
+<dd> def
+</dd>
+<dt> title&#160;</dt>
+<dd> def
+</dd>
+<dt>title</dt>
+<dd> def
+</dd>
+</dl>
 
 !! end
 
@@ -13973,6 +14450,17 @@ title=[[Duna]] language=sr
 </p>
 !! end
 
+!! test
+Link to a section of a variant of this title shouldn't be parsed as self-link
+!! options
+title=[[Duna]] language=sr
+!! input
+[[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
+!! result
+<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
+</p>
+!! end
+
 !! test
 Link to pages in language variants
 !! options
@@ -14342,9 +14830,12 @@ Bug 529: Uncovered bullet
 !! input
 * Foo {{bullet}}
 !! result
-<ul><li> Foo 
-</li><li> Bar
-</li></ul>
+<ul>
+<li> Foo 
+</li>
+<li> Bar
+</li>
+</ul>
 
 !! end
 
@@ -14359,15 +14850,30 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! input
 ******* Foo {{bullet}}
 !! result
-<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo 
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li><li> Bar
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li> Foo 
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li> Bar
+</li>
+</ul>
 
 !! end
 
@@ -14399,9 +14905,12 @@ Bug 529: Uncovered bullet in parser function result
 !! input
 * Foo {{lc:{{bullet}} }}
 !! result
-<ul><li> Foo 
-</li><li> bar
-</li></ul>
+<ul>
+<li> Foo 
+</li>
+<li> bar
+</li>
+</ul>
 
 !! end
 
@@ -15799,11 +16308,14 @@ parsoid=wt2html,wt2wt
 {{echo|:a}}
 !!result
 <span about="#mwt1" typeof="mw:Transclusion">
-</span><ul about="#mwt1"><li>a</li></ul>
+</span><ul about="#mwt1"><li>a</li>
+</ul>
 <span about="#mwt2" typeof="mw:Transclusion">
-</span><ol about="#mwt2"><li>a</li></ol>
+</span><ol about="#mwt2"><li>a</li>
+</ol>
 <span about="#mwt3" typeof="mw:Transclusion">
-</span><dl about="#mwt3"><dd>a</dd></dl>
+</span><dl about="#mwt3"><dd>a</dd>
+</dl>
 !!end
 
 #### ----------------------------------------------------------------
@@ -15878,7 +16390,8 @@ A <ref>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
-</li></ol>
+</li>
+</ol>
 !!end
 
 !!test
@@ -15900,7 +16413,8 @@ A <ref>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
  bar
  baz
-</li></ol>
+</li>
+</ol>
 !!end
 
 !!test
@@ -15936,7 +16450,8 @@ baz
 
 
 booz
-</li></ol>
+</li>
+</ol>
 !!end
 
 !!test
@@ -15951,7 +16466,8 @@ A <ref> foo {{echo|</ref> B C}}
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,0,0]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 
 <ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
+</ol>
 !!end
 
 !!test
@@ -15966,7 +16482,8 @@ A <ref> foo <!--</ref> B C
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
 <ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li>
+</ol>
 !!end
 
 !!test
@@ -15981,7 +16498,8 @@ A <ref> <b> foo </ref> B C
 <p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;autoInsertedEnd&amp;quot;:true,&amp;quot;dsr&amp;quot;:[8,16,3,0]}\"> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
 <ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li>
+</ol>
 !!end
 
 !!test
@@ -16043,7 +16561,8 @@ parsoid
 <p><span about="#mwt1" class="reference" data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:{&quot;html&quot;:&quot;foo &amp;lt;ref&amp;gt;bar&amp;lt;/ref&amp;gt; baz&quot;},&quot;attrs&quot;:{}}" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw="{&quot;name&quot;:&quot;references&quot;,&quot;attrs&quot;:{}}">
-<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref&gt;bar&lt;/ref&gt; baz</li></ol>
+<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref&gt;bar&lt;/ref&gt; baz</li>
+</ol>
 !!end
 
 !!test
@@ -16059,7 +16578,8 @@ B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 <p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
 B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li></ol>
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li>
+</ol>
 !!end
 
 !!test
@@ -16085,7 +16605,8 @@ B <ref group="b">bar</ref>
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
 
-<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
 !!end
 
 !!test
@@ -16103,11 +16624,13 @@ B <ref>bar</ref>
 !!result
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
 
 <p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li></ol>
+<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li>
+</ol>
 !!end
 
 !!test
@@ -16127,11 +16650,13 @@ C <ref>cfoo</ref>
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li>
+</ol>
 
 <p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
 
-<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li></ol>
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li>
+</ol>
 !!end
 
 !!test
@@ -16150,7 +16675,8 @@ This should just get lost.
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li>
+</ol>
 !!end
 
 !!test
@@ -16182,10 +16708,12 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
-<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li></ol>
+<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li>
+</ol>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;b&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{}}'>
-<li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li></ol>
+<li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li>
+</ol>
 !! end
 
 #### ----------------------------------------------------------------
@@ -16481,22 +17009,38 @@ Lists: 1. Nested inside html
 
 #<nowiki>;foo</nowiki>
 !! result
-<ul><li>*foo
-</li></ul>
-<ul><li>#foo
-</li></ul>
-<ul><li>:foo
-</li></ul>
-<ul><li>;foo
-</li></ul>
-<ol><li>*foo
-</li></ol>
-<ol><li>#foo
-</li></ol>
-<ol><li>:foo
-</li></ol>
-<ol><li>;foo
-</li></ol>
+<ul>
+<li>*foo
+</li>
+</ul>
+<ul>
+<li>#foo
+</li>
+</ul>
+<ul>
+<li>:foo
+</li>
+</ul>
+<ul>
+<li>;foo
+</li>
+</ul>
+<ol>
+<li>*foo
+</li>
+</ol>
+<ol>
+<li>#foo
+</li>
+</ol>
+<ol>
+<li>:foo
+</li>
+</ol>
+<ol>
+<li>;foo
+</li>
+</ol>
 
 !!end
 
@@ -16512,15 +17056,24 @@ Lists: 2. Inside definition lists
 
 :<nowiki>:foo</nowiki>
 !! result
-<dl><dt>;foo
-</dt></dl>
-<dl><dt>:foo
-</dt></dl>
-<dl><dt>:foo
-</dt><dd>bar
-</dd></dl>
-<dl><dd>:foo
-</dd></dl>
+<dl>
+<dt>;foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+<dd>bar
+</dd>
+</dl>
+<dl>
+<dd>:foo
+</dd>
+</dl>
 
 !!end
 
@@ -16531,10 +17084,14 @@ Lists: 3. Only bullets at start of text should be escaped
 
 *<nowiki>*foo</nowiki>''it''*bar
 !! result
-<ul><li>*foo*bar
-</li></ul>
-<ul><li>*foo<i>it</i>*bar
-</li></ul>
+<ul>
+<li>*foo*bar
+</li>
+</ul>
+<ul>
+<li>*foo<i>it</i>*bar
+</li>
+</ul>
 
 !!end
 
@@ -16549,12 +17106,18 @@ parsoid
 
 *[[Foo]]: bar
 !! result
-<ul><li>foo*bar
-</li></ul>
-<ul><li><i>foo</i>*bar
-</li></ul>
-<ul><li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
-</li></ul>
+<ul>
+<li>foo*bar
+</li>
+</ul>
+<ul>
+<li><i>foo</i>*bar
+</li>
+</ul>
+<ul>
+<li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
+</li>
+</ul>
 !!end
 
 !! test
@@ -16572,18 +17135,30 @@ Lists: 5. No unnecessary escapes
 
 * <s></s>: a
 !! result
-<ul><li> bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>[[bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>]]bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>foo]]</span>=
-</li></ul>
-<ul><li> <s></s>: a
-</li></ul>
+<ul>
+<li> bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>[[bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>]]bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>foo]]</span>=
+</li>
+</ul>
+<ul>
+<li> <s></s>: a
+</li>
+</ul>
 
 !!end
 
index 349c510..8c849bc 100644 (file)
@@ -777,7 +777,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * Returns true iff the given namespace defaults to Wikitext
+        * Returns true if the given namespace defaults to Wikitext
         * according to $wgNamespaceContentModels
         *
         * @param int $ns The namespace ID to check
index 686ab93..c749598 100644 (file)
@@ -5,7 +5,11 @@
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
 
-       function testbug14404() {
+       /**
+        * @covers Title::getTemplateLinksFrom
+        * @covers Title::getLinksFrom
+        */
+       public function testbug14404() {
                global $wgContLang, $wgLanguageCode, $wgLang;
 
                $title = Title::newFromText( 'Bug 14404' );
index 867c4f0..84f900f 100644 (file)
@@ -25,28 +25,37 @@ class ArticleTest extends MediaWikiTestCase {
                $this->article = null;
        }
 
-       function testImplementsGetMagic() {
+       /**
+        * @covers Article::__get
+        */
+       public function testImplementsGetMagic() {
                $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
        }
 
        /**
         * @depends testImplementsGetMagic
+        * @covers Article::__set
         */
-       function testImplementsSetMagic() {
+       public function testImplementsSetMagic() {
                $this->article->mLatest = 2;
                $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
        }
 
        /**
         * @depends testImplementsSetMagic
+        * @covers Article::__call
         */
-       function testImplementsCallMagic() {
+       public function testImplementsCallMagic() {
                $this->article->mLatest = 33;
                $this->article->mDataLoaded = true;
                $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
        }
 
-       function testGetOrSetOnNewProperty() {
+       /**
+        * @covers Article::__get
+        * @covers Article::__set
+        */
+       public function testGetOrSetOnNewProperty() {
                $this->article->ext_someNewProperty = 12;
                $this->assertEquals( 12, $this->article->ext_someNewProperty,
                        "Article get/set magic on new field" );
@@ -58,8 +67,13 @@ class ArticleTest extends MediaWikiTestCase {
 
        /**
         * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
+        * @covers Article::selectFields
+        * @covers Article::onArticleCreate
+        * @covers Article::onArticleDelete
+        * @covers Article::onArticleEdit
+        * @covers Article::getAutosummary
         */
-       function testStaticFunctions() {
+       public function testStaticFunctions() {
                $this->hideDeprecated( 'Article::getAutosummary' );
                $this->hideDeprecated( 'WikiPage::getAutosummary' );
                $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
@@ -75,18 +89,4 @@ class ArticleTest extends MediaWikiTestCase {
                $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
                        "Article static functions" );
        }
-
-       function testWikiPageFactory() {
-               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiPage', get_class( $page ) );
-       }
 }
index 32fc2c5..f0049fe 100644 (file)
@@ -6,7 +6,9 @@
  */
 class BlockTest extends MediaWikiLangTestCase {
 
-       private $block, $madeAt;
+       /** @var Block */
+       private $block;
+       private $madeAt;
 
        /* variable used to save up the blockID we insert in this test suite */
        private $blockId;
@@ -66,18 +68,24 @@ class BlockTest extends MediaWikiLangTestCase {
                }
        }
 
-       function testInitializerFunctionsReturnCorrectBlock() {
-               // $this->dumpBlocks();
-
+       /**
+        * @covers Block::newFromTarget
+        */
+       public function testINewFromTargetReturnsCorrectBlock() {
                $this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
+       }
 
+       /**
+        * @covers Block::newFromID
+        */
+       public function testINewFromIDReturnsCorrectBlock() {
                $this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
        }
 
        /**
         * per bug 26425
         */
-       function testBug26425BlockTimestampDefaultsToTime() {
+       public function testBug26425BlockTimestampDefaultsToTime() {
                // delta to stop one-off errors when things happen to go over a second mark.
                $delta = abs( $this->madeAt - $this->block->mTimestamp );
                $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
@@ -90,8 +98,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * This stopped working with r84475 and friends: regression being fixed for bug 29116.
         *
         * @dataProvider provideBug29116Data
+        * @covers Block::load
         */
-       function testBug29116LoadWithEmptyIp( $vagueTarget ) {
+       public function testBug29116LoadWithEmptyIp( $vagueTarget ) {
                $this->hideDeprecated( 'Block::load' );
 
                $uid = User::idFromName( 'UTBlockee' );
@@ -110,8 +119,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * had. Regression bug 29116.
         *
         * @dataProvider provideBug29116Data
+        * @covers Block::newFromTarget
         */
-       function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
+       public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
                $block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
                $this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
        }
@@ -124,7 +134,10 @@ class BlockTest extends MediaWikiLangTestCase {
                );
        }
 
-       function testBlockedUserCanNotCreateAccount() {
+       /**
+        * @covers Block::prevents
+        */
+       public function testBlockedUserCanNotCreateAccount() {
                $username = 'BlockedUserToCreateAccountWith';
                $u = User::newFromName( $username );
                $u->setPassword( 'NotRandomPass' );
@@ -184,7 +197,10 @@ class BlockTest extends MediaWikiLangTestCase {
                );
        }
 
-       function testCrappyCrossWikiBlocks() {
+       /**
+        * @covers Block::insert
+        */
+       public function testCrappyCrossWikiBlocks() {
                // Delete the last round's block if it's still there
                $oldBlock = Block::newFromTarget( 'UserOnForeignWiki' );
                if ( $oldBlock ) {
@@ -343,8 +359,10 @@ class BlockTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider providerXff
+        * @covers Block::getBlocksForIPList
+        * @covers Block::chooseBlock
         */
-       function testBlocksOnXff( $xff, $exCount, $exResult ) {
+       public function testBlocksOnXff( $xff, $exCount, $exResult ) {
                $list = array_map( 'trim', explode( ',', $xff ) );
                $xffblocks = Block::getBlocksForIPList( $list, true );
                $this->assertEquals( $exCount, count( $xffblocks ), 'Number of blocks for ' . $xff );
index e3d9da7..4832ada 100644 (file)
@@ -2,6 +2,8 @@
 
 /**
  * Test the CDB reader/writer
+ * @covers CdbWriter_PHP
+ * @covers CdbWriter_DBA
  */
 class CdbTest extends MediaWikiTestCase {
 
index f1004fb..c6a7169 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+
+/**
+ * Class CollationTest
+ * @covers Collation
+ * @covers IcuCollation
+ * @covers IdentityCollation
+ * @covers UppercaseCollation
+ */
 class CollationTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
@@ -20,7 +28,7 @@ class CollationTest extends MediaWikiLangTestCase {
         *
         * @dataProvider prefixDataProvider
         */
-       function testIsPrefix( $lang, $base, $extended ) {
+       public function testIsPrefix( $lang, $base, $extended ) {
                $cp = Collator::create( $lang );
                $cp->setStrength( Collator::PRIMARY );
                $baseBin = $cp->getSortKey( $base );
@@ -30,7 +38,7 @@ class CollationTest extends MediaWikiLangTestCase {
                $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
        }
 
-       function prefixDataProvider() {
+       public static function prefixDataProvider() {
                return array(
                        array( 'en', 'A', 'AA' ),
                        array( 'en', 'A', 'AAA' ),
@@ -53,7 +61,7 @@ class CollationTest extends MediaWikiLangTestCase {
         *
         * @dataProvider notPrefixDataProvider
         */
-       function testNotIsPrefix( $lang, $base, $extended ) {
+       public function testNotIsPrefix( $lang, $base, $extended ) {
                $cp = Collator::create( $lang );
                $cp->setStrength( Collator::PRIMARY );
                $baseBin = $cp->getSortKey( $base );
@@ -63,7 +71,7 @@ class CollationTest extends MediaWikiLangTestCase {
                $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
        }
 
-       function notPrefixDataProvider() {
+       public static function notPrefixDataProvider() {
                return array(
                        array( 'en', 'A', 'B' ),
                        array( 'en', 'AC', 'ABC' ),
@@ -81,7 +89,7 @@ class CollationTest extends MediaWikiLangTestCase {
         *
         * @dataProvider firstLetterProvider
         */
-       function testGetFirstLetter( $collation, $string, $firstLetter ) {
+       public function testGetFirstLetter( $collation, $string, $firstLetter ) {
                $col = Collation::factory( $collation );
                $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
        }
index d927b7a..76a9a10 100644 (file)
@@ -23,8 +23,9 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
        /**
         * Test for DiffHistoryBlob::xdiffAdler32()
         * @dataProvider provideXdiffAdler32
+        * @covers DiffHistoryBlob::xdiffAdler32
         */
-       function testXdiffAdler32( $input ) {
+       public function testXdiffAdler32( $input ) {
                $xdiffHash = substr( xdiff_string_rabdiff( $input, '' ), 0, 4 );
                $dhb = new DiffHistoryBlob;
                $myHash = $dhb->xdiffAdler32( $input );
index 76ef782..7d2b04f 100644 (file)
@@ -13,8 +13,9 @@ class EditPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideExtractSectionTitle
+        * @covers EditPage::extractSectionTitle
         */
-       function testExtractSectionTitle( $section, $title ) {
+       public function testExtractSectionTitle( $section, $title ) {
                $extracted = EditPage::extractSectionTitle( $section );
                $this->assertEquals( $title, $extracted );
        }
@@ -59,7 +60,7 @@ class EditPageTest extends MediaWikiLangTestCase {
         * wrapper around assertEquals() which calls rrtrim() to normalize the
         * expected and actual texts.
         */
-       function assertEditedTextEquals( $expected, $actual, $msg = '' ) {
+       protected function assertEditedTextEquals( $expected, $actual, $msg = '' ) {
                return $this->assertEquals( rtrim( $expected ), rtrim( $actual ), $msg );
        }
 
@@ -172,6 +173,10 @@ class EditPageTest extends MediaWikiLangTestCase {
                return $page;
        }
 
+       /**
+        * @todo split into a dataprovider and test method
+        * @covers EditPage
+        */
        public function testCreatePage() {
                $this->assertEdit(
                        'EditPageTest_testCreatePage',
@@ -338,6 +343,7 @@ hello
 
        /**
         * @dataProvider provideSectionEdit
+        * @covers EditPage
         */
        public function testSectionEdit( $base, $section, $text, $summary, $expected ) {
                $edit = array(
@@ -432,6 +438,7 @@ hello
 
        /**
         * @dataProvider provideAutoMerge
+        * @covers EditPage
         */
        public function testAutoMerge( $baseUser, $text, $adamsEdit, $bertasEdit,
                $expectedCode, $expectedText, $message = null
index 99544e7..ba155a4 100644 (file)
@@ -5,7 +5,10 @@
 
 class ExternalStoreTest extends MediaWikiTestCase {
 
-       function testExternalFetchFromURL() {
+       /**
+        * @covers ExternalStore::fetchFromURL
+        */
+       public function testExternalFetchFromURL() {
                $this->setMwGlobals( 'wgExternalStores', false );
 
                $this->assertFalse(
index 07215c1..dc19154 100644 (file)
@@ -5,6 +5,11 @@
  */
 class ExtraParserTest extends MediaWikiTestCase {
 
+       /** @var ParserOptions */
+       protected $options;
+       /** @var Parser */
+       protected $parser;
+
        protected function setUp() {
                parent::setUp();
 
@@ -26,8 +31,11 @@ class ExtraParserTest extends MediaWikiTestCase {
                MagicWord::clearCache();
        }
 
-       // Bug 8689 - Long numeric lines kill the parser
-       function testBug8689() {
+       /**
+        * Bug 8689 - Long numeric lines kill the parser
+        * @covers Parser::parse
+        */
+       public function testBug8689() {
                global $wgUser;
                $longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
 
@@ -37,14 +45,20 @@ class ExtraParserTest extends MediaWikiTestCase {
                        $this->parser->parse( $longLine, $t, $options )->getText() );
        }
 
-       /* Test the parser entry points */
-       function testParse() {
+       /**
+        * Test the parser entry points
+        * @covers Parser::parse
+        */
+       public function testParse() {
                $title = Title::newFromText( __FUNCTION__ );
                $parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
                $this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
        }
 
-       function testPreSaveTransform() {
+       /**
+        * @covers Parser::preSaveTransform
+        */
+       public function testPreSaveTransform() {
                global $wgUser;
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->preSaveTransform( "Test\r\n{{subst:Foo}}\n{{Bar}}", $title, $wgUser, $this->options );
@@ -52,7 +66,10 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
        }
 
-       function testPreprocess() {
+       /**
+        * @covers Parser::preprocess
+        */
+       public function testPreprocess() {
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
 
@@ -61,8 +78,9 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        /**
         * cleanSig() makes all templates substs and removes tildes
+        * @covers Parser::cleanSig
         */
-       function testCleanSig() {
+       public function testCleanSig() {
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
 
@@ -71,8 +89,9 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        /**
         * cleanSig() should do nothing if disabled
+        * @covers Parser::cleanSig
         */
-       function testCleanSigDisabled() {
+       public function testCleanSigDisabled() {
                $this->setMwGlobals( 'wgCleanSignatures', false );
 
                $title = Title::newFromText( __FUNCTION__ );
@@ -84,8 +103,9 @@ class ExtraParserTest extends MediaWikiTestCase {
        /**
         * cleanSigInSig() just removes tildes
         * @dataProvider provideStringsForCleanSigInSig
+        * @covers Parser::cleanSigInSig
         */
-       function testCleanSigInSig( $in, $out ) {
+       public function testCleanSigInSig( $in, $out ) {
                $this->assertEquals( Parser::cleanSigInSig( $in ), $out );
        }
 
@@ -97,7 +117,10 @@ class ExtraParserTest extends MediaWikiTestCase {
                );
        }
 
-       function testGetSection() {
+       /**
+        * @covers Parser::getSection
+        */
+       public function testGetSection() {
                $outputText2 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 2 );
                $outputText1 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1 );
 
@@ -105,7 +128,10 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
        }
 
-       function testReplaceSection() {
+       /**
+        * @covers Parser::replaceSection
+        */
+       public function testReplaceSection() {
                $outputText = $this->parser->replaceSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1, "New section 1" );
 
                $this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
@@ -113,8 +139,9 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        /**
         * Templates and comments are not affected, but noinclude/onlyinclude is.
+        * @covers Parser::getPreloadText
         */
-       function testGetPreloadText() {
+       public function testGetPreloadText() {
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
 
@@ -133,8 +160,9 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        /**
         * @group Database
+        * @covers Parser::parse
         */
-       function testTrackingCategory() {
+       public function testTrackingCategory() {
                $title = Title::newFromText( __FUNCTION__ );
                $catName = wfMessage( 'broken-file-category' )->inContentLanguage()->text();
                $cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
@@ -146,8 +174,9 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        /**
         * @group Database
+        * @covers Parser::parse
         */
-       function testTrackingCategorySpecial() {
+       public function testTrackingCategorySpecial() {
                // Special pages shouldn't have tracking cats.
                $title = SpecialPage::getTitleFor( 'Contributions' );
                $parserOutput = $this->parser->parse( "[[file:nonexistent]]", $title, $this->options );
diff --git a/tests/phpunit/includes/FallbackTest.php b/tests/phpunit/includes/FallbackTest.php
new file mode 100644 (file)
index 0000000..f408f47
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @covers Fallback
+ */
+class FallbackTest extends MediaWikiTestCase {
+
+       public function testFallbackMbstringFunctions() {
+
+               if ( !extension_loaded( 'mbstring' ) ) {
+                       $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
+               }
+
+               $sampleUTF = "Östergötland_coat_of_arms.png";
+
+               //mb_substr
+               $substr_params = array(
+                       array( 0, 0 ),
+                       array( 5, -4 ),
+                       array( 33 ),
+                       array( 100, -5 ),
+                       array( -8, 10 ),
+                       array( 1, 1 ),
+                       array( 2, -1 )
+               );
+
+               foreach ( $substr_params as $param_set ) {
+                       $old_param_set = $param_set;
+                       array_unshift( $param_set, $sampleUTF );
+
+                       $this->assertEquals(
+                               call_user_func_array( 'mb_substr', $param_set ),
+                               call_user_func_array( 'Fallback::mb_substr', $param_set ),
+                               'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
+                       );
+               }
+
+               //mb_strlen
+               $this->assertEquals(
+                       mb_strlen( $sampleUTF ),
+                       Fallback::mb_strlen( $sampleUTF ),
+                       'Fallback mb_strlen'
+               );
+
+               //mb_str(r?)pos
+               $strpos_params = array(
+                       //array( 'ter' ),
+                       //array( 'Ö' ),
+                       //array( 'Ö', 3 ),
+                       //array( 'oat_', 100 ),
+                       //array( 'c', -10 ),
+                       //Broken for now
+               );
+
+               foreach ( $strpos_params as $param_set ) {
+                       $old_param_set = $param_set;
+                       array_unshift( $param_set, $sampleUTF );
+
+                       $this->assertEquals(
+                               call_user_func_array( 'mb_strpos', $param_set ),
+                               call_user_func_array( 'Fallback::mb_strpos', $param_set ),
+                               'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
+                       );
+
+                       $this->assertEquals(
+                               call_user_func_array( 'mb_strrpos', $param_set ),
+                               call_user_func_array( 'Fallback::mb_strrpos', $param_set ),
+                               'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
+                       );
+               }
+       }
+
+}
\ No newline at end of file
index dfb0f13..3246410 100644 (file)
@@ -2,7 +2,11 @@
 
 class FauxRequestTest extends MediaWikiTestCase {
 
-       function testGetSetHeader() {
+       /**
+        * @covers FauxRequest::setHeader
+        * @covers FauxRequest::getHeader
+        */
+       public function testGetSetHeader() {
                $value = 'test/test';
 
                $request = new FauxRequest();
index 977c22b..7f41cfd 100644 (file)
  */
 
 class FauxResponseTest extends MediaWikiTestCase {
-       var $response;
+       /** @var FauxResponse */
+       protected $response;
 
        protected function setUp() {
                parent::setUp();
                $this->response = new FauxResponse;
        }
 
-       function testCookie() {
+       /**
+        * @covers FauxResponse::getcookie
+        * @covers FauxResponse::setcookie
+        */
+       public function testCookie() {
                $this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
                $this->response->setcookie( 'key', 'val' );
                $this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
        }
 
-       function testHeader() {
+       /**
+        * @covers FauxResponse::getheader
+        * @covers FauxResponse::header
+        */
+       public function testHeader() {
                $this->assertEquals( null, $this->response->getheader( 'Location' ), 'Non-existing header' );
 
                $this->response->header( 'Location: http://localhost/' );
@@ -52,7 +61,10 @@ class FauxResponseTest extends MediaWikiTestCase {
                $this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
        }
 
-       function testResponseCode() {
+       /**
+        * @covers FauxResponse::getStatusCode
+        */
+       public function testResponseCode() {
                $this->response->header( 'HTTP/1.1 200' );
                $this->assertEquals( 200, $this->response->getStatusCode(), 'Header with no message' );
 
index fb2304d..1531b56 100644 (file)
@@ -35,7 +35,6 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
         */
        protected $object;
 
-
        /**
         * A new fresh and empty FormOptions object to test initialization
         * with.
@@ -45,6 +44,9 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
                $this->object = new FormOptionsExposed();
        }
 
+       /**
+        * @covers FormOptionsExposed::add
+        */
        public function testAddStringOption() {
                $this->object->add( 'foo', 'string value' );
                $this->assertEquals(
@@ -60,6 +62,9 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers FormOptionsExposed::add
+        */
        public function testAddIntegers() {
                $this->object->add( 'one', 1 );
                $this->object->add( 'negone', -1 );
index 0a13cfe..08d6ba8 100644 (file)
@@ -60,6 +60,7 @@ class FormOptionsTest extends MediaWikiTestCase {
 
        /**
         * Reuse helpers above assertGuessBoolean assertGuessInt assertGuessString
+        * @covers FormOptions::guessType
         */
        public function testGuessTypeDetection() {
                $this->assertGuessBoolean( true );
@@ -78,12 +79,14 @@ class FormOptionsTest extends MediaWikiTestCase {
 
        /**
         * @expectedException MWException
+        * @covers FormOptions::guessType
         */
        public function testGuessTypeOnArrayThrowException() {
                $this->object->guessType( array( 'foo' ) );
        }
        /**
         * @expectedException MWException
+        * @covers FormOptions::guessType
         */
        public function testGuessTypeOnNullThrowException() {
                $this->object->guessType( null );
index 244b100..6154df1 100644 (file)
@@ -29,7 +29,10 @@ class GlobalTest extends MediaWikiTestCase {
                parent::tearDown();
        }
 
-       /** @dataProvider provideForWfArrayDiff2 */
+       /**
+        * @dataProvider provideForWfArrayDiff2
+        * @covers ::wfArrayDiff2
+        */
        public function testWfArrayDiff2( $a, $b, $expected ) {
                $this->assertEquals(
                        wfArrayDiff2( $a, $b ), $expected
@@ -53,25 +56,37 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
-       function testRandom() {
+       /**
+        * @covers ::wfRandom
+        */
+       public function testRandom() {
                # This could hypothetically fail, but it shouldn't ;)
                $this->assertFalse(
                        wfRandom() == wfRandom() );
        }
 
-       function testUrlencode() {
+       /**
+        * @covers ::wfUrlencode
+        */
+       public function testUrlencode() {
                $this->assertEquals(
                        "%E7%89%B9%E5%88%A5:Contributions/Foobar",
                        wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
        }
 
-       function testExpandIRI() {
+       /**
+        * @covers ::wfExpandIRI
+        */
+       public function testExpandIRI() {
                $this->assertEquals(
                        "https://te.wikibooks.org/wiki/ఉబుంటు_వాడుకరి_మార్గదర్శని",
                        wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
        }
 
-       function testReadOnlyEmpty() {
+       /**
+        * @covers ::wfReadOnly
+        */
+       public function testReadOnlyEmpty() {
                global $wgReadOnly;
                $wgReadOnly = null;
 
@@ -79,7 +94,10 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertFalse( wfReadOnly() );
        }
 
-       function testReadOnlySet() {
+       /**
+        * @covers ::wfReadOnly
+        */
+       public function testReadOnlySet() {
                global $wgReadOnly, $wgReadOnlyFile;
 
                $f = fopen( $wgReadOnlyFile, "wt" );
@@ -97,12 +115,6 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertFalse( wfReadOnly() );
        }
 
-       function testQuotedPrintable() {
-               $this->assertEquals(
-                       "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
-                       UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
-       }
-
        public static function provideArrayToCGI() {
                return array(
                        array( array(), '' ), // empty
@@ -123,13 +135,17 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideArrayToCGI
+        * @covers ::wfArrayToCgi
         */
-       function testArrayToCGI( $array, $result ) {
+       public function testArrayToCGI( $array, $result ) {
                $this->assertEquals( $result, wfArrayToCgi( $array ) );
        }
 
 
-       function testArrayToCGI2() {
+       /**
+        * @covers ::testWfArrayDiff2
+        */
+       public function testArrayToCGI2() {
                $this->assertEquals(
                        "baz=bar&foo=bar",
                        wfArrayToCgi(
@@ -154,8 +170,9 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideCgiToArray
+        * @covers ::wfCgiToArray
         */
-       function testCgiToArray( $cgi, $result ) {
+       public function testCgiToArray( $cgi, $result ) {
                $this->assertEquals( $result, wfCgiToArray( $cgi ) );
        }
 
@@ -174,12 +191,16 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideCgiRoundTrip
+        * @covers ::wfArrayToCgi
         */
-       function testCgiRoundTrip( $cgi ) {
+       public function testCgiRoundTrip( $cgi ) {
                $this->assertEquals( $cgi, wfArrayToCgi( wfCgiToArray( $cgi ) ) );
        }
 
-       function testMimeTypeMatch() {
+       /**
+        * @covers ::mimeTypeMatch
+        */
+       public function testMimeTypeMatch() {
                $this->assertEquals(
                        'text/html',
                        mimeTypeMatch( 'text/html',
@@ -201,7 +222,10 @@ class GlobalTest extends MediaWikiTestCase {
                                        'image/svg+xml' => 0.5 ) ) );
        }
 
-       function testNegotiateType() {
+       /**
+        * @covers ::wfNegotiateType
+        */
+       public function testNegotiateType() {
                $this->assertEquals(
                        'text/html',
                        wfNegotiateType(
@@ -242,73 +266,11 @@ class GlobalTest extends MediaWikiTestCase {
                                array( 'application/xhtml+xml' => 1.0 ) ) );
        }
 
-       function testFallbackMbstringFunctions() {
-
-               if ( !extension_loaded( 'mbstring' ) ) {
-                       $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
-               }
-
-               $sampleUTF = "Östergötland_coat_of_arms.png";
-
-               //mb_substr
-               $substr_params = array(
-                       array( 0, 0 ),
-                       array( 5, -4 ),
-                       array( 33 ),
-                       array( 100, -5 ),
-                       array( -8, 10 ),
-                       array( 1, 1 ),
-                       array( 2, -1 )
-               );
-
-               foreach ( $substr_params as $param_set ) {
-                       $old_param_set = $param_set;
-                       array_unshift( $param_set, $sampleUTF );
-
-                       $this->assertEquals(
-                               call_user_func_array( 'mb_substr', $param_set ),
-                               call_user_func_array( 'Fallback::mb_substr', $param_set ),
-                               'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
-                       );
-               }
-
-               //mb_strlen
-               $this->assertEquals(
-                       mb_strlen( $sampleUTF ),
-                       Fallback::mb_strlen( $sampleUTF ),
-                       'Fallback mb_strlen'
-               );
-
-               //mb_str(r?)pos
-               $strpos_params = array(
-                       //array( 'ter' ),
-                       //array( 'Ö' ),
-                       //array( 'Ö', 3 ),
-                       //array( 'oat_', 100 ),
-                       //array( 'c', -10 ),
-                       //Broken for now
-               );
-
-               foreach ( $strpos_params as $param_set ) {
-                       $old_param_set = $param_set;
-                       array_unshift( $param_set, $sampleUTF );
-
-                       $this->assertEquals(
-                               call_user_func_array( 'mb_strpos', $param_set ),
-                               call_user_func_array( 'Fallback::mb_strpos', $param_set ),
-                               'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
-                       );
-
-                       $this->assertEquals(
-                               call_user_func_array( 'mb_strrpos', $param_set ),
-                               call_user_func_array( 'Fallback::mb_strrpos', $param_set ),
-                               'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
-                       );
-               }
-       }
-
-
-       function testDebugFunctionTest() {
+       /**
+        * @covers ::wfDebug
+        * @covers ::wfDebugMem
+        */
+       public function testDebugFunctionTest() {
 
                global $wgDebugLogFile, $wgDebugTimestamps;
 
@@ -342,7 +304,10 @@ class GlobalTest extends MediaWikiTestCase {
                $wgDebugTimestamps = $old_wgDebugTimestamps;
        }
 
-       function testClientAcceptsGzipTest() {
+       /**
+        * @covers ::wfClientAcceptsGzip
+        */
+       public function testClientAcceptsGzipTest() {
 
                $settings = array(
                        'gzip' => true,
@@ -373,7 +338,10 @@ class GlobalTest extends MediaWikiTestCase {
                }
        }
 
-       function testSwapVarsTest() {
+       /**
+        * @covers ::swap
+        */
+       public function testSwapVarsTest() {
                $var1 = 1;
                $var2 = 2;
 
@@ -386,7 +354,10 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $var2, 1, 'var2 is swapped' );
        }
 
-       function testWfPercentTest() {
+       /**
+        * @covers ::wfPercent
+        */
+       public function testWfPercentTest() {
 
                $pcts = array(
                        array( 6 / 7, '0.86%', 2, false ),
@@ -414,6 +385,7 @@ class GlobalTest extends MediaWikiTestCase {
        /**
         * test @see wfShorthandToInteger()
         * @dataProvider provideShorthand
+        * @covers ::wfShorthandToInteger
         */
        public function testWfShorthandToInteger( $shorthand, $expected ) {
                $this->assertEquals( $expected,
@@ -474,6 +446,7 @@ class GlobalTest extends MediaWikiTestCase {
         *
         * @dataProvider provideMerge()
         * @group medium
+        * @covers ::wfMerge
         */
        public function testMerge( $old, $mine, $yours, $expectedMergeResult, $expectedText ) {
                $this->checkHasDiff3();
@@ -549,8 +522,9 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideMakeUrlIndexes()
+        * @covers ::wfMakeUrlIndexes
         */
-       function testMakeUrlIndexes( $url, $expected ) {
+       public function testMakeUrlIndexes( $url, $expected ) {
                $index = wfMakeUrlIndexes( $url );
                $this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
        }
@@ -606,8 +580,9 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideWfMatchesDomainList
+        * @covers ::wfMatchesDomainList
         */
-       function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
+       public function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
                $actual = wfMatchesDomainList( $url, $domains );
                $this->assertEquals( $expected, $actual, $description );
        }
@@ -630,7 +605,10 @@ class GlobalTest extends MediaWikiTestCase {
                return $a;
        }
 
-       function testWfMkdirParents() {
+       /**
+        * @covers ::wfMkdirParents
+        */
+       public function testWfMkdirParents() {
                // Should not return true if file exists instead of directory
                $fname = $this->getNewTempFile();
                wfSuppressWarnings();
@@ -641,8 +619,9 @@ class GlobalTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideWfShellMaintenanceCmdList
+        * @covers ::wfShellMaintenanceCmd
         */
-       function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+       public function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
                if ( wfIsWindows() ) {
                        // Approximation that's good enough for our purposes just now
                        $expected = str_replace( "'", '"', $expected );
@@ -669,5 +648,5 @@ class GlobalTest extends MediaWikiTestCase {
                                "Called eval.php --help --test with wrapper and php option" ),
                );
        }
-       /* TODO: many more! */
+       /* @TODO many more! */
 }
index 8bd0849..cf891e7 100644 (file)
@@ -6,8 +6,9 @@
 class GlobalWithDBTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideWfIsBadImageList
+        * @covers ::wfIsBadImage
         */
-       function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
+       public function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
                $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
        }
 
index 4184d15..9bb7487 100644 (file)
@@ -1,9 +1,11 @@
 <?php
 /**
- * Tests for wfAssembleUrl()
+ * @covers ::wfAssembleUrl
  */
 class WfAssembleUrlTest extends MediaWikiTestCase {
-       /** @dataProvider provideURLParts */
+       /**
+        * @dataProvider provideURLParts
+        */
        public function testWfAssembleUrl( $parts, $output ) {
                $partsDump = print_r( $parts, true );
                $this->assertEquals(
index baf9cee..a01c0d4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Tests for wfBCP47()
+ * @covers ::wfBCP47
  */
 class WfBCP47Test extends MediaWikiTestCase {
        /**
@@ -13,7 +13,7 @@ class WfBCP47Test extends MediaWikiTestCase {
         * @see http://tools.ietf.org/html/bcp47
         * @dataProvider provideLanguageCodes()
         */
-       function testBCP47( $code, $expected ) {
+       public function testBCP47( $code, $expected ) {
                $code = strtolower( $code );
                $this->assertEquals( $expected, wfBCP47( $code ),
                        "Applying BCP47 standard to lower case '$code'"
index c60f223..7da804e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Tests for wfBaseConvert()
+ * @covers ::wfBaseConvert
  */
 class WfBaseConvertTest extends MediaWikiTestCase {
        public static function provideSingleDigitConversions() {
index 3c4fa20..8c54804 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 /**
- * Tests for wfBaseName()
+ * @covers ::wfBaseName
  */
 class WfBaseNameTest extends MediaWikiTestCase {
        /**
         * @dataProvider providePaths
         */
-       function testBaseName( $fullpath, $basename ) {
+       public function testBaseName( $fullpath, $basename ) {
                $this->assertEquals( $basename, wfBaseName( $fullpath ),
                        "wfBaseName('$fullpath') => '$basename'" );
        }
index 5b622c1..41230a1 100644 (file)
@@ -1,9 +1,11 @@
 <?php
 /**
- * Tests for wfExpandUrl()
+ * @covers ::wfExpandUrl
  */
 class WfExpandUrlTest extends MediaWikiTestCase {
-       /** @dataProvider provideExpandableUrls */
+       /**
+        * @dataProvider provideExpandableUrls
+        */
        public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
                // Fake $wgServer and $wgCanonicalServer
                $this->setMwGlobals( array(
index 3521d18..6229624 100644 (file)
@@ -1,8 +1,11 @@
 <?php
 
+/**
+ * @covers ::wfGetCaller
+ */
 class WfGetCallerTest extends MediaWikiTestCase {
 
-       function testZero() {
+       public function testZero() {
                $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
        }
 
@@ -10,7 +13,7 @@ class WfGetCallerTest extends MediaWikiTestCase {
                return wfGetCaller();
        }
 
-       function testOne() {
+       public function testOne() {
                $this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
        }
 
@@ -22,11 +25,11 @@ class WfGetCallerTest extends MediaWikiTestCase {
                return wfGetCaller( $level );
        }
 
-       function testTwo() {
+       public function testTwo() {
                $this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
        }
 
-       function testN() {
+       public function testN() {
                $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
                $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
 
index 841a1b1..5032dc1 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Tests for wfParseUrl()
- *
  * Copyright © 2013 Alexandre Emsenhuber
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,6 +20,9 @@
  * @file
  */
 
+/**
+ * @covers ::wfParseUrl
+ */
 class WfParseUrlTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
@@ -31,7 +32,9 @@ class WfParseUrlTest extends MediaWikiTestCase {
                ) );
        }
 
-       /** @dataProvider provideURLs */
+       /**
+        * @dataProvider provideURLs
+        */
        public function testWfParseUrl( $url, $parts ) {
                $partsDump = var_export( $parts, true );
                $this->assertEquals(
index 67861ee..238a2c9 100644 (file)
@@ -1,9 +1,11 @@
 <?php
 /**
- * Tests for wfRemoveDotSegments()
+ *@covers ::wfRemoveDotSegments
  */
 class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
-       /** @dataProvider providePaths */
+       /**
+        * @dataProvider providePaths
+        */
        public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
                $this->assertEquals(
                        $outputPath,
index 604f901..aadec87 100644 (file)
@@ -1,10 +1,13 @@
 <?php
 
+/**
+ * @covers ::wfShorthandToInteger
+ */
 class WfShorthandToIntegerTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideABunchOfShorthands
         */
-       function testWfShorthandToInteger( $input, $output, $description ) {
+       public function testWfShorthandToInteger( $input, $output, $description ) {
                $this->assertEquals(
                        wfShorthandToInteger( $input ),
                        $output,
index 32bb49d..5998f18 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 /*
- * Tests for wfTimestamp()
+ * @covers ::wfTimestamp
  */
 class WfTimestampTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideNormalTimestamps
         */
-       function testNormalTimestamps( $input, $format, $output, $desc ) {
+       public function testNormalTimestamps( $input, $format, $output, $desc ) {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
@@ -57,7 +57,7 @@ class WfTimestampTest extends MediaWikiTestCase {
         * See r74778 and bug 25451
         * @dataProvider provideOldTimestamps
         */
-       function testOldTimestamps( $input, $format, $output, $desc ) {
+       public function testOldTimestamps( $input, $format, $output, $desc ) {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
@@ -96,7 +96,7 @@ class WfTimestampTest extends MediaWikiTestCase {
         * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
         * @dataProvider provideHttpDates
         */
-       function testHttpDate( $input, $output, $desc ) {
+       public function testHttpDate( $input, $output, $desc ) {
                $this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
        }
 
@@ -114,7 +114,7 @@ class WfTimestampTest extends MediaWikiTestCase {
         * There are a number of assumptions in our codebase where wfTimestamp()
         * should give the current date but it is not given a 0 there. See r71751 CR
         */
-       function testTimestampParameter() {
+       public function testTimestampParameter() {
                $now = wfTimestamp( TS_UNIX );
                // We check that wfTimestamp doesn't return false (error) and use a LessThan assert
                // for the cases where the test is run in a second boundary.
index 77685d5..ce6c82c 100644 (file)
@@ -1,18 +1,21 @@
 <?php
 /**
- * Tests for wfUrlencode()
- *
  * The function only need a string parameter and might react to IIS7.0
+ * @covers ::wfUrlencode
  */
 class WfUrlencodeTest extends MediaWikiTestCase {
        #### TESTS ##############################################################
 
-       /** @dataProvider provideURLS */
+       /**
+        * @dataProvider provideURLS
+        */
        public function testEncodingUrlWith( $input, $expected ) {
                $this->verifyEncodingFor( 'Apache', $input, $expected );
        }
 
-       /** @dataProvider provideURLS */
+       /**
+        * @dataProvider provideURLS
+        */
        public function testEncodingUrlWithMicrosoftIis7( $input, $expected ) {
                $this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
        }
index 5bbafd3..39c3959 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
 /**
- * Unit tests for the HTMLCheckMatrix form field
+ * Unit tests for the HTMLCheckMatrix + HTMLFormField
+ * @todo the tests for the two classes could be split up
  */
 class HtmlCheckMatrixTest extends MediaWikiTestCase {
        static private $defaultOptions = array(
@@ -10,6 +11,9 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
                'fieldname' => 'test',
        );
 
+       /**
+        * @covers HTMLCheckMatrix::__construct
+        */
        public function testPlainInstantiation() {
                try {
                        $form = new HTMLCheckMatrix( array() );
@@ -21,11 +25,17 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
                $this->fail( 'Expected MWException indicating missing parameters but none was thrown.' );
        }
 
+       /**
+        * @covers HTMLCheckMatrix::__construct
+        */
        public function testInstantiationWithMinimumRequiredParameters() {
                $form = new HTMLCheckMatrix( self::$defaultOptions );
                $this->assertTrue( true ); // form instantiation must throw exception on failure
        }
 
+       /**
+        * @covers HTMLFormField::validate
+        */
        public function testValidateCallsUserDefinedValidationCallback() {
                $called = false;
                $field = new HTMLCheckMatrix( self::$defaultOptions + array(
@@ -38,6 +48,9 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
                $this->assertTrue( $called );
        }
 
+       /**
+        * @covers HTMLFormField::validate
+        */
        public function testValidateRequiresArrayInput() {
                $field = new HTMLCheckMatrix( self::$defaultOptions );
                $this->assertEquals( false, $this->validate( $field, null ) );
@@ -47,11 +60,17 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
                $this->assertEquals( true, $this->validate( $field, array() ) );
        }
 
+       /**
+        * @covers HTMLFormField::validate
+        */
        public function testValidateAllowsOnlyKnownTags() {
                $field = new HTMLCheckMatrix( self::$defaultOptions );
                $this->assertInternalType( 'string', $this->validate( $field, array( 'foo' ) ) );
        }
 
+       /**
+        * @covers HTMLFormField::validate
+        */
        public function testValidateAcceptsPartialTagList() {
                $field = new HTMLCheckMatrix( self::$defaultOptions );
                $this->assertTrue( $this->validate( $field, array() ) );
@@ -65,6 +84,7 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
         * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
         *     $user->setOption( $k, $v );
         * }
+        * @covers HTMLFormField::filterDataForSubmit
         */
        public function testValuesForcedOnRemainOn() {
                $field = new HTMLCheckMatrix( self::$defaultOptions + array(
@@ -79,6 +99,9 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $field->filterDataForSubmit( array() ) );
        }
 
+       /**
+        * @covers HTMLFormField::filterDataForSubmit
+        */
        public function testValuesForcedOffRemainOff() {
                $field = new HTMLCheckMatrix( self::$defaultOptions + array(
                        'force-options-off' => array( 'c1-r2', 'c2-r2' ),
index bc4e499..68dfea1 100644 (file)
@@ -4,7 +4,10 @@
  * @group HashRing
  */
 class HashRingTest extends MediaWikiTestCase {
-       function testHashRing() {
+       /**
+        * @covers HashRing
+        */
+       public function testHashRing() {
                $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
 
                $locations = array();
index 81dd487..87af6c1 100644 (file)
@@ -35,6 +35,7 @@ class HooksTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideHooks
+        * @covers ::wfRunHooks
         */
        public function testOldStyleHooks( $msg, array $hook, $expectedFoo, $expectedBar ) {
                global $wgHooks;
@@ -49,6 +50,8 @@ class HooksTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideHooks
+        * @covers Hooks::register
+        * @covers Hooks::run
         */
        public function testNewStyleHooks( $msg, $hook, $expectedFoo, $expectedBar ) {
                $foo = $bar = 'original';
@@ -60,6 +63,12 @@ class HooksTest extends MediaWikiTestCase {
                $this->assertSame( $expectedBar, $bar, $msg );
        }
 
+       /**
+        * @covers Hooks::isRegistered
+        * @covers Hooks::register
+        * @covers Hooks::getHandlers
+        * @covers Hooks::run
+        */
        public function testNewStyleHookInteraction() {
                global $wgHooks;
 
@@ -82,12 +91,16 @@ class HooksTest extends MediaWikiTestCase {
 
        /**
         * @expectedException MWException
+        * @covers Hooks::run
         */
        public function testUncallableFunction() {
                Hooks::register( 'MediaWikiHooksTest001', 'ThisFunctionDoesntExist' );
                Hooks::run( 'MediaWikiHooksTest001', array() );
        }
 
+       /**
+        * @covers Hooks::run
+        */
        public function testFalseReturn() {
                Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
                        return false;
@@ -104,6 +117,7 @@ class HooksTest extends MediaWikiTestCase {
 
        /**
         * @expectedException FatalError
+        * @covers Hooks::run
         */
        public function testFatalError() {
                Hooks::register( 'MediaWikiHooksTest001', function () {
index a37df74..7ef0b60 100644 (file)
@@ -6,6 +6,7 @@
 class HtmlFormatterTest extends MediaWikiTestCase {
        /**
         * @dataProvider getHtmlData
+        * @covers HtmlFormatter::getText
         */
        public function testTransform( $input, $expected, $callback = false ) {
                $input = self::normalize( $input );
index ecfe418..21372a0 100644 (file)
@@ -41,6 +41,9 @@ class HtmlTest extends MediaWikiTestCase {
                ) );
        }
 
+       /**
+        * @covers Html::element
+        */
        public function testElementBasics() {
                $this->assertEquals(
                        '<img>',
@@ -89,11 +92,15 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataXmlMimeType
+        * @covers Html::isXmlMimeType
         */
        public function testXmlMimeType( $mimetype, $isXmlMimeType ) {
                $this->assertEquals( $isXmlMimeType, Html::isXmlMimeType( $mimetype ) );
        }
 
+       /**
+        * @covers HTML::expandAttributes
+        */
        public function testExpandAttributesSkipsNullAndFalse() {
 
                ### EMPTY ########
@@ -111,6 +118,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers HTML::expandAttributes
+        */
        public function testExpandAttributesForBooleans() {
                $this->assertEquals(
                        '',
@@ -146,6 +156,7 @@ class HtmlTest extends MediaWikiTestCase {
        /**
         * Test for Html::expandAttributes()
         * Please note it output a string prefixed with a space!
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesVariousExpansions() {
                ### NOT EMPTY ####
@@ -198,6 +209,7 @@ class HtmlTest extends MediaWikiTestCase {
         * Html::expandAttributes has special features for HTML
         * attributes that use space separated lists and also
         * allows arrays to be used as values.
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesListValueAttributes() {
                ### STRING VALUES
@@ -249,8 +261,9 @@ class HtmlTest extends MediaWikiTestCase {
        /**
         * Test feature added by r96188, let pass attributes values as
         * a PHP array. Restricted to class,rel, accesskey.
+        * @covers Html::expandAttributes
         */
-       function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
+       public function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
                $this->assertEquals(
                        ' class="booltrue one"',
                        Html::expandAttributes( array( 'class' => array(
@@ -273,8 +286,9 @@ class HtmlTest extends MediaWikiTestCase {
         * The later will take precedence.
         *
         * Feature added by r96188
+        * @covers Html::expandAttributes
         */
-       function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
+       public function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
                $this->assertEquals(
                        ' class=""',
                        Html::expandAttributes( array( 'class' => array(
@@ -285,7 +299,10 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testNamespaceSelector() {
+       /**
+        * @covers Html::namespaceSelector
+        */
+       public function testNamespaceSelector() {
                $this->assertEquals(
                        '<select id=namespace name=namespace>' . "\n" .
                                '<option value=0>(Main)</option>' . "\n" .
@@ -364,7 +381,7 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testCanFilterOutNamespaces() {
+       public function testCanFilterOutNamespaces() {
                $this->assertEquals(
                        '<select id=namespace name=namespace>' . "\n" .
                                '<option value=2>User</option>' . "\n" .
@@ -386,7 +403,7 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testCanDisableANamespaces() {
+       public function testCanDisableANamespaces() {
                $this->assertEquals(
                        '<select id=namespace name=namespace>' . "\n" .
                                '<option disabled value=0>(Main)</option>' . "\n" .
@@ -415,8 +432,9 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideHtml5InputTypes
+        * @covers Html::element
         */
-       function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
+       public function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
                $this->assertEquals(
                        '<input type=' . $HTML5InputType . '>',
                        Html::element( 'input', array( 'type' => $HTML5InputType ) ),
@@ -457,7 +475,7 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::dropDefaults
         * @dataProvider provideElementsWithAttributesHavingDefaultValues
         */
-       function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
+       public function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
                $this->assertEquals( $expected, Html::element( $element, $attribs ), $message );
        }
 
@@ -617,6 +635,9 @@ class HtmlTest extends MediaWikiTestCase {
                return $ret;
        }
 
+       /**
+        * @covers Html::expandAttributes
+        */
        public function testFormValidationBlacklist() {
                $this->assertEmpty(
                        Html::expandAttributes( array( 'min' => 1, 'max' => 100, 'pattern' => 'abc', 'required' => true, 'step' => 2 ) ),
index d8a0f74..11d8ed6 100644 (file)
@@ -5,8 +5,9 @@
 class HttpTest extends MediaWikiTestCase {
        /**
         * @dataProvider cookieDomains
+        * @covers Cookie::validateCookieDomain
         */
-       function testValidateCookieDomain( $expected, $domain, $origin = null ) {
+       public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
                if ( $origin ) {
                        $ok = Cookie::validateCookieDomain( $domain, $origin );
                        $msg = "$domain against origin $origin";
@@ -50,8 +51,9 @@ class HttpTest extends MediaWikiTestCase {
         * Test Http::isValidURI()
         * @bug 27854 : Http::isValidURI is too lax
         * @dataProvider provideURI
+        * @covers Http::isValidURI
         */
-       function testIsValidUri( $expect, $URI, $message = '' ) {
+       public function testIsValidUri( $expect, $URI, $message = '' ) {
                $this->assertEquals(
                        $expect,
                        (bool)Http::isValidURI( $URI ),
@@ -132,7 +134,7 @@ class HttpTest extends MediaWikiTestCase {
         * rewritten when bug 29232 is taken care of (high-level handling of
         * HTTP redirects).
         */
-       function testRelativeRedirections() {
+       public function testRelativeRedirections() {
                $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext' );
 
                # Forge a Location header
index e18295f..c074eea 100644 (file)
@@ -1,7 +1,12 @@
 <?php
 /**
- * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
+ * Tests for IP validity functions.
+ *
+ * Ported from /t/inc/IP.t by avar.
+ *
  * @group IP
+ * @todo Test methods in this call should be split into a method and a
+ * dataprovider.
  */
 
 class IPTest extends MediaWikiTestCase {
@@ -387,7 +392,7 @@ class IPTest extends MediaWikiTestCase {
         * representing the network mask and the bit mask.
         * @covers IP::parseCIDR
         */
-       function testCIDRParsing() {
+       public function testCIDRParsing() {
                $this->assertFalseCIDR( '192.0.2.0', "missing mask" );
                $this->assertFalseCIDR( '192.0.2.0/', "missing bitmask" );
 
@@ -484,7 +489,7 @@ class IPTest extends MediaWikiTestCase {
         * Test for IP::splitHostAndPort().
         * @dataProvider provideSplitHostAndPort
         */
-       function testSplitHostAndPort( $expected, $input, $description ) {
+       public function testSplitHostAndPort( $expected, $input, $description ) {
                $this->assertEquals( $expected, IP::splitHostAndPort( $input ), $description );
        }
 
@@ -511,7 +516,7 @@ class IPTest extends MediaWikiTestCase {
         * Test for IP::combineHostAndPort()
         * @dataProvider provideCombineHostAndPort
         */
-       function testCombineHostAndPort( $expected, $input, $description ) {
+       public function testCombineHostAndPort( $expected, $input, $description ) {
                list( $host, $port, $defaultPort ) = $input;
                $this->assertEquals(
                        $expected,
@@ -535,7 +540,7 @@ class IPTest extends MediaWikiTestCase {
         * Test for IP::sanitizeRange()
         * @dataProvider provideIPCIDRs
         */
-       function testSanitizeRange( $input, $expected, $description ) {
+       public function testSanitizeRange( $input, $expected, $description ) {
                $this->assertEquals( $expected, IP::sanitizeRange( $input ), $description );
        }
 
@@ -559,7 +564,7 @@ class IPTest extends MediaWikiTestCase {
         * Test for IP::prettifyIP()
         * @dataProvider provideIPsToPrettify
         */
-       function testPrettifyIP( $ip, $prettified ) {
+       public function testPrettifyIP( $ip, $prettified ) {
                $this->assertEquals( $prettified, IP::prettifyIP( $ip ), "Prettify of $ip" );
        }
 
index 070a680..d4ccca9 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 
 class LanguageConverterTest extends MediaWikiLangTestCase {
+       /** @var LanguageToTest */
        protected $lang = null;
+       /** @var TestConverter */
        protected $lc = null;
 
        protected function setUp() {
@@ -30,39 +32,61 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                parent::tearDown();
        }
 
-       function testGetPreferredVariantDefaults() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantDefaults() {
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantHeaders() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaders() {
                global $wgRequest;
                $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
 
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantHeaderWeight() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderWeight() {
                global $wgRequest;
                $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
 
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantHeaderWeight2() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderWeight2() {
                global $wgRequest;
                $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
 
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantHeaderMulti() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getHeaderVariant
+        */
+       public function testGetPreferredVariantHeaderMulti() {
                global $wgRequest;
                $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
 
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantUserOption() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantUserOption() {
                global $wgUser;
 
                $wgUser = new User;
@@ -75,7 +99,11 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantUserOptionForForeignLanguage() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getUserVariant
+        */
+       public function testGetPreferredVariantUserOptionForForeignLanguage() {
                global $wgContLang, $wgUser;
 
                $wgContLang = Language::factory( 'en' );
@@ -89,7 +117,12 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantHeaderUserVsUrl() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getUserVariant
+        * @covers LanguageConverter::getURLVariant
+        */
+       public function testGetPreferredVariantHeaderUserVsUrl() {
                global $wgContLang, $wgRequest, $wgUser;
 
                $wgContLang = Language::factory( 'tg-latn' );
@@ -103,15 +136,21 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
        }
 
-
-       function testGetPreferredVariantDefaultLanguageVariant() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        */
+       public function testGetPreferredVariantDefaultLanguageVariant() {
                global $wgDefaultLanguageVariant;
 
                $wgDefaultLanguageVariant = 'tg-latn';
                $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
        }
 
-       function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
+       /**
+        * @covers LanguageConverter::getPreferredVariant
+        * @covers LanguageConverter::getURLVariant
+        */
+       public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
                global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
 
                $wgContLang = Language::factory( 'tg-latn' );
index 212b3b3..478a2ff 100644 (file)
@@ -2,7 +2,7 @@
 
 class LicensesTest extends MediaWikiTestCase {
 
-       function testLicenses() {
+       public function testLicenses() {
                $str = "
 * Free licenses:
 ** GFDL|Debian disagrees
index ec4d98e..b605f08 100644 (file)
@@ -6,7 +6,7 @@ class LinkerTest extends MediaWikiLangTestCase {
         * @dataProvider provideCasesForUserLink
         * @covers Linker::userLink
         */
-       function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
+       public function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
                $this->setMwGlobals( array(
                        'wgArticlePath' => '/wiki/$1',
                        'wgWellFormedXml' => true,
index d6f0d2e..2501c78 100644 (file)
@@ -35,72 +35,72 @@ class LocalFileTest extends MediaWikiTestCase {
                $this->file_lc = $this->repo_lc->newFile( 'test!' );
        }
 
-       function testGetHashPath() {
+       public function testGetHashPath() {
                $this->assertEquals( '', $this->file_hl0->getHashPath() );
                $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
                $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
        }
 
-       function testGetRel() {
+       public function testGetRel() {
                $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
                $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
                $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
        }
 
-       function testGetUrlRel() {
+       public function testGetUrlRel() {
                $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
                $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
                $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
        }
 
-       function testGetArchivePath() {
+       public function testGetArchivePath() {
                $this->assertEquals( 'mwstore://local-backend/test-public/archive', $this->file_hl0->getArchivePath() );
                $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2', $this->file_hl2->getArchivePath() );
                $this->assertEquals( 'mwstore://local-backend/test-public/archive/!', $this->file_hl0->getArchivePath( '!' ) );
                $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
        }
 
-       function testGetThumbPath() {
+       public function testGetThumbPath() {
                $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!', $this->file_hl0->getThumbPath() );
                $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
                $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
                $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
        }
 
-       function testGetArchiveUrl() {
+       public function testGetArchiveUrl() {
                $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
                $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
                $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
                $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
        }
 
-       function testGetThumbUrl() {
+       public function testGetThumbUrl() {
                $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
                $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
                $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
                $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
        }
 
-       function testGetArchiveVirtualUrl() {
+       public function testGetArchiveVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/public/archive/a/a2', $this->file_hl2->getArchiveVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/public/archive/%21', $this->file_hl0->getArchiveVirtualUrl( '!' ) );
                $this->assertEquals( 'mwrepo://test/public/archive/a/a2/%21', $this->file_hl2->getArchiveVirtualUrl( '!' ) );
        }
 
-       function testGetThumbVirtualUrl() {
+       public function testGetThumbVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/thumb/Test%21/%21', $this->file_hl0->getThumbVirtualUrl( '!' ) );
                $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21/%21', $this->file_hl2->getThumbVirtualUrl( '!' ) );
        }
 
-       function testGetUrl() {
+       public function testGetUrl() {
                $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
                $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
        }
 
-       function testWfLocalFile() {
+       public function testWfLocalFile() {
                $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
                $this->assertThat( $file, $this->isInstanceOf( 'LocalFile' ), 'wfLocalFile() returns LocalFile for valid Titles' );
        }
index a44f69e..d86f2c9 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 class MWFunctionTest extends MediaWikiTestCase {
-       function testNewObjFunction() {
+       public function testNewObjFunction() {
                $arg1 = 'Foo';
                $arg2 = 'Bar';
                $arg3 = array( 'Baz' );
index 0f74899..1e18f97 100644 (file)
@@ -10,7 +10,7 @@ class MessageTest extends MediaWikiLangTestCase {
                ) );
        }
 
-       function testExists() {
+       public function testExists() {
                $this->assertTrue( wfMessage( 'mainpage' )->exists() );
                $this->assertTrue( wfMessage( 'mainpage' )->params( array() )->exists() );
                $this->assertTrue( wfMessage( 'mainpage' )->rawParams( 'foo', 123 )->exists() );
@@ -19,7 +19,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->rawParams( 'foo', 123 )->exists() );
        }
 
-       function testKey() {
+       public function testKey() {
                $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
                $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
@@ -28,41 +28,91 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
        }
 
-       function testInLanguage() {
+       public function testInLanguage() {
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
                $this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'en' ) )->text() );
                $this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'ru' ) )->text() );
        }
 
-       function testMessageParams() {
+       public function testMessageParams() {
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
                $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text() );
                $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text() );
        }
 
-       function testMessageParamSubstitution() {
+       public function testMessageParamSubstitution() {
                $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses', 'Заглавная страница' )->plain() );
                $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses', 'Заглавная страница $1' )->plain() );
                $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain() );
                $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain() );
        }
 
-       function testDeliciouslyManyParams() {
+       public function testDeliciouslyManyParams() {
                $msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
                // One less than above has placeholders
                $params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
                $this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
        }
 
-       function testInContentLanguageDisabled() {
+       /**
+        * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+        * @group Database
+        */
+       public function testMessageParamTypes() {
+               $lang = Language::factory( 'en' );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatNum( 123456.789 ),
+                       $msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
+                       'numParams is handled correctly'
+               );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatDuration( 1234 ),
+                       $msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
+                       'durationParams is handled correctly'
+               );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatExpiry( wfTimestampNow() ),
+                       $msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
+                       'expiryParams is handled correctly'
+               );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatTimePeriod( 1234 ),
+                       $msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
+                       'timeperiodParams is handled correctly'
+               );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatSize( 123456 ),
+                       $msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
+                       'sizeParams is handled correctly'
+               );
+
+               $msg = new RawMessage( '$1' );
+               $this->assertEquals(
+                       $lang->formatBitrate( 123456 ),
+                       $msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
+                       'bitrateParams is handled correctly'
+               );
+       }
+
+       public function testInContentLanguageDisabled() {
                $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
 
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
        }
 
-       function testInContentLanguageEnabled() {
+       public function testInContentLanguageEnabled() {
                $this->setMwGlobals( array(
                        'wgLang' => Language::factory( 'fr' ),
                        'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
@@ -74,7 +124,7 @@ class MessageTest extends MediaWikiLangTestCase {
        /**
         * @expectedException MWException
         */
-       function testInLanguageThrows() {
+       public function testInLanguageThrows() {
                wfMessage( 'foo' )->inLanguage( 123 );
        }
 }
index 386ddb8..adfb215 100644 (file)
@@ -1,10 +1,17 @@
 <?php
 /**
- * Tests for the PathRouter parsing
+ * Tests for the PathRouter parsing.
+ *
+ * @todo Add covers tags.
  */
 
 class PathRouterTest extends MediaWikiTestCase {
 
+       /**
+        * @var PathRouter
+        */
+       protected $basicRouter;
+
        protected function setUp() {
                parent::setUp();
                $router = new PathRouter;
index 392ad08..3dec2da 100644 (file)
@@ -4,11 +4,16 @@
  * @group Database
  */
 class PreferencesTest extends MediaWikiTestCase {
-       /** Array of User objects */
+       /**
+        * @var User[]
+        */
        private $prefUsers;
+       /**
+        * @var RequestContext
+        */
        private $context;
 
-       function __construct() {
+       public function __construct() {
                parent::__construct();
 
                $this->prefUsers['noemail'] = new User;
@@ -40,7 +45,7 @@ class PreferencesTest extends MediaWikiTestCase {
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       function testEmailFieldsWhenUserHasNoEmail() {
+       public function testEmailFieldsWhenUserHasNoEmail() {
                $prefs = $this->prefsFor( 'noemail' );
                $this->assertArrayHasKey( 'cssclass',
                        $prefs['emailaddress']
@@ -52,7 +57,7 @@ class PreferencesTest extends MediaWikiTestCase {
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       function testEmailFieldsWhenUserEmailNotAuthenticated() {
+       public function testEmailFieldsWhenUserEmailNotAuthenticated() {
                $prefs = $this->prefsFor( 'notauth' );
                $this->assertArrayHasKey( 'cssclass',
                        $prefs['emailaddress']
@@ -64,7 +69,7 @@ class PreferencesTest extends MediaWikiTestCase {
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       function testEmailFieldsWhenUserEmailIsAuthenticated() {
+       public function testEmailFieldsWhenUserEmailIsAuthenticated() {
                $prefs = $this->prefsFor( 'auth' );
                $this->assertArrayHasKey( 'cssclass',
                        $prefs['emailaddress']
@@ -73,7 +78,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /** Helper */
-       function prefsFor( $user_key ) {
+       protected function prefsFor( $user_key ) {
                $preferences = array();
                Preferences::profilePreferences(
                        $this->prefUsers[$user_key]
diff --git a/tests/phpunit/includes/Providers.php b/tests/phpunit/includes/Providers.php
deleted file mode 100644 (file)
index 4ddc0b0..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Generic providers for the MediaWiki PHPUnit test suite
- *
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** */
-class MediaWikiProvide {
-
-       /* provide an array of numbers from 1 up to @param $num */
-       private static function createProviderUpTo( $num ) {
-               $ret = array();
-               for ( $i = 1; $i <= $num; $i++ ) {
-                       $ret[] = array( $i );
-               }
-
-               return $ret;
-       }
-
-       /* array of months numbers (as an integer) */
-       public static function Months() {
-               return self::createProviderUpTo( 12 );
-       }
-
-       /* array of days numbers (as an integer) */
-       public static function Days() {
-               return self::createProviderUpTo( 31 );
-       }
-
-       public static function DaysMonths() {
-               $ret = array();
-
-               $months = self::Months();
-               $days = self::Days();
-               foreach ( $months as $month ) {
-                       foreach ( $days as $day ) {
-                               $ret[] = array( $day[0], $month[0] );
-                       }
-               }
-
-               return $ret;
-       }
-}
index f01fb23..cfa3e77 100644 (file)
@@ -9,7 +9,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        protected $user_comment;
        protected $context;
 
-       function __construct() {
+       public function __construct() {
                parent::__construct();
 
                $this->title = Title::newFromText( 'SomeTitle' );
@@ -56,7 +56,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeBlock() {
+       public function testIrcMsgForLogTypeBlock() {
                $sep = $this->context->msg( 'colon-separator' )->text();
 
                # block/block
@@ -78,7 +78,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeDelete() {
+       public function testIrcMsgForLogTypeDelete() {
                $sep = $this->context->msg( 'colon-separator' )->text();
 
                # delete/delete
@@ -101,7 +101,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeNewusers() {
+       public function testIrcMsgForLogTypeNewusers() {
                $this->assertIRCComment(
                        'New user account',
                        'newusers', 'newusers',
@@ -127,7 +127,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeMove() {
+       public function testIrcMsgForLogTypeMove() {
                $move_params = array(
                        '4::target' => $this->target->getPrefixedText(),
                        '5::noredir' => 0,
@@ -154,7 +154,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypePatrol() {
+       public function testIrcMsgForLogTypePatrol() {
                # patrol/patrol
                $this->assertIRCComment(
                        $this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
@@ -170,7 +170,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeProtect() {
+       public function testIrcMsgForLogTypeProtect() {
                $protectParams = array(
                        '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
                );
@@ -204,7 +204,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        /**
         * @covers LogFormatter::getIRCActionText
         */
-       function testIrcMsgForLogTypeUpload() {
+       public function testIrcMsgForLogTypeUpload() {
                $sep = $this->context->msg( 'colon-separator' )->text();
 
                # upload/upload
@@ -230,19 +230,19 @@ class RecentChangeTest extends MediaWikiTestCase {
         * --
         */
        /*
-       function testIrcMsgForBlankingAES() {
+       public function testIrcMsgForBlankingAES() {
                // $this->context->msg( 'autosumm-blank', .. );
        }
 
-       function testIrcMsgForReplaceAES() {
+       public function testIrcMsgForReplaceAES() {
                // $this->context->msg( 'autosumm-replace', .. );
        }
 
-       function testIrcMsgForRollbackAES() {
+       public function testIrcMsgForRollbackAES() {
                // $this->context->msg( 'revertpage', .. );
        }
 
-       function testIrcMsgForUndoAES() {
+       public function testIrcMsgForUndoAES() {
                // $this->context->msg( 'undo-summary', .. );
        }
        */
@@ -251,10 +251,11 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @param $expected String Expected IRC text without colors codes
         * @param $type String Log type (move, delete, suppress, patrol ...)
         * @param $action String A log type action
+        * @param $params
         * @param $comment String (optional) A comment for the log action
         * @param $msg String (optional) A message for PHPUnit :-)
         */
-       function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
+       protected function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
 
                $logEntry = new ManualLogEntry( $type, $action );
                $logEntry->setPerformer( $this->user );
index e3a9cfb..1776b5d 100644 (file)
@@ -7,6 +7,8 @@ class RequestContextTest extends MediaWikiTestCase {
 
        /**
         * Test the relationship between title and wikipage in RequestContext
+        * @covers RequestContext::getWikiPage
+        * @covers RequestContext::getTitle
         */
        public function testWikiPageTitle() {
                $context = new RequestContext();
@@ -27,6 +29,9 @@ class RequestContextTest extends MediaWikiTestCase {
                        "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
        }
 
+       /**
+        * @covers RequestContext::importScopedSession
+        */
        public function testImportScopedSession() {
                $context = RequestContext::getMain();
 
index c30c441..ca8b2b6 100644 (file)
@@ -99,6 +99,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider providePackedModules
+        * @covers ResourceLoader::makePackedModulesString
         */
        public function testMakePackedModulesString( $desc, $modules, $packed ) {
                $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
@@ -106,6 +107,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider providePackedModules
+        * @covers ResourceLoaderContext::expandModuleNames
         */
        public function testexpandModuleNames( $desc, $modules, $packed ) {
                $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
index 00b1f29..e17c7b0 100644 (file)
@@ -38,7 +38,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                                'iwlinks' ) );
        }
 
-       public function setUp() {
+       protected function setUp() {
                global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
                parent::setUp();
@@ -456,15 +456,15 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @dataProvider provideUserWasLastToEdit
         */
        public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
-               $userA = \User::newFromName( "RevisionStorageTest_userA" );
-               $userB = \User::newFromName( "RevisionStorageTest_userB" );
+               $userA = User::newFromName( "RevisionStorageTest_userA" );
+               $userB = User::newFromName( "RevisionStorageTest_userB" );
 
                if ( $userA->getId() === 0 ) {
-                       $userA = \User::createNew( $userA->getName() );
+                       $userA = User::createNew( $userA->getName() );
                }
 
                if ( $userB->getId() === 0 ) {
-                       $userB = \User::createNew( $userB->getName() );
+                       $userB = User::createNew( $userB->getName() );
                }
 
                $ns = $this->getDefaultWikitextNS();
index f35a05f..4e83e35 100644 (file)
@@ -7,7 +7,7 @@
  */
 class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
 
-       function setUp() {
+       protected function setUp() {
                $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
                $dbw = wfGetDB( DB_MASTER );
index e3b0844..b5819ff 100644 (file)
@@ -54,7 +54,10 @@ class RevisionTest extends MediaWikiTestCase {
                parent::tearDown();
        }
 
-       function testGetRevisionText() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionText() {
                $row = new stdClass;
                $row->old_flags = '';
                $row->old_text = 'This is a bunch of revision text.';
@@ -63,7 +66,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testGetRevisionTextGzip() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionTextGzip() {
                $this->checkPHPExtension( 'zlib' );
 
                $row = new stdClass;
@@ -74,7 +80,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testGetRevisionTextUtf8Native() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionTextUtf8Native() {
                $row = new stdClass;
                $row->old_flags = 'utf-8';
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -84,7 +93,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testGetRevisionTextUtf8Legacy() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionTextUtf8Legacy() {
                $row = new stdClass;
                $row->old_flags = '';
                $row->old_text = "Wiki est l'\xe9cole superieur !";
@@ -94,7 +106,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testGetRevisionTextUtf8NativeGzip() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionTextUtf8NativeGzip() {
                $this->checkPHPExtension( 'zlib' );
 
                $row = new stdClass;
@@ -106,7 +121,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testGetRevisionTextUtf8LegacyGzip() {
+       /**
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionTextUtf8LegacyGzip() {
                $this->checkPHPExtension( 'zlib' );
 
                $row = new stdClass;
@@ -118,7 +136,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ) );
        }
 
-       function testCompressRevisionTextUtf8() {
+       /**
+        * @covers Revision::compressRevisionText
+        */
+       public function testCompressRevisionTextUtf8() {
                $row = new stdClass;
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
                $row->old_flags = Revision::compressRevisionText( $row->old_text );
@@ -132,7 +153,10 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ), "getRevisionText" );
        }
 
-       function testCompressRevisionTextUtf8Gzip() {
+       /**
+        * @covers Revision::compressRevisionText
+        */
+       public function testCompressRevisionTextUtf8Gzip() {
                $this->checkPHPExtension( 'zlib' );
                $this->setMwGlobals( 'wgCompressRevisions', true );
 
@@ -155,6 +179,8 @@ class RevisionTest extends MediaWikiTestCase {
         * @param string $text
         * @param string $title
         * @param string $model
+        * @param null $format
+        *
         * @return Revision
         */
        function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
@@ -194,8 +220,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetContentModel
+        * @covers Revision::getContentModel
         */
-       function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
+       public function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
 
                $this->assertEquals( $expectedModel, $rev->getContentModel() );
@@ -214,8 +241,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetContentFormat
+        * @covers Revision::getContentFormat
         */
-       function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
+       public function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
 
                $this->assertEquals( $expectedFormat, $rev->getContentFormat() );
@@ -233,8 +261,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetContentHandler
+        * @covers Revision::getContentHandler
         */
-       function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
+       public function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
 
                $this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
@@ -252,8 +281,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetContent
+        * @covers Revision::getContent
         */
-       function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+       public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
                $content = $rev->getContent( $audience );
 
@@ -272,8 +302,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetText
+        * @covers Revision::getText
         */
-       function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
+       public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
                $this->hideDeprecated( 'Revision::getText' );
 
                $rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -284,8 +315,9 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @group Database
         * @dataProvider dataGetText
+        * @covers Revision::getRawText
         */
-       function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
+       public function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
                $this->hideDeprecated( 'Revision::getRawText' );
 
                $rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -328,6 +360,9 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertEquals( $expected_hash, $rev->getSha1() );
        }
 
+       /**
+        * @covers Revision::__construct
+        */
        public function testConstructWithText() {
                $this->hideDeprecated( "Revision::getText" );
 
@@ -342,6 +377,9 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
        }
 
+       /**
+        * @covers Revision::__construct
+        */
        public function testConstructWithContent() {
                $this->hideDeprecated( "Revision::getText" );
 
@@ -361,8 +399,9 @@ class RevisionTest extends MediaWikiTestCase {
         * Tests whether $rev->getContent() returns a clone when needed.
         *
         * @group Database
+        * @covers Revision::getContent
         */
-       function testGetContentClone() {
+       public function testGetContentClone() {
                $content = new RevisionTestModifyableContent( "foo" );
 
                $rev = new Revision(
@@ -394,8 +433,9 @@ class RevisionTest extends MediaWikiTestCase {
         * Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
         *
         * @group Database
+        * @covers Revision::getContent
         */
-       function testGetContentUncloned() {
+       public function testGetContentUncloned() {
                $rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT );
                $content = $rev->getContent( Revision::RAW );
                $content2 = $rev->getContent( Revision::RAW );
index 8a88191..8516a4c 100644 (file)
@@ -33,7 +33,7 @@ class TestSample extends MediaWikiLangTestCase {
         * "Agile Documentation" at
         * http://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
         */
-       function testTitleObjectStringConversion() {
+       public function testTitleObjectStringConversion() {
                $title = Title::newFromText( "text" );
                $this->assertInstanceOf( 'Title', $title, "Title creation" );
                $this->assertEquals( "Text", $title, "Automatic string conversion" );
@@ -98,7 +98,7 @@ class TestSample extends MediaWikiLangTestCase {
         * @expectedException MWException object
         * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
         */
-       function testTitleObjectFromObject() {
+       public function testTitleObjectFromObject() {
                $title = Title::newFromText( Title::newFromText( "test" ) );
                $this->assertEquals( "Test", $title->isLocal() );
        }
index 38c15ee..81246d3 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @todo Tests covering decodeCharReferences can be refactored into a single
+ * method and dataprovider.
+ */
 class SanitizerTest extends MediaWikiTestCase {
 
        protected function setUp() {
@@ -8,7 +12,10 @@ class SanitizerTest extends MediaWikiTestCase {
                AutoLoader::loadClass( 'Sanitizer' );
        }
 
-       function testDecodeNamedEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testDecodeNamedEntities() {
                $this->assertEquals(
                        "\xc3\xa9cole",
                        Sanitizer::decodeCharReferences( '&eacute;cole' ),
@@ -16,7 +23,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testDecodeNumericEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testDecodeNumericEntities() {
                $this->assertEquals(
                        "\xc4\x88io bonas dans l'\xc3\xa9cole!",
                        Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&#233;cole!" ),
@@ -24,7 +34,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testDecodeMixedEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testDecodeMixedEntities() {
                $this->assertEquals(
                        "\xc4\x88io bonas dans l'\xc3\xa9cole!",
                        Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&eacute;cole!" ),
@@ -32,7 +45,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testDecodeMixedComplexEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testDecodeMixedComplexEntities() {
                $this->assertEquals(
                        "\xc4\x88io bonas dans l'\xc3\xa9cole! (mais pas &#x108;io dans l'&eacute;cole)",
                        Sanitizer::decodeCharReferences(
@@ -42,7 +58,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testInvalidAmpersand() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testInvalidAmpersand() {
                $this->assertEquals(
                        'a & b',
                        Sanitizer::decodeCharReferences( 'a & b' ),
@@ -50,7 +69,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testInvalidEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testInvalidEntities() {
                $this->assertEquals(
                        '&foo;',
                        Sanitizer::decodeCharReferences( '&foo;' ),
@@ -58,7 +80,10 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testInvalidNumberedEntities() {
+       /**
+        * @covers Sanitizer::decodeCharReferences
+        */
+       public function testInvalidNumberedEntities() {
                $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
        }
 
@@ -69,7 +94,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @param String $tag Name of an HTML5 element (ie: 'video')
         * @param Boolean $escaped Wheter sanitizer let the tag in or escape it (ie: '&lt;video&gt;')
         */
-       function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
+       public function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
                $this->setMwGlobals( array(
                        'wgUseTidy' => false
                ) );
@@ -131,8 +156,9 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataRemoveHTMLtags
+        * @covers Sanitizer::removeHTMLtags
         */
-       function testRemoveHTMLtags( $input, $output, $msg = null ) {
+       public function testRemoveHTMLtags( $input, $output, $msg = null ) {
                $GLOBALS['wgUseTidy'] = false;
                $this->assertEquals( $output, Sanitizer::removeHTMLtags( $input ), $msg );
        }
@@ -141,7 +167,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @dataProvider provideTagAttributesToDecode
         * @covers Sanitizer::decodeTagAttributes
         */
-       function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
+       public function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
                $this->assertEquals( $expected,
                        Sanitizer::decodeTagAttributes( $attributes ),
                        $message
@@ -189,7 +215,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @dataProvider provideDeprecatedAttributes
         * @covers Sanitizer::fixTagAttributes
         */
-       function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
+       public function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
                $this->assertEquals( " $inputAttr",
                        Sanitizer::fixTagAttributes( $inputAttr, $inputEl ),
                        $message
@@ -217,7 +243,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @dataProvider provideCssCommentsFixtures
         * @covers Sanitizer::checkCss
         */
-       function testCssCommentsChecking( $expected, $css, $message = '' ) {
+       public function testCssCommentsChecking( $expected, $css, $message = '' ) {
                $this->assertEquals( $expected,
                        Sanitizer::checkCss( $css ),
                        $message
@@ -265,8 +291,9 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAttributeSupport
+        * @covers Sanitizer::fixTagAttributes
         */
-       function testAttributeSupport( $tag, $attributes, $expected, $message ) {
+       public function testAttributeSupport( $tag, $attributes, $expected, $message ) {
                $this->assertEquals( $expected,
                        Sanitizer::fixTagAttributes( $attributes, $tag ),
                        $message
index fe0bc64..f13e838 100644 (file)
@@ -1,5 +1,10 @@
 <?php
 
+/**
+ * @covers Sanitizer::validateEmail
+ * @TODO all test methods in this class should be refactored and...
+ *    use a single test method and a single data provider...
+ */
 class SanitizerValidateEmailTest extends MediaWikiTestCase {
 
        private function checkEmail( $addr, $expected = true, $msg = '' ) {
@@ -22,54 +27,56 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
                $this->checkEmail( $addr, false, $msg );
        }
 
-       function testEmailWellKnownUserAtHostDotTldAreValid() {
+       public function testEmailWellKnownUserAtHostDotTldAreValid() {
                $this->valid( 'user@example.com' );
                $this->valid( 'user@example.museum' );
        }
 
-       function testEmailWithUpperCaseCharactersAreValid() {
+       public function testEmailWithUpperCaseCharactersAreValid() {
                $this->valid( 'USER@example.com' );
                $this->valid( 'user@EXAMPLE.COM' );
                $this->valid( 'user@Example.com' );
                $this->valid( 'USER@eXAMPLE.com' );
        }
 
-       function testEmailWithAPlusInUserName() {
+       public function testEmailWithAPlusInUserName() {
                $this->valid( 'user+sub@example.com' );
                $this->valid( 'user+@example.com' );
        }
 
-       function testEmailDoesNotNeedATopLevelDomain() {
+       public function testEmailDoesNotNeedATopLevelDomain() {
                $this->valid( "user@localhost" );
                $this->valid( "FooBar@localdomain" );
                $this->valid( "nobody@mycompany" );
        }
 
-       function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
+       public function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
                $this->invalid( " user@host.com" );
                $this->invalid( "user@host.com " );
                $this->invalid( "\tuser@host.com" );
                $this->invalid( "user@host.com\t" );
        }
 
-       function testEmailWithWhiteSpacesAreInvalids() {
+       public function testEmailWithWhiteSpacesAreInvalids() {
                $this->invalid( "User user@host" );
                $this->invalid( "first last@mycompany" );
                $this->invalid( "firstlast@my company" );
        }
 
-       // bug 26948 : comma were matched by an incorrect regexp range
-       function testEmailWithCommasAreInvalids() {
+       /**
+        * bug 26948 : comma were matched by an incorrect regexp range
+        */
+       public function testEmailWithCommasAreInvalids() {
                $this->invalid( "user,foo@example.org" );
                $this->invalid( "userfoo@ex,ample.org" );
        }
 
-       function testEmailWithHyphens() {
+       public function testEmailWithHyphens() {
                $this->valid( "user-foo@example.org" );
                $this->valid( "userfoo@ex-ample.org" );
        }
 
-       function testEmailDomainCanNotBeginWithDot() {
+       public function testEmailDomainCanNotBeginWithDot() {
                $this->invalid( "user@." );
                $this->invalid( "user@.localdomain" );
                $this->invalid( "user@localdomain." );
@@ -78,19 +85,19 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
                $this->invalid( ".@a............" );
        }
 
-       function testEmailWithFunnyCharacters() {
+       public function testEmailWithFunnyCharacters() {
                $this->valid( "\$user!ex{this}@123.com" );
        }
 
-       function testEmailTopLevelDomainCanBeNumerical() {
+       public function testEmailTopLevelDomainCanBeNumerical() {
                $this->valid( "user@example.1234" );
        }
 
-       function testEmailWithoutAtSignIsInvalid() {
+       public function testEmailWithoutAtSignIsInvalid() {
                $this->invalid( 'useràexample.com' );
        }
 
-       function testEmailWithOneCharacterDomainIsValid() {
+       public function testEmailWithOneCharacterDomainIsValid() {
                $this->valid( 'user@a' );
        }
 }
index 181a913..053d8a7 100644 (file)
@@ -24,7 +24,11 @@ function getSiteParams( $conf, $wiki ) {
 }
 
 class SiteConfigurationTest extends MediaWikiTestCase {
-       var $mConf;
+
+       /**
+        * @var SiteConfiguration
+        */
+       protected $mConf;
 
        protected function setUp() {
                parent::setUp();
@@ -95,7 +99,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                $GLOBALS['global'] = array( 'global' => 'global' );
        }
 
-       function testSiteFromDb() {
+       /**
+        * @covers SiteConfiguration::siteFromDB
+        */
+       public function testSiteFromDb() {
                $this->assertEquals(
                        array( 'wikipedia', 'en' ),
                        $this->mConf->siteFromDB( 'enwiki' ),
@@ -120,7 +127,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                );
        }
 
-       function testGetLocalDatabases() {
+       /**
+        * @covers SiteConfiguration::getLocalDatabases
+        */
+       public function testGetLocalDatabases() {
                $this->assertEquals(
                        array( 'enwiki', 'dewiki', 'frwiki' ),
                        $this->mConf->getLocalDatabases(),
@@ -128,7 +138,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                );
        }
 
-       function testGetConfVariables() {
+       /**
+        * @covers SiteConfiguration::get
+        */
+       public function testGetConfVariables() {
                $this->assertEquals(
                        'enwiki',
                        $this->mConf->get( 'simple', 'enwiki', 'wiki' ),
@@ -240,7 +253,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                );
        }
 
-       function testSiteFromDbWithCallback() {
+       /**
+        * @covers SiteConfiguration::siteFromDB
+        */
+       public function testSiteFromDbWithCallback() {
                $this->mConf->siteParamsCallback = 'getSiteParams';
 
                $this->assertEquals(
@@ -260,7 +276,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                );
        }
 
-       function testParameterReplacement() {
+       /**
+        * @covers SiteConfiguration::get
+        */
+       public function testParameterReplacement() {
                $this->mConf->siteParamsCallback = 'getSiteParams';
 
                $this->assertEquals(
@@ -290,7 +309,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                );
        }
 
-       function testGetAllGlobals() {
+       /**
+        * @covers SiteConfiguration::getAll
+        */
+       public function testGetAllGlobals() {
                $this->mConf->siteParamsCallback = 'getSiteParams';
 
                $getall = array(
index b222812..89759e5 100644 (file)
@@ -9,7 +9,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * @covers StringUtils::isUtf8
         * @dataProvider provideStringsForIsUtf8Check
         */
-       function testIsUtf8WithMbstring( $expected, $string ) {
+       public function testIsUtf8WithMbstring( $expected, $string ) {
                if ( !function_exists( 'mb_check_encoding' ) ) {
                        $this->markTestSkipped( 'Test requires the mbstring PHP extension' );
                }
@@ -27,7 +27,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * @covers StringUtils::isUtf8
         * @dataProvider provideStringsForIsUtf8Check
         */
-       function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
+       public function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
                $this->assertEquals( $expected,
                        StringUtils::isUtf8( $string, /** disable mbstring: */true ),
                        'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
index ffa8c42..fb63a56 100644 (file)
@@ -7,20 +7,37 @@ require __DIR__ . "/../../../maintenance/runJobs.php";
 
 class TemplateCategoriesTest extends MediaWikiLangTestCase {
 
-       function testTemplateCategories() {
+       /**
+        * @covers Title::getParentCategories
+        */
+       public function testTemplateCategories() {
                $title = Title::newFromText( "Categorized from template" );
                $page = WikiPage::factory( $title );
                $user = new User();
                $user->mRights = array( 'createpage', 'edit', 'purge' );
 
-               $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
+               $page->doEditContent(
+                       new WikitextContent( '{{Categorising template}}' ),
+                       'Create a page with a template',
+                       0,
+                       false,
+                       $user
+               );
+
                $this->assertEquals(
                        array()
                        , $title->getParentCategories()
                );
 
                $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-               $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
+
+               $template->doEditContent(
+                       new WikitextContent( '[[Category:Solved bugs]]' ),
+                       'Add a category through a template',
+                       0,
+                       false,
+                       $user
+               );
 
                // Run the job queue
                JobQueueGroup::destroySingletons();
index 2fb0f49..23e6503 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
-/* Wraps the user object, so we can also retain full access to properties like password if we log in via the API */
+/**
+ * Wraps the user object, so we can also retain full access to properties like password if we log in via the API
+ */
 class TestUser {
        public $username;
        public $password;
@@ -8,7 +10,7 @@ class TestUser {
        public $groups;
        public $user;
 
-       function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+       public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
                $this->username = $username;
                $this->realname = $realname;
                $this->email = $email;
index 3a2c62a..0b368c2 100644 (file)
@@ -8,8 +8,9 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * Test offset usage for a given language::userAdjust
+        * Test offset usage for a given Language::userAdjust
         * @dataProvider dataUserAdjust
+        * @covers Language::userAdjust
         */
        public function testUserAdjust( $date, $localTZoffset, $expected ) {
                global $wgContLang;
index 3668046..5338839 100644 (file)
@@ -14,8 +14,9 @@ class TimestampTest extends MediaWikiLangTestCase {
        /**
         * Test parsing of valid timestamps and outputing to MW format.
         * @dataProvider provideValidTimestamps
+        * @covers MWTimestamp::getTimestamp
         */
-       function testValidParse( $format, $original, $expected ) {
+       public function testValidParse( $format, $original, $expected ) {
                $timestamp = new MWTimestamp( $original );
                $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
        }
@@ -23,8 +24,9 @@ class TimestampTest extends MediaWikiLangTestCase {
        /**
         * Test outputting valid timestamps to different formats.
         * @dataProvider provideValidTimestamps
+        * @covers MWTimestamp::getTimestamp
         */
-       function testValidOutput( $format, $expected, $original ) {
+       public function testValidOutput( $format, $expected, $original ) {
                $timestamp = new MWTimestamp( $original );
                $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
        }
@@ -32,16 +34,18 @@ class TimestampTest extends MediaWikiLangTestCase {
        /**
         * Test an invalid timestamp.
         * @expectedException TimestampException
+        * @covers MWTimestamp
         */
-       function testInvalidParse() {
+       public function testInvalidParse() {
                new MWTimestamp( "This is not a timestamp." );
        }
 
        /**
         * Test requesting an invalid output format.
         * @expectedException TimestampException
+        * @covers MWTimestamp::getTimestamp
         */
-       function testInvalidOutput() {
+       public function testInvalidOutput() {
                $timestamp = new MWTimestamp( '1343761268' );
                $timestamp->getTimestamp( 98 );
        }
@@ -69,8 +73,8 @@ class TimestampTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @test
         * @dataProvider provideHumanTimestampTests
+        * @covers MWTimestamp::getHumanTimestamp
         */
        public function testHumanTimestamp(
                $tsTime, // The timestamp to format
@@ -202,8 +206,8 @@ class TimestampTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @test
         * @dataProvider provideRelativeTimestampTests
+        * @covers MWTimestamp::getRelativeTimestamp
         */
        public function testRelativeTimestamp(
                $tsTime, // The timestamp to format
index a11c3d9..3079d73 100644 (file)
@@ -6,7 +6,6 @@
  *
  * @note: We don't make assumptions about the main namespace.
  *        But we do expect the Help namespace to contain Wikitext.
- *
  */
 class TitleMethodsTest extends MediaWikiTestCase {
 
@@ -57,6 +56,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideEquals
+        * @covers Title::equals
         */
        public function testEquals( $titleA, $titleB, $expectedBool ) {
                $titleA = Title::newFromText( $titleA );
@@ -81,12 +81,16 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideInNamespace
+        * @covers Title::inNamespace
         */
        public function testInNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
        }
 
+       /**
+        * @covers Title::inNamespaces
+        */
        public function testInNamespaces() {
                $mainpage = Title::newFromText( 'Main Page' );
                $this->assertTrue( $mainpage->inNamespaces( NS_MAIN, NS_USER ) );
@@ -110,6 +114,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideHasSubjectNamespace
+        * @covers Title::hasSubjectNamespace
         */
        public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -143,6 +148,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentModel
+        * @covers Title::getContentModel
         */
        public function testGetContentModel( $title, $expectedModelId ) {
                $title = Title::newFromText( $title );
@@ -151,6 +157,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentModel
+        * @covers Title::hasContentModel
         */
        public function testHasContentModel( $title, $expectedModelId ) {
                $title = Title::newFromText( $title );
@@ -181,13 +188,13 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsCssOrJsPage
+        * @covers Title::isCssOrJsPage
         */
        public function testIsCssOrJsPage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
        }
 
-
        public static function provideIsCssJsSubpage() {
                return array(
                        array( 'Help:Foo', false ),
@@ -210,6 +217,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsCssJsSubpage
+        * @covers Title::isCssJsSubpage
         */
        public function testIsCssJsSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -230,6 +238,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsCssSubpage
+        * @covers Title::isCssSubpage
         */
        public function testIsCssSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -250,6 +259,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsJsSubpage
+        * @covers Title::isJsSubpage
         */
        public function testIsJsSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -281,6 +291,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsWikitextPage
+        * @covers Title::isWikitextPage
         */
        public function testIsWikitextPage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
index 9144d0c..f15c177 100644 (file)
@@ -2,6 +2,7 @@
 
 /**
  * @group Database
+ * @todo covers tags
  */
 class TitlePermissionTest extends MediaWikiLangTestCase {
 
@@ -68,7 +69,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                }
        }
 
-       function setUserPerm( $perm ) {
+       protected function setUserPerm( $perm ) {
                // Setting member variables is evil!!!
 
                if ( is_array( $perm ) ) {
@@ -78,11 +79,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                }
        }
 
-       function setTitle( $ns, $title = "Main_Page" ) {
+       protected function setTitle( $ns, $title = "Main_Page" ) {
                $this->title = Title::makeTitle( $ns, $title );
        }
 
-       function setUser( $userName = null ) {
+       protected function setUser( $userName = null ) {
                if ( $userName === 'anon' ) {
                        $this->user = $this->anonUser;
                } elseif ( $userName === null || $userName === $this->userName ) {
@@ -92,7 +93,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                }
        }
 
-       function testQuickPermissions() {
+       /**
+        * @todo This test method should be split up into separate test methods and
+        * data providers
+        */
+       public function testQuickPermissions() {
                global $wgContLang;
                $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
 
@@ -320,7 +325,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                }
        }
 
-       function runGroupPermissions( $action, $result, $result2 = null ) {
+       protected function runGroupPermissions( $action, $result, $result2 = null ) {
                global $wgGroupPermissions;
 
                if ( $result2 === null ) {
@@ -348,7 +353,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( $result2, $res );
        }
 
-       function testSpecialsAndNSPermissions() {
+       /**
+        * @todo This test method should be split up into separate test methods and
+        * data providers
+        */
+       public function testSpecialsAndNSPermissions() {
                global $wgNamespaceProtection;
                $this->setUser( $this->userName );
 
@@ -399,7 +408,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'bogus', $this->user ) );
        }
 
-       function testCssAndJavascriptPermissions() {
+       /**
+        * @todo This test method should be split up into separate test methods and
+        * data providers
+        */
+       public function testCssAndJavascriptPermissions() {
                $this->setUser( $this->userName );
 
                $this->setTitle( NS_USER, $this->userName . '/test.js' );
@@ -448,7 +461,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                );
        }
 
-       function runCSSandJSPermissions( $result0, $result1, $result2, $result3, $result4 ) {
+       protected function runCSSandJSPermissions( $result0, $result1, $result2, $result3, $result4 ) {
                $this->setUserPerm( '' );
                $this->assertEquals( $result0,
                        $this->title->getUserPermissionsErrors( 'bogus',
@@ -485,7 +498,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->user ) );
        }
 
-       function testPageRestrictions() {
+       /**
+        * @todo This test method should be split up into separate test methods and
+        * data providers
+        */
+       public function testPageRestrictions() {
                global $wgContLang;
 
                $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
@@ -576,7 +593,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->user ) );
        }
 
-       function testCascadingSourcesRestrictions() {
+       public function testCascadingSourcesRestrictions() {
                $this->setTitle( NS_MAIN, "test page" );
                $this->setUserPerm( array( "edit", "bogus" ) );
 
@@ -596,7 +613,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
        }
 
-       function testActionPermissions() {
+       /**
+        * @todo This test method should be split up into separate test methods and
+        * data providers
+        */
+       public function testActionPermissions() {
                $this->setUserPerm( array( "createpage" ) );
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['pt_create_perm'] = '';
@@ -667,7 +688,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'move-target', $this->user ) );
        }
 
-       function testUserBlock() {
+       public function testUserBlock() {
                global $wgEmailConfirmToEdit, $wgEmailAuthentication;
                $wgEmailConfirmToEdit = true;
                $wgEmailAuthentication = true;
index da663c4..6bfe545 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 /**
- *
  * @group Database
  *        ^--- needed for language cache stuff
  */
@@ -19,7 +18,10 @@ class TitleTest extends MediaWikiTestCase {
                ) );
        }
 
-       function testLegalChars() {
+       /**
+        * @covers Title::legalChars
+        */
+       public function testLegalChars() {
                $titlechars = Title::legalChars();
 
                foreach ( range( 1, 255 ) as $num ) {
@@ -34,8 +36,10 @@ class TitleTest extends MediaWikiTestCase {
 
        /**
         * See also mediawiki.Title.test.js
+        * @covers Title::secureAndSplit
+        * @todo This method should be split into 2 separate tests each with a provider
         */
-       function testSecureAndSplit() {
+       public function testSecureAndSplit() {
                // Valid
                foreach ( array(
                        'Sandbox',
@@ -171,15 +175,17 @@ class TitleTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideConvertByteClassToUnicodeClass
+        * @covers Title::convertByteClassToUnicodeClass
         */
-       function testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass ) {
+       public function testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass ) {
                $this->assertEquals( $unicodeClass, Title::convertByteClassToUnicodeClass( $byteClass ) );
        }
 
        /**
         * @dataProvider provideBug31100
+        * @covers Title::fixSpecialName
         */
-       function testBug31100FixSpecialName( $text, $expectedParam ) {
+       public function testBug31100FixSpecialName( $text, $expectedParam ) {
                $title = Title::newFromText( $text );
                $fixed = $title->fixSpecialName();
                $stuff = explode( '/', $fixed->getDBkey(), 2 );
@@ -205,10 +211,11 @@ class TitleTest extends MediaWikiTestCase {
         * @group Database
         * @param string $source
         * @param string $target
-        * @param array|string|true $expected Required error
+        * @param array|string|bool $expected Required error
         * @dataProvider provideTestIsValidMoveOperation
+        * @covers Title::isValidMoveOperation
         */
-       function testIsValidMoveOperation( $source, $target, $expected ) {
+       public function testIsValidMoveOperation( $source, $target, $expected ) {
                $title = Title::newFromText( $source );
                $nt = Title::newFromText( $target );
                $errors = $title->isValidMoveOperation( $nt, false );
@@ -225,7 +232,7 @@ class TitleTest extends MediaWikiTestCase {
        /**
         * Provides test parameter values for testIsValidMoveOperation()
         */
-       function dataTestIsValidMoveOperation() {
+       public function dataTestIsValidMoveOperation() {
                return array(
                        array( 'Test', 'Test', 'selfmove' ),
                        array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
@@ -238,12 +245,12 @@ class TitleTest extends MediaWikiTestCase {
         * @param array $whitelistRegexp
         * @param string $source
         * @param string $action
-        * @param array|string|true $expected Required error
+        * @param array|string|bool $expected Required error
         *
         * @covers Title::checkReadPermissions
         * @dataProvider dataWgWhitelistReadRegexp
         */
-       function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
+       public function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
                // $wgWhitelistReadRegexp must be an array. Since the provided test cases
                // usually have only one regex, it is more concise to write the lonely regex
                // as a string. Thus we cast to an array() to honor $wgWhitelistReadRegexp
@@ -300,7 +307,7 @@ class TitleTest extends MediaWikiTestCase {
        /**
         * Provides test parameter values for testWgWhitelistReadRegexp()
         */
-       function dataWgWhitelistReadRegexp() {
+       public function dataWgWhitelistReadRegexp() {
                $ALLOWED = true;
                $DISALLOWED = false;
 
@@ -336,7 +343,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function flattenErrorsArray( $errors ) {
+       public function flattenErrorsArray( $errors ) {
                $result = array();
                foreach ( $errors as $error ) {
                        $result[] = $error[0];
@@ -353,9 +360,10 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provideCasesForGetpageviewlanguage
+        * @dataProvider provideGetPageViewLanguage
+        * @covers Title::getPageViewLanguage
         */
-       function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+       public function testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
                global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
 
                // Setup environnement for this test
@@ -375,7 +383,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       public static function provideCasesForGetpageviewlanguage() {
+       public static function provideGetPageViewLanguage() {
                # Format:
                # - expected
                # - Title name
@@ -416,8 +424,9 @@ class TitleTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideBaseTitleCases
+        * @covers Title::getBaseText
         */
-       function testExtractingBaseTextFromTitle( $title, $expected, $msg = '' ) {
+       public function testGetBaseText( $title, $expected, $msg = '' ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expected,
                        $title->getBaseText(),
@@ -435,8 +444,9 @@ class TitleTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideRootTitleCases
+        * @covers Title::getRootText
         */
-       function testExtractingRootTextFromTitle( $title, $expected, $msg = '' ) {
+       public function testGetRootText( $title, $expected, $msg = '' ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expected,
                        $title->getRootText(),
@@ -455,8 +465,9 @@ class TitleTest extends MediaWikiTestCase {
        /**
         * @todo Handle $wgNamespacesWithSubpages cases
         * @dataProvider provideSubpageTitleCases
+        * @covers Title::getSubpageText
         */
-       function testExtractingSubpageTextFromTitle( $title, $expected, $msg = '' ) {
+       public function testGetSubpageText( $title, $expected, $msg = '' ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expected,
                        $title->getSubpageText(),
index 23553ca..8f78ae5 100644 (file)
@@ -1,8 +1,11 @@
 <?php
 
 class UIDGeneratorTest extends MediaWikiTestCase {
+
        /**
         * @dataProvider provider_testTimestampedUID
+        * @covers UIDGenerator::newTimestampedUID128
+        * @covers UIDGenerator::newTimestampedUID88
         */
        public function testTimestampedUID( $method, $digitlen, $bits, $tbits, $hostbits ) {
                $id = call_user_func( array( 'UIDGenerator', $method ) );
@@ -46,6 +49,7 @@ class UIDGeneratorTest extends MediaWikiTestCase {
 
        /**
         * array( method, length, bits, hostbits )
+        * NOTE: When adding a new method name here please update the covers tags for the tests!
         */
        public static function provider_testTimestampedUID() {
                return array(
@@ -55,22 +59,40 @@ class UIDGeneratorTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers UIDGenerator::newUUIDv4
+        */
        public function testUUIDv4() {
                for ( $i = 0; $i < 100; $i++ ) {
                        $id = UIDGenerator::newUUIDv4();
                        $this->assertEquals( true,
                                preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
                                "UID $id has the right format" );
+               }
+       }
 
+       /**
+        * @covers UIDGenerator::newRawUUIDv4
+        */
+       public function testRawUUIDv4() {
+               for ( $i = 0; $i < 100; $i++ ) {
                        $id = UIDGenerator::newRawUUIDv4();
                        $this->assertEquals( true,
                                preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
                                "UID $id has the right format" );
+               }
+       }
 
+       /**
+        * @covers UIDGenerator::newRawUUIDv4
+        */
+       public function testRawUUIDv4QuickRand() {
+               for ( $i = 0; $i < 100; $i++ ) {
                        $id = UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND );
                        $this->assertEquals( true,
                                preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
                                "UID $id has the right format" );
                }
        }
+
 }
diff --git a/tests/phpunit/includes/UserMailerTest.php b/tests/phpunit/includes/UserMailerTest.php
new file mode 100644 (file)
index 0000000..278edfa
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+class UserMailerTest extends MediaWikiLangTestCase {
+
+       /**
+        * @covers UserMailer::quotedPrintable
+        */
+       public function testQuotedPrintable() {
+               $this->assertEquals(
+                       "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
+                       UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
+       }
+
+}
\ No newline at end of file
index 0113cab..ff33e82 100644 (file)
@@ -53,6 +53,9 @@ class UserTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers User::getGroupPermissions
+        */
        public function testGroupPermissions() {
                $rights = User::getGroupPermissions( array( 'unittesters' ) );
                $this->assertContains( 'runtest', $rights );
@@ -67,6 +70,9 @@ class UserTest extends MediaWikiTestCase {
                $this->assertNotContains( 'nukeworld', $rights );
        }
 
+       /**
+        * @covers User::getGroupPermissions
+        */
        public function testRevokePermissions() {
                $rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
                $this->assertNotContains( 'runtest', $rights );
@@ -75,6 +81,9 @@ class UserTest extends MediaWikiTestCase {
                $this->assertNotContains( 'nukeworld', $rights );
        }
 
+       /**
+        * @covers User::getRights
+        */
        public function testUserPermissions() {
                $rights = $this->user->getRights();
                $this->assertContains( 'runtest', $rights );
@@ -85,6 +94,7 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideGetGroupsWithPermission
+        * @covers User::getGroupsWithPermission
         */
        public function testGetGroupsWithPermission( $expected, $right ) {
                $result = User::getGroupsWithPermission( $right );
@@ -117,6 +127,7 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUserNames
+        * @covers User::isValidUserName
         */
        public function testIsValidUserName( $username, $result, $message ) {
                $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
@@ -171,6 +182,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * Test User::editCount
         * @group medium
+        * @covers User::getEditCount
         */
        public function testEditCount() {
                $user = User::newFromName( 'UnitTestUser' );
@@ -195,6 +207,8 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * Test changing user options.
+        * @covers User::setOption
+        * @covers User::getOption
         */
        public function testOptions() {
                $user = User::newFromName( 'UnitTestUser' );
@@ -212,6 +226,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * Bug 37963
         * Make sure defaults are loaded when setOption is called.
+        * @covers User::loadOptions
         */
        public function testAnonOptions() {
                global $wgDefaultUserOptions;
index 4f5322e..f8ed14b 100644 (file)
@@ -20,8 +20,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDetectServer
+        * @covers WebRequest::detectServer
         */
-       function testDetectServer( $expected, $input, $description ) {
+       public function testDetectServer( $expected, $input, $description ) {
                $_SERVER = $input;
                $result = WebRequest::detectServer();
                $this->assertEquals( $expected, $result, $description );
@@ -103,8 +104,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideGetIP
+        * @covers WebRequest::getIP
         */
-       function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
+       public function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
                $_SERVER = $input;
                $this->setMwGlobals( array(
                        'wgSquidServersNoPurge' => $squid,
@@ -272,8 +274,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
        /**
         * @expectedException MWException
+        * @covers WebRequest::getIP
         */
-       function testGetIpLackOfRemoteAddrThrowAnException() {
+       public function testGetIpLackOfRemoteAddrThrowAnException() {
                $request = new WebRequest();
                # Next call throw an exception about lacking an IP
                $request->getIP();
@@ -297,8 +300,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideLanguageData
+        * @covers WebRequest::getAcceptLang
         */
-       function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
+       public function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
                $_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
                $request = new WebRequest();
                $this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description );
index bf8cd37..1258eb1 100644 (file)
@@ -1,14 +1,14 @@
 <?php
+
 /**
  * @group ContentHandler
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  * @group medium
  **/
-
 class WikiPageTest extends MediaWikiLangTestCase {
 
-       var $pages_to_delete;
+       protected $pages_to_delete;
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -90,6 +90,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                return $page;
        }
 
+       /**
+        * @covers WikiPage::doEditContent
+        */
        public function testDoEditContent() {
                $page = $this->newPage( "WikiPageTest_testDoEditContent" );
                $title = $page->getTitle();
@@ -143,6 +146,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
+       /**
+        * @covers WikiPage::doEdit
+        */
        public function testDoEdit() {
                $this->hideDeprecated( "WikiPage::doEdit" );
                $this->hideDeprecated( "WikiPage::getText" );
@@ -200,6 +206,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
+       /**
+        * @covers WikiPage::doQuickEdit
+        */
        public function testDoQuickEdit() {
                global $wgUser;
 
@@ -216,6 +225,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( $text, $page->getText() );
        }
 
+       /**
+        * @covers WikiPage::doQuickEditContent
+        */
        public function testDoQuickEditContent() {
                global $wgUser;
 
@@ -229,6 +241,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertTrue( $content->equals( $page->getContent() ) );
        }
 
+       /**
+        * @covers WikiPage::doDeleteArticle
+        */
        public function testDoDeleteArticle() {
                $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
                $id = $page->getId();
@@ -253,6 +268,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
+       /**
+        * @covers WikiPage::doDeleteUpdates
+        */
        public function testDoDeleteUpdates() {
                $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
                $id = $page->getId();
@@ -268,6 +286,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
+       /**
+        * @covers WikiPage::getRevision
+        */
        public function testGetRevision() {
                $page = $this->newPage( "WikiPageTest_testGetRevision" );
 
@@ -283,6 +304,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
        }
 
+       /**
+        * @covers WikiPage::getContent
+        */
        public function testGetContent() {
                $page = $this->newPage( "WikiPageTest_testGetContent" );
 
@@ -296,6 +320,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $content->getNativeData() );
        }
 
+       /**
+        * @covers WikiPage::getText
+        */
        public function testGetText() {
                $this->hideDeprecated( "WikiPage::getText" );
 
@@ -311,6 +338,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $text );
        }
 
+       /**
+        * @covers WikiPage::getRawText
+        */
        public function testGetRawText() {
                $this->hideDeprecated( "WikiPage::getRawText" );
 
@@ -326,6 +356,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $text );
        }
 
+       /**
+        * @covers WikiPage::getContentModel
+        */
        public function testGetContentModel() {
                global $wgContentHandlerUseDB;
 
@@ -339,6 +372,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
        }
 
+       /**
+        * @covers WikiPage::getContentHandler
+        */
        public function testGetContentHandler() {
                global $wgContentHandlerUseDB;
 
@@ -352,6 +388,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
        }
 
+       /**
+        * @covers WikiPage::exists
+        */
        public function testExists() {
                $page = $this->newPage( "WikiPageTest_testExists" );
                $this->assertFalse( $page->exists() );
@@ -383,6 +422,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideHasViewableContent
+        * @covers WikiPage::hasViewableContent
         */
        public function testHasViewableContent( $title, $viewable, $create = false ) {
                $page = $this->newPage( $title );
@@ -406,6 +446,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::getRedirectTarget
         */
        public function testGetRedirectTarget( $title, $model, $text, $target ) {
                $page = $this->createPage( $title, $text, $model );
@@ -421,6 +462,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::isRedirect
         */
        public function testIsRedirect( $title, $model, $text, $target ) {
                $page = $this->createPage( $title, $text, $model );
@@ -537,6 +579,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideIsCountable
+        * @covers WikiPage::isCountable
         */
        public function testIsCountable( $title, $model, $text, $mode, $expected ) {
                global $wgContentHandlerUseDB;
@@ -575,6 +618,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideGetParserOutput
+        * @covers WikiPage::getParserOutput
         */
        public function testGetParserOutput( $model, $text, $expectedHtml ) {
                $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
@@ -591,6 +635,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                return $po;
        }
 
+       /**
+        * @covers WikiPage::getParserOutput
+        */
        public function testGetParserOutput_nonexisting() {
                static $count = 0;
                $count++;
@@ -603,6 +650,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
        }
 
+       /**
+        * @covers WikiPage::getParserOutput
+        */
        public function testGetParserOutput_badrev() {
                $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
 
@@ -679,6 +729,7 @@ more stuff
 
        /**
         * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSection
         */
        public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
                $this->hideDeprecated( "WikiPage::replaceSection" );
@@ -692,6 +743,7 @@ more stuff
 
        /**
         * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionContent
         */
        public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
                $page = $this->createPage( $title, $text, $model );
@@ -802,6 +854,7 @@ more stuff
 
        /**
         * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+        * @covers WikiPage::doRollback
         */
        public function testDoRollback() {
                $admin = new User();
@@ -878,6 +931,7 @@ more stuff
 
        /**
         * @dataProvider provideGetAutoSummary
+        * @covers WikiPage::getAutosummary
         */
        public function testGetAutosummary( $old, $new, $flags, $expected ) {
                $this->hideDeprecated( "WikiPage::getAutosummary" );
@@ -950,6 +1004,7 @@ more stuff
 
        /**
         * @dataProvider provideGetAutoDeleteReason
+        * @covers WikiPage::getAutoDeleteReason
         */
        public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
                global $wgUser;
@@ -1003,6 +1058,7 @@ more stuff
 
        /**
         * @dataProvider providePreSaveTransform
+        * @covers WikiPage::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                $this->hideDeprecated( 'WikiPage::preSaveTransform' );
@@ -1015,4 +1071,21 @@ more stuff
 
                $this->assertEquals( $expected, $text );
        }
+
+       /**
+        * @covers WikiPage::factory
+        */
+       public function testWikiPageFactory() {
+               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiPage', get_class( $page ) );
+       }
 }
index 41f3572..2a723e8 100644 (file)
@@ -7,7 +7,7 @@
  */
 class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
@@ -26,6 +26,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                }
        }
 
+       /**
+        * @covers WikiPage::getContentModel
+        */
        public function testGetContentModel() {
                $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
@@ -36,6 +39,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
        }
 
+       /**
+        * @covers WikiPage::getContentHandler
+        */
        public function testGetContentHandler() {
                $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
 
index c5b411f..161468e 100644 (file)
@@ -1,9 +1,24 @@
 <?php
+
+/**
+ * @group Xml
+ */
 class XmlJs extends MediaWikiTestCase {
-       public function testConstruction() {
-               $obj = new XmlJsCode( null );
-               $this->assertNull( $obj->value );
-               $obj = new XmlJsCode( '' );
-               $this->assertSame( $obj->value, '' );
+
+       /**
+        * @covers XmlJsCode::__construct
+        * @dataProvider provideConstruction
+        */
+       public function testConstruction( $value ) {
+               $obj = new XmlJsCode( $value );
+               $this->assertEquals( $value, $obj->value );
        }
+
+       public function provideConstruction(){
+               return array(
+                       array( null ),
+                       array( '' ),
+               );
+       }
+
 }
index 08c031f..56d28b5 100644 (file)
@@ -1,7 +1,13 @@
 <?php
 
-// TODO
+/**
+ * @group Xml
+ */
 class XmlSelectTest extends MediaWikiTestCase {
+
+       /**
+        * @var XmlSelect
+        */
        protected $select;
 
        protected function setUp() {
@@ -17,8 +23,9 @@ class XmlSelectTest extends MediaWikiTestCase {
                $this->select = null;
        }
 
-       ### START OF TESTS ###
-
+       /**
+        * @covers XmlSelect::__construct
+        */
        public function testConstructWithoutParameters() {
                $this->assertEquals( '<select></select>', $this->select->getHTML() );
        }
@@ -26,6 +33,7 @@ class XmlSelectTest extends MediaWikiTestCase {
        /**
         * Parameters are $name (false), $id (false), $default (false)
         * @dataProvider provideConstructionParameters
+        * @covers XmlSelect::__construct
         */
        public function testConstructParameters( $name, $id, $default, $expected ) {
                $this->select = new XmlSelect( $name, $id, $default );
@@ -39,7 +47,6 @@ class XmlSelectTest extends MediaWikiTestCase {
         *  - $id      (default: false)
         *  - $default (default: false)
         * Provides a fourth parameters representing the expected HTML output
-        *
         */
        public static function provideConstructionParameters() {
                return array(
@@ -60,29 +67,41 @@ class XmlSelectTest extends MediaWikiTestCase {
                );
        }
 
-       # Begin XmlSelect::addOption() similar to Xml::option
+       /**
+        * @covers XmlSelect::addOption
+        */
        public function testAddOption() {
                $this->select->addOption( 'foo' );
                $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
        }
 
+       /**
+        * @covers XmlSelect::addOption
+        */
        public function testAddOptionWithDefault() {
                $this->select->addOption( 'foo', true );
                $this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
        }
 
+       /**
+        * @covers XmlSelect::addOption
+        */
        public function testAddOptionWithFalse() {
                $this->select->addOption( 'foo', false );
                $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
        }
 
+       /**
+        * @covers XmlSelect::addOption
+        */
        public function testAddOptionWithValueZero() {
                $this->select->addOption( 'foo', 0 );
                $this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
        }
 
-       # End XmlSelect::addOption() similar to Xml::option
-
+       /**
+        * @covers XmlSelect::setDefault
+        */
        public function testSetDefault() {
                $this->select->setDefault( 'bar1' );
                $this->select->addOption( 'foo1' );
@@ -98,6 +117,7 @@ class XmlSelectTest extends MediaWikiTestCase {
         * Adding default later on should set the correct selection or
         * raise an exception.
         * To handle this, we need to render the options in getHtml()
+        * @covers XmlSelect::setDefault
         */
        public function testSetDefaultAfterAddingOptions() {
                $this->select->addOption( 'foo1' );
@@ -110,6 +130,10 @@ class XmlSelectTest extends MediaWikiTestCase {
                                '<option value="foo2">foo2</option></select>', $this->select->getHTML() );
        }
 
+       /**
+        * @covers XmlSelect::setAttribute
+        * @covers XmlSelect::getAttribute
+        */
        public function testGetAttributes() {
                # create some attributes
                $this->select->setAttribute( 'dummy', 0x777 );
index 2294804..8205029 100644 (file)
@@ -1,8 +1,9 @@
 <?php
 
+/**
+ * @group Xml
+ */
 class XmlTest extends MediaWikiTestCase {
-       private static $oldLang;
-       private static $oldNamespaces;
 
        protected function setUp() {
                parent::setUp();
@@ -33,6 +34,9 @@ class XmlTest extends MediaWikiTestCase {
                ) );
        }
 
+       /**
+        * @covers Xml::expandAttributes
+        */
        public function testExpandAttributes() {
                $this->assertNull( Xml::expandAttributes( null ),
                        'Converting a null list of attributes'
@@ -42,12 +46,18 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Xml::expandAttributes
+        */
        public function testExpandAttributesException() {
                $this->setExpectedException( 'MWException' );
                Xml::expandAttributes( 'string' );
        }
 
-       function testElementOpen() {
+       /**
+        * @covers Xml::element
+        */
+       public function testElementOpen() {
                $this->assertEquals(
                        '<element>',
                        Xml::element( 'element', null, null ),
@@ -55,7 +65,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testElementEmpty() {
+       /**
+        * @covers Xml::element
+        */
+       public function testElementEmpty() {
                $this->assertEquals(
                        '<element />',
                        Xml::element( 'element', null, '' ),
@@ -63,7 +76,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testElementInputCanHaveAValueOfZero() {
+       /**
+        * @covers Xml::input
+        */
+       public function testElementInputCanHaveAValueOfZero() {
                $this->assertEquals(
                        '<input name="name" value="0" />',
                        Xml::input( 'name', false, 0 ),
@@ -71,7 +87,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testElementEscaping() {
+       /**
+        * @covers Xml::element
+        */
+       public function testElementEscaping() {
                $this->assertEquals(
                        '<element>hello &lt;there&gt; you &amp; you</element>',
                        Xml::element( 'element', null, 'hello <there> you & you' ),
@@ -79,13 +98,19 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Xml::escapeTagsOnly
+        */
        public function testEscapeTagsOnly() {
                $this->assertEquals( '&quot;&gt;&lt;', Xml::escapeTagsOnly( '"><' ),
                        'replace " > and < with their HTML entitites'
                );
        }
 
-       function testElementAttributes() {
+       /**
+        * @covers Xml::element
+        */
+       public function testElementAttributes() {
                $this->assertEquals(
                        '<element key="value" <>="&lt;&gt;">',
                        Xml::element( 'element', array( 'key' => 'value', '<>' => '<>' ), null ),
@@ -93,7 +118,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testOpenElement() {
+       /**
+        * @covers Xml::openElement
+        */
+       public function testOpenElement() {
                $this->assertEquals(
                        '<element k="v">',
                        Xml::openElement( 'element', array( 'k' => 'v' ) ),
@@ -101,10 +129,16 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testCloseElement() {
+       /**
+        * @covers Xml::closeElement
+        */
+       public function testCloseElement() {
                $this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
        }
 
+       /**
+        * @covers Xml::dateMenu
+        */
        public function testDateMenu() {
                $curYear = intval( gmdate( 'Y' ) );
                $prevYear = $curYear - 1;
@@ -185,10 +219,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       #
-       textarea
-       #
-       function testTextareaNoContent() {
+       /**
+        * @covers Xml::textarea
+        */
+       public function testTextareaNoContent() {
                $this->assertEquals(
                        '<textarea name="name" id="name" cols="40" rows="5"></textarea>',
                        Xml::textarea( 'name', '' ),
@@ -196,7 +230,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testTextareaAttribs() {
+       /**
+        * @covers Xml::textarea
+        */
+       public function testTextareaAttribs() {
                $this->assertEquals(
                        '<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
                        Xml::textarea( 'name', '<txt>', 20, 10 ),
@@ -204,10 +241,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       #
-       # input and label
-       #
-       function testLabelCreation() {
+       /**
+        * @covers Xml::label
+        */
+       public function testLabelCreation() {
                $this->assertEquals(
                        '<label for="id">name</label>',
                        Xml::label( 'name', 'id' ),
@@ -215,7 +252,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testLabelAttributeCanOnlyBeClassOrTitle() {
+       /**
+        * @covers Xml::label
+        */
+       public function testLabelAttributeCanOnlyBeClassOrTitle() {
                $this->assertEquals(
                        '<label for="id">name</label>',
                        Xml::label( 'name', 'id', array( 'generated' => true ) ),
@@ -244,7 +284,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testLanguageSelector() {
+       /**
+        * @covers Xml::languageSelector
+        */
+       public function testLanguageSelector() {
                $select = Xml::languageSelector( 'en', true, null,
                        array( 'id' => 'testlang' ), wfMessage( 'yourlanguage' ) );
                $this->assertEquals(
@@ -253,10 +296,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       #
-       # JS
-       #
-       function testEscapeJsStringSpecialChars() {
+       /**
+        * @covers Xml::escapeJsString
+        */
+       public function testEscapeJsStringSpecialChars() {
                $this->assertEquals(
                        '\\\\\r\n',
                        Xml::escapeJsString( "\\\r\n" ),
@@ -264,7 +307,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarBoolean() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarBoolean() {
                $this->assertEquals(
                        'true',
                        Xml::encodeJsVar( true ),
@@ -272,7 +318,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarNull() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarNull() {
                $this->assertEquals(
                        'null',
                        Xml::encodeJsVar( null ),
@@ -280,7 +329,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarArray() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarArray() {
                $this->assertEquals(
                        '["a",1]',
                        Xml::encodeJsVar( array( 'a', 1 ) ),
@@ -293,7 +345,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarObject() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarObject() {
                $this->assertEquals(
                        '{"a":"a","b":1}',
                        Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
@@ -301,7 +356,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarInt() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarInt() {
                $this->assertEquals(
                        '123456',
                        Xml::encodeJsVar( 123456 ),
@@ -309,7 +367,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarFloat() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarFloat() {
                $this->assertEquals(
                        '1.23456',
                        Xml::encodeJsVar( 1.23456 ),
@@ -317,7 +378,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarIntString() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarIntString() {
                $this->assertEquals(
                        '"123456"',
                        Xml::encodeJsVar( '123456' ),
@@ -325,7 +389,10 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
-       function testEncodeJsVarFloatString() {
+       /**
+        * @covers Xml::encodeJsVar
+        */
+       public function testEncodeJsVarFloatString() {
                $this->assertEquals(
                        '"1.23456"',
                        Xml::encodeJsVar( '1.23456' ),
index 6a9b44f..8d6f1ed 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * PHPUnit tests for XMLTypeCheck.
  * @author physikerwelt
- * @group ?
+ * @group Xml
  * @covers XMLTypeCheck
  */
 class XmlTypeCheckTest extends MediaWikiTestCase {
index 3fea57a..2627a41 100644 (file)
@@ -1,7 +1,12 @@
 <?php
 
+/**
+ * @covers ZipDirectoryReader
+ * NOTE: this test is more like an integration test than a unit test
+ */
 class ZipDirectoryReaderTest extends MediaWikiTestCase {
-       var $zipDir, $entries;
+       protected $zipDir;
+       protected $entries;
 
        protected function setUp() {
                parent::setUp();
@@ -24,21 +29,21 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
                $this->assertTrue( $status->isOK(), $assertMessage );
        }
 
-       function testEmpty() {
+       public function testEmpty() {
                $this->readZipAssertSuccess( 'empty.zip', 'Empty zip' );
        }
 
-       function testMultiDisk0() {
+       public function testMultiDisk0() {
                $this->readZipAssertError( 'split.zip', 'zip-unsupported',
                        'Split zip error' );
        }
 
-       function testNoSignature() {
+       public function testNoSignature() {
                $this->readZipAssertError( 'nosig.zip', 'zip-wrong-format',
                        'No signature should give "wrong format" error' );
        }
 
-       function testSimple() {
+       public function testSimple() {
                $this->readZipAssertSuccess( 'class.zip', 'Simple ZIP' );
                $this->assertEquals( $this->entries, array( array(
                        'name' => 'Class.class',
@@ -47,33 +52,33 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
                ) ) );
        }
 
-       function testBadCentralEntrySignature() {
+       public function testBadCentralEntrySignature() {
                $this->readZipAssertError( 'wrong-central-entry-sig.zip', 'zip-bad',
                        'Bad central entry error' );
        }
 
-       function testTrailingBytes() {
+       public function testTrailingBytes() {
                $this->readZipAssertError( 'trail.zip', 'zip-bad',
                        'Trailing bytes error' );
        }
 
-       function testWrongCDStart() {
+       public function testWrongCDStart() {
                $this->readZipAssertError( 'wrong-cd-start-disk.zip', 'zip-unsupported',
                        'Wrong CD start disk error' );
        }
 
 
-       function testCentralDirectoryGap() {
+       public function testCentralDirectoryGap() {
                $this->readZipAssertError( 'cd-gap.zip', 'zip-bad',
                        'CD gap error' );
        }
 
-       function testCentralDirectoryTruncated() {
+       public function testCentralDirectoryTruncated() {
                $this->readZipAssertError( 'cd-truncated.zip', 'zip-bad',
                        'CD truncated error (should hit unpack() overrun)' );
        }
 
-       function testLooksLikeZip64() {
+       public function testLooksLikeZip64() {
                $this->readZipAssertError( 'looks-like-zip64.zip', 'zip-unsupported',
                        'A file which looks like ZIP64 but isn\'t, should give error' );
        }
diff --git a/tests/phpunit/includes/api/ApiAccountCreationTest.php b/tests/phpunit/includes/api/ApiAccountCreationTest.php
deleted file mode 100644 (file)
index 50638ca..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group API
- * @group medium
- */
-class ApiCreateAccountTest extends ApiTestCase {
-       function setUp() {
-               parent::setUp();
-               LoginForm::setCreateaccountToken();
-               $this->setMwGlobals( array( 'wgEnableEmail' => true ) );
-       }
-
-       /**
-        * Test the account creation API with a valid request. Also
-        * make sure the new account can log in and is valid.
-        *
-        * This test does multiple API requests so it might end up being
-        * a bit slow. Raise the default timeout.
-        * @group medium
-        */
-       function testValid() {
-               global $wgServer;
-
-               if ( !isset( $wgServer ) ) {
-                       $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
-               }
-
-               $password = User::randomPassword();
-
-               $ret = $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'Apitestnew',
-                       'password' => $password,
-                       'email' => 'test@domain.test',
-                       'realname' => 'Test Name'
-               ) );
-
-               $result = $ret[0];
-               $this->assertNotInternalType( 'bool', $result );
-               $this->assertNotInternalType( 'null', $result['createaccount'] );
-
-               // Should first ask for token.
-               $a = $result['createaccount'];
-               $this->assertEquals( 'needtoken', $a['result'] );
-               $token = $a['token'];
-
-               // Finally create the account
-               $ret = $this->doApiRequest(
-                       array(
-                               'action' => 'createaccount',
-                               'name' => 'Apitestnew',
-                               'password' => $password,
-                               'token' => $token,
-                               'email' => 'test@domain.test',
-                               'realname' => 'Test Name'
-                       ),
-                       $ret[2]
-               );
-
-               $result = $ret[0];
-               $this->assertNotInternalType( 'bool', $result );
-               $this->assertEquals( 'success', $result['createaccount']['result'] );
-
-               // Try logging in with the new user.
-               $ret = $this->doApiRequest( array(
-                       'action' => 'login',
-                       'lgname' => 'Apitestnew',
-                       'lgpassword' => $password,
-               ) );
-
-               $result = $ret[0];
-               $this->assertNotInternalType( 'bool', $result );
-               $this->assertNotInternalType( 'null', $result['login'] );
-
-               $a = $result['login']['result'];
-               $this->assertEquals( 'NeedToken', $a );
-               $token = $result['login']['token'];
-
-               $ret = $this->doApiRequest(
-                       array(
-                               'action' => 'login',
-                               'lgtoken' => $token,
-                               'lgname' => 'Apitestnew',
-                               'lgpassword' => $password,
-                       ),
-                       $ret[2]
-               );
-
-               $result = $ret[0];
-
-               $this->assertNotInternalType( 'bool', $result );
-               $a = $result['login']['result'];
-
-               $this->assertEquals( 'Success', $a );
-
-               // log out to destroy the session
-               $ret = $this->doApiRequest(
-                       array(
-                               'action' => 'logout',
-                       ),
-                       $ret[2]
-               );
-               $this->assertEquals( array(), $ret[0] );
-       }
-
-       /**
-        * Make sure requests with no names are invalid.
-        * @expectedException UsageException
-        */
-       function testNoName() {
-               $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'token' => LoginForm::getCreateaccountToken(),
-                       'password' => 'password',
-               ) );
-       }
-
-       /**
-        * Make sure requests with no password are invalid.
-        * @expectedException UsageException
-        */
-       function testNoPassword() {
-               $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'testName',
-                       'token' => LoginForm::getCreateaccountToken(),
-               ) );
-       }
-
-       /**
-        * Make sure requests with existing users are invalid.
-        * @expectedException UsageException
-        */
-       function testExistingUser() {
-               $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'Apitestsysop',
-                       'token' => LoginForm::getCreateaccountToken(),
-                       'password' => 'password',
-                       'email' => 'test@domain.test',
-               ) );
-       }
-
-       /**
-        * Make sure requests with invalid emails are invalid.
-        * @expectedException UsageException
-        */
-       function testInvalidEmail() {
-               $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'Test User',
-                       'token' => LoginForm::getCreateaccountToken(),
-                       'password' => 'password',
-                       'email' => 'invalid',
-               ) );
-       }
-}
index d0eb18a..d98eec6 100644 (file)
@@ -4,6 +4,8 @@
  * @group API
  * @group Database
  * @group medium
+ *
+ * @covers ApiBlock
  */
 class ApiBlockTest extends ApiTestCase {
        protected function setUp() {
@@ -11,7 +13,7 @@ class ApiBlockTest extends ApiTestCase {
                $this->doLogin();
        }
 
-       function getTokens() {
+       protected function getTokens() {
                return $this->getTokenList( self::$users['sysop'] );
        }
 
@@ -34,7 +36,7 @@ class ApiBlockTest extends ApiTestCase {
         * Which made the Block/Unblock API to actually verify the token
         * previously always considered valid (bug 34212).
         */
-       function testMakeNormalBlock() {
+       public function testMakeNormalBlock() {
                $tokens = $this->getTokens();
 
                $user = User::newFromName( 'UTApiBlockee' );
@@ -63,17 +65,13 @@ class ApiBlockTest extends ApiTestCase {
        }
 
        /**
-        * Attempting to block without a token should give a UsageException with
-        * error message:
-        *   "The token parameter must be set"
-        *
-        * @dataProvider provideBlockUnblockAction
         * @expectedException UsageException
+        * @expectedExceptionMessage The token parameter must be set
         */
-       function testBlockingActionWithNoToken( $action ) {
+       public function testBlockingActionWithNoToken( ) {
                $this->doApiRequest(
                        array(
-                               'action' => $action,
+                               'action' => 'block',
                                'user' => 'UTApiBlockee',
                                'reason' => 'Some reason',
                        ),
@@ -82,14 +80,4 @@ class ApiBlockTest extends ApiTestCase {
                        self::$users['sysop']->user
                );
        }
-
-       /**
-        * Just provide the 'block' and 'unblock' action to test both API calls
-        */
-       public static function provideBlockUnblockAction() {
-               return array(
-                       array( 'block' ),
-                       array( 'unblock' ),
-               );
-       }
 }
diff --git a/tests/phpunit/includes/api/ApiCreateAccountTest.php b/tests/phpunit/includes/api/ApiCreateAccountTest.php
new file mode 100644 (file)
index 0000000..a723245
--- /dev/null
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @group Database
+ * @group API
+ * @group medium
+ *
+ * @covers ApiCreateAccount
+ */
+class ApiCreateAccountTest extends ApiTestCase {
+       protected function setUp() {
+               parent::setUp();
+               LoginForm::setCreateaccountToken();
+               $this->setMwGlobals( array( 'wgEnableEmail' => true ) );
+       }
+
+       /**
+        * Test the account creation API with a valid request. Also
+        * make sure the new account can log in and is valid.
+        *
+        * This test does multiple API requests so it might end up being
+        * a bit slow. Raise the default timeout.
+        * @group medium
+        */
+       public function testValid() {
+               global $wgServer;
+
+               if ( !isset( $wgServer ) ) {
+                       $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
+               }
+
+               $password = User::randomPassword();
+
+               $ret = $this->doApiRequest( array(
+                       'action' => 'createaccount',
+                       'name' => 'Apitestnew',
+                       'password' => $password,
+                       'email' => 'test@domain.test',
+                       'realname' => 'Test Name'
+               ) );
+
+               $result = $ret[0];
+               $this->assertNotInternalType( 'bool', $result );
+               $this->assertNotInternalType( 'null', $result['createaccount'] );
+
+               // Should first ask for token.
+               $a = $result['createaccount'];
+               $this->assertEquals( 'needtoken', $a['result'] );
+               $token = $a['token'];
+
+               // Finally create the account
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'createaccount',
+                               'name' => 'Apitestnew',
+                               'password' => $password,
+                               'token' => $token,
+                               'email' => 'test@domain.test',
+                               'realname' => 'Test Name'
+                       ),
+                       $ret[2]
+               );
+
+               $result = $ret[0];
+               $this->assertNotInternalType( 'bool', $result );
+               $this->assertEquals( 'success', $result['createaccount']['result'] );
+
+               // Try logging in with the new user.
+               $ret = $this->doApiRequest( array(
+                       'action' => 'login',
+                       'lgname' => 'Apitestnew',
+                       'lgpassword' => $password,
+               ) );
+
+               $result = $ret[0];
+               $this->assertNotInternalType( 'bool', $result );
+               $this->assertNotInternalType( 'null', $result['login'] );
+
+               $a = $result['login']['result'];
+               $this->assertEquals( 'NeedToken', $a );
+               $token = $result['login']['token'];
+
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'login',
+                               'lgtoken' => $token,
+                               'lgname' => 'Apitestnew',
+                               'lgpassword' => $password,
+                       ),
+                       $ret[2]
+               );
+
+               $result = $ret[0];
+
+               $this->assertNotInternalType( 'bool', $result );
+               $a = $result['login']['result'];
+
+               $this->assertEquals( 'Success', $a );
+
+               // log out to destroy the session
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'logout',
+                       ),
+                       $ret[2]
+               );
+               $this->assertEquals( array(), $ret[0] );
+       }
+
+       /**
+        * Make sure requests with no names are invalid.
+        * @expectedException UsageException
+        */
+       public function testNoName() {
+               $this->doApiRequest( array(
+                       'action' => 'createaccount',
+                       'token' => LoginForm::getCreateaccountToken(),
+                       'password' => 'password',
+               ) );
+       }
+
+       /**
+        * Make sure requests with no password are invalid.
+        * @expectedException UsageException
+        */
+       public function testNoPassword() {
+               $this->doApiRequest( array(
+                       'action' => 'createaccount',
+                       'name' => 'testName',
+                       'token' => LoginForm::getCreateaccountToken(),
+               ) );
+       }
+
+       /**
+        * Make sure requests with existing users are invalid.
+        * @expectedException UsageException
+        */
+       public function testExistingUser() {
+               $this->doApiRequest( array(
+                       'action' => 'createaccount',
+                       'name' => 'Apitestsysop',
+                       'token' => LoginForm::getCreateaccountToken(),
+                       'password' => 'password',
+                       'email' => 'test@domain.test',
+               ) );
+       }
+
+       /**
+        * Make sure requests with invalid emails are invalid.
+        * @expectedException UsageException
+        */
+       public function testInvalidEmail() {
+               $this->doApiRequest( array(
+                       'action' => 'createaccount',
+                       'name' => 'Test User',
+                       'token' => LoginForm::getCreateaccountToken(),
+                       'password' => 'password',
+                       'email' => 'invalid',
+               ) );
+       }
+}
index c19b54e..7521dcf 100644 (file)
@@ -8,6 +8,8 @@
  * @group API
  * @group Database
  * @group medium
+ *
+ * @covers ApiEditPage
  */
 class ApiEditPageTest extends ApiTestCase {
 
@@ -43,7 +45,7 @@ class ApiEditPageTest extends ApiTestCase {
                parent::tearDown();
        }
 
-       function testEdit() {
+       public function testEdit() {
                $name = 'Help:ApiEditPageTest_testEdit'; // assume Help namespace to default to wikitext
 
                // -- test new page --------------------------------------------
@@ -97,7 +99,7 @@ class ApiEditPageTest extends ApiTestCase {
                );
        }
 
-       function testNonTextEdit() {
+       public function testNonTextEdit() {
                $name = 'Dummy:ApiEditPageTest_testNonTextEdit';
                $data = serialize( 'some bla bla text' );
 
@@ -150,7 +152,7 @@ class ApiEditPageTest extends ApiTestCase {
        /**
         * @dataProvider provideEditAppend
         */
-       function testEditAppend( $text, $op, $append, $expected ) {
+       public function testEditAppend( $text, $op, $append, $expected ) {
                static $count = 0;
                $count++;
 
@@ -196,7 +198,7 @@ class ApiEditPageTest extends ApiTestCase {
        /**
         * Test editing of sections
         */
-       function testEditSection() {
+       public function testEditSection() {
                $name = 'Help:ApiEditPageTest_testEditSection';
                $page = WikiPage::factory( Title::newFromText( $name ) );
                $text = "==section 1==\ncontent 1\n==section 2==\ncontent2";
@@ -233,7 +235,7 @@ class ApiEditPageTest extends ApiTestCase {
         * page that doesn't exist (bug 52830) and one that
         * does exist
         */
-       function testEditNewSection() {
+       public function testEditNewSection() {
                $name = 'Help:ApiEditPageTest_testEditNewSection';
 
                // Test on a page that does not already exist
@@ -266,7 +268,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $text, "== header ==\n\ntest\n\n== header ==\n\ntest" );
        }
 
-       function testEditConflict() {
+       public function testEditConflict() {
                static $count = 0;
                $count++;
 
@@ -302,7 +304,7 @@ class ApiEditPageTest extends ApiTestCase {
                }
        }
 
-       function testEditConflict_redirect() {
+       public function testEditConflict_redirect() {
                static $count = 0;
                $count++;
 
@@ -358,13 +360,13 @@ class ApiEditPageTest extends ApiTestCase {
                }
        }
 
-       function testEditConflict_bug41990() {
+       public function testEditConflict_bug41990() {
                static $count = 0;
                $count++;
 
                /*
                * bug 41990: if the target page has a newer revision than the redirect, then editing the
-               * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+               * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
                * caused an edit conflict to be detected.
                */
 
index ad1e73a..3168f32 100644 (file)
@@ -4,10 +4,18 @@
  * @group API
  * @group Database
  * @group medium
+ *
+ * @covers ApiOptions
  */
 class ApiOptionsTest extends MediaWikiLangTestCase {
 
-       private $mTested, $mUserMock, $mContext, $mSession;
+       /** @var PHPUnit_Framework_MockObject_MockObject */
+       private $mUserMock ;
+       /** @var ApiOptions */
+       private $mTested;
+       private $mSession;
+       /** @var DerivativeContext */
+       private $mContext;
 
        private $mOldGetPreferencesHooks = false;
 
index b408875..d303d4b 100644 (file)
@@ -4,6 +4,8 @@
  * @group API
  * @group Database
  * @group medium
+ *
+ * @covers ApiParse
  */
 class ApiParseTest extends ApiTestCase {
 
@@ -12,7 +14,7 @@ class ApiParseTest extends ApiTestCase {
                $this->doLogin();
        }
 
-       function testParseNonexistentPage() {
+       public function testParseNonexistentPage() {
                $somePage = mt_rand();
 
                try {
index 881eb3f..d25a4c1 100644 (file)
@@ -4,6 +4,8 @@
  * @group API
  * @group Database
  * @group medium
+ *
+ * @covers ApiPurge
  */
 class ApiPurgeTest extends ApiTestCase {
 
@@ -15,7 +17,7 @@ class ApiPurgeTest extends ApiTestCase {
        /**
         * @group Broken
         */
-       function testPurgeMainPage() {
+       public function testPurgeMainPage() {
                if ( !Title::newFromText( 'UTPage' )->exists() ) {
                        $this->markTestIncomplete( "The article [[UTPage]] does not exist" );
                }
index 5106be5..472f8c4 100644 (file)
@@ -7,7 +7,7 @@
  */
 class ApiTest extends ApiTestCase {
 
-       function testRequireOnlyOneParameterDefault() {
+       public function testRequireOnlyOneParameterDefault() {
                $mock = new MockApi();
 
                $this->assertEquals(
@@ -18,7 +18,7 @@ class ApiTest extends ApiTestCase {
        /**
         * @expectedException UsageException
         */
-       function testRequireOnlyOneParameterZero() {
+       public function testRequireOnlyOneParameterZero() {
                $mock = new MockApi();
 
                $this->assertEquals(
@@ -29,7 +29,7 @@ class ApiTest extends ApiTestCase {
        /**
         * @expectedException UsageException
         */
-       function testRequireOnlyOneParameterTrue() {
+       public function testRequireOnlyOneParameterTrue() {
                $mock = new MockApi();
 
                $this->assertEquals(
@@ -43,7 +43,7 @@ class ApiTest extends ApiTestCase {
         *
         * @expectedException UsageException
         */
-       function testApi() {
+       public function testApi() {
                $api = new ApiMain(
                        new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
                );
@@ -61,14 +61,14 @@ class ApiTest extends ApiTestCase {
        /**
         * Test result of attempted login with an empty username
         */
-       function testApiLoginNoName() {
+       public function testApiLoginNoName() {
                $data = $this->doApiRequest( array( 'action' => 'login',
                        'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
                ) );
                $this->assertEquals( 'NoName', $data[0]['login']['result'] );
        }
 
-       function testApiLoginBadPass() {
+       public function testApiLoginBadPass() {
                global $wgServer;
 
                $user = self::$users['sysop'];
@@ -109,7 +109,7 @@ class ApiTest extends ApiTestCase {
                $this->assertEquals( "WrongPass", $a );
        }
 
-       function testApiLoginGoodPass() {
+       public function testApiLoginGoodPass() {
                global $wgServer;
 
                if ( !isset( $wgServer ) ) {
@@ -155,7 +155,7 @@ class ApiTest extends ApiTestCase {
        /**
         * @group Broken
         */
-       function testApiGotCookie() {
+       public function testApiGotCookie() {
                $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
 
                global $wgServer, $wgScriptPath;
@@ -201,7 +201,7 @@ class ApiTest extends ApiTestCase {
                return $cj;
        }
 
-       function testRunLogin() {
+       public function testRunLogin() {
                $sysopUser = self::$users['sysop'];
                $data = $this->doApiRequest( array(
                        'action' => 'login',
@@ -227,7 +227,7 @@ class ApiTest extends ApiTestCase {
                return $data;
        }
 
-       function testGettingToken() {
+       public function testGettingToken() {
                foreach ( self::$users as $user ) {
                        $this->runTokenTest( $user );
                }
index 94ef9c6..ad297dd 100644 (file)
@@ -117,7 +117,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * @param $params Array: key-value API params
         * @param $session Array|null: session array
         * @param $user User|null A User object for the context
-        * @return result of the API call
+        * @return mixed result of the API call
         * @throws Exception in case wsToken is not set in the session
         */
        protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) {
@@ -188,66 +188,3 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                );
        }
 }
-
-class UserWrapper {
-       public $userName;
-       public $password;
-       public $user;
-
-       public function __construct( $userName, $password, $group = '' ) {
-               $this->userName = $userName;
-               $this->password = $password;
-
-               $this->user = User::newFromName( $this->userName );
-               if ( !$this->user->getID() ) {
-                       $this->user = User::createNew( $this->userName, array(
-                               "email" => "test@example.com",
-                               "real_name" => "Test User" ) );
-               }
-               $this->user->setPassword( $this->password );
-
-               if ( $group !== '' ) {
-                       $this->user->addGroup( $group );
-               }
-               $this->user->saveSettings();
-       }
-}
-
-class MockApi extends ApiBase {
-       public function execute() {
-       }
-
-       public function getVersion() {
-       }
-
-       public function __construct() {
-       }
-
-       public function getAllowedParams() {
-               return array(
-                       'filename' => null,
-                       'enablechunks' => false,
-                       'sessionkey' => null,
-               );
-       }
-}
-
-class ApiTestContext extends RequestContext {
-
-       /**
-        * Returns a DerivativeContext with the request variables in place
-        *
-        * @param $request WebRequest request object including parameters and session
-        * @param $user User or null
-        * @return DerivativeContext
-        */
-       public function newTestContext( WebRequest $request, User $user = null ) {
-               $context = new DerivativeContext( $this );
-               $context->setRequest( $request );
-               if ( $user !== null ) {
-                       $context->setUser( $user );
-               }
-
-               return $context;
-       }
-}
diff --git a/tests/phpunit/includes/api/ApiTestContext.php b/tests/phpunit/includes/api/ApiTestContext.php
new file mode 100644 (file)
index 0000000..43637c2
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+class ApiTestContext extends RequestContext {
+
+       /**
+        * Returns a DerivativeContext with the request variables in place
+        *
+        * @param $request WebRequest request object including parameters and session
+        * @param $user User or null
+        * @return DerivativeContext
+        */
+       public function newTestContext( WebRequest $request, User $user = null ) {
+               $context = new DerivativeContext( $this );
+               $context->setRequest( $request );
+               if ( $user !== null ) {
+                       $context->setUser( $user );
+               }
+
+               return $context;
+       }
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/api/ApiUnblockTest.php b/tests/phpunit/includes/api/ApiUnblockTest.php
new file mode 100644 (file)
index 0000000..2c2370a
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiUnblock
+ */
+class ApiUnblockTest extends ApiTestCase {
+       protected function setUp() {
+               parent::setUp();
+               $this->doLogin();
+       }
+
+       /**
+        * @expectedException UsageException
+        */
+       public function testWithNoToken( ) {
+               $this->doApiRequest(
+                       array(
+                               'action' => 'unblock',
+                               'user' => 'UTApiBlockee',
+                               'reason' => 'Some reason',
+                       ),
+                       null,
+                       false,
+                       self::$users['sysop']->user
+               );
+       }
+}
index ae3a5e9..1540af5 100644 (file)
@@ -31,7 +31,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
         * Testing login
         * XXX this is a funny way of getting session context
         */
-       function testLogin() {
+       public function testLogin() {
                $user = self::$users['uploader'];
 
                $params = array(
index 8253989..028ea9f 100644 (file)
@@ -18,7 +18,7 @@ class ApiWatchTest extends ApiTestCase {
 
        /**
         */
-       function testWatchEdit() {
+       public function testWatchEdit() {
                $tokens = $this->getTokens();
 
                $data = $this->doApiRequest( array(
@@ -37,7 +37,7 @@ class ApiWatchTest extends ApiTestCase {
        /**
         * @depends testWatchEdit
         */
-       function testWatchClear() {
+       public function testWatchClear() {
                $tokens = $this->getTokens();
 
                $data = $this->doApiRequest( array(
@@ -67,7 +67,7 @@ class ApiWatchTest extends ApiTestCase {
 
        /**
         */
-       function testWatchProtect() {
+       public function testWatchProtect() {
                $tokens = $this->getTokens();
 
                $data = $this->doApiRequest( array(
@@ -85,7 +85,7 @@ class ApiWatchTest extends ApiTestCase {
 
        /**
         */
-       function testGetRollbackToken() {
+       public function testGetRollbackToken() {
                $this->getTokens();
 
                if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
@@ -121,7 +121,7 @@ class ApiWatchTest extends ApiTestCase {
         *
         * @depends testGetRollbackToken
         */
-       function testWatchRollback( $data ) {
+       public function testWatchRollback( $data ) {
                $keys = array_keys( $data[0]['query']['pages'] );
                $key = array_pop( $keys );
                $pageinfo = $data[0]['query']['pages'][$key];
diff --git a/tests/phpunit/includes/api/MockApi.php b/tests/phpunit/includes/api/MockApi.php
new file mode 100644 (file)
index 0000000..3686048
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+class MockApi extends ApiBase {
+       public function execute() {
+       }
+
+       public function getVersion() {
+       }
+
+       public function __construct() {
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'filename' => null,
+                       'enablechunks' => false,
+                       'sessionkey' => null,
+               );
+       }
+}
\ No newline at end of file
index d9be85e..a1fc2c2 100644 (file)
@@ -6,6 +6,7 @@
  * @group API
  */
 class PrefixUniquenessTest extends MediaWikiTestCase {
+
        public function testPrefixes() {
                $main = new ApiMain( new FauxRequest() );
                $query = new ApiQuery( $main, 'foo', 'bar' );
@@ -13,6 +14,7 @@ class PrefixUniquenessTest extends MediaWikiTestCase {
                $prefixes = array();
 
                foreach ( $modules as $name => $class ) {
+                       /** @var ApiMain $module */
                        $module = new $class( $main, $name );
                        $prefix = $module->getModulePrefix();
                        if ( isset( $prefixes[$prefix] ) ) {
diff --git a/tests/phpunit/includes/api/UserWrapper.php b/tests/phpunit/includes/api/UserWrapper.php
new file mode 100644 (file)
index 0000000..3262e6c
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+class UserWrapper {
+       public $userName;
+       public $password;
+       public $user;
+
+       public function __construct( $userName, $password, $group = '' ) {
+               $this->userName = $userName;
+               $this->password = $password;
+
+               $this->user = User::newFromName( $this->userName );
+               if ( !$this->user->getID() ) {
+                       $this->user = User::createNew( $this->userName, array(
+                               "email" => "test@example.com",
+                               "real_name" => "Test User" ) );
+               }
+               $this->user->setPassword( $this->password );
+
+               if ( $group !== '' ) {
+                       $this->user->addGroup( $group );
+               }
+               $this->user->saveSettings();
+       }
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/api/format/ApiFormatJsonTest.php b/tests/phpunit/includes/api/format/ApiFormatJsonTest.php
new file mode 100644 (file)
index 0000000..c71faec
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ * @covers ApiFormatJson
+ */
+class ApiFormatJsonTest extends ApiFormatTestBase {
+
+       public function testValidSyntax( ) {
+               $data = $this->apiRequest( 'json', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+
+               $this->assertInternalType( 'array', json_decode( $data, true ) );
+               $this->assertGreaterThan( 0, count( (array)$data ) );
+       }
+}
index 802a0e1..759dfc7 100644 (file)
@@ -4,11 +4,11 @@
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiFormatPhp
  */
 class ApiFormatPhpTest extends ApiFormatTestBase {
 
-       function testValidPhpSyntax() {
-
+       public function testValidyntax( ) {
                $data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
 
                $this->assertInternalType( 'array', unserialize( $data ) );
index 153f2cf..24d8cb8 100644 (file)
@@ -1,9 +1,18 @@
 <?php
 
 abstract class ApiFormatTestBase extends ApiTestCase {
+
+       /**
+        * @param string $format
+        * @param array $params
+        * @param $data
+        *
+        * @return string
+        */
        protected function apiRequest( $format, $params, $data = null ) {
                $data = parent::doApiRequest( $params, $data, true );
 
+               /** @var ApiMain $module */
                $module = $data[3];
 
                $printer = $module->createPrinterByName( $format );
@@ -19,4 +28,5 @@ abstract class ApiFormatTestBase extends ApiTestCase {
 
                return $out;
        }
+
 }
diff --git a/tests/phpunit/includes/api/format/ApiFormatWddxTest.php b/tests/phpunit/includes/api/format/ApiFormatWddxTest.php
new file mode 100644 (file)
index 0000000..2cf6dca
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ * @covers ApiFormatWddx
+ */
+class ApiFormatWddxTest extends ApiFormatTestBase {
+
+       public function testValidSyntax( ) {
+               $data = $this->apiRequest( 'wddx', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
+
+               $this->assertInternalType( 'array', wddx_deserialize( $data ) );
+               $this->assertGreaterThan( 0, count( (array)$data ) );
+       }
+}
index 1a2aa83..a68c830 100644 (file)
 
 require_once 'ApiQueryTestBase.php';
 
-/** These tests validate basic functionality of the api query module
+/**
+ * These tests validate basic functionality of the api query module
  *
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiQuery
  */
 class ApiQueryBasicTest extends ApiQueryTestBase {
        /**
index 4d5ddba..2116cd3 100644 (file)
@@ -24,6 +24,7 @@ require_once 'ApiQueryContinueTestBase.php';
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiQuery
  */
 class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
        /**
index f494e9c..7797522 100644 (file)
@@ -28,6 +28,7 @@ require_once 'ApiQueryContinueTestBase.php';
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiQuery
  */
 class ApiQueryContinueTest extends ApiQueryContinueTestBase {
        /**
index fbb1e64..3b55b13 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Jan 1, 2013
  *
  * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
index 7f5fe91..74ceff9 100644 (file)
@@ -4,13 +4,14 @@
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiQueryRevisions
  */
 class ApiQueryRevisionsTest extends ApiTestCase {
 
        /**
         * @group medium
         */
-       function testContentComesWithContentModelAndFormat() {
+       public function testContentComesWithContentModelAndFormat() {
                $pageName = 'Help:' . __METHOD__;
                $title = Title::newFromText( $pageName );
                $page = WikiPage::factory( $title );
index bc01ec2..2ec5fe3 100644 (file)
@@ -4,6 +4,7 @@
  * @group API
  * @group Database
  * @group medium
+ * @covers ApiQuery
  */
 class ApiQueryTest extends ApiTestCase {
 
@@ -12,7 +13,7 @@ class ApiQueryTest extends ApiTestCase {
                $this->doLogin();
        }
 
-       function testTitlesGetNormalized() {
+       public function testTitlesGetNormalized() {
 
                global $wgMetaNamespace;
 
@@ -43,7 +44,7 @@ class ApiQueryTest extends ApiTestCase {
                );
        }
 
-       function testTitlesAreRejectedIfInvalid() {
+       public function testTitlesAreRejectedIfInvalid() {
                $title = false;
                while ( !$title || Title::newFromText( $title )->exists() ) {
                        $title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
index 8ee8ea9..9cfab41 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Feb 10, 2013
  *
  * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
index ee3db3e..ce2db5d 100644 (file)
@@ -46,8 +46,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * test usernames
         *
         * @dataProvider provideUserGenders
+        * @covers GenderCache::getGenderOf
         */
-       function testUserName( $username, $expectedGender ) {
+       public function testUserName( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -57,8 +58,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * genderCache should work with user objects, too
         *
         * @dataProvider provideUserGenders
+        * @covers GenderCache::getGenderOf
         */
-       function testUserObjects( $username, $expectedGender ) {
+       public function testUserObjects( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
                $user = User::newFromName( $username );
                $gender = $genderCache->getGenderOf( $user );
@@ -82,8 +84,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * against the never existing username
         *
         * @dataProvider provideStripSubpages
+        * @covers GenderCache::getGenderOf
         */
-       function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+       public function testStripSubpages( $pageWithSubpage, $expectedGender ) {
                $genderCache = GenderCache::singleton();
                $gender = $genderCache->getGenderOf( $pageWithSubpage );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
index c550150..803acf7 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group Database
  * @group Cache
+ * @covers MessageCache
  */
 class MessageCacheTest extends MediaWikiLangTestCase {
 
@@ -83,7 +84,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
         *
         * @dataProvider provideMessagesForFallback
         */
-       function testMessageFallbacks( $message, $lang, $expectedContent ) {
+       public function testMessageFallbacks( $message, $lang, $expectedContent ) {
                $result = MessageCache::singleton()->get( $message, true, $lang );
                $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
        }
@@ -111,7 +112,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
         *
         * @dataProvider provideMessagesForFullKeys
         */
-       function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+       public function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
                $result = MessageCache::singleton()->get( $message, true, $lang, true );
                $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
        }
index 1c81ea7..d3793d8 100644 (file)
@@ -59,7 +59,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
        /**
         * Highlight diff between assertEquals and assertNotSame
         */
-       function testPhpUnitArrayEquality() {
+       public function testPhpUnitArrayEquality() {
                $one = array( 'A' => 1, 'B' => 2 );
                $two = array( 'B' => 2, 'A' => 1 );
                $this->assertEquals( $one, $two ); // ==
@@ -70,7 +70,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * @dataProvider provideInvalidConstructorArg
         * @expectedException MWException
         */
-       function testConstructorGivenInvalidValue( $maxSize ) {
+       public function testConstructorGivenInvalidValue( $maxSize ) {
                new ProcessCacheLRUTestable( $maxSize );
        }
 
@@ -88,7 +88,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                );
        }
 
-       function testAddAndGetAKey() {
+       public function testAddAndGetAKey() {
                $oneCache = new ProcessCacheLRUTestable( 1 );
                $this->assertCacheEmpty( $oneCache );
 
@@ -99,7 +99,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                $this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
        }
 
-       function testDeleteOldKey() {
+       public function testDeleteOldKey() {
                $oneCache = new ProcessCacheLRUTestable( 1 );
                $this->assertCacheEmpty( $oneCache );
 
@@ -117,7 +117,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * @param $cacheMaxEntries Maximum entry the created cache will hold
         * @param $entryToFill Number of entries to insert in the created cache.
         */
-       function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
+       public function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
                $cache = new ProcessCacheLRUTestable( $cacheMaxEntries );
                $this->fillCache( $cache, $entryToFill );
 
@@ -145,7 +145,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * Create a cache with only one remaining entry then update
         * the first inserted entry. Should bump it to the top.
         */
-       function testReplaceExistingKeyShouldBumpEntryToTop() {
+       public function testReplaceExistingKeyShouldBumpEntryToTop() {
                $maxEntries = 3;
 
                $cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -164,7 +164,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                );
        }
 
-       function testRecentlyAccessedKeyStickIn() {
+       public function testRecentlyAccessedKeyStickIn() {
                $cache = new ProcessCacheLRUTestable( 2 );
                $cache->set( 'first', 'prop1', 'value1' );
                $cache->set( 'second', 'prop2', 'value2' );
@@ -183,7 +183,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * Given a cache having 1,2,3 as key, updating 2 should bump 2 to
         * the top of the queue with the new value: 1,3,2* (* = updated).
         */
-       function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
+       public function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
                $maxEntries = 3;
 
                $cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -204,7 +204,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                );
        }
 
-       function testBumpExistingKeyToTop() {
+       public function testBumpExistingKeyToTop() {
                $cache = new ProcessCacheLRUTestable( 3 );
                $this->fillCache( $cache, 3 );
 
index c345513..aedf594 100644 (file)
@@ -70,6 +70,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetDefaultModelFor
+        * @covers ContentHandler::getDefaultModelFor
         */
        public function testGetDefaultModelFor( $title, $expectedModelId ) {
                $title = Title::newFromText( $title );
@@ -78,6 +79,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetDefaultModelFor
+        * @covers ContentHandler::getForTitle
         */
        public function testGetForTitle( $title, $expectedContentModel ) {
                $title = Title::newFromText( $title );
@@ -97,6 +99,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetLocalizedName
+        * @covers ContentHandler::getLocalizedName
         */
        public function testGetLocalizedName( $id, $expected ) {
                $name = ContentHandler::getLocalizedName( $id );
@@ -131,6 +134,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetPageLanguage
+        * @covers ContentHandler::getPageLanguage
         */
        public function testGetPageLanguage( $title, $expected ) {
                if ( is_string( $title ) ) {
@@ -155,6 +159,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentText_Null
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_Null( $contentHandlerTextFallback ) {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
@@ -175,6 +180,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataGetContentText_TextContent
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_TextContent( $contentHandlerTextFallback ) {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
@@ -188,6 +194,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
        /**
         * ContentHandler::getContentText should have thrown an exception for non-text Content object
         * @expectedException MWException
+        * @covers ContentHandler::getContentText
         */
        public function testGetContentText_NonTextContent_fail() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'fail' );
@@ -197,6 +204,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                ContentHandler::getContentText( $content );
        }
 
+       /**
+        * @covers ContentHandler::getContentText
+        */
        public function testGetContentText_NonTextContent_serialize() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'serialize' );
 
@@ -206,6 +216,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $content->serialize(), $text );
        }
 
+       /**
+        * @covers ContentHandler::getContentText
+        */
        public function testGetContentText_NonTextContent_ignore() {
                $this->setMwGlobals( 'wgContentHandlerTextFallback', 'ignore' );
 
@@ -241,6 +254,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataMakeContent
+        * @covers ContentHandler::makeContent
         */
        public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
                $title = Title::newFromText( $title );
@@ -270,6 +284,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
        */
 
+       /**
+        * @covers ContentHandler::runLegacyHooks
+        */
        public function testRunLegacyHooks() {
                Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
 
index 1c45820..bd6d41f 100644 (file)
@@ -50,12 +50,18 @@ class CssContentTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers CssContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
        }
 
+       /**
+        * @covers CssContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( 'hello world.' );
 
@@ -73,6 +79,7 @@ class CssContentTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider dataEquals
+        * @covers CssContent::equals
         */
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
index 5c1ff8f..c8616ff 100644 (file)
@@ -89,6 +89,9 @@ class JavaScriptContentTest extends TextContentTest {
                );
        }
 
+       /**
+        * @covers JavaScriptContent::addSectionHeader
+        */
        public function testAddSectionHeader() {
                $content = $this->newContent( 'hello world' );
                $c = $content->addSectionHeader( 'test' );
@@ -233,6 +236,9 @@ class JavaScriptContentTest extends TextContentTest {
                );
        }
 
+       /**
+        * @covers JavaScriptContent::matchMagicWord
+        */
        public function testMatchMagicWord() {
                $mw = MagicWord::get( "staticredirect" );
 
@@ -240,6 +246,9 @@ class JavaScriptContentTest extends TextContentTest {
                $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
        }
 
+       /**
+        * @covers JavaScriptContent::updateRedirect
+        */
        public function testUpdateRedirect() {
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -249,12 +258,18 @@ class JavaScriptContentTest extends TextContentTest {
                $this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
        }
 
+       /**
+        * @covers JavaScriptContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
        }
 
+       /**
+        * @covers JavaScriptContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
index c7138b7..a1f099f 100644 (file)
@@ -51,6 +51,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetParserOutput
+        * @covers TextContent::getParserOutput
         */
        public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
                $title = Title::newFromText( $title );
@@ -96,6 +97,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataPreSaveTransform
+        * @covers TextContent::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgContLang;
@@ -119,6 +121,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataPreloadTransform
+        * @covers TextContent::preloadTransform
         */
        public function testPreloadTransform( $text, $expected ) {
                global $wgContLang;
@@ -140,6 +143,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetRedirectTarget
+        * @covers TextContent::getRedirectTarget
         */
        public function testGetRedirectTarget( $text, $expected ) {
                $content = $this->newContent( $text );
@@ -154,6 +158,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetRedirectTarget
+        * @covers TextContent::isRedirect
         */
        public function testIsRedirect( $text, $expected ) {
                $content = $this->newContent( $text );
@@ -209,6 +214,7 @@ class TextContentTest extends MediaWikiLangTestCase {
        /**
         * @dataProvider dataIsCountable
         * @group Database
+        * @covers TextContent::isCountable
         */
        public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
                $this->setMwGlobals( 'wgArticleCountMethod', $mode );
@@ -240,6 +246,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetTextForSummary
+        * @covers TextContent::getTextForSummary
         */
        public function testGetTextForSummary( $text, $maxlength, $expected ) {
                $content = $this->newContent( $text );
@@ -247,12 +254,18 @@ class TextContentTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $content->getTextForSummary( $maxlength ) );
        }
 
+       /**
+        * @covers TextContent::getTextForSearchIndex
+        */
        public function testGetTextForSearchIndex() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getTextForSearchIndex() );
        }
 
+       /**
+        * @covers TextContent::copy
+        */
        public function testCopy() {
                $content = $this->newContent( 'hello world.' );
                $copy = $content->copy();
@@ -261,30 +274,45 @@ class TextContentTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'hello world.', $copy->getNativeData() );
        }
 
+       /**
+        * @covers TextContent::getSize
+        */
        public function testGetSize() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 12, $content->getSize() );
        }
 
+       /**
+        * @covers TextContent::getNativeData
+        */
        public function testGetNativeData() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getNativeData() );
        }
 
+       /**
+        * @covers TextContent::getWikitextForTransclusion
+        */
        public function testGetWikitextForTransclusion() {
                $content = $this->newContent( 'hello world.' );
 
                $this->assertEquals( 'hello world.', $content->getWikitextForTransclusion() );
        }
 
+       /**
+        * @covers TextContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_TEXT, $content->getModel() );
        }
 
+       /**
+        * @covers TextContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
@@ -302,6 +330,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataIsEmpty
+        * @covers TextContent::isEmpty
         */
        public function testIsEmpty( $text, $empty ) {
                $content = $this->newContent( $text );
@@ -321,6 +350,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataEquals
+        * @covers TextContent::equals
         */
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
@@ -342,6 +372,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetDeletionUpdates
+        * @covers TextContent::getDeletionUpdates
         */
        public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
                $ns = $this->getDefaultWikitextNS();
@@ -410,6 +441,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideConvert
+        * @covers TextContent::convert
         */
        public function testConvert( $text, $model, $lossy, $expectedNative ) {
                $content = $this->newContent( $text );
index d213251..75a7278 100644 (file)
@@ -16,6 +16,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
        }
 
+       /**
+        * @covers WikitextContentHandler::serializeContent
+        */
        public function testSerializeContent() {
                $content = new WikitextContent( 'hello world' );
 
@@ -30,6 +33,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers WikitextContentHandler::unserializeContent
+        */
        public function testUnserializeContent() {
                $content = $this->handler->unserializeContent( 'hello world' );
                $this->assertEquals( 'hello world', $content->getNativeData() );
@@ -45,6 +51,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers WikitextContentHandler::makeEmptyContent
+        */
        public function testMakeEmptyContent() {
                $content = $this->handler->makeEmptyContent();
 
@@ -64,6 +73,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
         * @dataProvider provideMakeRedirectContent
         * @param Title|string $title Title object or string for Title::newFromText()
         * @param string $expected Serialized form of the content object built
+        * @covers WikitextContentHandler::makeRedirectContent
         */
        public function testMakeRedirectContent( $title, $expected ) {
                global $wgContLang;
@@ -92,6 +102,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataIsSupportedFormat
+        * @covers WikitextContentHandler::isSupportedFormat
         */
        public function testIsSupportedFormat( $format, $supported ) {
                $this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
@@ -131,6 +142,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataMerge3
+        * @covers WikitextContentHandler::merge3
         */
        public function testMerge3( $old, $mine, $yours, $expected ) {
                $this->checkHasDiff3();
@@ -188,6 +200,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider dataGetAutosummary
+        * @covers WikitextContentHandler::getAutosummary
         */
        public function testGetAutosummary( $old, $new, $flags, $expected ) {
                $oldContent = is_null( $old ) ? null : new WikitextContent( $old );
index 37b01fd..9f20073 100644 (file)
@@ -64,6 +64,7 @@ more stuff
        /**
         * @dataProvider dataGetSecondaryDataUpdates
         * @group Database
+        * @covers WikitextContent::getSecondaryDataUpdates
         */
        public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
                $ns = $this->getDefaultWikitextNS();
@@ -116,6 +117,7 @@ just a test"
 
        /**
         * @dataProvider dataGetSection
+        * @covers WikitextContent::getSection
         */
        public function testGetSection( $text, $sectionId, $expectedText ) {
                $content = $this->newContent( $text );
@@ -167,6 +169,7 @@ just a test"
 
        /**
         * @dataProvider dataReplaceSection
+        * @covers WikitextContent::replaceSection
         */
        public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
                $content = $this->newContent( $text );
@@ -175,6 +178,9 @@ just a test"
                $this->assertEquals( $expected, is_null( $c ) ? null : $c->getNativeData() );
        }
 
+       /**
+        * @covers WikitextContent::addSectionHeader
+        */
        public function testAddSectionHeader() {
                $content = $this->newContent( 'hello world' );
                $content = $content->addSectionHeader( 'test' );
@@ -319,6 +325,9 @@ just a test"
                );
        }
 
+       /**
+        * @covers WikitextContent::matchMagicWord
+        */
        public function testMatchMagicWord() {
                $mw = MagicWord::get( "staticredirect" );
 
@@ -329,6 +338,9 @@ just a test"
                $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
        }
 
+       /**
+        * @covers WikitextContent::updateRedirect
+        */
        public function testUpdateRedirect() {
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -348,12 +360,18 @@ just a test"
                $this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
        }
 
+       /**
+        * @covers WikitextContent::getModel
+        */
        public function testGetModel() {
                $content = $this->newContent( "hello world." );
 
                $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
        }
 
+       /**
+        * @covers WikitextContent::getContentHandler
+        */
        public function testGetContentHandler() {
                $content = $this->newContent( "hello world." );
 
index 8138b70..134f856 100644 (file)
@@ -58,8 +58,9 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDiapers
+        * @covers DatabaseMysqlBase::addIdentifierQuotes
         */
-       function testAddIdentifierQuotes( $expected, $in ) {
+       public function testAddIdentifierQuotes( $expected, $in ) {
                $db = new FakeDatabaseMysqlBase();
                $quoted = $db->addIdentifierQuotes( $in );
                $this->assertEquals($expected, $quoted);
index 46ccfe0..bdd567e 100644 (file)
@@ -6,6 +6,9 @@
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
+       /**
+        * @var DatabaseTestHelper
+        */
        private $database;
 
        protected function setUp() {
@@ -22,8 +25,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideSelect
+        * @covers DatabaseBase::select
         */
-       function testSelect( $sql, $sqlText ) {
+       public function testSelect( $sql, $sqlText ) {
                $this->database->select(
                        $sql['tables'],
                        $sql['fields'],
@@ -123,8 +127,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUpdate
+        * @covers DatabaseBase::update
         */
-       function testUpdate( $sql, $sqlText ) {
+       public function testUpdate( $sql, $sqlText ) {
                $this->database->update(
                        $sql['table'],
                        $sql['values'],
@@ -174,8 +179,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDelete
+        * @covers DatabaseBase::delete
         */
-       function testDelete( $sql, $sqlText ) {
+       public function testDelete( $sql, $sqlText ) {
                $this->database->delete(
                        $sql['table'],
                        $sql['conds'],
@@ -206,8 +212,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUpsert
+        * @covers DatabaseBase::upsert
         */
-       function testUpsert( $sql, $sqlText ) {
+       public function testUpsert( $sql, $sqlText ) {
                $this->database->upsert(
                        $sql['table'],
                        $sql['rows'],
@@ -241,8 +248,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDeleteJoin
+        * @covers DatabaseBase::deleteJoin
         */
-       function testDeleteJoin( $sql, $sqlText ) {
+       public function testDeleteJoin( $sql, $sqlText ) {
                $this->database->deleteJoin(
                        $sql['delTable'],
                        $sql['joinTable'],
@@ -287,8 +295,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideInsert
+        * @covers DatabaseBase::insert
         */
-       function testInsert( $sql, $sqlText ) {
+       public function testInsert( $sql, $sqlText ) {
                $this->database->insert(
                        $sql['table'],
                        $sql['rows'],
@@ -339,8 +348,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideInsertSelect
+        * @covers DatabaseBase::insertSelect
         */
-       function testInsertSelect( $sql, $sqlText ) {
+       public function testInsertSelect( $sql, $sqlText ) {
                $this->database->insertSelect(
                        $sql['destTable'],
                        $sql['srcTable'],
@@ -401,8 +411,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideReplace
+        * @covers DatabaseBase::replace
         */
-       function testReplace( $sql, $sqlText ) {
+       public function testReplace( $sql, $sqlText ) {
                $this->database->replace(
                        $sql['table'],
                        $sql['uniqueIndexes'],
@@ -515,8 +526,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideNativeReplace
+        * @covers DatabaseBase::nativeReplace
         */
-       function testNativeReplace( $sql, $sqlText ) {
+       public function testNativeReplace( $sql, $sqlText ) {
                $this->database->nativeReplace(
                        $sql['table'],
                        $sql['rows'],
@@ -541,8 +553,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideConditional
+        * @covers DatabaseBase::conditional
         */
-       function testConditional( $sql, $sqlText ) {
+       public function testConditional( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->database->conditional(
                        $sql['conds'],
                        $sql['true'],
@@ -581,8 +594,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideBuildConcat
+        * @covers DatabaseBase::buildConcat
         */
-       function testBuildConcat( $stringList, $sqlText ) {
+       public function testBuildConcat( $stringList, $sqlText ) {
                $this->assertEquals( trim( $this->database->buildConcat(
                        $stringList
                ) ), $sqlText );
@@ -603,8 +617,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideBuildLike
+        * @covers DatabaseBase::buildLike
         */
-       function testBuildLike( $array, $sqlText ) {
+       public function testBuildLike( $array, $sqlText ) {
                $this->assertEquals( trim( $this->database->buildLike(
                        $array
                ) ), $sqlText );
@@ -633,8 +648,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUnionQueries
+        * @covers DatabaseBase::unionQueries
         */
-       function testUnionQueries( $sql, $sqlText ) {
+       public function testUnionQueries( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->database->unionQueries(
                        $sql['sqls'],
                        $sql['all']
@@ -667,25 +683,37 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                );
        }
 
-       function testTransactionCommit() {
+       /**
+        * @covers DatabaseBase::commit
+        */
+       public function testTransactionCommit() {
                $this->database->begin( __METHOD__ );
                $this->database->commit( __METHOD__ );
                $this->assertLastSql( 'BEGIN; COMMIT' );
        }
 
-       function testTransactionRollback() {
+       /**
+        * @covers DatabaseBase::rollback
+        */
+       public function testTransactionRollback() {
                $this->database->begin( __METHOD__ );
                $this->database->rollback( __METHOD__ );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
        }
 
-       function testDropTable() {
+       /**
+        * @covers DatabaseBase::dropTable
+        */
+       public function testDropTable() {
                $this->database->setExistingTables( array( 'table' ) );
                $this->database->dropTable( 'table', __METHOD__ );
                $this->assertLastSql( 'DROP TABLE table' );
        }
 
-       function testDropNonExistingTable() {
+       /**
+        * @covers DatabaseBase::dropTable
+        */
+       public function testDropNonExistingTable() {
                $this->assertFalse(
                        $this->database->dropTable( 'non_existing', __METHOD__ )
                );
index 91ab33a..70ee946 100644 (file)
@@ -27,6 +27,10 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
  * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
+
+       /**
+        * @var MockDatabaseSqlite
+        */
        var $db;
 
        protected function setUp() {
@@ -83,6 +87,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideAddQuotes()
+        * @covers DatabaseSqlite::addQuotes
         */
        public function testAddQuotes( $value, $expected ) {
                // check quoting
@@ -105,6 +110,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers DatabaseSqlite::replaceVars
+        */
        public function testReplaceVars() {
                $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
@@ -143,6 +151,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::tableName
+        */
        public function testTableName() {
                // @todo Moar!
                $db = new DatabaseSqliteStandalone( ':memory:' );
@@ -153,6 +164,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
        }
 
+       /**
+        * @covers DatabaseSqlite::duplicateTableStructure
+        */
        public function testDuplicateTableStructure() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                $db->query( 'CREATE TABLE foo(foo, barfoo)' );
@@ -174,6 +188,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::duplicateTableStructure
+        */
        public function testDuplicateTableStructureVirtual() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                if ( $db->getFulltextSearchModule() != 'FTS3' ) {
@@ -194,6 +211,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers DatabaseSqlite::deleteJoin
+        */
        public function testDeleteJoin() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
                $db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
@@ -306,12 +326,18 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers DatabaseSqlite::insertId
+        */
        public function testInsertIdType() {
                $db = new DatabaseSqliteStandalone( ':memory:' );
-               $this->assertInstanceOf( 'ResultWrapper',
-                       $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
-               $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
-                       "Insertion worked" );
+
+               $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
+               $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+
+               $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
+               $this->assertTrue( $insertion, "Insertion worked" );
+
                $this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
                $this->assertTrue( $db->close(), "closing database" );
        }
@@ -385,7 +411,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                return $indexes;
        }
 
-       function testCaseInsensitiveLike() {
+       public function testCaseInsensitiveLike() {
                // TODO: Test this for all databases
                $db = new DatabaseSqliteStandalone( ':memory:' );
                $res = $db->query( 'SELECT "a" LIKE "A" AS a' );
index a3ef55a..301fc99 100644 (file)
@@ -5,7 +5,11 @@
  * @group DatabaseBase
  */
 class DatabaseTest extends MediaWikiTestCase {
-       var $db, $functionTest = false;
+       /**
+        * @var DatabaseBase
+        */
+       var $db;
+       var $functionTest = false;
 
        protected function setUp() {
                parent::setUp();
@@ -19,8 +23,10 @@ class DatabaseTest extends MediaWikiTestCase {
                        $this->functionTest = false;
                }
        }
-
-       function testAddQuotesNull() {
+       /**
+        * @covers DatabaseBase::dropTable
+        */
+       public function testAddQuotesNull() {
                $check = "NULL";
                if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
                        $check = "''";
@@ -28,7 +34,7 @@ class DatabaseTest extends MediaWikiTestCase {
                $this->assertEquals( $check, $this->db->addQuotes( null ) );
        }
 
-       function testAddQuotesInt() {
+       public function testAddQuotesInt() {
                # returning just "1234" should be ok too, though...
                # maybe
                $this->assertEquals(
@@ -36,20 +42,20 @@ class DatabaseTest extends MediaWikiTestCase {
                        $this->db->addQuotes( 1234 ) );
        }
 
-       function testAddQuotesFloat() {
+       public function testAddQuotesFloat() {
                # returning just "1234.5678" would be ok too, though
                $this->assertEquals(
                        "'1234.5678'",
                        $this->db->addQuotes( 1234.5678 ) );
        }
 
-       function testAddQuotesString() {
+       public function testAddQuotesString() {
                $this->assertEquals(
                        "'string'",
                        $this->db->addQuotes( 'string' ) );
        }
 
-       function testAddQuotesStringQuote() {
+       public function testAddQuotesStringQuote() {
                $check = "'string''s cause trouble'";
                if ( $this->db->getType() === 'mysql' ) {
                        $check = "'string\'s cause trouble'";
@@ -109,21 +115,21 @@ class DatabaseTest extends MediaWikiTestCase {
                }
        }
 
-       function testTableNameLocal() {
+       public function testTableNameLocal() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename' ),
                        $this->db->tableName( 'tablename' )
                );
        }
 
-       function testTableNameRawLocal() {
+       public function testTableNameRawLocal() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename', null, null, 'raw' ),
                        $this->db->tableName( 'tablename', 'raw' )
                );
        }
 
-       function testTableNameShared() {
+       public function testTableNameShared() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
                        $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
@@ -135,7 +141,7 @@ class DatabaseTest extends MediaWikiTestCase {
                );
        }
 
-       function testTableNameRawShared() {
+       public function testTableNameRawShared() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
                        $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
@@ -147,21 +153,21 @@ class DatabaseTest extends MediaWikiTestCase {
                );
        }
 
-       function testTableNameForeign() {
+       public function testTableNameForeign() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename', 'databasename', '' ),
                        $this->db->tableName( 'databasename.tablename' )
                );
        }
 
-       function testTableNameRawForeign() {
+       public function testTableNameRawForeign() {
                $this->assertEquals(
                        $this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
                        $this->db->tableName( 'databasename.tablename', 'raw' )
                );
        }
 
-       function testFillPreparedEmpty() {
+       public function testFillPreparedEmpty() {
                $sql = $this->db->fillPrepared(
                        'SELECT * FROM interwiki', array() );
                $this->assertEquals(
@@ -169,7 +175,7 @@ class DatabaseTest extends MediaWikiTestCase {
                        $sql );
        }
 
-       function testFillPreparedQuestion() {
+       public function testFillPreparedQuestion() {
                $sql = $this->db->fillPrepared(
                        'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
                        array( 4, "Snicker's_paradox" ) );
@@ -181,7 +187,7 @@ class DatabaseTest extends MediaWikiTestCase {
                $this->assertEquals( $check, $sql );
        }
 
-       function testFillPreparedBang() {
+       public function testFillPreparedBang() {
                $sql = $this->db->fillPrepared(
                        'SELECT user_id FROM ! WHERE user_name=?',
                        array( '"user"', "Slash's Dot" ) );
@@ -193,7 +199,7 @@ class DatabaseTest extends MediaWikiTestCase {
                $this->assertEquals( $check, $sql );
        }
 
-       function testFillPreparedRaw() {
+       public function testFillPreparedRaw() {
                $sql = $this->db->fillPrepared(
                        "SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
                        array( '"user"', "Slash's Dot" ) );
@@ -202,7 +208,7 @@ class DatabaseTest extends MediaWikiTestCase {
                        $sql );
        }
 
-       function testStoredFunctions() {
+       public function testStoredFunctions() {
                if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
                        $this->markTestSkipped( 'MySQL or Postgres required' );
                }
@@ -220,7 +226,7 @@ class DatabaseTest extends MediaWikiTestCase {
                );
        }
 
-       function testUnknownTableCorruptsResults() {
+       public function testUnknownTableCorruptsResults() {
                $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
                $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
                $this->assertInternalType( 'int', $res->numRows() );
index 9026cb9..6926b1c 100644 (file)
@@ -21,7 +21,7 @@ class MWDebugTest extends MediaWikiTestCase {
                parent::tearDown();
        }
 
-       function testAddLog() {
+       public function testAddLog() {
                MWDebug::log( 'logging a string' );
                $this->assertEquals(
                        array( array(
@@ -33,7 +33,7 @@ class MWDebugTest extends MediaWikiTestCase {
                );
        }
 
-       function testAddWarning() {
+       public function testAddWarning() {
                MWDebug::warning( 'Warning message' );
                $this->assertEquals(
                        array( array(
@@ -45,7 +45,7 @@ class MWDebugTest extends MediaWikiTestCase {
                );
        }
 
-       function testAvoidDuplicateDeprecations() {
+       public function testAvoidDuplicateDeprecations() {
                MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
                MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
 
@@ -56,7 +56,7 @@ class MWDebugTest extends MediaWikiTestCase {
                );
        }
 
-       function testAvoidNonConsecutivesDuplicateDeprecations() {
+       public function testAvoidNonConsecutivesDuplicateDeprecations() {
                MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
                MWDebug::warning( 'some warning' );
                MWDebug::log( 'we could have logged something too' );
index 013bbe2..fcfa724 100644 (file)
@@ -6,7 +6,13 @@
  * @group medium
  */
 class FileBackendTest extends MediaWikiTestCase {
-       private $backend, $multiBackend;
+
+       /** @var FileBackend */
+       private $backend;
+       /** @var FileBackendMultiWrite */
+       private $multiBackend;
+       /** @var FSFileBackend */
+       public $singleBackend;
        private $filesToPrune = array();
        private static $backendToUse;
 
@@ -85,6 +91,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testIsStoragePath
+        * @covers FileBackend::isStoragePath
         */
        public function testIsStoragePath( $path, $isStorePath ) {
                $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
@@ -109,6 +116,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testSplitStoragePath
+        * @covers FileBackend::splitStoragePath
         */
        public function testSplitStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
@@ -133,6 +141,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_normalizeStoragePath
+        * @covers FileBackend::normalizeStoragePath
         */
        public function testNormalizeStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
@@ -159,6 +168,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testParentStoragePath
+        * @covers FileBackend::parentStoragePath
         */
        public function testParentStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
@@ -180,6 +190,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testExtensionFromPath
+        * @covers FileBackend::extensionFromPath
         */
        public function testExtensionFromPath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
@@ -213,6 +224,9 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
+       /**
+        * @covers FileBackend::doOperation
+        */
        private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
@@ -284,6 +298,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCopy
+        * @covers FileBackend::doOperation
         */
        public function testCopy( $op ) {
                $this->backend = $this->singleBackend;
@@ -404,6 +419,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testMove
+        * @covers FileBackend::doOperation
         */
        public function testMove( $op ) {
                $this->backend = $this->singleBackend;
@@ -525,6 +541,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDelete
+        * @covers FileBackend::doOperation
         */
        public function testDelete( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -616,6 +633,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDescribe
+        * @covers FileBackend::doOperation
         */
        public function testDescribe( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -683,6 +701,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCreate
+        * @covers FileBackend::doOperation
         */
        public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
                $this->backend = $this->singleBackend;
@@ -803,6 +822,9 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
+       /**
+        * @covers FileBackend::doQuickOperations
+        */
        public function testDoQuickOperations() {
                $this->backend = $this->singleBackend;
                $this->doTestDoQuickOperations();
@@ -1019,6 +1041,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileStat
+        * @covers FileBackend::getFileStat
         */
        public function testGetFileStat( $path, $content, $alreadyExists ) {
                $this->backend = $this->singleBackend;
@@ -1094,6 +1117,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileContents
+        * @covers FileBackend::getFileContents
+        * @covers FileBackend::getFileContentsMulti
         */
        public function testGetFileContents( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1153,6 +1178,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalCopy
+        * @covers FileBackend::getLocalCopy
         */
        public function testGetLocalCopy( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1222,6 +1248,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalReference
+        * @covers FileBackend::getLocalReference
         */
        public function testGetLocalReference( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1286,6 +1313,10 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
+       /**
+        * @covers FileBackend::getLocalCopy
+        * @covers FileBackend::getLocalReference
+        */
        public function testGetLocalCopyAndReference404() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1314,6 +1345,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileHttpUrl
+        * @covers FileBackend::getFileHttpUrl
         */
        public function testGetFileHttpUrl( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1358,6 +1390,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testPrepareAndClean
+        * @covers FileBackend::prepare
+        * @covers FileBackend::clean
         */
        public function testPrepareAndClean( $path, $isOK ) {
                $this->backend = $this->singleBackend;
@@ -1416,6 +1450,9 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
+       /**
+        * @covers FileBackend::clean
+        */
        private function doTestRecursiveClean() {
                $backendName = $this->backendClass();
 
@@ -1462,6 +1499,9 @@ class FileBackendTest extends MediaWikiTestCase {
 
        // @todo testSecure
 
+       /**
+        * @covers FileBackend::doOperations
+        */
        public function testDoOperations() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1549,6 +1589,9 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
+       /**
+        * @covers FileBackend::doOperations
+        */
        public function testDoOperationsPipeline() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1648,6 +1691,9 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
+       /**
+        * @covers FileBackend::doOperations
+        */
        public function testDoOperationsFailing() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1722,6 +1768,9 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileA" );
        }
 
+       /**
+        * @covers FileBackend::getFileList
+        */
        public function testGetFileList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1886,6 +1935,10 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers FileBackend::getTopDirectoryList
+        * @covers FileBackend::getDirectoryList
+        */
        public function testGetDirectoryList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -2092,6 +2145,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( array(), $items, "Directory listing is empty." );
        }
 
+       /**
+        * @covers FileBackend::lockFiles
+        * @covers FileBackend::unlockFiles
+        */
        public function testLockCalls() {
                $this->backend = $this->singleBackend;
                $this->doTestLockCalls();
index 033ae0b..e3a7556 100644 (file)
@@ -1,24 +1,28 @@
 <?php
 
 class FileRepoTest extends MediaWikiTestCase {
+
        /**
         * @expectedException MWException
+        * @covers FileRepo::__construct
         */
-       function testFileRepoConstructionOptionCanNotBeNull() {
+       public function testFileRepoConstructionOptionCanNotBeNull() {
                new FileRepo();
        }
 
        /**
         * @expectedException MWException
+        * @covers FileRepo::__construct
         */
-       function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
+       public function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
                new FileRepo( array() );
        }
 
        /**
         * @expectedException MWException
+        * @covers FileRepo::__construct
         */
-       function testFileRepoConstructionOptionNeedNameKey() {
+       public function testFileRepoConstructionOptionNeedNameKey() {
                new FileRepo( array(
                        'backend' => 'foobar'
                ) );
@@ -26,14 +30,18 @@ class FileRepoTest extends MediaWikiTestCase {
 
        /**
         * @expectedException MWException
+        * @covers FileRepo::__construct
         */
-       function testFileRepoConstructionOptionNeedBackendKey() {
+       public function testFileRepoConstructionOptionNeedBackendKey() {
                new FileRepo( array(
                        'name' => 'foobar'
                ) );
        }
 
-       function testFileRepoConstructionWithRequiredOptions() {
+       /**
+        * @covers FileRepo::__construct
+        */
+       public function testFileRepoConstructionWithRequiredOptions() {
                $f = new FileRepo( array(
                        'name' => 'FileRepoTestRepository',
                        'backend' => new FSFileBackend( array(
index 71a585e..b33c1bb 100644 (file)
@@ -1,10 +1,16 @@
 <?php
+
 /**
  * @group FileRepo
  * @group medium
  */
 class StoreBatchTest extends MediaWikiTestCase {
 
+       protected $createdFiles;
+       protected $date;
+       /** @var FileRepo */
+       protected $repo;
+
        protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
@@ -60,6 +66,7 @@ class StoreBatchTest extends MediaWikiTestCase {
         * @param $originalName string The title of the image
         * @param $srcPath string The filepath or virtual URL
         * @param $flags integer Flags to pass into repo::store().
+        * @return FileRepoStatus
         */
        private function storeit( $originalName, $srcPath, $flags ) {
                $hashPath = $this->repo->getHashPath( $originalName );
@@ -79,7 +86,7 @@ class StoreBatchTest extends MediaWikiTestCase {
         * @param $fn string The title of the image
         * @param $infn string The name of the file (in the filesystem)
         * @param $otherfn string The name of the different file (in the filesystem)
-        * @param $fromrepo logical 'true' if we want to copy from a virtual URL out of the Repo.
+        * @param $fromrepo bool 'true' if we want to copy from a virtual URL out of the Repo.
         */
        private function storecohort( $fn, $infn, $otherfn, $fromrepo ) {
                $f = $this->storeit( $fn, $infn, 0 );
@@ -116,6 +123,9 @@ class StoreBatchTest extends MediaWikiTestCase {
                $this->assertEquals( $f->successCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
        }
 
+       /**
+        * @covers FileRepo::store
+        */
        public function teststore() {
                global $IP;
                $this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
index ea87ede..0e5f267 100644 (file)
@@ -9,7 +9,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
         * @covers InstallDocFormatter::format
         * @dataProvider provideDocFormattingTests
         */
-       function testFormat( $expected, $unformattedText, $message = '' ) {
+       public function testFormat( $expected, $unformattedText, $message = '' ) {
                $this->assertEquals(
                        $expected,
                        InstallDocFormatter::format( $unformattedText ),
index 7c37f98..66e6559 100644 (file)
@@ -11,8 +11,9 @@ class OracleInstallerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideOracleConnectStrings
+        * @covers OracleInstaller::checkConnectStringFormat
         */
-       function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
+       public function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
                $validity = $expected ? 'should be valid' : 'should NOT be valid';
                $msg = "'$connectString' ($msg) $validity.";
                $this->assertEquals( $expected,
index 6990153..4e51c4f 100644 (file)
@@ -71,7 +71,7 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testProperties( $queue, $recycles, $desc ) {
+       public function testProperties( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
                if ( !$queue ) {
                        $this->markTestSkipped( $desc );
@@ -84,7 +84,7 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicOperations( $queue, $recycles, $desc ) {
+       public function testBasicOperations( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
                if ( !$queue ) {
                        $this->markTestSkipped( $desc );
@@ -158,7 +158,7 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicDeduplication( $queue, $recycles, $desc ) {
+       public function testBasicDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
                if ( !$queue ) {
                        $this->markTestSkipped( $desc );
@@ -215,7 +215,7 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testRootDeduplication( $queue, $recycles, $desc ) {
+       public function testRootDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
                if ( !$queue ) {
                        $this->markTestSkipped( $desc );
@@ -268,7 +268,7 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_fifoQueueLists
         */
-       function testJobOrder( $queue, $recycles, $desc ) {
+       public function testJobOrder( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
                if ( !$queue ) {
                        $this->markTestSkipped( $desc );
index 1c898f0..5a3c161 100644 (file)
@@ -4,12 +4,14 @@
  * CSSJanus libary:
  * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
  * Ported to PHP for ResourceLoader and has been extended since.
+ *
+ * @covers CSSJanus
  */
 class CSSJanusTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideTransformCases
         */
-       function testTransform( $cssA, $cssB = null ) {
+       public function testTransform( $cssA, $cssB = null ) {
 
                if ( $cssB ) {
                        $transformedA = CSSJanus::transform( $cssA );
@@ -28,7 +30,7 @@ class CSSJanusTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideTransformAdvancedCases
         */
-       function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
+       public function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
                $swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
                $swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
 
@@ -44,7 +46,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * @dataProvider provideTransformBrokenCases
         * @group Broken
         */
-       function testTransformBroken( $code, $expectedOutput ) {
+       public function testTransformBroken( $code, $expectedOutput ) {
                $flipped = CSSJanus::transform( $code );
 
                $this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
index e9901ce..951dd7b 100644 (file)
@@ -21,7 +21,7 @@ class CSSMinTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideMinifyCases
         */
-       function testMinify( $code, $expectedOutput ) {
+       public function testMinify( $code, $expectedOutput ) {
                $minified = CSSMin::minify( $code );
 
                $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
@@ -70,7 +70,7 @@ class CSSMinTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideRemapCases
         */
-       function testRemap( $message, $params, $expectedOutput ) {
+       public function testRemap( $message, $params, $expectedOutput ) {
                $remapped = call_user_func_array( 'CSSMin::remap', $params );
 
                $messageAdd = " Case: $message";
@@ -115,7 +115,7 @@ class CSSMinTest extends MediaWikiTestCase {
         * @group Broken
         * @dataProvider provideStringCases
         */
-       function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
+       public function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
                $this->testMinifyOutput( $code, $expectedOutput );
        }
 
index d04dd7d..66fe915 100644 (file)
@@ -4,7 +4,7 @@
  * Tests for IEUrlExtension::findIE6Extension
  */
 class IEUrlExtensionTest extends MediaWikiTestCase {
-       function testSimple() {
+       public function testSimple() {
                $this->assertEquals(
                        'y',
                        IEUrlExtension::findIE6Extension( 'x.y' ),
@@ -12,7 +12,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testSimpleNoExt() {
+       public function testSimpleNoExt() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( 'x' ),
@@ -20,7 +20,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testEmpty() {
+       public function testEmpty() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( '' ),
@@ -28,7 +28,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testQuestionMark() {
+       public function testQuestionMark() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( '?' ),
@@ -36,7 +36,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testExtQuestionMark() {
+       public function testExtQuestionMark() {
                $this->assertEquals(
                        'x',
                        IEUrlExtension::findIE6Extension( '.x?' ),
@@ -44,7 +44,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testQuestionMarkExt() {
+       public function testQuestionMarkExt() {
                $this->assertEquals(
                        'x',
                        IEUrlExtension::findIE6Extension( '?.x' ),
@@ -52,7 +52,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testInvalidChar() {
+       public function testInvalidChar() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( '.x*' ),
@@ -60,7 +60,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testInvalidCharThenExtension() {
+       public function testInvalidCharThenExtension() {
                $this->assertEquals(
                        'x',
                        IEUrlExtension::findIE6Extension( '*.x' ),
@@ -68,7 +68,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testMultipleQuestionMarks() {
+       public function testMultipleQuestionMarks() {
                $this->assertEquals(
                        'c',
                        IEUrlExtension::findIE6Extension( 'a?b?.c?.d?e?f' ),
@@ -76,7 +76,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testExeException() {
+       public function testExeException() {
                $this->assertEquals(
                        'd',
                        IEUrlExtension::findIE6Extension( 'a?b?.exe?.d?.e' ),
@@ -84,7 +84,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testExeException2() {
+       public function testExeException2() {
                $this->assertEquals(
                        'exe',
                        IEUrlExtension::findIE6Extension( 'a?b?.exe' ),
@@ -92,7 +92,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testHash() {
+       public function testHash() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( 'a#b.c' ),
@@ -100,7 +100,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testHash2() {
+       public function testHash2() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( 'a?#b.c' ),
@@ -108,7 +108,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testDotAtEnd() {
+       public function testDotAtEnd() {
                $this->assertEquals(
                        '',
                        IEUrlExtension::findIE6Extension( '.' ),
@@ -116,7 +116,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
                );
        }
 
-       function testTwoDots() {
+       public function testTwoDots() {
                $this->assertEquals(
                        'z',
                        IEUrlExtension::findIE6Extension( 'x.y.z' ),
index eb64a64..ab72e36 100644 (file)
@@ -119,7 +119,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideCases
         */
-       function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
+       public function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
                $minified = JavaScriptMinifier::minify( $code );
 
                // JSMin+'s parser will throw an exception if output is not valid JS.
@@ -153,7 +153,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBug32548
         */
-       function testBug32548Exponent( $num ) {
+       public function testBug32548Exponent( $num ) {
                // Long line breaking was being incorrectly done between the base and
                // exponent part of a number, causing a syntax error. The line should
                // instead break at the start of the number.
index 43792c1..a0e63a8 100644 (file)
@@ -16,6 +16,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * Basically the file has IPTC and XMP metadata, the
         * IPTC should override the XMP, except for the multilingual
         * translation (to en) where XMP should win.
+        * @covers BitmapMetadataHandler::Jpeg
         */
        public function testMultilingualCascade() {
                if ( !extension_loaded( 'exif' ) ) {
@@ -48,6 +49,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         *
         * There's more extensive tests of comment extraction in
         * JpegMetadataExtractorTests.php
+        * @covers BitmapMetadataHandler::Jpeg
         */
        public function testJpegComment() {
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -60,6 +62,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
        /**
         * Make sure a bad iptc block doesn't stop the other metadata
         * from being extracted.
+        * @covers BitmapMetadataHandler::Jpeg
         */
        public function testBadIPTC() {
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -67,6 +70,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
        }
 
+       /**
+        * @covers BitmapMetadataHandler::Jpeg
+        */
        public function testIPTCDates() {
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
                        'iptc-timetest.jpg' );
@@ -78,6 +84,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
        /**
         * File has an invalid time (+ one valid but really weird time)
         * that shouldn't be included
+        * @covers BitmapMetadataHandler::Jpeg
         */
        public function testIPTCDatesInvalid() {
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -91,6 +98,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * XMP data should take priority over iptc data
         * when hash has been updated, but not when
         * the hash is wrong.
+        * @covers BitmapMetadataHandler::addMetadata
+        * @covers BitmapMetadataHandler::getMetadataArray
         */
        public function testMerging() {
                $merger = new BitmapMetadataHandler();
@@ -114,6 +123,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
+       /**
+        * @covers BitmapMetadataHandler::png
+        */
        public function testPNGXMP() {
                if ( !extension_loaded( 'xml' ) ) {
                        $this->markTestSkipped( "This test needs the xml extension." );
@@ -134,6 +146,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result );
        }
 
+       /**
+        * @covers BitmapMetadataHandler::png
+        */
        public function testPNGNative() {
                $handler = new BitmapMetadataHandler();
                $result = $handler->png( $this->filePath . 'Png-native-test.png' );
@@ -141,6 +156,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] );
        }
 
+       /**
+        * @covers BitmapMetadataHandler::getTiffByteOrder
+        */
        public function testTiffByteOrder() {
                $handler = new BitmapMetadataHandler();
                $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
index c4706bf..9395b66 100644 (file)
@@ -13,8 +13,9 @@ class BitmapScalingTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideNormaliseParams
+        * @covers BitmapHandler::normaliseParams
         */
-       function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
+       public function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
                $file = new FakeDimensionFile( $fileDimensions );
                $handler = new BitmapHandler;
                $valid = $handler->normaliseParams( $file, $params );
@@ -102,7 +103,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
                );
        }
 
-       function testTooBigImage() {
+       /**
+        * @covers BitmapHandler::doTransform
+        */
+       public function testTooBigImage() {
                $file = new FakeDimensionFile( array( 4000, 4000 ) );
                $handler = new BitmapHandler;
                $params = array( 'width' => '3700' ); // Still bigger than max size.
@@ -110,7 +114,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
-       function testTooBigMustRenderImage() {
+       /**
+        * @covers BitmapHandler::doTransform
+        */
+       public function testTooBigMustRenderImage() {
                $file = new FakeDimensionFile( array( 4000, 4000 ) );
                $file->mustRender = true;
                $handler = new BitmapHandler;
@@ -119,36 +126,12 @@ class BitmapScalingTest extends MediaWikiTestCase {
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
-       function testImageArea() {
+       /**
+        * @covers BitmapHandler::getImageArea
+        */
+       public function testImageArea() {
                $file = new FakeDimensionFile( array( 7, 9 ) );
                $handler = new BitmapHandler;
                $this->assertEquals( 63, $handler->getImageArea( $file ) );
        }
 }
-
-class FakeDimensionFile extends File {
-       public $mustRender = false;
-
-       public function __construct( $dimensions ) {
-               parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
-                       new NullRepo( null ) );
-
-               $this->dimensions = $dimensions;
-       }
-
-       public function getWidth( $page = 1 ) {
-               return $this->dimensions[0];
-       }
-
-       public function getHeight( $page = 1 ) {
-               return $this->dimensions[1];
-       }
-
-       public function mustRender() {
-               return $this->mustRender;
-       }
-
-       public function getPath() {
-               return '';
-       }
-}
index 532182c..a2e0eb6 100644 (file)
@@ -2,6 +2,11 @@
 
 class ExifBitmapTest extends MediaWikiTestCase {
 
+       /**
+        * @var ExifBitmapHandler
+        */
+       protected $handler;
+
        protected function setUp() {
                parent::setUp();
                if ( !extension_loaded( 'exif' ) ) {
@@ -14,42 +19,62 @@ class ExifBitmapTest extends MediaWikiTestCase {
 
        }
 
+       /**
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testIsOldBroken() {
                $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
 
+       /**
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testIsBrokenFile() {
                $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
 
+       /**
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testIsInvalid() {
                $res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
                $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
        }
 
+       /**
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testGoodMetadata() {
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
 
+       /**
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testIsOldGood() {
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
 
-       // Handle metadata from paged tiff handler (gotten via instant commons)
-       // gracefully.
+       /**
+        * Handle metadata from paged tiff handler (gotten via instant commons) gracefully.
+        * @covers ExifBitmapHandler::isMetadataValid
+        */
        public function testPagedTiffHandledGracefully() {
                $meta = 'a:6:{s:9:"page_data";a:1:{i:1;a:5:{s:5:"width";i:643;s:6:"height";i:448;s:5:"alpha";s:4:"true";s:4:"page";i:1;s:6:"pixels";i:288064;}}s:10:"page_count";i:1;s:10:"first_page";i:1;s:9:"last_page";i:1;s:4:"exif";a:9:{s:10:"ImageWidth";i:643;s:11:"ImageLength";i:448;s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:4;s:12:"RowsPerStrip";i:50;s:19:"PlanarConfiguration";i:1;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}s:21:"TIFF_METADATA_VERSION";s:3:"1.4";}';
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
        }
 
-       function testConvertMetadataLatest() {
+       /**
+        * @covers ExifBitmapHandler::convertMetadataVersion
+        */
+       public function testConvertMetadataLatest() {
                $metadata = array(
                        'foo' => array( 'First', 'Second', '_type' => 'ol' ),
                        'MEDIAWIKI_EXIF_VERSION' => 2
@@ -58,7 +83,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $this->assertEquals( $metadata, $res );
        }
 
-       function testConvertMetadataToOld() {
+       /**
+        * @covers ExifBitmapHandler::convertMetadataVersion
+        */
+       public function testConvertMetadataToOld() {
                $metadata = array(
                        'foo' => array( 'First', 'Second', '_type' => 'ol' ),
                        'bar' => array( 'First', 'Second', '_type' => 'ul' ),
@@ -77,7 +105,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $res );
        }
 
-       function testConvertMetadataSoftware() {
+       /**
+        * @covers ExifBitmapHandler::convertMetadataVersion
+        */
+       public function testConvertMetadataSoftware() {
                $metadata = array(
                        'Software' => array( array( 'GIMP', '1.1' ) ),
                        'MEDIAWIKI_EXIF_VERSION' => 2,
@@ -90,7 +121,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $res );
        }
 
-       function testConvertMetadataSoftwareNormal() {
+       /**
+        * @covers ExifBitmapHandler::convertMetadataVersion
+        */
+       public function testConvertMetadataSoftwareNormal() {
                $metadata = array(
                        'Software' => array( "GIMP 1.2", "vim" ),
                        'MEDIAWIKI_EXIF_VERSION' => 2,
index c16de8b..64276d9 100644 (file)
@@ -3,6 +3,8 @@
  * Tests related to auto rotation.
  *
  * @group medium
+ *
+ * @todo covers tags
  */
 class ExifRotationTest extends MediaWikiTestCase {
 
@@ -34,10 +36,9 @@ class ExifRotationTest extends MediaWikiTestCase {
        }
 
        /**
-        *
         * @dataProvider provideFiles
         */
-       function testMetadata( $name, $type, $info ) {
+       public function testMetadata( $name, $type, $info ) {
                if ( !BitmapHandler::canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
@@ -50,7 +51,7 @@ class ExifRotationTest extends MediaWikiTestCase {
         *
         * @dataProvider provideFiles
         */
-       function testRotationRendering( $name, $type, $info, $thumbs ) {
+       public function testRotationRendering( $name, $type, $info, $thumbs ) {
                if ( !BitmapHandler::canRotate() ) {
                        $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
                }
@@ -129,7 +130,7 @@ class ExifRotationTest extends MediaWikiTestCase {
         * Same as before, but with auto-rotation disabled.
         * @dataProvider provideFilesNoAutoRotate
         */
-       function testMetadataNoAutoRotate( $name, $type, $info ) {
+       public function testMetadataNoAutoRotate( $name, $type, $info ) {
                $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                $file = $this->dataFile( $name, $type );
@@ -141,7 +142,7 @@ class ExifRotationTest extends MediaWikiTestCase {
         *
         * @dataProvider provideFilesNoAutoRotate
         */
-       function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
+       public function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
                $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                foreach ( $thumbs as $size => $out ) {
@@ -216,7 +217,7 @@ class ExifRotationTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBitmapExtractPreRotationDimensions
         */
-       function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
+       public function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
                $result = $this->handler->extractPreRotationDimensions( array(
                        'physicalWidth' => self::TEST_WIDTH,
                        'physicalHeight' => self::TEST_HEIGHT,
index b84ed56..dea36b0 100644 (file)
@@ -1,6 +1,9 @@
 <?php
 class ExifTest extends MediaWikiTestCase {
 
+       /** @var string */
+       protected $mediaPath;
+
        protected function setUp() {
                parent::setUp();
                if ( !extension_loaded( 'exif' ) ) {
diff --git a/tests/phpunit/includes/media/FakeDimensionFile.php b/tests/phpunit/includes/media/FakeDimensionFile.php
new file mode 100644 (file)
index 0000000..7926000
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class FakeDimensionFile extends File {
+       public $mustRender = false;
+
+       public function __construct( $dimensions ) {
+               parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
+                       new NullRepo( null ) );
+
+               $this->dimensions = $dimensions;
+       }
+
+       public function getWidth( $page = 1 ) {
+               return $this->dimensions[0];
+       }
+
+       public function getHeight( $page = 1 ) {
+               return $this->dimensions[1];
+       }
+
+       public function mustRender() {
+               return $this->mustRender;
+       }
+
+       public function getPath() {
+               return '';
+       }
+}
\ No newline at end of file
index bee0906..a8e420f 100644 (file)
@@ -1,6 +1,12 @@
 <?php
+
 class FormatMetadataTest extends MediaWikiTestCase {
 
+       /** @var FSFileBackend */
+       protected $backend;
+       /** @var FSRepo */
+       protected $repo;
+
        protected function setUp() {
                parent::setUp();
 
@@ -22,6 +28,9 @@ class FormatMetadataTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
+       /**
+        * @covers File::formatMetadata
+        */
        public function testInvalidDate() {
                $file = $this->dataFile( 'broken_exif_date.jpg', 'image/jpeg' );
 
index 86cf346..9e3f924 100644 (file)
@@ -12,6 +12,7 @@ class GIFMetadataExtractorTest extends MediaWikiTestCase {
         * @param $filename String
         * @param $expected Array The extracted metadata.
         * @dataProvider provideGetMetadata
+        * @covers GIFMetadataExtractor::getMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $actual = GIFMetadataExtractor::getMetadata( $this->mediaPath . $filename );
index 7ea6b7e..c8e729c 100644 (file)
@@ -1,6 +1,15 @@
 <?php
 class GIFHandlerTest extends MediaWikiTestCase {
 
+       /** @var FSFileBackend */
+       protected $backend;
+       /** @var GIFHandler */
+       protected $handler;
+       /** @var FSRepo */
+       protected $repo;
+       /** @var string */
+       protected $filePath;
+
        protected function setUp() {
                parent::setUp();
 
@@ -18,6 +27,9 @@ class GIFHandlerTest extends MediaWikiTestCase {
                $this->handler = new GIFHandler();
        }
 
+       /**
+        * @covers GIFHandler::getMetadata
+        */
        public function testInvalidFile() {
                $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
                $this->assertEquals( GIFHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
         * @param $filename String basename of the file to check
         * @param $expected boolean Expected result.
         * @dataProvider provideIsAnimated
+        * @covers GIFHandler::isAnimatedImage
         */
        public function testIsAnimanted( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
@@ -45,6 +58,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
         * @param $filename String
         * @param $expected Integer Total image area
         * @dataProvider provideGetImageArea
+        * @covers GIFHandler::getImageArea
         */
        public function testGetImageArea( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
@@ -63,6 +77,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
         * @param $metadata String Serialized metadata
         * @param $expected Integer One of the class constants of GIFHandler
         * @dataProvider provideIsMetadataValid
+        * @covers GIFHandler::isMetadataValid
         */
        public function testIsMetadataValid( $metadata, $expected ) {
                $actual = $this->handler->isMetadataValid( null, $metadata );
@@ -83,6 +98,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
         * @param $filename String
         * @param $expected String Serialized array
         * @dataProvider provideGetMetadata
+        * @covers GIFHandler::getMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
index 81a58dd..81c1d28 100644 (file)
@@ -1,11 +1,19 @@
 <?php
+
 class IPTCTest extends MediaWikiTestCase {
+
+       /**
+        * @covers IPTC::getCharset
+        */
        public function testRecognizeUtf8() {
                // utf-8 is the only one used in practise.
                $res = IPTC::getCharset( "\x1b%G" );
                $this->assertEquals( 'UTF-8', $res );
        }
 
+       /**
+        * @covers IPTC::Parse
+        */
        public function testIPTCParseNoCharset88591() {
                // basically IPTC for keyword with value of 0xBC which is 1/4 in iso-8859-1
                // This data doesn't specify a charset. We're supposed to guess
@@ -15,17 +23,22 @@ class IPTCTest extends MediaWikiTestCase {
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
 
-       /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
-       /* \xC3 = Ã, \xB8 = ¸  */
+       /**
+        * @covers IPTC::Parse
+        */
        public function testIPTCParseNoCharset88591b() {
+               /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
+               /* \xC3 = Ã, \xB8 = ¸  */
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x09\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8";
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( 'ÃÃø' ), $res['Keywords'] );
        }
 
-       /* Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
+       /**
+        * Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
         * What should happen is the first "\xC3\xC3" should be dropped as invalid,
         * leaving \xC3\xB8, which is ø
+        * @covers IPTC::Parse
         */
        public function testIPTCParseForcedUTFButInvalid() {
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
@@ -34,13 +47,19 @@ class IPTCTest extends MediaWikiTestCase {
                $this->assertEquals( array( 'ø' ), $res['Keywords'] );
        }
 
+       /**
+        * @covers IPTC::Parse
+        */
        public function testIPTCParseNoCharsetUTF8() {
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x07\x1c\x02\x19\x00\x02¼";
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
 
-       // Testing something that has 2 values for keyword
+       /**
+        * Testing something that has 2 values for keyword
+        * @covers IPTC::Parse
+        */
        public function testIPTCParseMulti() {
                $iptcData = /* identifier */ "Photoshop 3.0\08BIM\4\4"
                        /* length */ . "\0\0\0\0\0\x0D"
@@ -50,6 +69,9 @@ class IPTCTest extends MediaWikiTestCase {
                $this->assertEquals( array( '¼', '¼½' ), $res['Keywords'] );
        }
 
+       /**
+        * @covers IPTC::Parse
+        */
        public function testIPTCParseUTF8() {
                // This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
index cae7137..6d1d681 100644 (file)
@@ -5,9 +5,13 @@
  * serve as a very good "test". (Adobe photoshop probably creates such files
  * but it costs money). The implementation of it currently in MediaWiki is based
  * solely on reading the standard, without any real world test files.
+ *
+ * @covers JpegMetadataExtractor
  */
 class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
+       protected $filePath;
+
        protected function setUp() {
                parent::setUp();
 
@@ -18,7 +22,7 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
         * We also use this test to test padding bytes don't
         * screw stuff up
         *
-        * @param $file filename
+        * @param string $file filename
         *
         * @dataProvider provideUtf8Comment
         */
index 7775c41..ce956ba 100644 (file)
@@ -1,6 +1,11 @@
 <?php
+/**
+ * @covers JpegHandler
+ */
 class JpegTest extends MediaWikiTestCase {
 
+       protected $filePath;
+
        protected function setUp() {
                parent::setUp();
                if ( !extension_loaded( 'exif' ) ) {
index 4e4c649..c28898b 100644 (file)
@@ -1,7 +1,12 @@
 <?php
 
 class MediaHandlerTest extends MediaWikiTestCase {
-       function testFitBoxWidth() {
+
+       /**
+        * @covers MediaHandler::fitBoxWidth
+        * @todo split into a dataprovider and test method
+        */
+       public function testFitBoxWidth() {
                $vals = array(
                        array(
                                'width' => 50,
index 58d791f..33a03a2 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @covers PNGMetadataExtractor
+ */
 class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
        protected function setUp() {
@@ -9,7 +13,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
        /**
         * Tests zTXt tag (compressed textual metadata)
         */
-       function testPngNativetZtxt() {
+       public function testPngNativetZtxt() {
                $this->checkPHPExtension( 'zlib' );
 
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
@@ -26,7 +30,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
        /**
         * Test tEXt tag (Uncompressed textual metadata)
         */
-       function testPngNativeText() {
+       public function testPngNativeText() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
                $expected = "Some long image desc";
@@ -43,7 +47,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
         * tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
         * Make sure non-ascii characters get converted properly
         */
-       function testPngNativeTextNonAscii() {
+       public function testPngNativeTextNonAscii() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
@@ -65,7 +69,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
         * actual resolution of the image is (aka in dots per meter).
         */
        /*
-       function testPngPhysTag() {
+       public function testPngPhysTag() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
@@ -81,7 +85,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
        /**
         * Given a normal static PNG, check the animation metadata returned.
         */
-       function testStaticPngAnimationMetadata() {
+       public function testStaticPngAnimationMetadata() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
@@ -94,7 +98,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
         * Given an animated APNG image file
         * check it gets animated metadata right.
         */
-       function testApngAnimationMetadata() {
+       public function testApngAnimationMetadata() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Animated_PNG_example_bouncing_beach_ball.png' );
 
@@ -104,46 +108,46 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
        }
 
-       function testPngBitDepth8() {
+       public function testPngBitDepth8() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
                $this->assertEquals( 8, $meta['bitDepth'] );
        }
 
-       function testPngBitDepth1() {
+       public function testPngBitDepth1() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        '1bit-png.png' );
                $this->assertEquals( 1, $meta['bitDepth'] );
        }
 
 
-       function testPngIndexColour() {
+       public function testPngIndexColour() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
                $this->assertEquals( 'index-coloured', $meta['colorType'] );
        }
 
-       function testPngRgbColour() {
+       public function testPngRgbColour() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'rgb-png.png' );
                $this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
        }
 
-       function testPngRgbNoAlphaColour() {
+       public function testPngRgbNoAlphaColour() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'rgb-na-png.png' );
                $this->assertEquals( 'truecolour', $meta['colorType'] );
        }
 
-       function testPngGreyscaleColour() {
+       public function testPngGreyscaleColour() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'greyscale-png.png' );
                $this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
        }
 
-       function testPngGreyscaleNoAlphaColour() {
+       public function testPngGreyscaleNoAlphaColour() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'greyscale-na-png.png' );
                $this->assertEquals( 'greyscale', $meta['colorType'] );
index 855780d..ad4c249 100644 (file)
@@ -1,6 +1,15 @@
 <?php
 class PNGHandlerTest extends MediaWikiTestCase {
 
+       /** @var PNGHandler */
+       protected $handler;
+       /** @var FSRepo */
+       protected $repo;
+       /** @var FSFileBackend */
+       protected $backend;
+       /** @var string */
+       protected $filePath;
+
        protected function setUp() {
                parent::setUp();
 
@@ -18,6 +27,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
                $this->handler = new PNGHandler();
        }
 
+       /**
+        * @covers PNGHandler::getMetadata
+        */
        public function testInvalidFile() {
                $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
                $this->assertEquals( PNGHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
         * @param $filename String basename of the file to check
         * @param $expected boolean Expected result.
         * @dataProvider provideIsAnimated
+        * @covers PNGHandler::isAnimatedImage
         */
        public function testIsAnimanted( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
@@ -45,6 +58,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
         * @param $filename String
         * @param $expected Integer Total image area
         * @dataProvider provideGetImageArea
+        * @covers PNGHandler::getImageArea
         */
        public function testGetImageArea( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
@@ -65,6 +79,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
         * @param $metadata String Serialized metadata
         * @param $expected Integer One of the class constants of PNGHandler
         * @dataProvider provideIsMetadataValid
+        * @covers PNGHandler::isMetadataValid
         */
        public function testIsMetadataValid( $metadata, $expected ) {
                $actual = $this->handler->isMetadataValid( null, $metadata );
@@ -85,6 +100,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
         * @param $filename String
         * @param $expected String Serialized array
         * @dataProvider provideGetMetadata
+        * @covers PNGHandler::getMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
index 3bf9c59..5dd7b24 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers SVGMetadataExtractor
+ */
 class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
        protected function setUp() {
@@ -10,14 +13,14 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideSvgFiles
         */
-       function testGetMetadata( $infile, $expected ) {
+       public function testGetMetadata( $infile, $expected ) {
                $this->assertMetadata( $infile, $expected );
        }
 
        /**
         * @dataProvider provideSvgFilesWithXMLMetadata
         */
-       function testGetXMLMetadata( $infile, $expected ) {
+       public function testGetXMLMetadata( $infile, $expected ) {
                $r = new XMLReader();
                if ( !method_exists( $r, 'readInnerXML' ) ) {
                        $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
index 1ec34d5..8d74b98 100644 (file)
@@ -1,6 +1,11 @@
 <?php
 class TiffTest extends MediaWikiTestCase {
 
+       /** @var TiffHandler */
+       protected $handler;
+       /** @var string */
+       protected $filePath;
+
        protected function setUp() {
                parent::setUp();
                if ( !extension_loaded( 'exif' ) ) {
@@ -13,11 +18,17 @@ class TiffTest extends MediaWikiTestCase {
                $this->handler = new TiffHandler;
        }
 
+       /**
+        * @covers TiffHandler::getMetadata
+        */
        public function testInvalidFile() {
                $res = $this->handler->getMetadata( null, $this->filePath . 'README' );
                $this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
        }
 
+       /**
+        * @covers TiffHandler::getMetadata
+        */
        public function testTiffMetadataExtraction() {
                $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
                $expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
index aa0cdd2..9ec5796 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @todo covers tags
+ */
 class XMPTest extends MediaWikiTestCase {
 
        protected function setUp() {
@@ -15,7 +19,10 @@ class XMPTest extends MediaWikiTestCase {
         * @param $expected Array expected result of parsing the xmp.
         * @param $info String Short sentence on what's being tested.
         *
+        * @throws Exception
         * @dataProvider provideXMPParse
+        *
+        * @covers XMPReader::parse
         */
        public function testXMPParse( $xmp, $expected, $info ) {
                if ( !is_string( $xmp ) || !is_array( $expected ) ) {
@@ -74,8 +81,10 @@ class XMPTest extends MediaWikiTestCase {
         *
         * @todo This is based on what the standard says. Need to find a real
         * world example file to double check the support for this is right.
+        *
+        * @covers XMPReader::parseExtended
         */
-       function testExtendedXMP() {
+       public function testExtendedXMP() {
                $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -104,8 +113,10 @@ class XMPTest extends MediaWikiTestCase {
        /**
         * This test has an extended XMP block with a wrong guid (md5sum)
         * and thus should only return the StandardXMP, not the ExtendedXMP.
+        *
+        * @covers XMPReader::parseExtended
         */
-       function testExtendedXMPWithWrongGUID() {
+       public function testExtendedXMPWithWrongGUID() {
                $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -133,8 +144,10 @@ class XMPTest extends MediaWikiTestCase {
        /**
         * Have a high offset to simulate a missing packet,
         * which should cause it to ignore the ExtendedXMP packet.
+        *
+        * @covers XMPReader::parseExtended
         */
-       function testExtendedXMPMissingPacket() {
+       public function testExtendedXMPMissingPacket() {
                $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
index 257c40a..96bf5e4 100644 (file)
@@ -3,8 +3,9 @@ class XMPValidateTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideDates
+        * @covers XMPValidate::validateDate
         */
-       function testValidateDate( $value, $expected ) {
+       public function testValidateDate( $value, $expected ) {
                // The method should modify $value.
                XMPValidate::validateDate( array(), $value, true );
                $this->assertEquals( $expected, $value );
index 68efd86..52dd2ef 100644 (file)
  */
 class CleanUpTest extends MediaWikiTestCase {
        /** @todo document */
-       function testAscii() {
+       public function testAscii() {
                $text = 'This is plain ASCII text.';
                $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
        }
 
        /** @todo document */
-       function testNull() {
+       public function testNull() {
                $text = "a \x00 null";
                $expect = "a \xef\xbf\xbd null";
                $this->assertEquals(
@@ -52,13 +52,13 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testLatin() {
+       public function testLatin() {
                $text = "L'\xc3\xa9cole";
                $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
        }
 
        /** @todo document */
-       function testLatinNormal() {
+       public function testLatinNormal() {
                $text = "L'e\xcc\x81cole";
                $expect = "L'\xc3\xa9cole";
                $this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
@@ -105,7 +105,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testAllBytes() {
+       public function testAllBytes() {
                $this->doTestBytes( '', '' );
                $this->doTestBytes( 'x', '' );
                $this->doTestBytes( '', 'x' );
@@ -145,7 +145,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testDoubleBytes() {
+       public function testDoubleBytes() {
                $this->doTestDoubleBytes( '', '' );
                $this->doTestDoubleBytes( 'x', '' );
                $this->doTestDoubleBytes( '', 'x' );
@@ -198,7 +198,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testTripleBytes() {
+       public function testTripleBytes() {
                $this->doTestTripleBytes( '', '' );
                $this->doTestTripleBytes( 'x', '' );
                $this->doTestTripleBytes( '', 'x' );
@@ -276,7 +276,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testChunkRegression() {
+       public function testChunkRegression() {
                # Check for regression against a chunking bug
                $text = "\x46\x55\xb8" .
                        "\xdc\x96" .
@@ -299,7 +299,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testInterposeRegression() {
+       public function testInterposeRegression() {
                $text = "\x4e\x30" .
                        "\xb1" . # bad tail
                        "\x3a" .
@@ -334,7 +334,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testOverlongRegression() {
+       public function testOverlongRegression() {
                $text = "\x67" .
                        "\x1a" . # forbidden ascii
                        "\xea" . # bad head
@@ -359,7 +359,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testSurrogateRegression() {
+       public function testSurrogateRegression() {
                $text = "\xed\xb4\x96" . # surrogate 0xDD16
                        "\x83" . # bad tail
                        "\xb4" . # bad tail
@@ -374,7 +374,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testBomRegression() {
+       public function testBomRegression() {
                $text = "\xef\xbf\xbe" . # U+FFFE, illegal char
                        "\xb2" . # bad tail
                        "\xef" . # bad head
@@ -389,7 +389,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testForbiddenRegression() {
+       public function testForbiddenRegression() {
                $text = "\xef\xbf\xbf"; # U+FFFF, illegal char
                $expect = "\xef\xbf\xbd";
                $this->assertEquals(
@@ -398,7 +398,7 @@ class CleanUpTest extends MediaWikiTestCase {
        }
 
        /** @todo document */
-       function testHangulRegression() {
+       public function testHangulRegression() {
                $text = "\xed\x9c\xaf" . # Hangul char
                        "\xe1\x87\x81"; # followed by another final jamo
                $expect = $text; # Should *not* change.
index be603e5..aa78394 100644 (file)
@@ -118,6 +118,18 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->assertEquals( $this->cache->get( $key ), $value );
        }
 
+       /**
+        * @covers BagOStuff::incr
+        */
+       public function testIncr() {
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, 0 );
+               $this->cache->incr( $key );
+               $expectedValue = 1;
+               $actualValue = $this->cache->get( $key );
+               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+       }
+
        public function testGetMulti() {
                $value1 = array( 'this' => 'is', 'a' => 'test' );
                $value2 = array( 'this' => 'is', 'another' => 'test' );
index 263df5f..c2c97c0 100644 (file)
@@ -9,11 +9,13 @@
  * @author Antoine Musso
  * @copyright Copyright © 2011, Antoine Musso
  * @file
+ * @todo covers tags
  */
 
-/** */
 class MagicVariableTest extends MediaWikiTestCase {
-       /** Will contains a parser object*/
+       /**
+        * @var Parser
+        */
        private $testParser = null;
 
        /**
@@ -51,11 +53,31 @@ class MagicVariableTest extends MediaWikiTestCase {
                $this->testParser->setTitle( $title );
        }
 
-       /** destroy parser (TODO: is it really neded?)*/
-       protected function tearDown() {
-               unset( $this->testParser );
+       /**
+        * @param int $num upper limit for numbers
+        * @return array of numbers from 1 up to $num
+        */
+       private static function createProviderUpTo( $num ) {
+               $ret = array();
+               for ( $i = 1; $i <= $num; $i++ ) {
+                       $ret[] = array( $i );
+               }
+
+               return $ret;
+       }
+
+       /**
+        * @return array of months numbers (as an integer)
+        */
+       public static function provideMonths() {
+               return self::createProviderUpTo( 12 );
+       }
 
-               parent::tearDown();
+       /**
+        * @return array of days numbers (as an integer)
+        */
+       public static function provideDays() {
+               return self::createProviderUpTo( 31 );
        }
 
        ############### TESTS #############################################
@@ -65,70 +87,69 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        # day
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testCurrentdayIsUnPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testCurrentdayIsUnPadded( $day ) {
                $this->assertUnPadded( 'currentday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testCurrentdaytwoIsZeroPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testCurrentdaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'currentday2', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testLocaldayIsUnPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testLocaldayIsUnPadded( $day ) {
                $this->assertUnPadded( 'localday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testLocaldaytwoIsZeroPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testLocaldaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'localday2', $day );
        }
 
        # month
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testCurrentmonthIsZeroPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testCurrentmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'currentmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testCurrentmonthoneIsUnPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testCurrentmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'currentmonth1', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testLocalmonthIsZeroPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testLocalmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'localmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testLocalmonthoneIsUnPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testLocalmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'localmonth1', $month );
        }
 
-
        # revision day
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testRevisiondayIsUnPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testRevisiondayIsUnPadded( $day ) {
                $this->assertUnPadded( 'revisionday', $day );
        }
 
-       /** @dataProvider MediaWikiProvide::Days */
-       function testRevisiondaytwoIsZeroPadded( $day ) {
+       /** @dataProvider provideDays */
+       public function testRevisiondaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'revisionday2', $day );
        }
 
        # revision month
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testRevisionmonthIsZeroPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testRevisionmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'revisionmonth', $month );
        }
 
-       /** @dataProvider MediaWikiProvide::Months */
-       function testRevisionmonthoneIsUnPadded( $month ) {
+       /** @dataProvider provideMonths */
+       public function testRevisionmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'revisionmonth1', $month );
        }
 
@@ -136,15 +157,15 @@ class MagicVariableTest extends MediaWikiTestCase {
         * Rough tests for {{SERVERNAME}} magic word
         * Bug 31176
         * @group Database
-        * @dataProvider dataServernameFromDifferentProtocols
+        * @dataProvider provideDataServernameFromDifferentProtocols
         */
-       function testServernameFromDifferentProtocols( $server ) {
+       public function testServernameFromDifferentProtocols( $server ) {
                $this->setMwGlobals( 'wgServer', $server );
 
                $this->assertMagic( 'localhost', 'servername' );
        }
 
-       function dataServernameFromDifferentProtocols() {
+       public static function provideDataServernameFromDifferentProtocols() {
                return array(
                        array( 'http://localhost/' ),
                        array( 'https://localhost/' ),
@@ -155,12 +176,12 @@ class MagicVariableTest extends MediaWikiTestCase {
        ############### HELPERS ############################################
 
        /** assertion helper expecting a magic output which is zero padded */
-       PUBLIC function assertZeroPadded( $magic, $value ) {
+       public function assertZeroPadded( $magic, $value ) {
                $this->assertMagicPadding( $magic, $value, '%02d' );
        }
 
        /** assertion helper expecting a magic output which is unpadded */
-       PUBLIC function assertUnPadded( $magic, $value ) {
+       public function assertUnPadded( $magic, $value ) {
                $this->assertMagicPadding( $magic, $value, '%d' );
        }
 
index dc1cb0d..eac4de5 100644 (file)
@@ -6,6 +6,8 @@
  * @group Database
  * @group Parser
  * @group Stub
+ *
+ * @todo covers tags
  */
 class NewParserTest extends MediaWikiTestCase {
        static protected $articles = array(); // Array of test articles defined by the tests
@@ -671,7 +673,7 @@ class NewParserTest extends MediaWikiTestCase {
         *
         * @group ParserFuzz
         */
-       function testFuzzTests() {
+       public function testFuzzTests() {
                global $wgParserTestFiles;
 
                $files = $wgParserTestFiles;
index 3cdbf15..e5c5cb2 100644 (file)
@@ -15,6 +15,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider providePreSaveTransform
+        * @covers Parser::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgParser;
@@ -28,6 +29,9 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       /**
+        * @covers Parser::callParserFunction
+        */
        public function testCallParserFunction() {
                global $wgParser;
 
@@ -45,6 +49,10 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                ), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
        }
 
+       /**
+        * @covers Parser::parse
+        * @covers ParserOutput::getSections
+        */
        public function testGetSections() {
                global $wgParser;
 
@@ -83,5 +91,5 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        ),
                ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
        }
-       // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+       //@Todo Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
index 68f77ab..c73666d 100644 (file)
@@ -2,7 +2,7 @@
 
 class ParserOutputTest extends MediaWikiTestCase {
 
-       function dataIsLinkInternal() {
+       public static function provideIsLinkInternal() {
                return array(
                        // Different domains
                        array( false, 'http://example.org', 'http://mediawiki.org' ),
@@ -29,13 +29,17 @@ class ParserOutputTest extends MediaWikiTestCase {
 
        /**
         * Test to make sure ParserOutput::isLinkInternal behaves properly
-        * @dataProvider dataIsLinkInternal
+        * @dataProvider provideIsLinkInternal
+        * @covers ParserOutput::isLinkInternal
         */
-       function testIsLinkInternal( $shouldMatch, $server, $url ) {
-
+       public function testIsLinkInternal( $shouldMatch, $server, $url ) {
                $this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
        }
 
+       /**
+        * @covers ParserOutput::setExtensionData
+        * @covers ParserOutput::getExtensionData
+        */
        public function testExtensionData() {
                $po = new ParserOutput();
 
index c609164..d12fee3 100644 (file)
@@ -4,8 +4,17 @@
  * @author Antoine Musso
  */
 class ParserPreloadTest extends MediaWikiTestCase {
+       /**
+        * @var Parser
+        */
        private $testParser;
+       /**
+        * @var ParserOptions
+        */
        private $testParserOptions;
+       /**
+        * @var Title
+        */
        private $title;
 
        protected function setUp() {
@@ -31,14 +40,14 @@ class ParserPreloadTest extends MediaWikiTestCase {
        /**
         * @covers Parser::getPreloadText
         */
-       function testPreloadSimpleText() {
+       public function testPreloadSimpleText() {
                $this->assertPreloaded( 'simple', 'simple' );
        }
 
        /**
         * @covers Parser::getPreloadText
         */
-       function testPreloadedPreIsUnstripped() {
+       public function testPreloadedPreIsUnstripped() {
                $this->assertPreloaded(
                        '<pre>monospaced</pre>',
                        '<pre>monospaced</pre>',
@@ -49,7 +58,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
        /**
         * @covers Parser::getPreloadText
         */
-       function testPreloadedNowikiIsUnstripped() {
+       public function testPreloadedNowikiIsUnstripped() {
                $this->assertPreloaded(
                        '<nowiki>[[Dummy title]]</nowiki>',
                        '<nowiki>[[Dummy title]]</nowiki>',
@@ -57,7 +66,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
                );
        }
 
-       function assertPreloaded( $expected, $text, $msg = '' ) {
+       protected function assertPreloaded( $expected, $text, $msg = '' ) {
                $this->assertEquals(
                        $expected,
                        $this->testParser->getPreloadText(
index 7e9c9d4..8aee937 100644 (file)
@@ -1,9 +1,16 @@
 <?php
 
 class PreprocessorTest extends MediaWikiTestCase {
-       var $mTitle = 'Page title';
-       var $mPPNodeCount = 0;
-       var $mOptions;
+       protected $mTitle = 'Page title';
+       protected $mPPNodeCount = 0;
+       /**
+        * @var ParserOptions
+        */
+       protected $mOptions;
+       /**
+        * @var Preprocessor
+        */
+       protected $mPreprocessor;
 
        protected function setUp() {
                global $wgParserConf, $wgContLang;
@@ -115,7 +122,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * @param string $wikiText
         * @return string
         */
-       function preprocessToXml( $wikiText ) {
+       protected function preprocessToXml( $wikiText ) {
                if ( method_exists( $this->mPreprocessor, 'preprocessToXml' ) ) {
                        return $this->normalizeXml( $this->mPreprocessor->preprocessToXml( $wikiText ) );
                }
@@ -134,14 +141,15 @@ class PreprocessorTest extends MediaWikiTestCase {
         * @param string $xml
         * @return string
         */
-       function normalizeXml( $xml ) {
+       protected function normalizeXml( $xml ) {
                return preg_replace( '!<([a-z]+)/>!', '<$1></$1>', str_replace( ' />', '/>', $xml ) );
        }
 
        /**
         * @dataProvider provideCases
+        * @covers Preprocessor_DOM::preprocessToXml
         */
-       function testPreprocessorOutput( $wikiText, $expectedXml ) {
+       public function testPreprocessorOutput( $wikiText, $expectedXml ) {
                $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
        }
 
@@ -160,8 +168,9 @@ class PreprocessorTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideFiles
+        * @covers Preprocessor_DOM::preprocessToXml
         */
-       function testPreprocessorOutputFiles( $filename ) {
+       public function testPreprocessorOutputFiles( $filename ) {
                $folder = __DIR__ . "/../../../parser/preprocess";
                $wikiText = file_get_contents( "$folder/$filename.txt" );
                $output = $this->preprocessToXml( $wikiText );
@@ -222,8 +231,9 @@ class PreprocessorTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideHeadings
+        * @covers Preprocessor_DOM::preprocessToXml
         */
-       function testHeadings( $wikiText, $expectedXml ) {
+       public function testHeadings( $wikiText, $expectedXml ) {
                $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
        }
 }
index ed60079..61cbe45 100644 (file)
@@ -21,7 +21,7 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideValidNames
         */
-       function testTagHooks( $tag ) {
+       public function testTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
@@ -36,7 +36,7 @@ class TagHookTest extends MediaWikiTestCase {
         * @dataProvider provideBadNames
         * @expectedException MWException
         */
-       function testBadTagHooks( $tag ) {
+       public function testBadTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
@@ -48,7 +48,7 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideValidNames
         */
-       function testFunctionTagHooks( $tag ) {
+       public function testFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
@@ -63,7 +63,7 @@ class TagHookTest extends MediaWikiTestCase {
         * @dataProvider provideBadNames
         * @expectedException MWException
         */
-       function testBadFunctionTagHooks( $tag ) {
+       public function testBadFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
index 8957a2f..8706703 100644 (file)
@@ -115,7 +115,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                return true;
        }
 
-       function testFullWidth() {
+       public function testFullWidth() {
                $this->assertEquals(
                        array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
                        $this->fetchIds( $this->search->searchText( 'AZ' ) ),
@@ -134,14 +134,14 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        "Search for normalized from Full-width Lower" );
        }
 
-       function testTextSearch() {
+       public function testTextSearch() {
                $this->assertEquals(
                        array( 'Smithee' ),
                        $this->fetchIds( $this->search->searchText( 'smithee' ) ),
                        "Plain search failed" );
        }
 
-       function testTextPowerSearch() {
+       public function testTextPowerSearch() {
                $this->search->setNamespaces( array( 0, 1, 4 ) );
                $this->assertEquals(
                        array(
@@ -152,7 +152,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        "Power search failed" );
        }
 
-       function testTitleSearch() {
+       public function testTitleSearch() {
                $this->assertEquals(
                        array(
                                'Alan Smithee',
@@ -162,7 +162,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        "Title search failed" );
        }
 
-       function testTextTitlePowerSearch() {
+       public function testTextTitlePowerSearch() {
                $this->search->setNamespaces( array( 0, 1, 4 ) );
                $this->assertEquals(
                        array(
index e947c34..2f4fd50 100644 (file)
@@ -30,7 +30,7 @@ class SearchUpdateTest extends MediaWikiTestCase {
                return trim( SearchUpdate::updateText( $text ) );
        }
 
-       function testUpdateText() {
+       public function testUpdateText() {
                $this->assertEquals(
                        'test',
                        $this->updateText( '<div>TeSt</div>' ),
@@ -62,7 +62,7 @@ EOT
                );
        }
 
-       function testBug32712() {
+       public function testBug32712() {
                $text = "text „http://example.com“ text";
                $result = $this->updateText( $text );
                $processed = preg_replace( '/Q/u', 'Q', $result );
index e0092a5..c5d52d3 100644 (file)
@@ -54,6 +54,7 @@ class MediaWikiSiteTest extends SiteTest {
 
        /**
         * @dataProvider fileUrlProvider
+        * @covers MediaWikiSite::getFileUrl
         */
        public function testGetFileUrl( $url, $filePath, $pathArgument, $expected ) {
                $site = new MediaWikiSite();
@@ -77,6 +78,7 @@ class MediaWikiSiteTest extends SiteTest {
 
        /**
         * @dataProvider provideGetPageUrl
+        * @covers MediaWikiSite::getPageUrl
         */
        public function testGetPageUrl( $path, $page, $expected ) {
                $site = new MediaWikiSite();
index bd2ae07..8af2fc1 100644 (file)
@@ -68,6 +68,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::isEmpty
         */
        public function testIsEmpty( SiteList $sites ) {
                $this->assertEquals( count( $sites ) === 0, $sites->isEmpty() );
@@ -76,6 +77,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::getSite
         */
        public function testGetSiteByGlobalId( SiteList $sites ) {
                if ( $sites->isEmpty() ) {
@@ -93,6 +95,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::getSiteByInternalId
         */
        public function testGetSiteByInternalId( $sites ) {
                /**
@@ -110,6 +113,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::hasSite
         */
        public function testHasGlobalId( $sites ) {
                $this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
@@ -128,6 +132,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::hasInternalId
         */
        public function testHasInternallId( $sites ) {
                /**
@@ -145,6 +150,7 @@ class SiteListTest extends MediaWikiTestCase {
        /**
         * @dataProvider siteListProvider
         * @param SiteList $sites
+        * @covers SiteList::getGlobalIdentifiers
         */
        public function testGetGlobalIdentifiers( SiteList $sites ) {
                $identifiers = $sites->getGlobalIdentifiers();
@@ -169,6 +175,8 @@ class SiteListTest extends MediaWikiTestCase {
         * @since 1.21
         *
         * @param SiteList $list
+        * @covers SiteList::getSerializationData
+        * @covers SiteList::unserialize
         */
        public function testSerialization( SiteList $list ) {
                $serialization = serialize( $list );
index cf652e9..6002c1a 100644 (file)
@@ -32,6 +32,9 @@
  */
 class SiteSQLStoreTest extends MediaWikiTestCase {
 
+       /**
+        * @covers SiteSQLStore::getSites
+        */
        public function testGetSites() {
                $expectedSites = TestSites::getSites();
                TestSites::insertIntoDb();
@@ -56,6 +59,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers SiteSQLStore::saveSites
+        */
        public function testSaveSites() {
                $store = SiteSQLStore::newInstance();
 
@@ -86,6 +92,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
                $this->assertTrue( $site->getInternalId() >= 0 );
        }
 
+       /**
+        * @covers SiteSQLStore::reset
+        */
        public function testReset() {
                $store1 = SiteSQLStore::newInstance();
                $store2 = SiteSQLStore::newInstance();
@@ -109,6 +118,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
                $this->assertNull( $site );
        }
 
+       /**
+        * @covers SiteSQLStore::clear
+        */
        public function testClear() {
                $store = SiteSQLStore::newInstance();
                $this->assertTrue( $store->clear() );
index b453e74..29c1ff3 100644 (file)
@@ -38,6 +38,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getInterwikiIds
         */
        public function testGetInterwikiIds( Site $site ) {
                $this->assertInternalType( 'array', $site->getInterwikiIds() );
@@ -46,6 +47,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getNavigationIds
         */
        public function testGetNavigationIds( Site $site ) {
                $this->assertInternalType( 'array', $site->getNavigationIds() );
@@ -54,6 +56,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::addNavigationId
         */
        public function testAddNavigationId( Site $site ) {
                $site->addNavigationId( 'foobar' );
@@ -63,6 +66,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::addInterwikiId
         */
        public function testAddInterwikiId( Site $site ) {
                $site->addInterwikiId( 'foobar' );
@@ -72,6 +76,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getLanguageCode
         */
        public function testGetLanguageCode( Site $site ) {
                $this->assertTypeOrValue( 'string', $site->getLanguageCode(), null );
@@ -80,6 +85,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::setLanguageCode
         */
        public function testSetLanguageCode( Site $site ) {
                $site->setLanguageCode( 'en' );
@@ -89,6 +95,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::normalizePageName
         */
        public function testNormalizePageName( Site $site ) {
                $this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
@@ -97,6 +104,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getGlobalId
         */
        public function testGetGlobalId( Site $site ) {
                $this->assertTypeOrValue( 'string', $site->getGlobalId(), null );
@@ -105,6 +113,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::setGlobalId
         */
        public function testSetGlobalId( Site $site ) {
                $site->setGlobalId( 'foobar' );
@@ -114,6 +123,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getType
         */
        public function testGetType( Site $site ) {
                $this->assertInternalType( 'string', $site->getType() );
@@ -122,6 +132,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getPath
         */
        public function testGetPath( Site $site ) {
                $this->assertTypeOrValue( 'string', $site->getPath( 'page_path' ), null );
@@ -132,6 +143,7 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::getAllPaths
         */
        public function testGetAllPaths( Site $site ) {
                $this->assertInternalType( 'array', $site->getAllPaths() );
@@ -140,6 +152,8 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::setPath
+        * @covers Site::removePath
         */
        public function testSetAndRemovePath( Site $site ) {
                $count = count( $site->getAllPaths() );
@@ -162,6 +176,9 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertNull( $site->getPath( 'spam' ) );
        }
 
+       /**
+        * @covers Site::setLinkPath
+        */
        public function testSetLinkPath() {
                $site = new Site();
                $path = "TestPath/$1";
@@ -170,6 +187,9 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertEquals( $path, $site->getLinkPath() );
        }
 
+       /**
+        * @covers Site::getLinkPathType
+        */
        public function testGetLinkPathType() {
                $site = new Site();
 
@@ -182,6 +202,9 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertEquals( $path, $site->getLinkPath() );
        }
 
+       /**
+        * @covers Site::setPath
+        */
        public function testSetPath() {
                $site = new Site();
 
@@ -191,6 +214,10 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertEquals( $path, $site->getPath( 'foo' ) );
        }
 
+       /**
+        * @covers Site::setPath
+        * @covers Site::getProtocol
+        */
        public function testProtocolRelativePath() {
                $site = new Site();
 
@@ -228,6 +255,7 @@ class SiteTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideGetPageUrl
+        * @covers Site::getPageUrl
         */
        public function testGetPageUrl( $path, $page, $expected ) {
                $site = new Site();
@@ -252,6 +280,8 @@ class SiteTest extends MediaWikiTestCase {
        /**
         * @dataProvider instanceProvider
         * @param Site $site
+        * @covers Site::serialize
+        * @covers Site::unserialize
         */
        public function testSerialization( Site $site ) {
                $this->assertInstanceOf( 'Serializable', $site );
index 3b82e07..a806b4a 100644 (file)
@@ -51,7 +51,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
         * Test SQL for each of our QueryPages objects
         * @group Database
         */
-       function testQuerypageSqlQuery() {
+       public function testQuerypageSqlQuery() {
                global $wgDBtype;
 
                foreach ( $this->queryPages as $page ) {
index c7a4828..6c637c6 100644 (file)
@@ -15,7 +15,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
         *
         * Test specifications by Alexandre "ialex" Emsenhuber.
         */
-       function testBug41337() {
+       public function testBug41337() {
 
                // Set a low limit
                $this->setMwGlobals( 'wgMaxSigChars', 2 );
index c737f05..17e883f 100644 (file)
@@ -18,7 +18,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
         * @param $expectedProfile An expected search profile name
         * @param $expectedNs Array Expected namespaces
         */
-       function testProfileAndNamespaceLoading(
+       public function testProfileAndNamespaceLoading(
                $requested, $userOptions, $expectedProfile, $expectedNS,
                $message = 'Profile name and namespaces mismatches!'
        ) {
@@ -112,7 +112,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
         * Verify we do not expand search term in <title> on search result page
         * https://gerrit.wikimedia.org/r/4841
         */
-       function testSearchTermIsNotExpanded() {
+       public function testSearchTermIsNotExpanded() {
 
                # Initialize [[Special::Search]]
                $search = new SpecialSearch();
index 298420b..982b46b 100644 (file)
@@ -1,10 +1,12 @@
 <?php
+
 /**
  * @group Upload
  */
 class UploadBaseTest extends MediaWikiTestCase {
-       protected $upload;
 
+       /** @var UploadTestHandler */
+       protected $upload;
 
        protected function setUp() {
                global $wgHooks;
@@ -30,6 +32,7 @@ class UploadBaseTest extends MediaWikiTestCase {
         * of UploadBase::getTitle() and then the actual returned title
         *
         * @dataProvider provideTestTitleValidation
+        * @covers UploadBase::getTitle
         */
        public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
                /* Check the result code */
@@ -82,6 +85,7 @@ class UploadBaseTest extends MediaWikiTestCase {
 
        /**
         * Test the upload verification functions
+        * @covers UploadBase::verifyUpload
         */
        public function testVerifyUpload() {
                /* Setup with zero file size */
@@ -108,7 +112,6 @@ class UploadBaseTest extends MediaWikiTestCase {
         *
         * This method should be abstracted so we can test different settings.
         */
-
        public function testMaxUploadSize() {
                global $wgMaxUploadSize;
                $savedGlobal = $wgMaxUploadSize; // save global
index fdf3347..a644f5e 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageAm.php */
 class LanguageAmTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index a623912..7b48f23 100644 (file)
@@ -6,7 +6,11 @@
 
 /** Tests for MediaWiki languages/LanguageAr.php */
 class LanguageArTest extends LanguageClassesTestCase {
-       function testFormatNum() {
+       /**
+        * @covers Language::formatNum
+        * @todo split into a test and a dataprovider
+        */
+       public function testFormatNum() {
                $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
                $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
        }
@@ -14,8 +18,9 @@ class LanguageArTest extends LanguageClassesTestCase {
        /**
         * Mostly to test the raw ascii feature.
         * @dataProvider providerSprintfDate
+        * @covers Language::sprintfDate
         */
-       function testSprintfDate( $format, $date, $expected ) {
+       public function testSprintfDate( $format, $date, $expected ) {
                $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
        }
 
@@ -44,14 +49,20 @@ class LanguageArTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index a88356a..7bd586a 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageBe.php */
 class LanguageBeTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 3fcc0e5..d5822f4 100644 (file)
@@ -6,14 +6,17 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
         * be-tarask. This is to ensure LanguageClassesTestCase
         * does not give us the wrong language.
         */
-       function testBeTaraskTestsUsesBeTaraskCode() {
+       public function testBeTaraskTestsUsesBeTaraskCode() {
                $this->assertEquals( 'be-tarask',
                        $this->getLang()->getCode()
                );
        }
 
-       /** see bug 23156 & r64981 */
-       function testSearchRightSingleQuotationMarkAsApostroph() {
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testSearchRightSingleQuotationMarkAsApostroph() {
                $this->assertEquals(
                        "'",
                        $this->getLang()->normalizeForSearch( '’' ),
@@ -21,25 +24,37 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                );
        }
 
-       /** see bug 23156 & r64981 */
-       function testCommafy() {
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testCommafy() {
                $this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
                $this->assertEquals( '12,345', $this->getLang()->commafy( '12345' ) );
        }
 
-       /** see bug 23156 & r64981 */
-       function testDoesNotCommafyFourDigitsNumber() {
+       /**
+        * @see bug 23156 & r64981
+        * @covers Language::commafy
+        */
+       public function testDoesNotCommafyFourDigitsNumber() {
                $this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
        }
 
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -59,8 +74,11 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
index 3cdde36..187bfbb 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageBho.php */
 class LanguageBhoTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 83a0ef6..fb965b8 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageBs.php */
 class LanguageBsTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 03bb898..632e037 100644 (file)
@@ -35,6 +35,9 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
         */
        private $languageObject;
 
+       /**
+        * @return Language
+        */
        protected function getLang() {
                return $this->languageObject;
        }
@@ -56,7 +59,7 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
                                        . "out of " . get_called_class() . " failling back to 'en'\n"
                        );
                }
-               // TODO: validate $m[1] which should be a valid language code
+               // @todo validate $m[1] which should be a valid language code
                $this->languageObject = Language::factory( $m[1] );
        }
 
index 93ee0f0..da9e6b8 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/Languagecs.php */
 class LanguageCsTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 562d6d9..0719317 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageCu.php */
 class LanguageCuTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 435da4f..eaf663a 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageCy.php */
 class LanguageCyTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index be42124..94c11bc 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageDsb.php */
 class LanguageDsbTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 4f96b48..46b6501 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageFr.php */
 class LanguageFrTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 73c4800..c009f56 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGa.php */
 class LanguageGaTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index edf8e50..0b2612b 100644 (file)
@@ -7,8 +7,11 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGd.php */
 class LanguageGdTest extends LanguageClassesTestCase {
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::convertPlural
+       */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
@@ -26,8 +29,11 @@ class LanguageGdTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPluralExplicit */
-       function testExplicitPlural( $result, $value ) {
+       /**
+        * @dataProvider providerPluralExplicit
+        * @covers Language::convertPlural
+        */
+       public function testExplicitPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
index 71c0160..a0def62 100644 (file)
@@ -7,16 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGv.php */
 class LanguageGvTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
                // What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28
                $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." );
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
index a8524bb..8edc6dd 100644 (file)
@@ -7,38 +7,53 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
 class LanguageHeTest extends LanguageClassesTestCase {
-       /*
-       The most common usage for the plural forms is two forms,
-       for singular and plural. In this case, the second form
-       is technically dual, but in practice it's used as plural.
-       In some cases, usually with expressions of time, three forms
-       are needed - singular, dual and plural.
-       CLDR also specifies a fourth form for multiples of 10,
-       which is very rare. It also has a mistake, because
-       the number 10 itself is supposed to be just plural,
-       so currently it's overridden in MediaWiki.
+       /**
+        * The most common usage for the plural forms is two forms,
+        * for singular and plural. In this case, the second form
+        * is technically dual, but in practice it's used as plural.
+        * In some cases, usually with expressions of time, three forms
+        * are needed - singular, dual and plural.
+        * CLDR also specifies a fourth form for multiples of 10,
+        * which is very rare. It also has a mistake, because
+        * the number 10 itself is supposed to be just plural,
+        * so currently it's overridden in MediaWiki.
        */
 
-       /** @dataProvider provideTwoPluralForms */
-       function testTwoPluralForms( $result, $value ) {
+       // @todo the below test*PluralForms test methods can be refactored
+       //  to use a single test method and data provider..
+
+       /**
+        * @dataProvider provideTwoPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testTwoPluralForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider provideThreePluralForms */
-       function testThreePluralForms( $result, $value ) {
+       /**
+        * @dataProvider provideThreePluralForms
+        * @covers Language::convertPlural
+        */
+       public function testThreePluralForms( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider provideFourPluralForms */
-       function testFourPluralForms( $result, $value ) {
+       /**
+        * @dataProvider provideFourPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testFourPluralForms( $result, $value ) {
                $forms = array( 'one', 'two', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider provideFourPluralForms */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider provideFourPluralForms
+        * @covers Language::convertPlural
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -75,8 +90,11 @@ class LanguageHeTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider provideGrammar */
-       function testGrammar( $result, $word, $case ) {
+       /**
+        * @dataProvider provideGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
index 9502d6a..f6d2c9e 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageHi.php */
 class LanguageHiTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 7516bac..6ce4aff 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHr.php */
 class LanguageHrTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index bae4542..f95a43b 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHsb.php */
 class LanguageHsbTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 40ae108..ee9197d 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageHu.php */
 class LanguageHuTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 1abc375..896522b 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageHy.php */
 class LanguageHyTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                // This fails for 0, but I'm not sure why. Some voodoo going on here.
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
index 291c59b..568a378 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageKsh.php */
 class LanguageKshTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other', 'zero' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 2fa40b5..10b3234 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLn.php */
 class LanguageLnTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index e5a10b5..30642f6 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/LanguageLt.php */
 class LanguageLtTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -34,8 +40,11 @@ class LanguageLtTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testOneFewPlural( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testOneFewPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                // This fails for 21, but not sure why.
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
index 368ac8c..c4d8a6f 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLv.php */
 class LanguageLvTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index f4eb99a..65e8fd7 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMg.php */
 class LanguageMgTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 0ae533d..7d47b37 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMk.php */
 class LanguageMkTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 057ca67..4fa45ce 100644 (file)
@@ -8,9 +8,12 @@
 /** Tests for MediaWiki languages/LanguageMl.php */
 class LanguageMlTest extends LanguageClassesTestCase {
 
-       /** see bug 29495 */
-       /** @dataProvider providerFormatNum */
-       function testFormatNum( $result, $value ) {
+       /**
+        * @dataProvider providerFormatNum
+        * @see bug 29495
+        * @covers Language::formatNum
+        */
+       public function testFormatNum( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
        }
 
index 3b162b7..e0e54ca 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMo.php */
 class LanguageMoTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 12af2e8..96d2bc9 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMt.php */
 class LanguageMtTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -39,13 +45,16 @@ class LanguageMtTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       public static function providerPluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index f783f2c..26bd691 100644 (file)
@@ -8,7 +8,11 @@
 /** Tests for MediaWiki languages/LanguageNl.php */
 class LanguageNlTest extends LanguageClassesTestCase {
 
-       function testFormatNum() {
+       /**
+        * @covers Language::formatNum
+        * @todo split into a test and a dataprovider
+        */
+       public function testFormatNum() {
                $this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
                $this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
                $this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
index 1d62567..18efd73 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageNso.php */
 class LanguageNsoTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 9ec2a88..d180037 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguagePl.php */
 class LanguagePlTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -39,13 +45,16 @@ class LanguagePlTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       public static function providerPluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 919a744..ae7816b 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRo.php */
 class LanguageRoTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index bfd5074..e938be7 100644 (file)
@@ -8,14 +8,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRu.php */
 class LanguageRuTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -35,8 +41,11 @@ class LanguageRuTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
@@ -50,8 +59,11 @@ class LanguageRuTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerGrammar */
-       function testGrammar( $result, $word, $case ) {
+       /**
+        * @dataProvider providerGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
index 70efa3b..533aa2b 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSe.php */
 class LanguageSeTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -27,13 +33,16 @@ class LanguageSeTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       public static function providerPluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 589a369..bf6a14b 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSgs.php */
 class LanguageSgsTest extends LanguageClassesTestCase {
-       /** @dataProvider providePluralAllForms */
-       function testPluralAllForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralAllForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralAllForms( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePluralAllForms */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePluralAllForms
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -36,8 +42,11 @@ class LanguageSgsTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
index 9f34db5..6d2e25a 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSh.php */
 class LanguageShTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 3f32c66..cb8a13b 100644 (file)
@@ -8,14 +8,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSk.php */
 class LanguageSkTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 84c2e01..9783dd8 100644 (file)
@@ -8,14 +8,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSl.php */
 class LanguageSlTest extends LanguageClassesTestCase {
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providerPlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providerPlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 5819831..95cb333 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSma.php */
 class LanguageSmaTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -27,13 +33,16 @@ class LanguageSmaTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       public static function providerPluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 40d14e3..ab4d4ab 100644 (file)
  * @author Antoine Musso <hashar at free dot fr>
  * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
  * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
  */
 
 /** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends LanguageClassesTestCase {
-       function testEasyConversions() {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testEasyConversions() {
                $this->assertCyrillic(
                        'шђчћжШЂЧЋЖ',
                        'Cyrillic guessing characters'
@@ -25,7 +32,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       function testMixedConversions() {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testMixedConversions() {
                $this->assertCyrillic(
                        'шђчћжШЂЧЋЖ - šđčćž',
                        'Mostly cyrillic characters'
@@ -36,7 +46,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       function testSameAmountOfLatinAndCyrillicGetConverted() {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testSameAmountOfLatinAndCyrillicGetConverted() {
                $this->assertConverted(
                        '4 latin: šđčć | 4 cyrillic: шђчћ',
                        'sr-ec'
@@ -49,8 +62,9 @@ class LanguageSrTest extends LanguageClassesTestCase {
 
        /**
         * @author Nikola Smolenski
+        * @covers LanguageConverter::convertTo
         */
-       function testConversionToCyrillic() {
+       public function testConversionToCyrillic() {
                //A simple convertion of Latin to Cyrillic
                $this->assertEquals( 'абвг',
                        $this->convertToCyrillic( 'abvg' )
@@ -89,7 +103,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       function testConversionToLatin() {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToLatin() {
                //A simple convertion of Latin to Latin
                $this->assertEquals( 'abcd',
                        $this->convertToLatin( 'abcd' )
@@ -108,14 +125,20 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -135,8 +158,11 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
@@ -157,7 +183,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @param $variant string Language variant 'sr-ec' or 'sr-el'
         * @param $msg string Optional message
         */
-       function assertUnConverted( $text, $variant, $msg = '' ) {
+       protected function assertUnConverted( $text, $variant, $msg = '' ) {
                $this->assertEquals(
                        $text,
                        $this->convertTo( $text, $variant ),
@@ -171,7 +197,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @param $variant string Language variant 'sr-ec' or 'sr-el'
         * @param $msg string Optional message
         */
-       function assertConverted( $text, $variant, $msg = '' ) {
+       protected function assertConverted( $text, $variant, $msg = '' ) {
                $this->assertNotEquals(
                        $text,
                        $this->convertTo( $text, $variant ),
@@ -184,7 +210,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * using the cyrillic variant and converted to Latin when using
         * the Latin variant.
         */
-       function assertCyrillic( $text, $msg = '' ) {
+       protected function assertCyrillic( $text, $msg = '' ) {
                $this->assertUnConverted( $text, 'sr-ec', $msg );
                $this->assertConverted( $text, 'sr-el', $msg );
        }
@@ -194,14 +220,14 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * using the Latin variant and converted to Cyrillic when using
         * the Cyrillic variant.
         */
-       function assertLatin( $text, $msg = '' ) {
+       protected function assertLatin( $text, $msg = '' ) {
                $this->assertUnConverted( $text, 'sr-el', $msg );
                $this->assertConverted( $text, 'sr-ec', $msg );
        }
 
 
        /** Wrapper for converter::convertTo() method*/
-       function convertTo( $text, $variant ) {
+       protected function convertTo( $text, $variant ) {
                return $this->getLang()
                        ->mConverter
                        ->convertTo(
@@ -209,11 +235,11 @@ class LanguageSrTest extends LanguageClassesTestCase {
                        );
        }
 
-       function convertToCyrillic( $text ) {
+       protected function convertToCyrillic( $text ) {
                return $this->convertTo( $text, 'sr-ec' );
        }
 
-       function convertToLatin( $text ) {
+       protected function convertToLatin( $text ) {
                return $this->convertTo( $text, 'sr-el' );
        }
 }
index 7a26780..78929e2 100644 (file)
@@ -1,7 +1,11 @@
 <?php
 
 class LanguageTest extends LanguageClassesTestCase {
-       function testLanguageConvertDoubleWidthToSingleWidth() {
+       /**
+        * @covers Language::convertDoubleWidth
+        * @covers Language::normalizeForSearch
+        */
+       public function testLanguageConvertDoubleWidthToSingleWidth() {
                $this->assertEquals(
                        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
                        $this->getLang()->normalizeForSearch(
@@ -12,9 +16,10 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @dataProvider provideFormattableTimes
+        * @dataProvider provideFormattableTimes#
+        * @covers Language::formatTimePeriod
         */
-       function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
+       public function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
                $this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
        }
 
@@ -203,7 +208,10 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function testTruncate() {
+       /**
+        * @covers Language::truncate
+        */
+       public function testTruncate() {
                $this->assertEquals(
                        "XXX",
                        $this->getLang()->truncate( "1234567890", 0, 'XXX' ),
@@ -236,9 +244,10 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @dataProvider provideHTMLTruncateData()
+        * @dataProvider provideHTMLTruncateData
+        * @covers Language::truncateHTML
         */
-       function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
+       public function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
                // Actual HTML...
                $this->assertEquals(
                        $expected,
@@ -247,7 +256,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * Array format is ($len, $ellipsis, $input, $expected)
+        * @return array format is ($len, $ellipsis, $input, $expected)
         */
        public static function provideHTMLTruncateData() {
                return array(
@@ -308,8 +317,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Test Language::isWellFormedLanguageTag()
         * @dataProvider provideWellFormedLanguageTags
+        * @covers Language::isWellFormedLanguageTag
         */
-       function testWellFormedLanguageTag( $code, $message = '' ) {
+       public function testWellFormedLanguageTag( $code, $message = '' ) {
                $this->assertTrue(
                        Language::isWellFormedLanguageTag( $code ),
                        "validating code $code $message"
@@ -359,8 +369,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Negative test for Language::isWellFormedLanguageTag()
         * @dataProvider provideMalformedLanguageTags
+        * @covers Language::isWellFormedLanguageTag
         */
-       function testMalformedLanguageTag( $code, $message = '' ) {
+       public function testMalformedLanguageTag( $code, $message = '' ) {
                $this->assertFalse(
                        Language::isWellFormedLanguageTag( $code ),
                        "validating that code $code is a malformed language tag - $message"
@@ -409,8 +420,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * Negative test for Language::isWellFormedLanguageTag()
+        * @covers Language::isWellFormedLanguageTag
         */
-       function testLenientLanguageTag() {
+       public function testLenientLanguageTag() {
                $this->assertTrue(
                        Language::isWellFormedLanguageTag( 'pa_guru', true ),
                        'pa_guru is a well-formed language tag in lenient mode'
@@ -420,15 +432,19 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Test Language::isValidBuiltInCode()
         * @dataProvider provideLanguageCodes
+        * @covers Language::isValidBuiltInCode
         */
-       function testBuiltInCodeValidation( $code, $message = '' ) {
+       public function testBuiltInCodeValidation( $code, $message = '' ) {
                $this->assertTrue(
                        (bool)Language::isValidBuiltInCode( $code ),
                        "validating code $code $message"
                );
        }
 
-       function testBuiltInCodeValidationRejectUnderscore() {
+       /**
+        * @covers Language::isValidBuiltInCode
+        */
+       public function testBuiltInCodeValidationRejectUnderscore() {
                $this->assertFalse(
                        (bool)Language::isValidBuiltInCode( 'be_tarask' ),
                        "reject underscore in language code"
@@ -450,8 +466,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Test Language::isKnownLanguageTag()
         * @dataProvider provideKnownLanguageTags
+        * @covers Language::isKnownLanguageTag
         */
-       function testKnownLanguageTag( $code, $message = '' ) {
+       public function testKnownLanguageTag( $code, $message = '' ) {
                $this->assertTrue(
                        (bool)Language::isKnownLanguageTag( $code ),
                        "validating code $code - $message"
@@ -467,9 +484,9 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * Test Language::isKnownLanguageTag()
+        * @covers Language::isKnownLanguageTag
         */
-       function testKnownCldrLanguageTag() {
+       public function testKnownCldrLanguageTag() {
                if ( !class_exists( 'LanguageNames' ) ) {
                        $this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
                }
@@ -483,8 +500,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Negative tests for Language::isKnownLanguageTag()
         * @dataProvider provideUnKnownLanguageTags
+        * @covers Language::isKnownLanguageTag
         */
-       function testUnknownLanguageTag( $code, $message = '' ) {
+       public function testUnknownLanguageTag( $code, $message = '' ) {
                $this->assertFalse(
                        (bool)Language::isKnownLanguageTag( $code ),
                        "checking that code $code is invalid - $message"
@@ -501,31 +519,35 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Test too short timestamp
         * @expectedException MWException
+        * @covers Language::sprintfDate
         */
-       function testSprintfDateTooShortTimestamp() {
+       public function testSprintfDateTooShortTimestamp() {
                $this->getLang()->sprintfDate( 'xiY', '1234567890123' );
        }
 
        /**
         * Test too long timestamp
         * @expectedException MWException
+        * @covers Language::sprintfDate
         */
-       function testSprintfDateTooLongTimestamp() {
+       public function testSprintfDateTooLongTimestamp() {
                $this->getLang()->sprintfDate( 'xiY', '123456789012345' );
        }
 
        /**
         * Test too short timestamp
         * @expectedException MWException
+        * @covers Language::sprintfDate
         */
-       function testSprintfDateNotAllDigitTimestamp() {
+       public function testSprintfDateNotAllDigitTimestamp() {
                $this->getLang()->sprintfDate( 'xiY', '-1234567890123' );
        }
 
        /**
         * @dataProvider provideSprintfDateSamples
+        * @covers Language::sprintfDate
         */
-       function testSprintfDate( $format, $ts, $expected, $msg ) {
+       public function testSprintfDate( $format, $ts, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
                        $this->getLang()->sprintfDate( $format, $ts ),
@@ -536,8 +558,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * sprintfDate should always use UTC when no zone is given.
         * @dataProvider provideSprintfDateSamples
+        * @covers Language::sprintfDate
         */
-       function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
+       public function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
                $oldTZ = date_default_timezone_get();
                $res = date_default_timezone_set( 'Asia/Seoul' );
                if ( !$res ) {
@@ -556,8 +579,9 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * sprintfDate should use passed timezone
         * @dataProvider provideSprintfDateSamples
+        * @covers Language::sprintfDate
         */
-       function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
+       public function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
                $tz = new DateTimeZone( 'Asia/Seoul' );
                if ( !$tz ) {
                        $this->markTestSkipped( "Error getting Timezone" );
@@ -957,8 +981,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideFormatSizes
+        * @covers Language::formatSize
         */
-       function testFormatSize( $size, $expected, $msg ) {
+       public function testFormatSize( $size, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
                        $this->getLang()->formatSize( $size ),
@@ -1019,8 +1044,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideFormatBitrate
+        * @covers Language::formatBitrate
         */
-       function testFormatBitrate( $bps, $expected, $msg ) {
+       public function testFormatBitrate( $bps, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
                        $this->getLang()->formatBitrate( $bps ),
@@ -1091,8 +1117,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideFormatDuration
+        * @covers Language::formatDuration
         */
-       function testFormatDuration( $duration, $expected, $intervals = array() ) {
+       public function testFormatDuration( $duration, $expected, $intervals = array() ) {
                $this->assertEquals(
                        $expected,
                        $this->getLang()->formatDuration( $duration, $intervals ),
@@ -1227,8 +1254,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideCheckTitleEncodingData
+        * @covers Language::checkTitleEncoding
         */
-       function testCheckTitleEncoding( $s ) {
+       public function testCheckTitleEncoding( $s ) {
                $this->assertEquals(
                        $s,
                        $this->getLang()->checkTitleEncoding( $s ),
@@ -1291,8 +1319,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideRomanNumeralsData
+        * @covers Language::romanNumeral
         */
-       function testRomanNumerals( $num, $numerals ) {
+       public function testRomanNumerals( $num, $numerals ) {
                $this->assertEquals(
                        $numerals,
                        Language::romanNumeral( $num ),
@@ -1349,8 +1378,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider providePluralData
+        * @covers Language::convertPlural
         */
-       function testConvertPlural( $expected, $number, $forms ) {
+       public function testConvertPlural( $expected, $number, $forms ) {
                $chosen = $this->getLang()->convertPlural( $number, $forms );
                $this->assertEquals( $expected, $chosen );
        }
@@ -1395,7 +1425,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * @covers Language::translateBlockExpiry()
         * @dataProvider provideTranslateBlockExpiry
         */
-       function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
+       public function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
                $lang = $this->getLang();
                if ( is_array( $expectedData ) ) {
                        list( $func, $arg ) = $expectedData;
@@ -1427,7 +1457,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * @covers Language::commafy()
         * @dataProvider provideCommafyData
         */
-       function testCommafy( $number, $numbersWithCommas ) {
+       public function testCommafy( $number, $numbersWithCommas ) {
                $this->assertEquals(
                        $numbersWithCommas,
                        $this->getLang()->commafy( $number ),
@@ -1454,7 +1484,10 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function testListToText() {
+       /**
+        * @covers Language::listToText
+        */
+       public function testListToText() {
                $lang = $this->getLang();
                $and = $lang->getMessageFromDB( 'and' );
                $s = $lang->getMessageFromDB( 'word-separator' );
@@ -1469,8 +1502,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideIsSupportedLanguage
+        * @covers Language::isSupportedLanguage
         */
-       function testIsSupportedLanguage( $code, $expected, $comment ) {
+       public function testIsSupportedLanguage( $code, $expected, $comment ) {
                $this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
        }
 
@@ -1485,8 +1519,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideGetParentLanguage
+        * @covers Language::getParentLanguage
         */
-       function testGetParentLanguage( $code, $expected, $comment ) {
+       public function testGetParentLanguage( $code, $expected, $comment ) {
                $lang = Language::factory( $code );
                if ( is_null( $expected ) ) {
                        $this->assertNull( $lang->getParentLanguage(), $comment );
@@ -1507,8 +1542,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider provideGetNamespaceAliases
+        * @covers Language::getNamespaceAliases
         */
-       function testGetNamespaceAliases( $languageCode, $subset ) {
+       public function testGetNamespaceAliases( $languageCode, $subset ) {
                $language = Language::factory( $languageCode );
                $aliases = $language->getNamespaceAliases();
                foreach ( $subset as $alias => $nsId ) {
@@ -1516,7 +1552,7 @@ class LanguageTest extends LanguageClassesTestCase {
                }
        }
 
-       function provideGetNamespaceAliases() {
+       public static function provideGetNamespaceAliases() {
                // TODO: Add tests for NS_PROJECT_TALK and GenderNamespaces
                return array(
                        array(
index 36446c4..e225af9 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTi.php */
 class LanguageTiTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 422ad43..7ac51c6 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTl.php */
 class LanguageTlTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 6358ac0..8fc2795 100644 (file)
@@ -17,7 +17,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
         * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
         * @dataProvider provideDottedAndDotlessI
         */
-       function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
+       public function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
                if ( $func == 'ucfirst' ) {
                        $res = $this->getLang()->ucfirst( $input );
                } elseif ( $func == 'lcfirst' ) {
index 3180d30..0783fcf 100644 (file)
@@ -8,14 +8,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageUk.php */
 class LanguageUkTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
@@ -35,8 +41,11 @@ class LanguageUkTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralTwoForms */
-       function testPluralTwoForms( $result, $value ) {
+       /**
+        * @dataProvider providePluralTwoForms
+        * @covers Language::convertPlural
+        */
+       public function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
index 8ee95b7..13f57c1 100644 (file)
  * @copyright Copyright © 2012, Robin Pepermans
  * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
  * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
  */
 
 /** Tests for MediaWiki languages/LanguageUz.php */
@@ -17,8 +21,9 @@ class LanguageUzTest extends LanguageClassesTestCase {
 
        /**
         * @author Nikola Smolenski
+        * @covers LanguageConverter::convertTo
         */
-       function testConversionToCyrillic() {
+       public function testConversionToCyrillic() {
                // A convertion of Latin to Cyrillic
                $this->assertEquals( 'абвгғ',
                        $this->convertToCyrillic( 'abvggʻ' )
@@ -37,7 +42,10 @@ class LanguageUzTest extends LanguageClassesTestCase {
                );
        }
 
-       function testConversionToLatin() {
+       /**
+        * @covers LanguageConverter::convertTo
+        */
+       public function testConversionToLatin() {
                // A simple convertion of Latin to Latin
                $this->assertEquals( 'abdef',
                        $this->convertToLatin( 'abdef' )
@@ -55,7 +63,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
         * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
         * @param $msg string Optional message
         */
-       function assertUnConverted( $text, $variant, $msg = '' ) {
+       protected function assertUnConverted( $text, $variant, $msg = '' ) {
                $this->assertEquals(
                        $text,
                        $this->convertTo( $text, $variant ),
@@ -69,7 +77,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
         * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
         * @param $msg string Optional message
         */
-       function assertConverted( $text, $variant, $msg = '' ) {
+       protected function assertConverted( $text, $variant, $msg = '' ) {
                $this->assertNotEquals(
                        $text,
                        $this->convertTo( $text, $variant ),
@@ -82,7 +90,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
         * using the cyrillic variant and converted to Latin when using
         * the Latin variant.
         */
-       function assertCyrillic( $text, $msg = '' ) {
+       protected function assertCyrillic( $text, $msg = '' ) {
                $this->assertUnConverted( $text, 'uz-cyrl', $msg );
                $this->assertConverted( $text, 'uz-latn', $msg );
        }
@@ -92,22 +100,22 @@ class LanguageUzTest extends LanguageClassesTestCase {
         * using the Latin variant and converted to Cyrillic when using
         * the Cyrillic variant.
         */
-       function assertLatin( $text, $msg = '' ) {
+       protected function assertLatin( $text, $msg = '' ) {
                $this->assertUnConverted( $text, 'uz-latn', $msg );
                $this->assertConverted( $text, 'uz-cyrl', $msg );
        }
 
 
        /** Wrapper for converter::convertTo() method*/
-       function convertTo( $text, $variant ) {
+       protected function convertTo( $text, $variant ) {
                return $this->getLang()->mConverter->convertTo( $text, $variant );
        }
 
-       function convertToCyrillic( $text ) {
+       protected function convertToCyrillic( $text ) {
                return $this->convertTo( $text, 'uz-cyrl' );
        }
 
-       function convertToLatin( $text ) {
+       protected function convertToLatin( $text ) {
                return $this->convertTo( $text, 'uz-latn' );
        }
 }
index ffa3375..d05196c 100644 (file)
@@ -7,14 +7,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageWa.php */
 class LanguageWaTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::convertPlural
+        */
+       public function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
-       function testGetPluralRuleType( $result, $value ) {
+       /**
+        * @dataProvider providePlural
+        * @covers Language::getPluralRuleType
+        */
+       public function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
index 163314e..83d8c71 100644 (file)
@@ -117,7 +117,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param $name string: name of the closing element to look for
         *           (e.g.: "mediawiki" when looking for </mediawiki>)
         *
-        * @return bool: true iff the end node could be found. false otherwise.
+        * @return bool: true if the end node could be found. false otherwise.
         */
        protected function skipToNodeEnd( $name ) {
                while ( $this->xml->read() ) {
index f4b61af..83d7701 100644 (file)
@@ -43,7 +43,7 @@ class MaintenanceFixup extends Maintenance {
        private $testCase;
 
        /**
-        * shutdownSimulated === true iff simulateShutdown has done it's work
+        * shutdownSimulated === true if simulateShutdown has done it's work
         *
         * @var bool
         */
@@ -130,6 +130,9 @@ class MaintenanceFixup extends Maintenance {
        }
 }
 
+/**
+ * @covers Maintenance
+ */
 class MaintenanceTest extends MediaWikiTestCase {
 
 
index bc2d737..0f36bc4 100644 (file)
@@ -6,6 +6,7 @@ require_once __DIR__ . "/../../../maintenance/backupPrefetch.inc";
  * Tests for BaseDump
  *
  * @group Dump
+ * @covers BaseDump
  */
 class BaseDumpTest extends MediaWikiTestCase {
 
index 653a114..15a928e 100644 (file)
@@ -7,6 +7,7 @@ require_once __DIR__ . "/../../../maintenance/backupTextPass.inc";
  *
  * @group Database
  * @group Dump
+ * @covers TextPassDumper
  */
 class TextPassDumperTest extends DumpTestCase {
 
index 98d8165..438281d 100644 (file)
@@ -4,6 +4,7 @@
  *
  * @group Database
  * @group Dump
+ * @covers BackupDumper
  */
 class BackupDumperLoggerTest extends DumpTestCase {
 
index 99bd270..c6094d9 100644 (file)
@@ -4,6 +4,7 @@
  *
  * @group Database
  * @group Dump
+ * @covers BackupDumper
  */
 class BackupDumperPageTest extends DumpTestCase {
 
index e8df199..42792d5 100644 (file)
@@ -70,6 +70,7 @@ class SemiMockedFetchText extends FetchText {
  *
  * @group Database
  * @group Dump
+ * @covers FetchText
  */
 class FetchTextTest extends MediaWikiTestCase {
 
index 2c84886..bb678af 100644 (file)
@@ -6,6 +6,7 @@ require_once __DIR__ . "/../../../maintenance/getSlaveServer.php";
  * Tests for getSlaveServer
  *
  * @group Database
+ * @covers GetSlaveServer
  */
 class GetSlaveServerTest extends MediaWikiTestCase {
 
index 850d39c..a385320 100644 (file)
@@ -5,7 +5,10 @@
  */
 class SideBarTest extends MediaWikiLangTestCase {
 
-       /** A skin template, reinitialized before each test */
+       /**
+        * A skin template, reinitialized before each test
+        * @var SkinTemplate
+        */
        private $skin;
        /** Local cache for sidebar messages */
        private $messages;
@@ -36,16 +39,12 @@ class SideBarTest extends MediaWikiLangTestCase {
                $this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
        }
 
-       protected function tearDown() {
-               parent::tearDown();
-               $this->skin = null;
-       }
-
        /**
         * Internal helper to test the sidebar
         * @param $expected
         * @param $text
         * @param $message (Default: '')
+        * @todo this assert method to should be converted to a test using a dataprovider..
         */
        private function assertSideBar( $expected, $text, $message = '' ) {
                $bar = array();
@@ -53,7 +52,10 @@ class SideBarTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $bar, $message );
        }
 
-       function testSidebarWithOnlyTwoTitles() {
+       /**
+        * @covers SkinTemplate::addToSidebarPlain
+        */
+       public function testSidebarWithOnlyTwoTitles() {
                $this->assertSideBar(
                        array(
                                'Title1' => array(),
@@ -65,7 +67,10 @@ class SideBarTest extends MediaWikiLangTestCase {
                );
        }
 
-       function testExpandMessages() {
+       /**
+        * @covers SkinTemplate::addToSidebarPlain
+        */
+       public function testExpandMessages() {
                $this->assertSidebar(
                        array( 'Title' => array(
                                array(
@@ -81,7 +86,10 @@ class SideBarTest extends MediaWikiLangTestCase {
                );
        }
 
-       function testExternalUrlsRequireADescription() {
+       /**
+        * @covers SkinTemplate::addToSidebarPlain
+        */
+       public function testExternalUrlsRequireADescription() {
                $this->assertSidebar(
                        array( 'Title' => array(
                                # ** http://www.mediawiki.org/| Home
@@ -105,8 +113,9 @@ class SideBarTest extends MediaWikiLangTestCase {
        /**
         * bug 33321 - Make sure there's a | after transforming.
         * @group Database
+        * @covers SkinTemplate::addToSidebarPlain
         */
-       function testTrickyPipe() {
+       public function testTrickyPipe() {
                $this->assertSidebar(
                        array( 'Title' => array(
                                # The first 2 are skipped
@@ -151,7 +160,7 @@ class SideBarTest extends MediaWikiLangTestCase {
        /**
         * Simple test to verify our helper assertAttribs() is functional
         */
-       function testTestAttributesAssertionHelper() {
+       public function testTestAttributesAssertionHelper() {
                $this->setMwGlobals( array(
                        'wgNoFollowLinks' => true,
                        'wgExternalLinkTarget' => false,
@@ -167,7 +176,7 @@ class SideBarTest extends MediaWikiLangTestCase {
        /**
         * Test $wgNoFollowLinks in sidebar
         */
-       function testRespectWgnofollowlinks() {
+       public function testRespectWgnofollowlinks() {
                $this->setMwGlobals( 'wgNoFollowLinks', false );
 
                $attribs = $this->getAttribs();
@@ -180,7 +189,7 @@ class SideBarTest extends MediaWikiLangTestCase {
         * Test $wgExternaLinkTarget in sidebar
         * @dataProvider dataRespectExternallinktarget
         */
-       function testRespectExternallinktarget( $externalLinkTarget ) {
+       public function testRespectExternallinktarget( $externalLinkTarget ) {
                $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
 
                $attribs = $this->getAttribs();
@@ -188,7 +197,7 @@ class SideBarTest extends MediaWikiLangTestCase {
                $this->assertEquals( $attribs['target'], $externalLinkTarget );
        }
 
-       function dataRespectExternallinktarget() {
+       public static function dataRespectExternallinktarget() {
                return array(
                        array( '_blank' ),
                        array( '_self' ),
index d3877e0..3ef2790 100644 (file)
@@ -38,7 +38,7 @@
                // making sure it is actually using text() and attr() (or something with the same effect)
 
                // Text escaping
-               html = '<div><span><html:msg key="properfoo"></span></div>';
+               html = '<div><span><html:msg key="properfoo" /></span></div>';
                $lc = $( html ).localize().find( 'span' );
 
                assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
@@ -63,7 +63,7 @@
                var html, $lc, x, sitename = 'Wikipedia';
 
                // Message key prefix
-               html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
+               html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
                $lc = $( html ).localize( {
                        prefix: 'foo-'
                } ).find( 'span' );
@@ -73,7 +73,7 @@
 
                // Variable keys mapping
                x = 'bar';
-               html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+               html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
                $lc = $( html ).localize( {
                        keys: {
                                'title': 'foo-' + x + '-title',
@@ -85,7 +85,7 @@
                assert.strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
 
                // Passing parameteters to mw.msg
-               html = '<div><span><html:msg key="foo-welcome"></span></div>';
+               html = '<div><span><html:msg key="foo-welcome" /></span></div>';
                $lc = $( html ).localize( {
                        params: {
                                'foo-welcome': [sitename, 'yesterday']
@@ -96,7 +96,7 @@
 
                // Combination of options prefix, params and keys
                x = 'bazz';
-               html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+               html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
                $lc = $( html ).localize( {
                        prefix: 'foo-',
                        keys: {