Merge "Support for linking directly to sections in ApiFeedWatchlist. It works only...
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 12 Apr 2013 15:02:41 +0000 (15:02 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 12 Apr 2013 15:02:41 +0000 (15:02 +0000)
542 files changed:
.jshintignore
CREDITS
HISTORY
RELEASE-NOTES-1.21
RELEASE-NOTES-1.22 [new file with mode: 0644]
UPGRADE
docs/title.txt
includes/Action.php
includes/ArrayUtils.php
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/Category.php
includes/Cdb_PHP.php
includes/ChangesFeed.php
includes/ChangesList.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/ExternalEdit.php [deleted file]
includes/ExternalUser.php [deleted file]
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/Hooks.php
includes/HttpFunctions.php
includes/ImagePage.php
includes/Import.php
includes/Linker.php
includes/LinksUpdate.php
includes/MWFunction.php
includes/MagicWord.php
includes/Metadata.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Preferences.php
includes/ProtectionForm.php
includes/RecentChange.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/SeleniumWebSettings.php
includes/Setup.php
includes/SiteConfiguration.php
includes/Skin.php
includes/SkinLegacy.php
includes/SkinTemplate.php
includes/SpecialPage.php
includes/SpecialPageFactory.php
includes/StatCounter.php [new file with mode: 0644]
includes/StreamFile.php
includes/StubObject.php
includes/Timestamp.php
includes/Title.php
includes/User.php
includes/UserArray.php
includes/UserMailer.php
includes/WebRequest.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/actions/CreditsAction.php
includes/actions/EditAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/PurgeAction.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatXml.php
includes/api/ApiImageRotate.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiUpload.php
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/cache/SquidUpdate.php
includes/cache/UserCache.php
includes/content/ContentHandler.php
includes/content/WikitextContent.php
includes/db/ChronologyProtector.php [new file with mode: 0644]
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseUtility.php
includes/db/IORMRow.php
includes/db/LBFactory.php
includes/db/LBFactory_Multi.php
includes/db/LoadBalancer.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/extauth/Hardcoded.php [deleted file]
includes/extauth/MediaWiki.php [deleted file]
includes/extauth/vB.php [deleted file]
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/LockManager.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerPage.php
includes/job/Job.php
includes/job/JobQueue.php
includes/job/JobQueueAggregator.php
includes/job/JobQueueAggregatorMemc.php
includes/job/JobQueueAggregatorRedis.php
includes/job/JobQueueDB.php
includes/job/JobQueueGroup.php
includes/job/JobQueueRedis.php
includes/json/FormatJson.php
includes/json/Services_JSON.php [deleted file]
includes/logging/DeleteLogFormatter.php [new file with mode: 0644]
includes/logging/LogFormatter.php
includes/logging/MoveLogFormatter.php [new file with mode: 0644]
includes/logging/NewUsersLogFormatter.php [new file with mode: 0644]
includes/logging/PatrolLogFormatter.php [new file with mode: 0644]
includes/logging/RightsLogFormatter.php [new file with mode: 0644]
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/ImageHandler.php
includes/media/Jpeg.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/PNGMetadataExtractor.php
includes/media/SVGMetadataExtractor.php
includes/media/XMP.php
includes/media/XMPValidate.php
includes/normal/UtfNormalTest.php
includes/normal/UtfNormalUtil.php
includes/objectcache/MemcachedClient.php
includes/objectcache/SqlBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleUDP.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/search/SearchUpdate.php
includes/site/MediaWikiSite.php
includes/specials/SpecialActiveusers.php [deleted file]
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlankpage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBlockme.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/templates/UserloginVForm.php [new file with mode: 0644]
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromUrl.php
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageGan.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageZh.php
languages/data/plurals-mediawiki.xml
languages/messages/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAst.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBho.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDv.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.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/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.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/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNah.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSi.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTh.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVi.php
languages/messages/MessagesWar.php
languages/messages/MessagesWuu.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/archives/patch-eu_local_id.sql [deleted file]
maintenance/archives/patch-external_user.sql [deleted file]
maintenance/archives/patch-img_media_mime-index.sql [new file with mode: 0644]
maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql [new file with mode: 0644]
maintenance/archives/patch-iwlinks-from-title-index.sql [new file with mode: 0644]
maintenance/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/copyJobQueue.php [new file with mode: 0644]
maintenance/dumpLinks.php
maintenance/dumpSisterSites.php
maintenance/jsduck/MetaTags.rb
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/jsduck/external.js
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/mergeMessageFileList.php
maintenance/mssql/tables.sql
maintenance/mwjsduck-gen
maintenance/oracle/tables.sql
maintenance/postgres/archives/patch-external_user.sql [deleted file]
maintenance/postgres/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/postgres/archives/patch-rename-iwl_prefix.sql
maintenance/postgres/tables.sql
maintenance/purgeList.php
maintenance/runJobs.php
maintenance/showJobs.php
maintenance/showSiteStats.php
maintenance/sqlite/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
maintenance/tables.sql
maintenance/updateCollation.php
redirect.php [deleted file]
redirect.php5 [deleted file]
redirect.phtml [deleted file]
resources/Resources.php
resources/jquery/jquery.makeCollapsible.js
resources/mediawiki.action/mediawiki.action.edit.editWarning.js [new file with mode: 0644]
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.special/images/glyph-people-large.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-lock.png [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.userLogin.vform.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.vforms.css [new file with mode: 0644]
resources/mediawiki.ui/mediawiki.ui.default.css [new file with mode: 0644]
resources/mediawiki.ui/mediawiki.ui.vector.css [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/Makefile [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/config.rb [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_default.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss [new file with mode: 0644]
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
resources/startup.js
skins/Chick.php [deleted file]
skins/MySkin.php [deleted file]
skins/Nostalgia.php [deleted file]
skins/Simple.php [deleted file]
skins/Standard.php [deleted file]
skins/chick/IE60Fixes.css [deleted file]
skins/chick/main.css [deleted file]
skins/common/commonPrint.css
skins/monobook/main.css
skins/myskin/main.css [deleted file]
skins/nostalgia/screen.css [deleted file]
skins/simple/discussionitem_icon.gif [deleted file]
skins/simple/external.png [deleted file]
skins/simple/file_icon.gif [deleted file]
skins/simple/link_icon.gif [deleted file]
skins/simple/lock_icon.gif [deleted file]
skins/simple/mail_icon.gif [deleted file]
skins/simple/main.css [deleted file]
skins/standard/main.css [deleted file]
skins/vector/images/user-icon.svg [new file with mode: 0644]
skins/vector/screen.css
tests/TestsAutoLoader.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/AutoLoaderTest.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/db/sqlite/tables-1.16.sql
tests/phpunit/data/db/sqlite/tables-1.17.sql
tests/phpunit/data/db/sqlite/tables-1.18.sql
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CollationTest.php [new file with mode: 0644]
tests/phpunit/includes/JsonTest.php [deleted file]
tests/phpunit/includes/LanguageConverterTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiTest.php
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/ApiQueryTestBase.php
tests/phpunit/includes/cache/MessageCacheTest.php [deleted file]
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/FormatJsonTest.php [new file with mode: 0644]
tests/phpunit/includes/json/ServicesJsonTest.php [deleted file]
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/install-phpunit.sh
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.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/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/LanguageUkTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/phpunit.php
tests/phpunit/skins/SideBarTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/load.mock.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/startup.test.js [new file with mode: 0644]

index 3869deb..30b6ee1 100644 (file)
@@ -1,3 +1,7 @@
+# Generated documentation
+docs/html/
+docs/js/
+
 # third-party libs
 extensions/
 node_modules/
diff --git a/CREDITS b/CREDITS
index 9c49a9b..6cc28c1 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.21 is a collaborative project released under the
+MediaWiki 1.22 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 
@@ -80,7 +80,7 @@ following names for their contribution to the product.
 * Thomas Bleher
 * Tim Starling
 * Timo Tijhof
-* Tom Gries
+* Thomas Gries
 * Trevor Parscal
 * Victor Vasiliev
 * Yesid Carrillo
@@ -143,6 +143,7 @@ following names for their contribution to the product.
 * Jimmy Xu
 * Jonathan Wiltshire
 * John N
+* JuneHyeon Bae
 * Jure Kajzer
 * Karun Dambiec
 * Katie Filbert
diff --git a/HISTORY b/HISTORY
index 02ba8d8..45eab2e 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,337 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+Change notes from older releases. For current info see RELEASE-NOTES-1.22.
+
+== MediaWiki 1.21 ==
+
+MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.21 ===
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+  instead.
+* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
+  of page watchers required for the number to be accessible to users
+  without the unwatchedpages permission.
+* $wgBug34832TransitionalRollback has been removed.
+* (bug 29472) $wgUseDynamicDates has been removed and its functionality
+  disabled.
+
+=== New features in 1.21 ===
+* (bug 38110) Schema changes (adding or dropping tables, indices and
+  fields) can be now be done separately from from other changes that
+  update.php makes.  This is useful in environments that use database
+  permissions to restrict schema changes but allow the DB user that
+  MediaWiki normally runs as to perform other changes that update.php
+  makes.  Schema changes can be run separately.  See the file UPGRADE
+  for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+  than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+  and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+  specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+  searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+  queues as well as cross-wiki access to queues, among other things. The schema
+  for the DB queue was changed to support better concurrency and reduce
+  deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+  tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+  for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+  preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+  new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+  the Message class, or the global method wfMessage.
+* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
+  <link rel=canonical> tag is added to every page indicating the correct server
+  to use.
+* Debug message emitted by wfDebugLog() will now be prefixed with the group
+  name when its logged to the default log file. That is the case whenever the
+  group has no key in wgDebugLogGroups, that will help triage the default log.
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
+* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
+* DatabaseUpdater class has two new methods to ease extensions schema changes:
+  dropExtensionIndex and renameExtensionIndex.
+* New preference type - 'api'. Preferences of this type are not shown on
+  Special:Preferences, but are still available via the action=options API.
+* (bug 39397) Hide rollback link if a user is the only contributor of the page.
+* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
+  on the info action. Default is 50.
+* Added action=createaccount to allow user account creation.
+* (bug 40124) action=options API also allows for setting of arbitrary
+  preferences, provided that their names are prefixed with 'userjs-'. This
+  officially reenables the feature that was undocumented and defective
+  in MW 1.20 (saving preferences using Special:Preferences cleared any
+  additional fields) and which has been disabled in 1.20.1 as a part of
+  a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+  "..." as author name.
+* Added the ability to limit the wall clock time used by shell processes,
+  as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
+* Allow memory of shell subprocesses to be limited using Linux cgroups
+  instead of ulimit -v, which tends to cause deadlocks in recent versions
+  of ImageMagick. Configurable with $wgShellCgroup.
+* Added $wgWhitelistReadRegexp for regex whitelisting.
+* (bug 5346) Categories that are redirects will be displayed italic in
+  the category links section at the bottom of a page.
+* (bug 43915) New maintenance script deleteEqualMessages.php.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+  subclass in HTMLForm.
+* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
+  html elements and tables. This allows presentational markup, especially
+  tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+  on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+  based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+  articles to be correctly sorted on category pages. They are named
+  'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+  co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+  gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+  oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+  uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+  structual equality of HTML (ignoring insignificant differences like
+  quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+
+=== Bug fixes in 1.21 ===
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+  recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+  when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+  method requests, we now send a Host header by default, for Varnish
+  compatibility. This also works with Squid in reverse-proxy mode. If you wish
+  to support Squid configured in forward-proxy mode, set
+  $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+  current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+  caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+  didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+  parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+  protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+  starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+  needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+  actually sorted.
+* (bug 2865)  User interface HTML elements don't use lang attribute.
+  (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+  title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+  Enotif no longer sends "page has been created" notifications for some log
+  actions. The following events now have a correct message: page creation,
+  deletion, move, restore (undeletion), change (edit). Parameter
+  $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
+  MediaWiki 1.23.
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+  skins, the heading levels have been changed from (variously per skin)
+  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+  If you are styling or scripting the headings in a custom way, this change
+  will require updates to your site's CSS or JS.
+* (bug 41342) jquery.suggestions should cancel any active (async) fetches
+  before it triggers another fetch.
+* (bug 42184) $wgUploadSizeWarning missing second variable.
+* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
+  log when determining whether an account is used.
+* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
+  History page.
+* (bug 42949) API no longer assumes all exceptions are MWException.
+* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
+* (bug 39062) Special:Contributions will display changes that don't have
+  a parent id instead of just an empty bullet item.
+* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
+* wfMerge() now works if $wgDiff3 contains spaces
+* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
+  ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+  a fatal error.
+* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+  URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+  "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+  extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+  script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
+* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+
+=== API changes in 1.21 ===
+* prop=revisions can now report the contentmodel and contentformat.
+  See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+  parameters to control the interpretation of page content.
+  See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+  does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+* (bug 43137) Don't return the sha1 of revisions through the API if the content is
+  revision-deleted.
+* ApiQueryImageInfo now also returns imageinfo for redirects.
+* list=alltransclusions added to enumerate every instance of page embedding
+* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
+  the same query. When both are present, 'from' is simply ignored.
+* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
+  a list of all link/template target pages instead of source pages.
+* BREAKING CHANGE: list=logevents output format changed for details of some log
+  types. Specifically, details that were formerly reported under a key like
+  "4::foo" will now be reported under a key of simply "foo".
+* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
+  for all query modules.
+* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+  certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+  when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+  a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+  redirects.
+* On error, any warnings generated before that error will be shown in the result.
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
+* ApiQueryImageInfo continuation is more reliable. The only major change is
+  that the imagerepository property will no longer be set on page objects not
+  processed in the current query (i.e. non-images or those skipped due to
+  iicontinue).
+* Add supports for all pageset capabilities - generators, redirects, converttitles to
+  action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+  in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+  link trails and link prefixes. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+  particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+  currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+  HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+  the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+  used for action=upload's 'file' and 'chunk' parameters. This type will raise
+  an error during parameter validation if the parameter is given but not
+  recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+  querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+  proper error instead of as an uncaught exception.
+* (bug 25325) added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+
+=== API internal changes in 1.21 ===
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+  Never use on the production servers, as this flag introduces security holes.
+  Whenever enabled, a warning will also be added to all output.
+* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
+* Query stores prop/list/meta as submodules
+* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
+* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
+  first one keeping its meaning. ApiPageSet is now derived from ApiBase.
+* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
+* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
+
+=== Languages updated in 1.21 ===
+
+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.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+  for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+  as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
+  moved it to the Vector extension. It was entirely Vector-extension-specific,
+  deeply interconnected with the extension, and this functionality really
+  belongs to the extension instead of the skin anyway. In the unlikely case you
+  were using it, you have to either copy it to your extension, or install the
+  Vector extension (and possibly disable its features using config settings if
+  you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+  lowerCamelCase format, and made more explicit:
+  - clear_stats.php -> clearCacheStats.php
+  - clear_interwiki_cache.php -> clearInterwikiCache.php
+  - initStats.php -> initSiteStats.php
+  - proxy_check.php -> proxyCheck.php
+  - stats.php -> showCacheStats.php
+  - showStats.php -> showSiteStats.php.
+  Class names were renamed accordingly:
+  - clear_stats -> ClearCacheStats
+  - InitStats -> InitSiteStats
+  - CacheStats -> ShowCacheStats
+  - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+  and moved it to the TitleBlacklist extension.
 
 == MediaWiki 1.20 ==
 
index c77ff83..2ab652b 100644 (file)
@@ -18,6 +18,7 @@ production.
 * $wgBug34832TransitionalRollback has been removed.
 * (bug 29472) $wgUseDynamicDates has been removed and its functionality
   disabled.
+* $wgVectorUseIconWatch is now enabled by default.
 
 === New features in 1.21 ===
 * (bug 38110) Schema changes (adding or dropping tables, indices and
@@ -125,8 +126,11 @@ production.
   correctly.
 * (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
   is now non-significant and not preserved in the HTML output.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
 
 === Bug fixes in 1.21 ===
+* (bug 40617) Installer can now customize the logo in LocalSettings.php
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
 * (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
 * (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
@@ -210,8 +214,6 @@ production.
 * (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
 * (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
 * (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
-* WDDX formatted output will actually be formatted (and normal output will no
-  longer be), and will no longer choke on booleans.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
@@ -279,6 +281,15 @@ production.
 * (bug 33304) list=allpages will now find really old indefinite protections.
 * (bug 45937) meta=allmessages will report a syntactically invalid lang as a
   proper error instead of as an uncaught exception.
+* (bug 25325) added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+* The JSON output formatter now leaves forward slashes unescaped to improve human
+  readability of URLs and similar strings. Also, a "utf8" option is now provided
+  to use UTF-8 encoding instead of hex escape codes for most non-ASCII characters.
+* action=opensearch no longer silently ignores the format parameter.
+* action=opensearch now supports format=jsonfm.
 
 === API internal changes in 1.21 ===
 * For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
@@ -317,7 +328,7 @@ changes to languages because of Bugzilla reports.
   were using it, you have to either copy it to your extension, or install the
   Vector extension (and possibly disable its features using config settings if
   you don't want them).
-* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership.
 * BREAKING CHANGE: Filenames of maintenance scripts were standardized into
   lowerCamelCase format, and made more explicit:
   - clear_stats.php -> clearCacheStats.php
@@ -333,6 +344,21 @@ changes to languages because of Bugzilla reports.
   - ShowStats -> ShowSiteStats.
 * BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
   and moved it to the TitleBlacklist extension.
+* The Special:ActiveUsers special page was removed.
+* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
+  has changed:
+** MediaWiki no longer supports PHP installations in which the native JSON
+   extension is missing or disabled.
+** XmlJsCode objects can no longer be nested inside objects or arrays.
+   (For Xml::encodeJsCall(), this individually applies to each argument.)
+** The sets of characters escaped by default, along with the precise escape
+   sequences used, have changed (except for the Xml::escapeJsString()
+   function, which is now deprecated).
+* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
+  be sure to upgrade affected extensions at the same time (e.g. Collection).
+* Calling Linker methods using a skin will now output deprecation warnings.
+* Pages with a returnto (such as the page when you login or logout), no
+  longer have a rel="next" link tag.
 
 == Compatibility ==
 
diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
new file mode 100644 (file)
index 0000000..c0d4951
--- /dev/null
@@ -0,0 +1,124 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.22 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.22 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.22 ===
+* $wgRedirectScript was removed. It was unused.
+* Removed $wgLocalMessageCacheSerialized, it is now always true.
+* When $wgUseVFormUserLogin is true, the redesign of Special:UserLogin is
+  activated.
+
+=== New features in 1.22 ===
+* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
+* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
+  the "eIOPTZ" formatting characters.
+* EditWarning: A warning is shown when an editor leaves the edit form without
+  saving (enabled by default, users can opt-out via the 'useeditwarning'
+  preference). This feature was moved from the Vector extension, and is now part
+  of core for all skins. Take care when upgrading that you don't use an older
+  version of the Vector extension as this feature may conflict.
+* New version of Special:UserLogin form. It is opt-in for now, controlled by
+  the $wgUseVFormUserLogin setting or a 'useNew' URL parameter trigger.
+
+=== Bug fixes in 1.22 ===
+* Disable Special:PasswordReset when $wgEnableEmail. Previously one could still
+  navigate to the page by entering the URL directly.
+
+
+=== API changes in 1.22 ===
+* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
+  parameter has had no effect since MediaWiki 1.16, and so its removal is
+  unlikely to impact existing clients.
+
+=== Languages updated in 1.22===
+
+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.22 ===
+* redirect.php was removed. It was unused.
+* ClickTracking integration was dropped from the mediaWiki.user.bucket
+  JavaScript function. The 'tracked' option is now ignored.
+* BREAKING CHANGE: Legacy skins Simple, MySkin and Standard were all removed.
+  Nostalgia was moved to an extension.
+* Event namespace used by jquery.makeCollapsible has been changed from
+  'mw-collapse' to 'mw-collapsible' for consistency with the module name.
+* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
+  with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
+  $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
+  use AuthPlugin for external authentication/authorization needs.
+* The Quickbar feature of the legacy skin model and the last remnants of it
+  throughout the code base have been removed.
+* Externaledit/externaldiff preference was removed. Very few users used this
+  feature, and improper configuration can actually prevent a user from editing
+
+== Compatibility ==
+
+MediaWiki 1.22 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.22 has several database changes since 1.21, 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.
diff --git a/UPGRADE b/UPGRADE
index 7987b22..96b5836 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -296,18 +296,3 @@ If you have a very old database (earlier than organized MediaWiki releases
 in late August 2003) you may need to manually run some of the update SQL
 scripts in maintenance/archives before the installer is able to pick up
 with remaining updates.
-
-
-== Upgrading from UseModWiki or old "phase 2" Wikipedia code ==
-
-There is a semi-maintained UseModWiki to MediaWiki conversion script at
-maintenance/importUseModWiki.php; it may require tweaking and customization
-to work for you.
-
-Install a new MediaWiki first, then use the conversion script which will
-output SQL statements; direct these to a file and then run that into your
-database.
-
-You will have to rebuild the links tables etc after importing.
-
-
index d2d91c9..454711d 100644 (file)
@@ -8,7 +8,7 @@ and can be queried for the others, and for other attributes of the title. This
 is intended to be an immutable "value" class, so there are no mutator functions.
 
 To get a new instance, call Title::newFromText(). Once instantiated, the
-non-static accessor methods can be used, such as getText(), getDBKey(),
+non-static accessor methods can be used, such as getText(), getDBkey(),
 getNamespace(), etc. Note that Title::newFromText() may return false if the text
 is illegal according to the rules below.
 
@@ -36,11 +36,11 @@ An initial colon in a title listed in wiki text may however suppress special
 handling for interlanguage links, image links, and category links. It is also
 used to indicate the main namespace in template inclusions.
 
-Once prefixes have been stripped, the rest of the title processed this way: 
+Once prefixes have been stripped, the rest of the title processed this way:
 
 * Spaces and underscores are treated as equivalent and each  is converted to the
   other in the appropriate context (underscore in URL and database keys, spaces
-  in plain text). 
+  in plain text).
 * Multiple consecutive spaces are converted to a single space.
 * Leading or trailing space is removed.
 * If $wgCapitalLinks is enabled (the default), the first letter is  capitalised,
@@ -58,7 +58,7 @@ UTF-8, because that is the size of the database field. Special page titles may
 be up to 512 bytes.
 
 Note that Unicode Normal Form C (NFC) is enforced by MediaWiki's user interface
-input functions, and so titles will typically be in this form. 
+input functions, and so titles will typically be in this form.
 
 getArticleID() needs some explanation: for "internal" articles, it should return
 the "page_id" field if the article exists, else it returns 0. For all external
index 2e0c88b..dff3803 100644 (file)
@@ -374,18 +374,23 @@ abstract class FormAction extends Action {
         * Add pre- or post-text to the form
         * @return String HTML which will be sent to $form->addPreText()
         */
-       protected function preText() { return ''; }
+       protected function preText() {
+               return '';
+       }
 
        /**
         * @return string
         */
-       protected function postText() { return ''; }
+       protected function postText() {
+               return '';
+       }
 
        /**
         * Play with the HTMLForm if you need to more substantially
         * @param $form HTMLForm
         */
-       protected function alterForm( HTMLForm $form ) {}
+       protected function alterForm( HTMLForm $form ) {
+       }
 
        /**
         * Get the HTMLForm to control behavior
index 0b74f06..985271f 100644 (file)
@@ -39,7 +39,7 @@ class ArrayUtils {
         *
         * @return bool|int|string
         */
-       public static function pickRandom( $weights ){
+       public static function pickRandom( $weights ) {
                if ( !is_array( $weights ) || count( $weights ) == 0 ) {
                        return false;
                }
index 9b4afe4..d2f52bc 100644 (file)
@@ -988,8 +988,9 @@ class Article implements Page {
 
                                // Set the fragment if one was specified in the redirect
                                if ( strval( $this->getTitle()->getFragment() ) != '' ) {
-                                       $fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
-                                       $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
+                                       $outputPage->addInlineScript( Xml::encodeJsCall(
+                                               'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
+                                       ) );
                                }
 
                                // Add a <link rel="canonical"> tag
@@ -1188,7 +1189,7 @@ class Article implements Page {
                } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
                        # Give explanation and add a link to view the revision...
                        $oldid = intval( $this->getOldID() );
-                       $link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
+                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
index 42cea7a..88bb21b 100644 (file)
@@ -90,13 +90,11 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => 'includes/ChangesList.php',
        'ErrorPageError' => 'includes/Exception.php',
        'ExplodeIterator' => 'includes/StringUtils.php',
-       'ExternalEdit' => 'includes/ExternalEdit.php',
        'ExternalStore' => 'includes/externalstore/ExternalStore.php',
        'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
        'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
        'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
        'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
-       'ExternalUser' => 'includes/ExternalUser.php',
        'FakeTitle' => 'includes/FakeTitle.php',
        'Fallback' => 'includes/Fallback.php',
        'FatalError' => 'includes/Exception.php',
@@ -156,7 +154,6 @@ $wgAutoloadLocalClasses = array(
        'LCStore_CDB' => 'includes/cache/LocalisationCache.php',
        'LCStore_DB' => 'includes/cache/LocalisationCache.php',
        'LCStore_Null' => 'includes/cache/LocalisationCache.php',
-       'LegacyTemplate' => 'includes/SkinLegacy.php',
        'License' => 'includes/Licenses.php',
        'Licenses' => 'includes/Licenses.php',
        'Linker' => 'includes/Linker.php',
@@ -229,7 +226,6 @@ $wgAutoloadLocalClasses = array(
        'SiteStatsInit' => 'includes/SiteStats.php',
        'SiteStatsUpdate' => 'includes/SiteStats.php',
        'Skin' => 'includes/Skin.php',
-       'SkinLegacy' => 'includes/SkinLegacy.php',
        'SkinTemplate' => 'includes/SkinTemplate.php',
        'SpecialCreateAccount' => 'includes/SpecialPage.php',
        'SpecialListAdmins' => 'includes/SpecialPage.php',
@@ -243,6 +239,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialRedirectToSpecial' => 'includes/SpecialPage.php',
        'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
        'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
+       'StatCounter' => 'includes/StatCounter.php',
        'Status' => 'includes/Status.php',
        'StreamFile' => 'includes/StreamFile.php',
        'StringUtils' => 'includes/StringUtils.php',
@@ -474,7 +471,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/db
        'Blob' => 'includes/db/DatabaseUtility.php',
-       'ChronologyProtector' => 'includes/db/LBFactory.php',
+       'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
        'CloneDatabase' => 'includes/db/CloneDatabase.php',
        'DatabaseBase' => 'includes/db/Database.php',
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
@@ -544,11 +541,6 @@ $wgAutoloadLocalClasses = array(
        'WikiDiff3' => 'includes/diff/WikiDiff3.php',
        'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
 
-       # includes/extauth
-       'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
-       'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
-       'ExternalUser_vB' => 'includes/extauth/vB.php',
-
        # includes/filebackend
        'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
        'FileBackend' => 'includes/filebackend/FileBackend.php',
@@ -680,8 +672,6 @@ $wgAutoloadLocalClasses = array(
 
        # includes/json
        'FormatJson' => 'includes/json/FormatJson.php',
-       'Services_JSON' => 'includes/json/Services_JSON.php',
-       'Services_JSON_Error' => 'includes/json/Services_JSON.php',
 
        # includes/libs
        'CSSJanus' => 'includes/libs/CSSJanus.php',
@@ -701,7 +691,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/logging
        'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
+       'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
        'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
        'LogEntry' => 'includes/logging/LogEntry.php',
        'LogEventsList' => 'includes/logging/LogEventsList.php',
@@ -710,12 +700,12 @@ $wgAutoloadLocalClasses = array(
        'LogPage' => 'includes/logging/LogPage.php',
        'LogPager' => 'includes/logging/LogPager.php',
        'ManualLogEntry' => 'includes/logging/LogEntry.php',
-       'MoveLogFormatter' => 'includes/logging/LogFormatter.php',
-       'NewUsersLogFormatter' => 'includes/logging/LogFormatter.php',
+       'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
+       'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
        'PatrolLog' => 'includes/logging/PatrolLog.php',
-       'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
+       'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
        'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
+       'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
 
        # includes/media
        'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -891,7 +881,6 @@ $wgAutoloadLocalClasses = array(
        'SiteStore' => 'includes/site/SiteStore.php',
 
        # includes/specials
-       'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
        'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
        'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
        'BlockListPager' => 'includes/specials/SpecialBlockList.php',
@@ -936,7 +925,6 @@ $wgAutoloadLocalClasses = array(
        'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php',
        'RandomPage' => 'includes/specials/SpecialRandompage.php',
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
-       'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
        'SpecialAllmessages' => 'includes/specials/SpecialAllmessages.php',
        'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
@@ -1012,6 +1000,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/templates
        'UserloginTemplate' => 'includes/templates/Userlogin.php',
+       'UserloginTemplateVForm' => 'includes/templates/UserloginVForm.php',
        'UsercreateTemplate' => 'includes/templates/Usercreate.php',
 
        # includes/upload
@@ -1092,17 +1081,10 @@ $wgAutoloadLocalClasses = array(
        'CologneBlueTemplate' => 'skins/CologneBlue.php',
        'ModernTemplate' => 'skins/Modern.php',
        'MonoBookTemplate' => 'skins/MonoBook.php',
-       'NostalgiaTemplate' => 'skins/Nostalgia.php',
-       'SkinChick' => 'skins/Chick.php',
        'SkinCologneBlue' => 'skins/CologneBlue.php',
        'SkinModern' => 'skins/Modern.php',
        'SkinMonoBook' => 'skins/MonoBook.php',
-       'SkinMySkin' => 'skins/MySkin.php',
-       'SkinNostalgia' => 'skins/Nostalgia.php',
-       'SkinSimple' => 'skins/Simple.php',
-       'SkinStandard' => 'skins/Standard.php',
        'SkinVector' => 'skins/Vector.php',
-       'StandardTemplate' => 'skins/Standard.php',
        'VectorTemplate' => 'skins/Vector.php',
 );
 
index 7ee36ce..1d98a29 100644 (file)
@@ -801,7 +801,8 @@ class Block {
                        case self::TYPE_RANGE:
                                list( $start, /*...*/ ) = IP::parseRange( $this->target );
                                return $start;
-                       default: throw new MWException( "Block with invalid type" );
+                       default:
+                               throw new MWException( "Block with invalid type" );
                }
        }
 
@@ -819,7 +820,8 @@ class Block {
                        case self::TYPE_RANGE:
                                list( /*...*/, $end ) = IP::parseRange( $this->target );
                                return $end;
-                       default: throw new MWException( "Block with invalid type" );
+                       default:
+                               throw new MWException( "Block with invalid type" );
                }
        }
 
@@ -1074,6 +1076,192 @@ class Block {
                return null;
        }
 
+
+       /**
+        * Get all blocks that match any IP from an array of IP addresses
+        *
+        * @param Array $ipChain list of IPs (strings), usually retrieved from the
+        *         X-Forwarded-For header of the request
+        * @param Bool $isAnon Exclude anonymous-only blocks if false
+        * @param Bool $fromMaster Whether to query the master or slave database
+        * @return Array of Blocks
+        * @since 1.21
+        */
+       public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
+               if ( !count( $ipChain ) ) {
+                       return array();
+               }
+
+               wfProfileIn( __METHOD__ );
+               $conds = array();
+               foreach ( array_unique( $ipChain ) as $ipaddr ) {
+                       # Discard invalid IP addresses. Since XFF can be spoofed and we do not
+                       # necessarily trust the header given to us, make sure that we are only
+                       # checking for blocks on well-formatted IP addresses (IPv4 and IPv6).
+                       # Do not treat private IP spaces as special as it may be desirable for wikis
+                       # to block those IP ranges in order to stop misbehaving proxies that spoof XFF.
+                       if ( !IP::isValid( $ipaddr ) ) {
+                               continue;
+                       }
+                       # Don't check trusted IPs (includes local squids which will be in every request)
+                       if ( wfIsTrustedProxy( $ipaddr ) ) {
+                               continue;
+                       }
+                       # Check both the original IP (to check against single blocks), as well as build
+                       # the clause to check for rangeblocks for the given IP.
+                       $conds['ipb_address'][] = $ipaddr;
+                       $conds[] = self::getRangeCond( IP::toHex( $ipaddr ) );
+               }
+
+               if ( !count( $conds ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return array();
+               }
+
+               if ( $fromMaster ) {
+                       $db = wfGetDB( DB_MASTER );
+               } else {
+                       $db = wfGetDB( DB_SLAVE );
+               }
+               $conds = $db->makeList( $conds, LIST_OR );
+               if ( !$isAnon ) {
+                       $conds = array( $conds, 'ipb_anon_only' => 0 );
+               }
+               $selectFields = array_merge(
+                       array( 'ipb_range_start', 'ipb_range_end' ),
+                       Block::selectFields()
+               );
+               $rows = $db->select( 'ipblocks',
+                       $selectFields,
+                       $conds,
+                       __METHOD__
+               );
+
+               $blocks = array();
+               foreach ( $rows as $row ) {
+                       $block = self::newFromRow( $row );
+                       if ( !$block->deleteIfExpired()  ) {
+                               $blocks[] = $block;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $blocks;
+       }
+
+       /**
+        * From a list of multiple blocks, find the most exact and strongest Block.
+        * The logic for finding the "best" block is:
+        *  - Blocks that match the block's target IP are preferred over ones in a range
+        *  - Hardblocks are chosen over softblocks that prevent account creation
+        *  - Softblocks that prevent account creation are chosen over other softblocks
+        *  - Other softblocks are chosen over autoblocks
+        *  - If there are multiple exact or range blocks at the same level, the one chosen
+        *    is random
+
+        * @param Array $ipChain list of IPs (strings). This is used to determine how "close"
+        *        a block is to the server, and if a block matches exactly, or is in a range.
+        *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+        *        local-squid, ...)
+        * @param Array $block Array of blocks
+        * @return Block|null the "best" block from the list
+        */
+       public static function chooseBlock( array $blocks, array $ipChain  ) {
+               if ( !count( $blocks ) ) {
+                       return null;
+               } elseif ( count( $blocks ) == 1 ) {
+                       return $blocks[0];
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               // Sort hard blocks before soft ones and secondarily sort blocks
+               // that disable account creation before those that don't.
+               usort( $blocks, function( Block $a, Block $b ) {
+                       $aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
+                       $bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
+                       return strcmp( $bWeight, $aWeight ); // highest weight first
+               } );
+
+               $blocksListExact = array(
+                       'hard' => false,
+                       'disable_create' => false,
+                       'other' => false,
+                       'auto' => false
+               );
+               $blocksListRange = array(
+                       'hard' => false,
+                       'disable_create' => false,
+                       'other' => false,
+                       'auto' => false
+               );
+               $ipChain = array_reverse( $ipChain );
+
+               foreach ( $blocks as $block ) {
+                       // Stop searching if we have already have a "better" block. This
+                       // is why the order of the blocks matters
+                       if ( !$block->isHardblock() && $blocksListExact['hard'] ) {
+                               break;
+                       } elseif ( !$block->prevents( 'createaccount' ) && $blocksListExact['disable_create'] ) {
+                               break;
+                       }
+
+                       foreach ( $ipChain as $checkip ) {
+                               $checkipHex = IP::toHex( $checkip );
+                               if ( (string)$block->getTarget() === $checkip ) {
+                                       if ( $block->isHardblock() ) {
+                                               $blocksListExact['hard'] = $blocksListExact['hard'] ?: $block;
+                                       } elseif ( $block->prevents( 'createaccount' ) ) {
+                                               $blocksListExact['disable_create'] = $blocksListExact['disable_create'] ?: $block;
+                                       } elseif ( $block->mAuto ) {
+                                               $blocksListExact['auto'] = $blocksListExact['auto'] ?: $block;
+                                       } else {
+                                               $blocksListExact['other'] = $blocksListExact['other'] ?: $block;
+                                       }
+                                       // We found closest exact match in the ip list, so go to the next Block
+                                       break;
+                               } elseif ( array_filter( $blocksListExact ) == array()
+                                       && $block->getRangeStart() <= $checkipHex
+                                       && $block->getRangeEnd() >= $checkipHex
+                               ) {
+                                       if ( $block->isHardblock() ) {
+                                               $blocksListRange['hard'] = $blocksListRange['hard'] ?: $block;
+                                       } elseif ( $block->prevents( 'createaccount' ) ) {
+                                               $blocksListRange['disable_create'] = $blocksListRange['disable_create'] ?: $block;
+                                       } elseif ( $block->mAuto ) {
+                                               $blocksListRange['auto'] = $blocksListRange['auto'] ?: $block;
+                                       } else {
+                                               $blocksListRange['other'] = $blocksListRange['other'] ?: $block;
+                                       }
+                                       break;
+                               }
+                       }
+               }
+
+               if ( array_filter( $blocksListExact ) == array() ) {
+                       $blocksList = &$blocksListRange;
+               } else {
+                       $blocksList = &$blocksListExact;
+               }
+
+               $chosenBlock = null;
+               if ( $blocksList['hard'] ) {
+                       $chosenBlock = $blocksList['hard'];
+               } elseif ( $blocksList['disable_create'] ) {
+                       $chosenBlock = $blocksList['disable_create'];
+               } elseif ( $blocksList['other'] ) {
+                       $chosenBlock = $blocksList['other'];
+               } elseif ( $blocksList['auto'] ) {
+                       $chosenBlock = $blocksList['auto'];
+               } else {
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( "Proxy block found, but couldn't be classified." );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $chosenBlock;
+       }
+
        /**
         * From an existing Block, get the target and the type of target.
         * Note that, except for null, it is always safe to treat the target
index 868d6c4..126b8fe 100644 (file)
@@ -40,7 +40,8 @@ class Category {
        /** Counts of membership (cat_pages, cat_subcats, cat_files) */
        private $mPages = null, $mSubcats = null, $mFiles = null;
 
-       private function __construct() { }
+       private function __construct() {
+       }
 
        /**
         * Set up all member variables using a database query.
index 71b55f8..e16397b 100644 (file)
@@ -411,7 +411,7 @@ class CdbWriter_PHP extends CdbWriter {
                // Calculate the number of items that will be in each hashtable
                $counts = array_fill( 0, 256, 0 );
                foreach ( $this->hplist as $item ) {
-                       ++ $counts[ 255 & $item['h'] ];
+                       ++ $counts[255 & $item['h']];
                }
 
                // Fill in $starts with the *end* indexes
index 476de5b..8b8b94e 100644 (file)
@@ -146,7 +146,7 @@ class ChangesFeed {
                        $feedLastmodUnix = wfTimestamp( TS_UNIX, $feedLastmod );
                        $lastmodUnix = wfTimestamp( TS_UNIX, $lastmod );
 
-                       if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix) {
+                       if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
                                wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
                                if ( $feedLastmodUnix < $lastmodUnix ) {
                                        $wgOut->setLastModified( $feedLastmod ); // bug 21916
@@ -187,7 +187,7 @@ class ChangesFeed {
 
                foreach( $sorted as $obj ) {
                        $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
-                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullUrl() : '';
+                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
                        // Skip items with deleted content (avoids partially complete/inconsistent output)
                        if( $obj->rc_deleted ) continue;
 
index 8461001..0c4d69e 100644 (file)
@@ -936,7 +936,7 @@ class EnhancedChangesList extends ChangesList {
                krsort( $userlinks );
                asort( $userlinks );
                $users = array();
-               foreach( $userlinks as $userlink => $count) {
+               foreach( $userlinks as $userlink => $count ) {
                        $text = $userlink;
                        $text .= $this->getLanguage()->getDirMark();
                        if( $count > 1 ) {
index 3f0fa7b..21448f7 100644 (file)
@@ -208,14 +208,12 @@ class IcuCollation extends Collation {
                'be-tarask' => array( "Ё" ),
                'en' => array(),
                'fi' => array( "Å", "Ä", "Ö" ),
-               '-fi' => array( "Ǥ", "Ŋ", "Ŧ", "Ʒ" ), // sorted like G, N, T, Z - bug 46330
                'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
                'it' => array(),
                'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
                'pt' => array(),
                'ru' => array(),
                'sv' => array( "Å", "Ä", "Ö" ),
-               '-sv' => array( "Þ" ), // sorted as "th" in Swedish, causing unexpected output - bug 45446
                'uk' => array( "Ґ", "Ь" ),
                'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
                // Not verified, but likely correct
@@ -364,8 +362,8 @@ class IcuCollation extends Collation {
                        // Append additional characters
                        $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
                        // Remove unnecessary ones, if any
-                       if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
-                               $letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+                       if ( isset( self::$tailoringFirstLetters['-' . $this->locale] ) ) {
+                               $letters = array_diff( $letters, self::$tailoringFirstLetters['-' . $this->locale] );
                        }
                } else {
                        $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
@@ -397,6 +395,72 @@ class IcuCollation extends Collation {
                        }
                }
                ksort( $letterMap, SORT_STRING );
+               // Remove duplicate prefixes. Basically if something has a sortkey
+               // which is a prefix of some other sortkey, then it is an
+               // expansion and probably should not be considered a section
+               // header.
+               //
+               // For example 'þ' is sometimes sorted as if it is the letters
+               // 'th'. Other times it is its own primary element. Another
+               // example is '₨'. Sometimes its a currency symbol. Sometimes it
+               // is an 'R' followed by an 's'.
+               //
+               // Additionally an expanded element should always sort directly
+               // after its first element due to they way sortkeys work.
+               //
+               // UCA sortkey elements are of variable length but no collation
+               // element should be a prefix of some other element, so I think
+               // this is safe. See:
+               // * https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
+               // * http://site.icu-project.org/design/collation/uca-weight-allocation
+               //
+               // Additionally, there is something called primary compression to
+               // worry about. Basically, if you have two primary elements that
+               // are more than one byte and both start with the same byte then
+               // the first byte is dropped on the second primary. Additionally
+               // either \x03 or \xFF may be added to mean that the next primary
+               // does not start with the first byte of the first primary.
+               //
+               // This shouldn't matter much, as the first primary is not
+               // changed, and that is what we are comparing against.
+               //
+               // tl;dr: This makes some assumptions about how icu implements
+               // collations. It seems incredibly unlikely these assumptions
+               // will change, but nonetheless they are assumptions.
+
+               $prev = false;
+               $duplicatePrefixes = array();
+               foreach( $letterMap as $key => $value ) {
+                       // Remove terminator byte. Otherwise the prefix
+                       // comparison will get hung up on that.
+                       $trimmedKey = rtrim( $key, "\0" );
+                       if ( $prev === false || $prev === '' ) {
+                               $prev = $trimmedKey;
+                               // We don't yet have a collation element
+                               // to compare against, so continue.
+                               continue;
+                       }
+
+                       // Due to the fact the array is sorted, we only have
+                       // to compare with the element directly previous
+                       // to the current element (skipping expansions).
+                       // An element "X" will always sort directly
+                       // before "XZ" (Unless we have "XY", but we
+                       // do not update $prev in that case).
+                       if ( substr( $trimmedKey, 0, strlen( $prev ) ) === $prev ) {
+                               $duplicatePrefixes[] = $key;
+                               // If this is an expansion, we don't want to
+                               // compare the next element to this element,
+                               // but to what is currently $prev
+                               continue;
+                       }
+                       $prev = $trimmedKey;
+               }
+               foreach( $duplicatePrefixes as $badKey ) {
+                       wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
+                       unset( $letterMap[$badKey] );
+                       // This code assumes that unsetting does not change sort order.
+               }
                $data = array(
                        'chars' => array_values( $letterMap ),
                        'keys' => array_keys( $letterMap ),
index 26fe197..0a193df 100644 (file)
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.21alpha';
+$wgVersion = '1.22alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -171,14 +171,6 @@ $wgScriptExtension = '.php';
  */
 $wgScript = false;
 
-/**
- * The URL path to redirect.php. This is a script that is used by the Nostalgia
- * skin.
- *
- * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
- */
-$wgRedirectScript = false;
-
 /**
  * The URL path to load.php.
  *
@@ -1900,13 +1892,6 @@ $wgMemCachedTimeout = 500000;
  */
 $wgUseLocalMessageCache = false;
 
-/**
- * Defines format of local cache.
- *  - true: Serialized object
- *  - false: PHP source file (Warning - security risk)
- */
-$wgLocalMessageCacheSerialized = true;
-
 /**
  * Instead of caching everything, only cache those messages which have
  * been customised in the site content language. This means that
@@ -2841,7 +2826,14 @@ $wgVectorUseSimpleSearch = true;
  *  - true = use an icon watch/unwatch button
  *  - false = use watch/unwatch text link
  */
-$wgVectorUseIconWatch = false;
+$wgVectorUseIconWatch = true;
+
+/**
+ * Use VForm design for Special:Userlogin.  This can be overridden by
+ * a useNew bool in the query string.  For instance, if it is globally
+ * false, you can try it with useNew=1.
+ */
+$wgUseVFormUserLogin = false;
 
 /**
  * Display user edit counts in various prominent places.
@@ -3662,8 +3654,6 @@ $wgDefaultUserOptions = array(
        'enotifusertalkpages' => 1,
        'enotifwatchlistpages' => 0,
        'extendwatchlist' => 0,
-       'externaldiff' => 0,
-       'externaleditor' => 0,
        'fancysig' => 0,
        'forceeditsummary' => 0,
        'gender' => 'unknown',
@@ -3680,7 +3670,6 @@ $wgDefaultUserOptions = array(
        'numberheadings' => 0,
        'previewonfirst' => 0,
        'previewontop' => 1,
-       'quickbar' => 5,
        'rcdays' => 7,
        'rclimit' => 50,
        'rememberpassword' => 0,
@@ -3709,6 +3698,7 @@ $wgDefaultUserOptions = array(
        'watchlisthidepatrolled' => 0,
        'watchmoves' => 0,
        'wllimit' => 250,
+       'useeditwarning' => 1,
 );
 
 /** An array of preferences to not show for the user */
@@ -3732,63 +3722,6 @@ $wgInvalidUsernameCharacters = '@';
  */
 $wgUserrightsInterwikiDelimiter = '@';
 
-/**
- * Use some particular type of external authentication.  The specific
- * authentication module you use will normally require some extra settings to
- * be specified.
- *
- * null indicates no external authentication is to be used.  Otherwise,
- * $wgExternalAuthType must be the name of a non-abstract class that extends
- * ExternalUser.
- *
- * Core authentication modules can be found in includes/extauth/.
- */
-$wgExternalAuthType = null;
-
-/**
- * Configuration for the external authentication.  This may include arbitrary
- * keys that depend on the authentication mechanism.  For instance,
- * authentication against another web app might require that the database login
- * info be provided.  Check the file where your auth mechanism is defined for
- * info on what to put here.
- */
-$wgExternalAuthConf = array();
-
-/**
- * When should we automatically create local accounts when external accounts
- * already exist, if using ExternalAuth?  Can have three values: 'never',
- * 'login', 'view'.  'view' requires the external database to support cookies,
- * and implies 'login'.
- *
- * TODO: Implement 'view' (currently behaves like 'login').
- */
-$wgAutocreatePolicy = 'login';
-
-/**
- * Policies for how each preference is allowed to be changed, in the presence
- * of external authentication.  The keys are preference keys, e.g., 'password'
- * or 'emailaddress' (see Preferences.php et al.).  The value can be one of the
- * following:
- *
- * - local: Allow changes to this pref through the wiki interface but only
- * apply them locally (default).
- * - semiglobal: Allow changes through the wiki interface and try to apply them
- * to the foreign database, but continue on anyway if that fails.
- * - global: Allow changes through the wiki interface, but only let them go
- * through if they successfully update the foreign database.
- * - message: Allow no local changes for linked accounts; replace the change
- * form with a message provided by the auth plugin, telling the user how to
- * change the setting externally (maybe providing a link, etc.).  If the auth
- * plugin provides no message for this preference, hide it entirely.
- *
- * Accounts that are not linked to an external account are never affected by
- * this setting.  You may want to look at $wgHiddenPrefs instead.
- * $wgHiddenPrefs supersedes this option.
- *
- * TODO: Implement message, global.
- */
-$wgAllowPrefChange = array();
-
 /**
  * This is to let user authenticate using https when they come from http.
  * Based on an idea by George Herbert on wikitech-l:
@@ -4324,6 +4257,13 @@ $wgSorbsUrl = array();
  */
 $wgProxyWhitelist = array();
 
+/**
+ * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
+ * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
+ * (transparent) proxies without needing to block the proxies themselves.
+ */
+$wgApplyIpBlocksToXff = false;
+
 /**
  * Simple rate limiter options to brake edit floods.
  *
@@ -4995,12 +4935,6 @@ $wgPreviewOnOpenNamespaces = array(
        NS_CATEGORY => true
 );
 
-/**
- * Activate external editor interface for files and pages
- * See http://www.mediawiki.org/wiki/Manual:External_editors
- */
-$wgUseExternalEditor = true;
-
 /** Go button goes straight to the edit screen if the article doesn't exist. */
 $wgGoToEdit = false;
 
index c4a8633..28847db 100644 (file)
@@ -197,8 +197,8 @@ define( 'EDIT_AUTOSUMMARY', 64 );
 define( 'LIST_COMMA', 0 );
 define( 'LIST_AND', 1 );
 define( 'LIST_SET', 2 );
-define( 'LIST_NAMES', 3);
-define( 'LIST_OR', 4);
+define( 'LIST_NAMES', 3 );
+define( 'LIST_OR', 4 );
 /**@}*/
 
 /**
index 8b2dbb5..86a7a77 100644 (file)
@@ -100,7 +100,7 @@ class EditPage {
 
        /**
         * Status: user tried to create this page, but is not allowed to do that
-        * ( Title->usercan('create') == false )
+        * ( Title->userCan('create') == false )
         */
        const AS_NO_CREATE_PERMISSION = 223;
 
@@ -487,7 +487,7 @@ class EditPage {
                        // The edit page was reached via a red link.
                        // Redirect to the article page and let them click the edit tab if
                        // they really want a permission error.
-                       $wgOut->redirect( $this->mTitle->getFullUrl() );
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
                        return;
                }
 
@@ -540,7 +540,7 @@ class EditPage {
                        // The edit page was reached via a red link.
                        // Redirect to the article page and let them click the edit tab if
                        // they really want a permission error.
-                       $wgOut->redirect( $this->mTitle->getFullUrl() );
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
                } else {
                        $wgOut->readOnlyPage( $source, $protected, $reasons, $action );
                }
@@ -621,6 +621,7 @@ class EditPage {
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
 
                if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+                       wfProfileOut( __METHOD__ );
                        throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
                }
 
@@ -1889,6 +1890,11 @@ class EditPage {
                if ( $wgUser->getOption( 'uselivepreview', false ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.preview' );
                }
+
+               if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+                       $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
+               }
+
                // Bug #19334: textarea jumps when editing articles in IE8
                $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
 
index 0bd7a2a..661d03d 100644 (file)
@@ -75,11 +75,11 @@ class MWException extends Exception {
                        return null; // Just silently ignore
                }
 
-               if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
+               if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[$name] ) ) {
                        return null;
                }
 
-               $hooks = $wgExceptionHooks[ $name ];
+               $hooks = $wgExceptionHooks[$name];
                $callargs = array_merge( array( $this ), $args );
 
                foreach ( $hooks as $hook ) {
@@ -130,8 +130,7 @@ class MWException extends Exception {
                                '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
                                "</p>\n";
                } else {
-                       return
-                               "<div class=\"errorbox\">" .
+                       return "<div class=\"errorbox\">" .
                                '[' . $this->getLogId() . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) .
                                ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
@@ -248,7 +247,7 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
-               global $wgLogExceptionBacktrace;
+               global $wgLogExceptionBacktrace, $wgMimeType;
                $log = $this->getLogMessage();
 
                if ( $log ) {
@@ -268,6 +267,7 @@ class MWException extends Exception {
                } else {
                        header( "HTTP/1.1 500 MediaWiki exception" );
                        header( "Status: 500 MediaWiki exception", true );
+                       header( "Content-Type: $wgMimeType; charset=utf-8", true );
 
                        $this->reportHTML();
                }
@@ -329,11 +329,17 @@ class ErrorPageError extends MWException {
                $this->msg = $msg;
                $this->params = $params;
 
+               // Bug 44111: Messages in the log files should be in English and not
+               // customized by the local wiki. So get the default English version for
+               // passing to the parent constructor. Our overridden report() below
+               // makes sure that the page shown to the user is not forced to English.
                if( $msg instanceof Message ) {
-                       parent::__construct( $msg );
+                       $enMsg = clone( $msg );
                } else {
-                       parent::__construct( wfMessage( $msg )->text() );
+                       $enMsg = wfMessage( $msg, $params );
                }
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               parent::__construct( $enMsg->text() );
        }
 
        function report() {
@@ -715,8 +721,10 @@ class MWExceptionHandler {
                // Final cleanup
                if ( $wgFullyInitialised ) {
                        try {
-                               wfLogProfilingData(); // uses $wgRequest, hence the $wgFullyInitialised condition
-                       } catch ( Exception $e ) {}
+                               // uses $wgRequest, hence the $wgFullyInitialised condition
+                               wfLogProfilingData();
+                       } catch ( Exception $e ) {
+                       }
                }
 
                // Exit value should be nonzero for the benefit of shell jobs
index d8cc024..996c14b 100644 (file)
@@ -296,6 +296,7 @@ class WikiExporter {
                                }
 
                                // Inform caller about problem
+                               wfProfileOut( __METHOD__ );
                                throw $e;
                        }
                # For page dumps...
@@ -541,7 +542,7 @@ class XmlDumpWriter {
         * @return string
         */
        function homelink() {
-               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
+               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
        }
 
        /**
@@ -563,8 +564,9 @@ class XmlDumpWriter {
                foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
                        $spaces .= '      ' .
                                Xml::element( 'namespace',
-                                       array(  'key' => $ns,
-                                                       'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+                                       array(
+                                               'key' => $ns,
+                                               'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
                                        ), $title ) . "\n";
                }
                $spaces .= "    </namespaces>";
@@ -837,7 +839,7 @@ class XmlDumpWriter {
                        "      " . $comment . "\n" .
                        "      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
                        $archiveName .
-                       "      " . Xml::element( 'src', null, $file->getCanonicalUrl() ) . "\n" .
+                       "      " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
                        "      " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
                        "      " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
                        "      " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
deleted file mode 100644 (file)
index 11e9423..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * External editors support
- *
- * License: Public domain
- *
- * @file
- * @author Erik Moeller <moeller@scireview.de>
- */
-
-/**
- * Support for external editors to modify both text and files
- * in external applications. It works as follows: MediaWiki
- * sends a meta-file with the MIME type 'application/x-external-editor'
- * to the client. The user has to associate that MIME type with
- * a helper application (a reference implementation in Perl
- * can be found in extensions/ee), which will launch the editor,
- * and save the modified data back to the server.
- *
- */
-class ExternalEdit extends ContextSource {
-
-       /**
-        * Array of URLs to link to
-        * @var Array
-        */
-       private $urls;
-
-       /**
-        * Constructor
-        * @param $context IContextSource context to use
-        * @param $urls array
-        */
-       public function __construct( IContextSource $context, array $urls = array() ) {
-               $this->setContext( $context );
-               $this->urls = $urls;
-       }
-
-       /**
-        * Check whether external edit or diff should be used.
-        *
-        * @param $context IContextSource context to use
-        * @param string $type can be either 'edit' or 'diff'
-        * @return Bool
-        */
-       public static function useExternalEngine( IContextSource $context, $type ) {
-               global $wgUseExternalEditor;
-
-               if ( !$wgUseExternalEditor ) {
-                       return false;
-               }
-
-               $pref = $type == 'diff' ? 'externaldiff' : 'externaleditor';
-               $request = $context->getRequest();
-
-               return !$request->getVal( 'internaledit' ) &&
-                       ( $context->getUser()->getOption( $pref ) || $request->getVal( 'externaledit' ) );
-       }
-
-       /**
-        * Output the information for the external editor
-        */
-       public function execute() {
-               global $wgContLang, $wgScript, $wgScriptPath, $wgCanonicalServer;
-
-               $this->getOutput()->disable();
-
-               $response = $this->getRequest()->response();
-               $response->header( 'Content-type: application/x-external-editor; charset=utf-8' );
-               $response->header( 'Cache-control: no-cache' );
-
-               $special = $wgContLang->getNsText( NS_SPECIAL );
-
-               # $type can be "Edit text", "Edit file" or "Diff text" at the moment
-               # See the protocol specifications at [[m:Help:External editors/Tech]] for
-               # details.
-               if ( count( $this->urls ) ) {
-                       $urls = $this->urls;
-                       $type = "Diff text";
-               } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
-                       $type = "Edit file";
-                       $image = wfLocalFile( $this->getTitle() );
-                       if ( $image ) {
-                               $urls = array(
-                                       'File' => array(
-                                               'Extension' => $image->getExtension(),
-                                               'URL' => $image->getCanonicalURL()
-                                       )
-                               );
-                       } else {
-                               $urls = array();
-                       }
-               } else {
-                       $type = "Edit text";
-                       # *.wiki file extension is used by some editors for syntax
-                       # highlighting, so we follow that convention
-                       $urls = array( 'File' => array(
-                               'Extension' => 'wiki',
-                               'URL' => $this->getTitle()->getCanonicalURL(
-                                       array( 'action' => 'edit', 'internaledit' => 'true' ) )
-                       ) );
-               }
-
-               $files = '';
-               foreach( $urls as $key => $vars ) {
-                       $files .= "\n[$key]\n";
-                       foreach( $vars as $varname => $varval ) {
-                               $files .= "$varname=$varval\n";
-                       }
-               }
-
-               $url = $this->getTitle()->getFullURL(
-                       $this->getRequest()->appendQueryValue( 'internaledit', 1, true ) );
-
-               $control = <<<CONTROL
-; You're seeing this file because you're using Mediawiki's External Editor feature.
-; This is probably because you selected use external editor in your preferences.
-; To edit normally, either disable that preference or go to the URL:
-; $url
-; See http://www.mediawiki.org/wiki/Manual:External_editors for details.
-[Process]
-Type=$type
-Engine=MediaWiki
-Script={$wgCanonicalServer}{$wgScript}
-Server={$wgCanonicalServer}
-Path={$wgScriptPath}
-Special namespace=$special
-$files
-CONTROL;
-               echo $control;
-       }
-}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
deleted file mode 100644 (file)
index 580b989..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- * Authentication with a foreign database
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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
- */
-
-/**
- * @defgroup ExternalUser ExternalUser
- */
-
-/**
- * A class intended to supplement, and perhaps eventually replace, AuthPlugin.
- * See: http://www.mediawiki.org/wiki/ExternalAuth
- *
- * The class represents a user whose data is in a foreign database.  The
- * database may have entirely different conventions from MediaWiki, but it's
- * assumed to at least support the concept of a user id (possibly not an
- * integer), a user name (possibly not meeting MediaWiki's username
- * requirements), and a password.
- *
- * @ingroup ExternalUser
- */
-abstract class ExternalUser {
-       protected function __construct() {}
-
-       /**
-        * Wrappers around initFrom*().
-        */
-
-       /**
-        * @param $name string
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromName( $name ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromName( $name ) ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * @param $id string
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromId( $id ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromId( $id ) ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromCookie() {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromCookie() ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * Creates the object corresponding to the given User object, assuming the
-        * user exists on the wiki and is linked to an external account.  If either
-        * of these is false, this will return false.
-        *
-        * This is a wrapper around newFromId().
-        *
-        * @param $user User
-        * @return ExternalUser|bool False on failure
-        */
-       public static function newFromUser( $user ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       # Short-circuit to avoid database query in common case so no one
-                       # kills me
-                       return false;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $id = $dbr->selectField( 'external_user', 'eu_external_id',
-                       array( 'eu_local_id' => $user->getId() ), __METHOD__ );
-               if ( $id === false ) {
-                       return false;
-               }
-               return self::newFromId( $id );
-       }
-
-       /**
-        * Given a name, which is a string exactly as input by the user in the
-        * login form but with whitespace stripped, initialize this object to be
-        * the corresponding ExternalUser.  Return true if successful, otherwise
-        * false.
-        *
-        * @param $name string
-        * @return bool Success?
-        */
-       abstract protected function initFromName( $name );
-
-       /**
-        * Given an id, which was at some previous point in history returned by
-        * getId(), initialize this object to be the corresponding ExternalUser.
-        * Return true if successful, false otherwise.
-        *
-        * @param $id string
-        * @return bool Success?
-        */
-       abstract protected function initFromId( $id );
-
-       /**
-        * Try to magically initialize the user from cookies or similar information
-        * so he or she can be logged in on just viewing the wiki.  If this is
-        * impossible to do, just return false.
-        *
-        * TODO: Actually use this.
-        *
-        * @return bool Success?
-        */
-       protected function initFromCookie() {
-               return false;
-       }
-
-       /**
-        * This must return some identifier that stably, uniquely identifies the
-        * user.  In a typical web application, this could be an integer
-        * representing the "user id".  In other cases, it might be a string.  In
-        * any event, the return value should be a string between 1 and 255
-        * characters in length; must uniquely identify the user in the foreign
-        * database; and, if at all possible, should be permanent.
-        *
-        * This will only ever be used to reconstruct this ExternalUser object via
-        * newFromId().  The resulting object in that case should correspond to the
-        * same user, even if details have changed in the interim (e.g., renames or
-        * preference changes).
-        *
-        * @return string
-        */
-       abstract public function getId();
-
-       /**
-        * This must return the name that the user would normally use for login to
-        * the external database.  It is subject to no particular restrictions
-        * beyond rudimentary sanity, and in particular may be invalid as a
-        * MediaWiki username.  It's used to auto-generate an account name that
-        * *is* valid for MediaWiki, either with or without user input, but
-        * basically is only a hint.
-        *
-        * @return string
-        */
-       abstract public function getName();
-
-       /**
-        * Is the given password valid for the external user?  The password is
-        * provided in plaintext.
-        *
-        * @param $password string
-        * @return bool
-        */
-       abstract public function authenticate( $password );
-
-       /**
-        * Retrieve the value corresponding to the given preference key.  The most
-        * important values are:
-        *
-        * - emailaddress
-        * - language
-        *
-        * The value must meet MediaWiki's requirements for values of this type,
-        * and will be checked for validity before use.  If the preference makes no
-        * sense for the backend, or it makes sense but is unset for this user, or
-        * is unrecognized, return null.
-        *
-        * $pref will never equal 'password', since passwords are usually hashed
-        * and cannot be directly retrieved.  authenticate() is used for this
-        * instead.
-        *
-        * TODO: Currently this is only called for 'emailaddress'; generalize!  Add
-        * some config option to decide which values are grabbed on user
-        * initialization.
-        *
-        * @param $pref string
-        * @return mixed
-        */
-       public function getPref( $pref ) {
-               return null;
-       }
-
-       /**
-        * Return an array of identifiers for all the foreign groups that this user
-        * has.  The identifiers are opaque objects that only need to be
-        * specifiable by the administrator in LocalSettings.php when configuring
-        * $wgAutopromote.  They may be, for instance, strings or integers.
-        *
-        * TODO: Support this in $wgAutopromote.
-        *
-        * @return array
-        */
-       public function getGroups() {
-               return array();
-       }
-
-       /**
-        * Given a preference key (e.g., 'emailaddress'), provide an HTML message
-        * telling the user how to change it in the external database.  The
-        * administrator has specified that this preference cannot be changed on
-        * the wiki, and may only be changed in the foreign database.  If no
-        * message is available, such as for an unrecognized preference, return
-        * false.
-        *
-        * TODO: Use this somewhere.
-        *
-        * @param $pref string
-        * @return mixed String or false
-        */
-       public static function getPrefMessage( $pref ) {
-               return false;
-       }
-
-       /**
-        * Set the given preference key to the given value.  Two important
-        * preference keys that you might want to implement are 'password' and
-        * 'emailaddress'.  If the set fails, such as because the preference is
-        * unrecognized or because the external database can't be changed right
-        * now, return false.  If it succeeds, return true.
-        *
-        * If applicable, you should make sure to validate the new value against
-        * any constraints the external database may have, since MediaWiki may have
-        * more limited constraints (e.g., on password strength).
-        *
-        * TODO: Untested.
-        *
-        * @param $key string
-        * @param $value string
-        * @return bool Success?
-        */
-       public static function setPref( $key, $value ) {
-               return false;
-       }
-
-       /**
-        * Create a link for future reference between this object and the provided
-        * user_id.  If the user was already linked, the old link will be
-        * overwritten.
-        *
-        * This is part of the core code and is not overridable by specific
-        * plugins.  It's in this class only for convenience.
-        *
-        * @param int $id user_id
-        */
-       final public function linkToLocal( $id ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'external_user',
-                       array( 'eu_local_id', 'eu_external_id' ),
-                       array( 'eu_local_id' => $id,
-                               'eu_external_id' => $this->getId() ),
-                       __METHOD__ );
-       }
-
-       /**
-        * Check whether this external user id is already linked with
-        * a local user.
-        * @return Mixed User if the account is linked, Null otherwise.
-        */
-       final public function getLocalUser() {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow(
-                       'external_user',
-                       '*',
-                       array( 'eu_external_id' => $this->getId() )
-               );
-               return $row
-                       ? User::newFromId( $row->eu_local_id )
-                       : null;
-       }
-
-}
index adc1f78..57d8c0b 100644 (file)
@@ -223,7 +223,7 @@ class FeedUtils {
                $queryParameters = ($oldid == null)
                        ? "diff={$newid}"
                        : "diff={$newid}&oldid={$oldid}";
-               $diffUrl = $title->getFullUrl( $queryParameters );
+               $diffUrl = $title->getFullURL( $queryParameters );
 
                $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
                        wfMessage( 'showdiff' )->inContentLanguage()->text() );
index 28403cc..9ce2f76 100644 (file)
@@ -379,7 +379,7 @@ class FileDeleteForm {
                        $q['oldimage'] = $this->oldimage;
                }
 
-               return $this->title->getLocalUrl( $q );
+               return $this->title->getLocalURL( $q );
        }
 
        /**
index e1e1234..751f4af 100644 (file)
@@ -1093,16 +1093,29 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
 
 /**
  * Send a warning either to the debug log or in a PHP error depending on
- * $wgDevelopmentWarnings
+ * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
  *
  * @param string $msg message to send
  * @param $callerOffset Integer: number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
- * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
- *        is true
+ * @param $level Integer: PHP error level; defaults to E_USER_NOTICE;
+ *        only used when $wgDevelopmentWarnings is true
  */
 function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
-       MWDebug::warning( $msg, $callerOffset + 1, $level );
+       MWDebug::warning( $msg, $callerOffset + 1, $level, 'auto' );
+}
+
+/**
+ * Send a warning as a PHP error and the debug log. This is intended for logging
+ * warnings in production. For logging development warnings, use WfWarn instead.
+ *
+ * @param $msg String: message to send
+ * @param $callerOffset Integer: number of items to go back in the backtrace to
+ *        find the correct caller (1 = function calling wfLogWarning, ...)
+ * @param $level Integer: PHP error level; defaults to E_USER_WARNING
+ */
+function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
+       MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
 }
 
 /**
@@ -1177,6 +1190,8 @@ function wfLogProfilingData() {
        global $wgRequestTime, $wgDebugLogFile, $wgDebugRawPage, $wgRequest;
        global $wgProfileLimit, $wgUser;
 
+       StatCounter::singleton()->flush();
+
        $profiler = Profiler::instance();
 
        # Profiling must actually be enabled...
@@ -1240,51 +1255,7 @@ function wfLogProfilingData() {
  * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
-       global $wgStatsMethod;
-
-       $count = intval( $count );
-       if ( $count == 0 ) {
-               return;
-       }
-
-       if( $wgStatsMethod == 'udp' ) {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
-               static $socket;
-
-               $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
-               if ( !$socket ) {
-                       $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-                       $statline = "stats/{$id} - 1 1 1 1 1 -total\n";
-                       socket_sendto(
-                               $socket,
-                               $statline,
-                               strlen( $statline ),
-                               0,
-                               $wgUDPProfilerHost,
-                               $wgUDPProfilerPort
-                       );
-               }
-               $statline = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
-               wfSuppressWarnings();
-               socket_sendto(
-                       $socket,
-                       $statline,
-                       strlen( $statline ),
-                       0,
-                       $wgUDPProfilerHost,
-                       $wgUDPProfilerPort
-               );
-               wfRestoreWarnings();
-       } elseif( $wgStatsMethod == 'cache' ) {
-               global $wgMemc;
-               $key = wfMemcKey( 'stats', $key );
-               if ( is_null( $wgMemc->incr( $key, $count ) ) ) {
-                       $wgMemc->add( $key, $count );
-               }
-       } else {
-               // Disabled
-       }
+       StatCounter::singleton()->incr( $key, $count );
 }
 
 /**
@@ -2578,8 +2549,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 
        if( !$ok ) {
                // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
-               trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
-                       E_USER_WARNING );
+               wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
        }
        return $ok;
 }
@@ -3338,7 +3308,7 @@ function wfCheckEntropy() {
  */
 function wfFixSessionID() {
        // If the cookie or session id is already set we already have a session and should abort
-       if ( isset( $_COOKIE[ session_name() ] ) || session_id() ) {
+       if ( isset( $_COOKIE[session_name()] ) || session_id() ) {
                return;
        }
 
@@ -3649,15 +3619,22 @@ function wfGetNull() {
  *
  * @param $maxLag Integer (deprecated)
  * @param $wiki mixed Wiki identifier accepted by wfGetLB
+ * @param $cluster string cluster name accepted by LBFactory
  */
-function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
-       $lb = wfGetLB( $wiki );
+function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
+       $lb = ( $cluster !== false )
+               ? wfGetLBFactory()->getExternalLB( $cluster )
+               : wfGetLB( $wiki );
        // bug 27975 - Don't try to wait for slaves if there are none
        // Prevents permission error when getting master position
        if ( $lb->getServerCount() > 1 ) {
                $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
                $pos = $dbw->getMasterPos();
-               $lb->waitForAll( $pos );
+               // The DBMS may not support getMasterPos() or the whole
+               // load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
+               if ( $pos !== false ) {
+                       $lb->waitForAll( $pos );
+               }
        }
 }
 
@@ -3940,7 +3917,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
        # Handle redirects
        $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
        if( $redirectTitle ) {
-               $name = $redirectTitle->getDbKey();
+               $name = $redirectTitle->getDBkey();
        }
 
        # Run the extension hook
index 6863973..e204087 100644 (file)
@@ -95,7 +95,7 @@
 class HTMLForm extends ContextSource {
 
        // A mapping of 'type' inputs onto standard HTMLFormField subclasses
-       static $typeMappings = array(
+       private static $typeMappings = array(
                'api' => 'HTMLApiField',
                'text' => 'HTMLTextField',
                'textarea' => 'HTMLTextAreaField',
@@ -128,6 +128,7 @@ class HTMLForm extends ContextSource {
 
        protected $mFieldTree;
        protected $mShowReset = false;
+       protected $mShowSubmit = true;
        public $mFieldData;
 
        protected $mSubmitCallback;
@@ -256,7 +257,7 @@ class HTMLForm extends ContextSource {
         */
        public function setDisplayFormat( $format ) {
                if ( !in_array( $format, $this->availableDisplayFormats ) ) {
-                       throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
+                       throw new MWException( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
                }
                $this->displayFormat = $format;
                return $this;
@@ -683,23 +684,26 @@ class HTMLForm extends ContextSource {
         */
        function getButtons() {
                $html = '';
-               $attribs = array();
 
-               if ( isset( $this->mSubmitID ) ) {
-                       $attribs['id'] = $this->mSubmitID;
-               }
+               if ( $this->mShowSubmit ) {
+                       $attribs = array();
 
-               if ( isset( $this->mSubmitName ) ) {
-                       $attribs['name'] = $this->mSubmitName;
-               }
+                       if ( isset( $this->mSubmitID ) ) {
+                               $attribs['id'] = $this->mSubmitID;
+                       }
 
-               if ( isset( $this->mSubmitTooltip ) ) {
-                       $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
-               }
+                       if ( isset( $this->mSubmitName ) ) {
+                               $attribs['name'] = $this->mSubmitName;
+                       }
 
-               $attribs['class'] = 'mw-htmlform-submit';
+                       if ( isset( $this->mSubmitTooltip ) ) {
+                               $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
+                       }
+
+                       $attribs['class'] = 'mw-htmlform-submit';
 
-               $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+                       $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+               }
 
                if ( $this->mShowReset ) {
                        $html .= Html::element(
@@ -851,6 +855,21 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Stop a default submit button being shown for this form. This implies that an
+        * alternate submit method must be provided manually.
+        *
+        * @since 1.22
+        *
+        * @param bool $suppressSubmit Set to false to re-enable the button again
+        *
+        * @return HTMLForm $this for chaining calls
+        */
+       function suppressDefaultSubmit( $suppressSubmit = true ) {
+               $this->mShowSubmit = !$suppressSubmit;
+               return $this;
+       }
+
        /**
         * @param string $id DOM id for the form
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -1996,7 +2015,6 @@ class HTMLSelectField extends HTMLFormField {
  * Select dropdown field, with an additional "other" textbox.
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
-       static $jsAdded = false;
 
        function __construct( $params ) {
                if ( !in_array( 'other', $params['options'], true ) ) {
@@ -2527,14 +2545,17 @@ class HTMLSubmitField extends HTMLFormField {
        }
 
        public function getInputHTML( $value ) {
-               return Xml::submitButton(
-                       $value,
-                       array(
-                               'class' => 'mw-htmlform-submit ' . $this->mClass,
-                               'name' => $this->mName,
-                               'id' => $this->mID,
-                       )
+               $attr = array(
+                       'class' => 'mw-htmlform-submit ' . $this->mClass,
+                       'name' => $this->mName,
+                       'id' => $this->mID,
                );
+
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $attr['disabled'] = 'disabled';
+               }
+
+               return Xml::submitButton( $value, $attr );
        }
 
        protected function needsLabel() {
index 8cc7ace..740abf7 100644 (file)
@@ -168,6 +168,7 @@ class Hooks {
                         */
                        if ( is_array( $hook ) ) {
                                if ( count( $hook ) < 1 ) {
+                                       wfProfileOut( 'hook: ' . $event );
                                        throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
                                } elseif ( is_object( $hook[0] ) ) {
                                        $object = $hook[0];
@@ -190,11 +191,12 @@ class Hooks {
                                        }
                                } elseif ( is_string( $hook[0] ) ) {
                                        $func = $hook[0];
-                                       if ( count( $hook ) > 1) {
+                                       if ( count( $hook ) > 1 ) {
                                                $data = $hook[1];
                                                $have_data = true;
                                        }
                                } else {
+                                       wfProfileOut( 'hook: ' . $event );
                                        throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
                                }
                        } elseif ( is_string( $hook ) ) { # functions look like strings, too
@@ -207,6 +209,7 @@ class Hooks {
                                        $method = "on" . $event;
                                }
                        } else {
+                               wfProfileOut( 'hook: ' . $event );
                                throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
                        }
 
@@ -276,11 +279,13 @@ class Hooks {
                                        $prettyFunc = strval( $callback );
                                }
                                if ( $badhookmsg ) {
+                                       wfProfileOut( 'hook: ' . $event );
                                        throw new MWException(
                                                'Detected bug in an extension! ' .
                                                "Hook $prettyFunc has invalid call signature; " . $badhookmsg
                                        );
                                } else {
+                                       wfProfileOut( 'hook: ' . $event );
                                        throw new MWException(
                                                'Detected bug in an extension! ' .
                                                "Hook $prettyFunc failed to return a value; " .
index 9e280db..acf9baa 100644 (file)
@@ -305,7 +305,7 @@ class MWHttpRequest {
 
        /**
         * Set the parameters of the request
-
+        *
         * @param $args Array
         * @todo overload the args param
         */
@@ -563,8 +563,8 @@ class MWHttpRequest {
                        $this->parseHeader();
                }
 
-               if ( isset( $this->respHeaders[strtolower ( $header ) ] ) ) {
-                       $v = $this->respHeaders[strtolower ( $header ) ];
+               if ( isset( $this->respHeaders[strtolower( $header )] ) ) {
+                       $v = $this->respHeaders[strtolower( $header )];
                        return $v[count( $v ) - 1];
                }
 
@@ -646,17 +646,17 @@ class MWHttpRequest {
                $headers = $this->getResponseHeaders();
 
                //return full url (fix for incorrect but handled relative location)
-               if ( isset( $headers[ 'location' ] ) ) {
-                       $locations = $headers[ 'location' ];
+               if ( isset( $headers['location'] ) ) {
+                       $locations = $headers['location'];
                        $domain = '';
                        $foundRelativeURI = false;
                        $countLocations = count( $locations );
 
                        for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
-                               $url = parse_url( $locations[ $i ] );
+                               $url = parse_url( $locations[$i] );
 
                                if ( isset( $url['host'] ) ) {
-                                       $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+                                       $domain = $url['scheme'] . '://' . $url['host'];
                                        break; //found correct URI (with host)
                                } else {
                                        $foundRelativeURI = true;
@@ -665,15 +665,15 @@ class MWHttpRequest {
 
                        if ( $foundRelativeURI ) {
                                if ( $domain ) {
-                                       return $domain . $locations[ $countLocations - 1 ];
+                                       return $domain . $locations[$countLocations - 1];
                                } else {
                                        $url = parse_url( $this->url );
-                                       if ( isset($url[ 'host' ]) ) {
-                                               return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+                                       if ( isset( $url['host'] ) ) {
+                                               return $url['scheme'] . '://' . $url['host'] . $locations[$countLocations - 1];
                                        }
                                }
                        } else {
-                               return $locations[ $countLocations - 1 ];
+                               return $locations[$countLocations - 1];
                        }
                }
 
@@ -696,11 +696,6 @@ class MWHttpRequest {
 class CurlHttpRequest extends MWHttpRequest {
        const SUPPORTS_FILE_POSTS = true;
 
-       static $curlMessageMap = array(
-               6 => 'http-host-unreachable',
-               28 => 'http-timed-out'
-       );
-
        protected $curlOptions = array();
        protected $headerText = "";
 
@@ -780,13 +775,7 @@ class CurlHttpRequest extends MWHttpRequest {
                }
 
                if ( false === curl_exec( $curlHandle ) ) {
-                       $code = curl_error( $curlHandle );
-
-                       if ( isset( self::$curlMessageMap[$code] ) ) {
-                               $this->status->fatal( self::$curlMessageMap[$code] );
-                       } else {
-                               $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
-                       }
+                       $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
                } else {
                        $this->headerList = explode( "\r\n", $this->headerText );
                }
@@ -938,8 +927,7 @@ class PhpHttpRequest extends MWHttpRequest {
 
                // If everything went OK, or we received some error code
                // get the response body content.
-               if ( $this->status->isOK()
-                               || (int)$this->respStatus >= 300) {
+               if ( $this->status->isOK() || (int)$this->respStatus >= 300 ) {
                        while ( !feof( $fh ) ) {
                                $buf = fread( $fh, 8192 );
 
index b3a485a..5e51878 100644 (file)
@@ -631,7 +631,7 @@ EOT
         * external editing (and instructions link) etc.
         */
        protected function uploadLinksBox() {
-               global $wgEnableUploads, $wgUseExternalEditor;
+               global $wgEnableUploads;
 
                if ( !$wgEnableUploads ) {
                        return;
@@ -654,25 +654,6 @@ EOT
                        $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
-               # External editing link
-               if ( $wgUseExternalEditor ) {
-                       $elink = Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'edit-externally' )->escaped(),
-                               array(),
-                               array(
-                                       'action' => 'edit',
-                                       'externaledit' => 'true',
-                                       'mode' => 'file'
-                               )
-                       );
-                       $out->addHTML(
-                               '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-                                       wfMessage( 'edit-externally-help' )->parse() .
-                                       "</small></li>\n"
-                       );
-               }
-
                $out->addHTML( "</ul>\n" );
        }
 
@@ -719,7 +700,7 @@ EOT
                $limit = 100;
 
                $out = $this->getContext()->getOutput();
-               $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
+               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
                $rows = array();
                $redirects = array();
                foreach ( $res as $row ) {
index fee636f..04d99e1 100644 (file)
@@ -47,7 +47,7 @@ class WikiImporter {
 
                stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
                $id = UploadSourceAdapter::registerSource( $source );
-               if (defined( 'LIBXML_PARSEHUGE' ) ) {
+               if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
                } else {
                        $this->reader->open( "uploadsource://$id" );
@@ -1714,7 +1714,7 @@ class ImportStreamSource {
                        if ( $history ) $params['history'] = 1;
                        if ( $templates ) $params['templates'] = 1;
                        if ( $pageLinkDepth ) $params['pagelink-depth'] = $pageLinkDepth;
-                       $url = $link->getFullUrl( $params );
+                       $url = $link->getFullURL( $params );
                        # For interwikis, use POST to avoid redirects.
                        return ImportStreamSource::newFromURL( $url, "POST" );
                }
index 972adfc..3e8a3c9 100644 (file)
@@ -238,7 +238,7 @@ class Linker {
                # Note: we want the href attribute first, for prettiness.
                $attribs = array( 'href' => self::linkUrl( $target, $query, $options ) );
                if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
-                       $attribs['href'] = wfAppendQuery( $attribs['href'], wfArrayToCgi( $oldquery ) );
+                       $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
                }
 
                $attribs = array_merge(
@@ -612,7 +612,7 @@ class Linker {
                                $hp['width'] = $file->getWidth( $page );
                        }
 
-                       if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+                       if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
                                global $wgThumbLimits, $wgThumbUpright;
                                if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
                                        $widthOption = User::getDefaultOption( 'thumbsize' );
@@ -797,6 +797,7 @@ class Linker {
                }
                $thumb = false;
                $noscale = false;
+               $manualthumb = false;
 
                if ( !$exists ) {
                        $outerWidth = $hp['width'] + 2;
@@ -808,6 +809,7 @@ class Linker {
                                        $manual_img = wfFindFile( $manual_title );
                                        if ( $manual_img ) {
                                                $thumb = $manual_img->getUnscaledThumb( $hp );
+                                               $manualthumb = true;
                                        } else {
                                                $exists = false;
                                        }
@@ -838,7 +840,13 @@ class Linker {
                # zoom icon still needs it, so we make a unique query for it. See bug 14771
                $url = $title->getLocalURL( $query );
                if ( $page ) {
-                       $url = wfAppendQuery( $url, 'page=' . urlencode( $page ) );
+                       $url = wfAppendQuery( $url, array( 'page' => $page ) );
+               }
+               if ( $manualthumb &&
+                    !isset( $fp['link-title'] ) &&
+                    !isset( $fp['link-url'] ) &&
+                    !isset( $fp['no-link'] ) ) {
+                       $fp['link-url'] = $url;
                }
 
                $s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
@@ -849,7 +857,7 @@ class Linker {
                        $s .= wfMessage( 'thumbnail_error', '' )->escaped();
                        $zoomIcon = '';
                } else {
-                       if ( !$noscale ) {
+                       if ( !$noscale && !$manualthumb ) {
                                self::processResponsiveImages( $file, $thumb, $hp );
                        }
                        $params = array(
@@ -961,7 +969,7 @@ class Linker {
         */
        protected static function getUploadUrl( $destFile, $query = '' ) {
                global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
-               $q = 'wpDestFile=' . $destFile->getPartialUrl();
+               $q = 'wpDestFile=' . $destFile->getPartialURL();
                if ( $query != '' )
                        $q .= '&' . $query;
 
@@ -971,7 +979,7 @@ class Linker {
                        return wfAppendQuery( $wgUploadNavigationUrl, $q );
                } else {
                        $upload = SpecialPage::getTitleFor( 'Upload' );
-                       return $upload->getLocalUrl( $q );
+                       return $upload->getLocalURL( $q );
                }
        }
 
@@ -1527,7 +1535,7 @@ class Linker {
                                        $nodotdot = substr( $nodotdot, 3 );
                                }
                                if ( $dotdotcount > 0 ) {
-                                       $exploded = explode( '/', $contextTitle->GetPrefixedText() );
+                                       $exploded = explode( '/', $contextTitle->getPrefixedText() );
                                        if ( count( $exploded ) > $dotdotcount ) { # not allowed to go below top level page
                                                $ret = implode( '/', array_slice( $exploded, 0, -$dotdotcount ) );
                                                # / at the end means don't show full path
index d99ae22..f79b423 100644 (file)
@@ -847,7 +847,7 @@ class LinksDeletionUpdate extends SqlDataUpdate {
                $res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
 
                foreach ( $res as $row ) {
-                       $cats [] = $row->cl_to;
+                       $cats[] = $row->cl_to;
                }
 
                $this->mPage->updateCategoryCounts( array(), $cats );
index 36fcc30..240a6d3 100644 (file)
@@ -32,7 +32,7 @@ class MWFunction {
                        if ( strpos( $callback, '::' ) !== false ) {
                                // PHP 5.1 cannot use call_user_func( 'Class::Method' )
                                // It can only handle only call_user_func( array( 'Class', 'Method' ) )
-                               $callback = explode( '::', $callback, 2);
+                               $callback = explode( '::', $callback, 2 );
                        }
                }
 
index 7b66924..41c7cb9 100644 (file)
@@ -309,6 +309,7 @@ class MagicWord {
                $wgContLang->getMagic( $this );
                if ( !$this->mSynonyms ) {
                        $this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Error: invalid magic word '$id'" );
                        #wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
                }
index 0b8014a..96d00ae 100644 (file)
@@ -107,7 +107,7 @@ abstract class RdfMetaData {
         * @param $title Title
         */
        protected function page( $name, $title ) {
-               $this->url( $name, $title->getFullUrl() );
+               $this->url( $name, $title->getFullURL() );
        }
 
        protected function url( $name, $url ) {
index edabd54..7592530 100644 (file)
@@ -432,7 +432,7 @@ class MimeMagic {
                $ext = explode( ' ', $ext );
 
                $extension = strtolower( $extension );
-               return  in_array( $extension, $ext );
+               return in_array( $extension, $ext );
        }
 
        /**
@@ -689,11 +689,11 @@ class MimeMagic {
                $script_type = null;
 
                # detect by shebang
-               if ( substr( $head, 0, 2) == "#!" ) {
+               if ( substr( $head, 0, 2 ) == "#!" ) {
                        $script_type = "ASCII";
-               } elseif ( substr( $head, 0, 5) == "\xef\xbb\xbf#!" ) {
+               } elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
                        $script_type = "UTF-8";
-               } elseif ( substr( $head, 0, 7) == "\xfe\xff\x00#\x00!" ) {
+               } elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
                        $script_type = "UTF-16BE";
                } elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
                        $script_type = "UTF-16LE";
@@ -804,7 +804,7 @@ class MimeMagic {
                                 * These mime's are stored in the database, where we don't really want
                                 * x-opc+zip, because we use it only for internal purposes
                                 */
-                               if ( $this->isMatchingExtension( $ext, $mime) ) {
+                               if ( $this->isMatchingExtension( $ext, $mime ) ) {
                                        /* A known file extension for an OPC file,
                                         * find the proper mime type for that file extension
                                         */
@@ -817,10 +817,10 @@ class MimeMagic {
                } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
                                ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
                                preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
-                       if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
+                       if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
                                $mime = "application/msword";
                        }
-                       switch( substr( $header, 512, 6) ) {
+                       switch( substr( $header, 512, 6 ) ) {
                                case "\xEC\xA5\xC1\x00\x0E\x00":
                                case "\xEC\xA5\xC1\x00\x1C\x00":
                                case "\xEC\xA5\xC1\x00\x43\x00":
index fccfbed..8001b41 100644 (file)
@@ -387,9 +387,9 @@ class MWNamespace {
                if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
                        return true;
                }
-               if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) {
+               if ( isset( $wgCapitalLinkOverrides[$index] ) ) {
                        // $wgCapitalLinkOverrides is explicitly set
-                       return $wgCapitalLinkOverrides[ $index ];
+                       return $wgCapitalLinkOverrides[$index];
                }
                // Default to the global setting
                return $wgCapitalLinks;
index 1e0c396..4e4b739 100644 (file)
@@ -253,6 +253,11 @@ class OutputPage extends ContextSource {
         */
        private $mProperties = array();
 
+       /**
+        * @var string|null: ResourceLoader target for load.php links. If null, will be omitted
+        */
+       private $mTarget = null;
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -451,7 +456,8 @@ class OutputPage extends ContextSource {
                        $module = $resourceLoader->getModule( $val );
                        if( $module instanceof ResourceLoaderModule
                                && $module->getOrigin() <= $this->getAllowedModules( $type )
-                               && ( is_null( $position ) || $module->getPosition() == $position ) )
+                               && ( is_null( $position ) || $module->getPosition() == $position )
+                               && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) ) )
                        {
                                $filteredModules[] = $val;
                        }
@@ -556,6 +562,22 @@ class OutputPage extends ContextSource {
                $this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
        }
 
+       /**
+        * @return null|string: ResourceLoader target
+        */
+       public function getTarget() {
+               return $this->mTarget;
+       }
+
+       /**
+        * Sets ResourceLoader target for load.php links. If null, will be omitted
+        *
+        * @param $target string|null
+        */
+       public function setTarget( $target ) {
+               $this->mTarget = $target;
+       }
+
        /**
         * Get an array of head items
         *
@@ -1401,7 +1423,7 @@ class OutputPage extends ContextSource {
         * @param $timestamp Mixed: string, or null
         * @return Mixed: previous value
         */
-       public function setRevisionTimestamp( $timestamp) {
+       public function setRevisionTimestamp( $timestamp ) {
                return wfSetVar( $this->mRevisionTimestamp, $timestamp );
        }
 
@@ -2401,7 +2423,6 @@ $templates
                        $proto = PROTO_RELATIVE;
                }
 
-               $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
                $link = $this->msg( 'returnto' )->rawParams(
                        Linker::link( $title, $text, array(), $query, $options ) )->escaped();
                $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
@@ -2600,6 +2621,9 @@ $templates
                                return $links;
                        }
                }
+               if ( !is_null( $this->mTarget ) ) {
+                       $extraQuery['target'] = $this->mTarget;
+               }
 
                // Create keyed-by-group list of module objects from modules list
                $groups = array();
@@ -2612,8 +2636,8 @@ $templates
                                        && $only == ResourceLoaderModule::TYPE_SCRIPTS )
                                || ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_STYLES )
                                        && $only == ResourceLoaderModule::TYPE_STYLES )
-                               )
-                       {
+                               || ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) )
+                       {
                                continue;
                        }
 
@@ -2659,13 +2683,9 @@ $templates
                        if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
                                // If we're only getting the styles, we don't need to do anything for empty modules.
                                $links .= Html::inlineScript(
-
                                                ResourceLoader::makeLoaderConditionalScript(
-
                                                                ResourceLoader::makeLoaderStateScript( $emptyModules )
-
                                                )
-
                                ) . "\n";
                        }
 
@@ -2847,8 +2867,8 @@ $templates
                        );
                        $defaultModules['site'] = 'loading';
                } else {
-                       // The wiki is configured to not allow a site module.
-                       $defaultModules['site'] = 'missing';
+                       // Site module is empty, save request by marking ready in advance (bug 46857)
+                       $defaultModules['site'] = 'ready';
                }
 
                // Add user JS if enabled
@@ -2874,15 +2894,14 @@ $templates
                                }
                                $defaultModules['user'] = 'loading';
                        } else {
-                               // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
-                               // blocking default gadgets that might depend on it. Although arguably default-enabled
-                               // gadgets should not depend on the user module, it's harmless and less error-prone to
-                               // handle this case.
+                               // Non-logged-in users have an empty user module.
+                               // Save request by marking ready in advance (bug 46857)
                                $defaultModules['user'] = 'ready';
                        }
                } else {
-                       // User JS disabled
-                       $defaultModules['user'] = 'missing';
+                       // User modules are disabled on this wiki.
+                       // Save request by marking ready in advance (bug 46857)
+                       $defaultModules['user'] = 'ready';
                }
 
                // Group JS is only enabled if site JS is enabled.
@@ -2893,13 +2912,13 @@ $templates
                                );
                                $defaultModules['user.groups'] = 'loading';
                        } else {
-                               // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
-                               // avoid blocking gadgets that might depend upon the module.
+                               // Non-logged-in users have no user.groups module.
+                               // Save request by marking ready in advance (bug 46857)
                                $defaultModules['user.groups'] = 'ready';
                        }
                } else {
                        // Site (and group JS) disabled
-                       $defaultModules['user.groups'] = 'missing';
+                       $defaultModules['user.groups'] = 'ready';
                }
 
                $loaderInit = '';
index 7749bf1..e8ecf6d 100644 (file)
@@ -38,7 +38,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.21';
+       $mwVersion = '1.22';
        $minimumVersionPHP = '5.3.2';
 
        $phpVersion = phpversion();
index 56dba05..33780a4 100644 (file)
@@ -546,18 +546,6 @@ class Preferences {
                                'section' => 'rendering/skin',
                        );
                }
-
-               $selectedSkin = $user->getOption( 'skin' );
-               if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
-                       $settings = array_flip( $context->getLanguage()->getQuickbarSettings() );
-
-                       $defaultPreferences['quickbar'] = array(
-                               'type' => 'radio',
-                               'options' => $settings,
-                               'section' => 'rendering/skin',
-                               'label-message' => 'qbsettings',
-                       );
-               }
        }
 
        /**
@@ -733,7 +721,7 @@ class Preferences {
         * @param $defaultPreferences Array
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgUseExternalEditor, $wgAllowUserCssPrefs;
+               global $wgAllowUserCssPrefs;
 
                ## Editing #####################################
                $defaultPreferences['cols'] = array(
@@ -806,19 +794,6 @@ class Preferences {
                        );
                }
 
-               if ( $wgUseExternalEditor ) {
-                       $defaultPreferences['externaleditor'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-externaleditor',
-                       );
-                       $defaultPreferences['externaldiff'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-externaldiff',
-                       );
-               }
-
                $defaultPreferences['forceeditsummary'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -830,6 +805,13 @@ class Preferences {
                        'section' => 'editing/advancedediting',
                        'label-message' => 'tog-uselivepreview',
                );
+
+               $defaultPreferences['useeditwarning'] = array(
+                       'type' => 'toggle',
+                       'section' => 'editing/advancedediting',
+                       'label-message' => 'tog-useeditwarning',
+               );
+
        }
 
        /**
index d7b8840..7ebefec 100644 (file)
@@ -191,7 +191,7 @@ class ProtectionForm {
                if( $wgRequest->wasPosted() ) {
                        if( $this->save() ) {
                                $q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
-                               $wgOut->redirect( $this->mTitle->getFullUrl( $q ) );
+                               $wgOut->redirect( $this->mTitle->getFullURL( $q ) );
                        }
                } else {
                        $this->show();
@@ -359,7 +359,7 @@ class ProtectionForm {
                if( !$this->disabled ) {
                        $wgOut->addModules( 'mediawiki.legacy.protect' );
                        $out .= Xml::openElement( 'form', array( 'method' => 'post',
-                               'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
+                               'action' => $this->mTitle->getLocalURL( 'action=protect' ),
                                'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
                }
 
index d7cf995..faad391 100644 (file)
@@ -284,7 +284,9 @@ class RecentChange {
        public function notifyRC2UDP() {
                global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
                # Notify external application via UDP
-               if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
+               # Omit RC_EXTERNAL changes: bots and tools can get these edits from the feed of the external wiki
+               if ( $wgRC2UDPAddress && $this->mAttribs['rc_type'] != RC_EXTERNAL &&
+                       ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
                        self::sendToUDP( $this->getIRCLine() );
                }
        }
index 2b34984..3ea5da4 100644 (file)
@@ -1278,6 +1278,7 @@ class Revision implements IDBAccessObject {
                        // Store and get the URL
                        $data = ExternalStore::insertToDefault( $data );
                        if( !$data ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Unable to store text to external storage" );
                        }
                        if( $flags ) {
@@ -1334,14 +1335,15 @@ class Revision implements IDBAccessObject {
                        $title = $this->getTitle();
 
                        if ( $title === null ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Insufficient information to determine the title of the revision's page!" );
                        }
 
                        $defaultModel = ContentHandler::getDefaultModelFor( $title );
                        $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
 
-                       $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
-                       $row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+                       $row['rev_content_model'] = ( $model === $defaultModel ) ? null : $model;
+                       $row['rev_content_format'] = ( $format === $defaultFormat ) ? null : $format;
                }
 
                $dbw->insert( 'revision', $row, __METHOD__ );
@@ -1517,8 +1519,8 @@ class Revision implements IDBAccessObject {
                        );
 
                        if ( $wgContentHandlerUseDB ) {
-                               $row[ 'content_model' ] = $current->rev_content_model;
-                               $row[ 'content_format' ] = $current->rev_content_format;
+                               $row['content_model'] = $current->rev_content_model;
+                               $row['content_format'] = $current->rev_content_format;
                        }
 
                        $revision = new Revision( $row );
index d87c540..666df96 100644 (file)
@@ -352,8 +352,7 @@ class RevisionItem extends RevisionItemBase {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->context->msg( 'diff' )->escaped();
                } else {
-                       return
-                               Linker::link(
+                       return Linker::link(
                                        $this->list->title,
                                        $this->context->msg( 'diff' )->escaped(),
                                        array(),
index 2dff081..3acb740 100644 (file)
@@ -507,7 +507,7 @@ class Sanitizer {
                                                !in_array( 'table', $tagstack ) ) {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) &&
-                                               !isset( $htmlnest [$t ] ) ) {
+                                               !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
                                                # Is it a self closed htmlpair ? (bug 5487)
                                                } elseif ( $brace == '/>' &&
@@ -555,12 +555,14 @@ class Sanitizer {
                                                continue;
                                        }
                                }
-                               $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+                               $text .= '&lt;' . str_replace( '>', '&gt;', $x );
                        }
                        # Close off any remaining tags
-                       while ( is_array( $tagstack ) && ($t = array_pop( $tagstack )) ) {
+                       while ( is_array( $tagstack ) && ( $t = array_pop( $tagstack ) ) ) {
                                $text .= "</$t>\n";
-                               if ( $t == 'table' ) { $tagstack = array_pop( $tablestack ); }
+                               if ( $t == 'table' ) {
+                                       $tagstack = array_pop( $tablestack );
+                               }
                        }
                } else {
                        # this might be possible using tidy itself
@@ -585,7 +587,7 @@ class Sanitizer {
                                                continue;
                                        }
                                }
-                               $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+                               $text .= '&lt;' . str_replace( '>', '&gt;', $x );
                        }
                }
                wfProfileOut( __METHOD__ );
@@ -723,7 +725,7 @@ class Sanitizer {
                        }
 
                        # Allow any attribute beginning with "data-", if in HTML5 mode
-                       if ( !($wgHtml5 && preg_match( '/^data-/i', $attribute )) && !isset( $whitelist[$attribute] ) ) {
+                       if ( !( $wgHtml5 && preg_match( '/^data-/i', $attribute ) ) && !isset( $whitelist[$attribute] ) ) {
                                continue;
                        }
 
@@ -1357,9 +1359,9 @@ class Sanitizer {
                if( $matches[1] != '' ) {
                        return Sanitizer::decodeEntity( $matches[1] );
                } elseif( $matches[2] != '' ) {
-                       return  Sanitizer::decodeChar( intval( $matches[2] ) );
+                       return Sanitizer::decodeChar( intval( $matches[2] ) );
                } elseif( $matches[3] != '' ) {
-                       return  Sanitizer::decodeChar( hexdec( $matches[3] ) );
+                       return Sanitizer::decodeChar( hexdec( $matches[3] ) );
                }
                # Last case should be an ampersand by itself
                return $matches[0];
@@ -1443,30 +1445,31 @@ class Sanitizer {
                if ( $wgAllowRdfaAttributes ) {
                        #RDFa attributes as specified in section 9 of http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
                        $common = array_merge( $common, array(
-                           'about', 'property', 'resource', 'datatype', 'typeof',
+                               'about', 'property', 'resource', 'datatype', 'typeof',
                        ) );
                }
 
                if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
                        # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
                        $common = array_merge( $common, array(
-                           'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
+                               'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
                        ) );
                }
 
                $block = array_merge( $common, array( 'align' ) );
                $tablealign = array( 'align', 'char', 'charoff', 'valign' );
-               $tablecell = array( 'abbr',
-                                   'axis',
-                                   'headers',
-                                   'scope',
-                                   'rowspan',
-                                   'colspan',
-                                   'nowrap', # deprecated
-                                   'width',  # deprecated
-                                   'height', # deprecated
-                                   'bgcolor' # deprecated
-                                   );
+               $tablecell = array(
+                       'abbr',
+                       'axis',
+                       'headers',
+                       'scope',
+                       'rowspan',
+                       'colspan',
+                       'nowrap', # deprecated
+                       'width', # deprecated
+                       'height', # deprecated
+                       'bgcolor', # deprecated
+               );
 
                # Numbers refer to sections in HTML 4.01 standard describing the element.
                # See: http://www.w3.org/TR/html4/
index 7715484..26c2df5 100644 (file)
@@ -67,7 +67,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
        $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
-       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
+       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles ) );
 
        if ( isset( $testResourceFiles['images'] ) ) {
                $testImageZip = $testResourceFiles['images'];
@@ -112,7 +112,7 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
        $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$testSuiteName];
-       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
+       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles ) );
 
        if ( isset( $testResourceFiles['db'] ) ) {
                $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
index e87b200..08ab143 100644 (file)
@@ -45,7 +45,6 @@ if ( !isset( $wgVersion ) ) {
 
 // Set various default paths sensibly...
 if ( $wgScript === false ) $wgScript = "$wgScriptPath/index$wgScriptExtension";
-if ( $wgRedirectScript === false ) $wgRedirectScript = "$wgScriptPath/redirect$wgScriptExtension";
 if ( $wgLoadScript === false ) $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
 
 if ( $wgArticlePath === false ) {
@@ -426,7 +425,7 @@ wfMemoryLimit();
  * that happens whenever you use a date function without the timezone being
  * explicitly set. Inspired by phpMyAdmin's treatment of the problem.
  */
-if ( is_null( $wgLocaltimezone) ) {
+if ( is_null( $wgLocaltimezone ) ) {
        wfSuppressWarnings();
        $wgLocaltimezone = date_default_timezone_get();
        wfRestoreWarnings();
index bbc14a1..2d250df 100644 (file)
@@ -228,7 +228,7 @@ class SiteConfiguration {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
                                                if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
index 0cc1086..117e6e2 100644 (file)
@@ -56,17 +56,19 @@ abstract class Skin extends ContextSource {
 
                        $skinDir = dir( $wgStyleDirectory );
 
-                       # while code from www.php.net
-                       while ( false !== ( $file = $skinDir->read() ) ) {
-                               // Skip non-PHP files, hidden files, and '.dep' includes
-                               $matches = array();
-
-                               if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
-                                       $aSkin = $matches[1];
-                                       $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+                       if ( $skinDir !== false && $skinDir !== null ) {
+                               # while code from www.php.net
+                               while ( false !== ( $file = $skinDir->read() ) ) {
+                                       // Skip non-PHP files, hidden files, and '.dep' includes
+                                       $matches = array();
+
+                                       if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
+                                               $aSkin = $matches[1];
+                                               $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+                                       }
                                }
+                               $skinDir->close();
                        }
-                       $skinDir->close();
                        $skinsInitialised = true;
                        wfProfileOut( __METHOD__ . '-init' );
                }
@@ -129,7 +131,6 @@ abstract class Skin extends ContextSource {
                // in the user preferences.
                $fallback = array(
                        0 => $wgDefaultSkin,
-                       1 => 'nostalgia',
                        2 => 'cologneblue'
                );
 
@@ -1252,7 +1253,7 @@ abstract class Skin extends ContextSource {
                                                }
 
                                                global $wgExternalLinkTarget;
-                                               if ( $wgExternalLinkTarget) {
+                                               if ( $wgExternalLinkTarget ) {
                                                        $extraAttribs['target'] = $wgExternalLinkTarget;
                                                }
                                        } else {
@@ -1557,6 +1558,7 @@ abstract class Skin extends ContextSource {
        function __call( $fname, $args ) {
                $realFunction = array( 'Linker', $fname );
                if ( is_callable( $realFunction ) ) {
+                       wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' );
                        return call_user_func_array( $realFunction, $args );
                } else {
                        $className = get_class( $this );
index b9766a9..9d657f7 100644 (file)
@@ -36,46 +36,6 @@ class SkinLegacy extends SkinTemplate {
        public function commonPrintStylesheet() {
                return true;
        }
-
-       /**
-        * This was for the old skins and for users with 640x480 screen.
-        * Please note old skins are still used and might prove useful for
-        * users having old computers or visually impaired.
-        */
-       var $mSuppressQuickbar = false;
-
-       /**
-        * Suppress the quickbar from the output, only for skin supporting
-        * the quickbar
-        */
-       public function suppressQuickbar() {
-               $this->mSuppressQuickbar = true;
-       }
-
-       /**
-        * Return whether the quickbar should be suppressed from the output
-        *
-        * @return Boolean
-        */
-       public function isQuickbarSuppressed() {
-               return $this->mSuppressQuickbar;
-       }
-
-       function qbSetting() {
-               global $wgUser;
-               if ( $this->isQuickbarSuppressed() ) {
-                       return 0;
-               }
-               $q = $wgUser->getOption( 'quickbar', 0 );
-               if( $q == 5 ) {
-                       # 5 is the default, which chooses the setting
-                       # depending on the directionality of your interface language
-                       global $wgLang;
-                       return $wgLang->isRTL() ? 2 : 1;
-               }
-               return $q;
-       }
-
 }
 
 class LegacyTemplate extends BaseTemplate {
@@ -531,7 +491,7 @@ class LegacyTemplate extends BaseTemplate {
                $s = array();
 
                if ( !$wgOut->isPrintable() ) {
-                       $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl(
+                       $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalURL(
                                $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) );
                        $s[] = "<a href=\"$printurl\" rel=\"alternate\">"
                                . wfMessage( 'printableversion' )->text() . '</a>';
index 59e1ccf..fee3058 100644 (file)
@@ -742,7 +742,7 @@ class SkinTemplate extends Skin {
                return array(
                        'class' => implode( ' ', $classes ),
                        'text' => $text,
-                       'href' => $title->getLocalUrl( $query ),
+                       'href' => $title->getLocalURL( $query ),
                        'primary' => true );
        }
 
@@ -1203,7 +1203,7 @@ class SkinTemplate extends Skin {
 
                if ( $out->isArticleRelated() ) {
                        $nav_urls['whatlinkshere'] = array(
-                               'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
+                               'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL()
                        );
 
                        $nav_urls['info'] = array(
@@ -1213,7 +1213,7 @@ class SkinTemplate extends Skin {
 
                        if ( $this->getTitle()->getArticleID() ) {
                                $nav_urls['recentchangeslinked'] = array(
-                                       'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
+                                       'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
                                );
                        }
                }
@@ -1322,8 +1322,10 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
         */
        function jstext( $str ) {
+               wfDeprecated( __METHOD__, '1.21' );
                echo Xml::escapeJsString( $this->data[$str] );
        }
 
index c32738f..d8f6fd9 100644 (file)
@@ -842,11 +842,11 @@ class SpecialPage {
        protected function addFeedLinks( $params ) {
                global $wgFeedClasses;
 
-               $feedTemplate = wfScript( 'api' ) . '?';
+               $feedTemplate = wfScript( 'api' );
 
                foreach ( $wgFeedClasses as $format => $class ) {
                        $theseParams = $params + array( 'feedformat' => $format );
-                       $url = $feedTemplate . wfArrayToCgi( $theseParams );
+                       $url = wfAppendQuery( $feedTemplate, $theseParams );
                        $this->getOutput()->addFeedLink( $format, $url );
                }
        }
@@ -948,7 +948,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegend( $this->msg( $this->getMessagePrefix() . '-legend' ) );
+               $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
                $form->addHeaderText(
                        $this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
 
@@ -1090,17 +1090,16 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
                $query = $this->getRedirectQuery();
                // Redirect to a page title with possible query parameters
                if ( $redirect instanceof Title ) {
-                       $url = $redirect->getFullUrl( $query );
+                       $url = $redirect->getFullURL( $query );
                        $this->getOutput()->redirect( $url );
                        return $redirect;
-               // Redirect to index.php with query parameters
                } elseif ( $redirect === true ) {
-                       global $wgScript;
-                       $url = $wgScript . '?' . wfArrayToCgi( $query );
+                       // Redirect to index.php with query parameters
+                       $url = wfAppendQuery( wfScript( 'index' ), $query );
                        $this->getOutput()->redirect( $url );
                        return $redirect;
                } else {
-                       $class = __CLASS__;
+                       $class = get_class( $this );
                        throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
                }
        }
@@ -1270,9 +1269,9 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
                        'action',
                        'redirect', 'rdfrom',
                        # Options for preloaded edits
-                       'preload', 'editintro', 'preloadtitle', 'summary',
+                       'preload', 'editintro', 'preloadtitle', 'summary', 'nosummary',
                        # Options for overriding user settings
-                       'preview', 'internaledit', 'externaledit', 'mode',
+                       'preview', 'internaledit', 'externaledit', 'mode', 'minor', 'watchthis',
                        # Options for history/diffs
                        'section', 'oldid', 'diff', 'dir',
                        'limit', 'offset', 'feed',
index 7368ab7..a53b901 100644 (file)
@@ -99,7 +99,6 @@ class SpecialPageFactory {
                'Listusers'                 => 'SpecialListUsers',
                'Listadmins'                => 'SpecialListAdmins',
                'Listbots'                  => 'SpecialListBots',
-               'Activeusers'               => 'SpecialActiveUsers',
                'Userrights'                => 'UserrightsPage',
                'EditWatchlist'             => 'SpecialEditWatchlist',
 
@@ -466,7 +465,7 @@ class SpecialPageFactory {
                                unset( $query['title'] );
                                $query = wfArrayToCgi( $query );
                                $title = $page->getTitle( $par );
-                               $url = $title->getFullUrl( $query );
+                               $url = $title->getFullURL( $query );
                                $context->getOutput()->redirect( $url );
                                wfProfileOut( __METHOD__ );
                                return $title;
diff --git a/includes/StatCounter.php b/includes/StatCounter.php
new file mode 100644 (file)
index 0000000..23a4e2b
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * @defgroup StatCounter StatCounter
+ *
+ * StatCounter is used to increment arbitrary keys for profiling reasons.
+ * The key/values are persisted in several possible ways (see $wgStatsMethod).
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ *
+ * 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 StatCounter
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ * This avoids spamming the collector many times for the same key.
+ *
+ * @ingroup StatCounter
+ */
+class StatCounter {
+       /** @var Array */
+       protected $deltas = array(); // (key => count)
+
+       protected function __construct() {}
+
+       /**
+        * @return StatCounter
+        */
+       public static function singleton() {
+               static $instance = null;
+               if ( !$instance ) {
+                       $instance = new self();
+               }
+               return $instance;
+       }
+
+       /**
+        * Increment a key by delta $count
+        *
+        * @param string $key
+        * @param integer $count
+        * @return void
+        */
+       public function incr( $key, $count = 1 ) {
+               $this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0;
+               $this->deltas[$key] += $count;
+               if ( PHP_SAPI === 'cli' ) {
+                       $this->flush();
+               }
+       }
+
+       /**
+        * Flush all pending deltas to persistent storage
+        *
+        * @return void
+        */
+       public function flush() {
+               global $wgStatsMethod;
+
+               $deltas = array_filter( $this->deltas ); // remove 0 valued entries
+               if ( $wgStatsMethod === 'udp' ) {
+                       $this->sendDeltasUDP( $deltas );
+               } elseif ( $wgStatsMethod === 'cache' ) {
+                       $this->sendDeltasMemc( $deltas );
+               } else {
+                       // disabled
+               }
+               $this->deltas = array();
+       }
+
+       protected function sendDeltasUDP( array $deltas ) {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
+
+               $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
+
+               $lines = array();
+               foreach ( $deltas as $key => $count ) {
+                       $lines[] = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
+               }
+
+               if ( count( $lines ) ) {
+                       static $socket = null;
+                       if ( !$socket ) {
+                               $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+                               array_unshift( $lines, "stats/{$id} - 1 1 1 1 1 -total\n" );
+                       }
+                       $packet = '';
+                       $packets = array();
+                       foreach ( $lines as $line ) {
+                               if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) {
+                                       $packets[] = $packet;
+                                       $packet = '';
+                               }
+                               $packet .= $line;
+                       }
+                       if ( $packet != '' ) {
+                               $packets[] = $packet;
+                       }
+                       foreach ( $packets as $packet ) {
+                               wfSuppressWarnings();
+                               socket_sendto(
+                                       $socket,
+                                       $packet,
+                                       strlen( $packet ),
+                                       0,
+                                       $wgUDPProfilerHost,
+                                       $wgUDPProfilerPort
+                               );
+                               wfRestoreWarnings();
+                       }
+               }
+       }
+
+       protected function sendDeltasMemc( array $deltas ) {
+               global $wgMemc;
+
+               foreach ( $deltas as $key => $count ) {
+                       $ckey = wfMemcKey( 'stats', $key );
+                       if ( $wgMemc->incr( $ckey, $count ) === null ) {
+                               $wgMemc->add( $ckey, $count );
+                       }
+               }
+       }
+}
index f5e4acf..1ad643a 100644 (file)
@@ -42,6 +42,7 @@ class StreamFile {
                wfProfileIn( __METHOD__ );
 
                if ( FileBackend::isStoragePath( $fname ) ) { // sanity
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
                }
 
index f0a3574..5b26d45 100644 (file)
@@ -122,6 +122,7 @@ class StubObject {
                        wfProfileIn( $fname );
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
+                               wfProfileOut( $fname );
                                throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
                        }
                        wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
index 1cf99a7..7dbfabf 100644 (file)
@@ -141,7 +141,7 @@ class MWTimestamp {
 
                try {
                        $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch(Exception $e) {
+               } catch( Exception $e ) {
                        throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
                }
 
index 974ea91..aa8fb93 100644 (file)
@@ -575,10 +575,12 @@ class Title {
         */
        public function isLocal() {
                if ( $this->mInterwiki != '' ) {
-                       return Interwiki::fetch( $this->mInterwiki )->isLocal();
-               } else {
-                       return true;
+                       $iw = Interwiki::fetch( $this->mInterwiki );
+                       if ( $iw ) {
+                               return $iw->isLocal();
+                       }
                }
+               return true;
        }
 
        /**
@@ -993,7 +995,7 @@ class Title {
         */
        public function getSkinFromCssJsSubpage() {
                $subpage = explode( '/', $this->mTextform );
-               $subpage = $subpage[ count( $subpage ) - 1 ];
+               $subpage = $subpage[count( $subpage ) - 1];
                $lastdot = strrpos( $subpage, '.' );
                if ( $lastdot === false )
                        return $subpage; # Never happens: only called for names ending in '.css' or '.js'
@@ -1325,8 +1327,8 @@ class Title {
        }
 
        /**
-        * Helper to fix up the get{Local,Full,Link,Canonical}URL args
-        * get{Canonical,Full,Link,Local}URL methods accepted an optional
+        * Helper to fix up the get{Canonical,Full,Link,Local,Internal}URL args
+        * get{Canonical,Full,Link,Local,Internal}URL methods accepted an optional
         * second argument named variant. This was deprecated in favor
         * of passing an array of option with a "variant" key
         * Once $query2 is removed for good, this helper can be dropped
@@ -1339,7 +1341,9 @@ class Title {
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
                if( $query2 !== false ) {
-                       wfDeprecated( "Title::get{Canonical,Full,Link,Local} method called with a second parameter is deprecated. Add your parameter to an array passed as the first parameter.", "1.19" );
+                       wfDeprecated( "Title::get{Canonical,Full,Link,Local,Internal}URL " .
+                               "method called with a second parameter is deprecated. Add your " .
+                               "parameter to an array passed as the first parameter.", "1.19" );
                }
                if ( is_array( $query ) ) {
                        $query = wfArrayToCgi( $query );
@@ -1397,7 +1401,6 @@ class Title {
         * Get a URL with no fragment or server name.  If this page is generated
         * with action=render, $wgServer is prepended.
         *
-
         * @param string|array $query an optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
@@ -4070,8 +4073,8 @@ class Title {
 
                if ( $res->numRows() > 0 ) {
                        foreach ( $res as $row ) {
-                               // $data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
-                               $data[$wgContLang->getNSText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
+                               // $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
+                               $data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
                        }
                }
                return $data;
@@ -4501,23 +4504,30 @@ class Title {
         */
        public function invalidateCache() {
                global $wgMemc;
+
                if ( wfReadOnly() ) {
                        return false;
                }
+
                $dbw = wfGetDB( DB_MASTER );
-               $success = $dbw->update(
-                       'page',
-                       array( 'page_touched' => $dbw->timestamp() ),
-                       $this->pageCond(),
-                       __METHOD__
-               );
+               $conds = $this->pageCond();
+               $dbw->onTransactionIdle( function() use ( $dbw, $conds ) {
+                       $dbw->update(
+                               'page',
+                               array( 'page_touched' => $dbw->timestamp() ),
+                               $conds,
+                               __METHOD__
+                       );
+               } );
                HTMLFileCache::clearFileCache( $this );
 
                // Clear page info.
                $revision = WikiPage::factory( $this )->getRevision();
-               if( $revision !== null ) {
+               if ( $revision !== null ) {
                        $memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
-                       $success = $success && $wgMemc->delete( $memcKey );
+                       $success = $wgMemc->delete( $memcKey );
+               } else {
+                       $success = true;
                }
 
                return $success;
index 6b7348a..5b7cbf2 100644 (file)
@@ -710,7 +710,7 @@ class User {
                                return 'passwordtooshort';
                        } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                return 'password-name-match';
-                       } elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+                       } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
                                return 'password-login-forbidden';
                        } else {
                                //it seems weird returning true here, but this is because of the
@@ -921,22 +921,12 @@ class User {
         * @return Bool True if the user is logged in, false otherwise.
         */
        private function loadFromSession() {
-               global $wgExternalAuthType, $wgAutocreatePolicy;
-
                $result = null;
                wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
                if ( $result !== null ) {
                        return $result;
                }
 
-               if ( $wgExternalAuthType && $wgAutocreatePolicy == 'view' ) {
-                       $extUser = ExternalUser::newFromCookie();
-                       if ( $extUser ) {
-                               # TODO: Automatically create the user here (or probably a bit
-                               # lower down, in fact)
-                       }
-               }
-
                $request = $this->getRequest();
 
                $cookieId = $request->getCookie( 'UserID' );
@@ -1271,7 +1261,7 @@ class User {
         *                    done against master.
         */
        private function getBlockedStatus( $bFromSlave = true ) {
-               global $wgProxyWhitelist, $wgUser;
+               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
 
                if ( -1 != $this->mBlockedby ) {
                        return;
@@ -1317,6 +1307,25 @@ class User {
                        }
                }
 
+               # (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               if ( !$block instanceof Block
+                       && $wgApplyIpBlocksToXff
+                       && $ip !== null
+                       && !$this->isAllowed( 'proxyunbannable' )
+                       && !in_array( $ip, $wgProxyWhitelist )
+               ) {
+                       $xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
+                       $xff = array_map( 'trim', explode( ',', $xff ) );
+                       $xff = array_diff( $xff, array( $ip ) );
+                       $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
+                       $block = Block::chooseBlock( $xffblocks, $xff );
+                       if ( $block instanceof Block ) {
+                               # Mangle the reason to alert the user that the block
+                               # originated from matching the X-Forwarded-For header.
+                               $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+                       }
+               }
+
                if ( $block instanceof Block ) {
                        wfDebug( __METHOD__ . ": Found block.\n" );
                        $this->mBlock = $block;
@@ -1330,7 +1339,7 @@ class User {
                        $this->mAllowUsertalk = false;
                }
 
-               # Extensions
+               // Extensions
                wfRunHooks( 'GetBlockedStatus', array( &$this ) );
 
                wfProfileOut( __METHOD__ );
@@ -1521,7 +1530,7 @@ class User {
                // Set the user limit key
                if ( $userLimit !== false ) {
                        wfDebug( __METHOD__ . ": effective user limit: $userLimit\n" );
-                       $keys[ wfMemcKey( 'limiter', $action, 'user', $id ) ] = $userLimit;
+                       $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
 
                $triggered = false;
@@ -1950,28 +1959,29 @@ class User {
         * for reload on the next hit.
         */
        public function invalidateCache() {
-               if( wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        return;
                }
                $this->load();
-               if( $this->mId ) {
+               if ( $this->mId ) {
                        $this->mTouched = self::newTouchedTimestamp();
 
                        $dbw = wfGetDB( DB_MASTER );
-
-                       // Prevent contention slams by checking user_touched first
-                       $now = $dbw->timestamp( $this->mTouched );
-                       $needsPurge = $dbw->selectField( 'user', '1',
-                               array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) )
-                       );
-                       if ( $needsPurge ) {
-                               $dbw->update( 'user',
-                                       array( 'user_touched' => $now ),
-                                       array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) ),
-                                       __METHOD__
-                               );
-                       }
-
+                       $userid = $this->mId;
+                       $touched = $this->mTouched;
+                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched ) {
+                               // Prevent contention slams by checking user_touched first
+                               $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
+                               $needsPurge = $dbw->selectField( 'user', '1',
+                                       array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
+                               if ( $needsPurge ) {
+                                       $dbw->update( 'user',
+                                               array( 'user_touched' => $dbw->timestamp( $touched ) ),
+                                               array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
+                                               __METHOD__
+                                       );
+                               }
+                       } );
                        $this->clearSharedCache();
                }
        }
@@ -3663,7 +3673,7 @@ class User {
        protected function getTokenUrl( $page, $token ) {
                // Hack to bypass localization of 'Special:'
                $title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
-               return $title->getCanonicalUrl();
+               return $title->getCanonicalURL();
        }
 
        /**
@@ -3674,8 +3684,12 @@ class User {
         * @return bool
         */
        public function confirmEmail() {
-               $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
-               wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+               // Check if it's already confirmed, so we don't touch the database
+               // and fire the ConfirmEmailComplete hook on redundant confirmations.
+               if ( !$this->isEmailConfirmed() ) {
+                       $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
+                       wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+               }
                return true;
        }
 
@@ -3855,6 +3869,7 @@ class User {
        /**
         * Check, if the given group has the given permission
         *
+        * @since 1.21
         * @param string $group Group to check
         * @param string $role Role to check
         * @return bool
@@ -4018,7 +4033,7 @@ class User {
                }
 
                // Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
-               if( empty( $wgGroupsAddToSelf['user']) || $wgGroupsAddToSelf['user'] !== true ) {
+               if( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
                        foreach( $wgGroupsAddToSelf as $key => $value ) {
                                if( is_int( $key ) ) {
                                        $wgGroupsAddToSelf['user'][] = $value;
@@ -4026,7 +4041,7 @@ class User {
                        }
                }
 
-               if( empty( $wgGroupsRemoveFromSelf['user']) || $wgGroupsRemoveFromSelf['user'] !== true ) {
+               if( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
                        foreach( $wgGroupsRemoveFromSelf as $key => $value ) {
                                if( is_int( $key ) ) {
                                        $wgGroupsRemoveFromSelf['user'][] = $value;
@@ -4385,8 +4400,6 @@ class User {
         * @todo document
         */
        protected function saveOptions() {
-               global $wgAllowPrefChange;
-
                $this->loadOptions();
 
                // Not using getOptions(), to keep hidden preferences in database
@@ -4398,7 +4411,6 @@ class User {
                        return;
                }
 
-               $extuser = ExternalUser::newFromUser( $this );
                $userId = $this->getId();
                $insert_rows = array();
                foreach( $saveOptions as $key => $value ) {
@@ -4413,16 +4425,6 @@ class User {
                                                'up_value' => $value,
                                        );
                        }
-                       if ( $extuser && isset( $wgAllowPrefChange[$key] ) ) {
-                               switch ( $wgAllowPrefChange[$key] ) {
-                                       case 'local':
-                                       case 'message':
-                                               break;
-                                       case 'semiglobal':
-                                       case 'global':
-                                               $extuser->setPref( $key, $value );
-                               }
-                       }
                }
 
                $dbw = wfGetDB( DB_MASTER );
index 3b8f5c1..1f55ef3 100644 (file)
@@ -44,7 +44,7 @@ abstract class UserArray implements Iterator {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
                if ( !$ids ) {
                        // Database::select() doesn't like empty arrays
-                       return new ArrayIterator(array());
+                       return new ArrayIterator( array() );
                }
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'user', '*', array( 'user_id' => $ids ),
index 6eb9917..2eb8429 100644 (file)
@@ -605,6 +605,7 @@ class EmailNotification {
 
                wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
                if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Not a valid page status!' );
                }
 
@@ -696,20 +697,20 @@ class EmailNotification {
 
                $keys = array();
                $postTransformKeys = array();
-               $pageTitleUrl = $this->title->getCanonicalUrl();
+               $pageTitleUrl = $this->title->getCanonicalURL();
                $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
                        // Always show a link to the diff which triggered the mail. See bug 32210.
                        $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
-                               $this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
+                               $this->title->getCanonicalURL( 'diff=next&oldid=' . $this->oldid ) )
                                ->inContentLanguage()->text();
 
                        if ( !$wgEnotifImpersonal ) {
                                // For personal mail, also show a link to the diff of all changes
                                // since last visited.
                                $keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
-                                       $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
+                                       $this->title->getCanonicalURL( 'diff=0&oldid=' . $this->oldid ) )
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID'] = $this->oldid;
@@ -724,10 +725,10 @@ class EmailNotification {
                }
 
                $keys['$PAGETITLE'] = $this->title->getPrefixedText();
-               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalUrl();
+               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
                $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
                        wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
-               $keys['$UNWATCHURL'] = $this->title->getCanonicalUrl( 'action=unwatch' );
+               $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
 
                if ( $this->editor->isAnon() ) {
                        # real anon (user:xxx.xxx.xxx.xxx)
@@ -738,10 +739,10 @@ class EmailNotification {
                } else {
                        $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
                        $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
-                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalUrl();
+                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
                }
 
-               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalUrl();
+               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
 
                # Replace this after transforming the message, bug 35019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
index 98007ef..3bdf645 100644 (file)
@@ -224,7 +224,7 @@ class WebRequest {
                }
 
                $matches = self::getPathInfo( 'title' );
-               foreach( $matches as $key => $val) {
+               foreach( $matches as $key => $val ) {
                        $this->data[$key] = $_GET[$key] = $_REQUEST[$key] = $val;
                }
        }
@@ -603,7 +603,7 @@ class WebRequest {
         * @return Boolean
         */
        public function checkSessionCookie() {
-               return isset( $_COOKIE[ session_name() ] );
+               return isset( $_COOKIE[session_name()] );
        }
 
        /**
@@ -654,11 +654,13 @@ class WebRequest {
                if( $hash !== false ) {
                        $base = substr( $base, 0, $hash );
                }
+
                if( $base[0] == '/' ) {
-                       return $base;
+                       // More than one slash will look like it is protocol relative
+                       return preg_replace( '!^/+!', '/', $base );
                } else {
                        // We may get paths with a host prepended; strip it.
-                       return preg_replace( '!^[^:]+://[^/]+/!', '/', $base );
+                       return preg_replace( '!^[^:]+://[^/]+/+!', '/', $base );
                }
        }
 
@@ -844,7 +846,7 @@ class WebRequest {
 
                if ( function_exists( 'apache_request_headers' ) ) {
                        foreach ( apache_request_headers() as $tempName => $tempValue ) {
-                               $this->headers[ strtoupper( $tempName ) ] = $tempValue;
+                               $this->headers[strtoupper( $tempName )] = $tempValue;
                        }
                } else {
                        foreach ( $_SERVER as $name => $value ) {
@@ -1103,7 +1105,7 @@ HTML;
                                $curIP = IP::canonicalize( $curIP );
                                if ( wfIsTrustedProxy( $curIP ) ) {
                                        if ( isset( $ipchain[$i + 1] ) ) {
-                                               if ( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1 ] ) ) {
+                                               if ( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1] ) ) {
                                                        $ip = $ipchain[$i + 1];
                                                }
                                        }
index b04a784..a1dbbfc 100644 (file)
@@ -211,15 +211,14 @@ class WikiReference {
        }
 
        /**
-        * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+        * Get a URL based on $wgServer, like Title::getFullURL() would produce
         * when called locally on the wiki.
         *
         * @param string $page page name (must be normalized before calling this function!)
         * @return String: URL
         */
        public function getFullUrl( $page ) {
-               return
-                       $this->mServer .
+               return $this->mServer .
                        $this->getLocalUrl( $page );
        }
 }
index 8d9d740..c016b18 100644 (file)
@@ -1161,7 +1161,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Invalidate the cache
                $this->mTitle->invalidateCache();
-               $this->clear();
 
                if ( $wgUseSquid ) {
                        // Commit the transaction before the purge is sent
@@ -1274,7 +1273,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       $row[ 'page_content_model' ] = $revision->getContentModel();
+                       $row['page_content_model'] = $revision->getContentModel();
                }
 
                $dbw->update( 'page',
@@ -1482,6 +1481,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $newContent = $sectionContent;
                } else {
                        if ( !$this->supportsSections() ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
                        }
 
@@ -1747,6 +1747,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        if ( $changed ) {
                                if ( !$content->isValid() ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( "New content failed validity check!" );
                                }
 
@@ -2591,8 +2592,8 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       $row[ 'ar_content_model' ] = 'rev_content_model';
-                       $row[ 'ar_content_format' ] = 'rev_content_format';
+                       $row['ar_content_model'] = 'rev_content_model';
+                       $row['ar_content_format'] = 'rev_content_format';
                }
 
                $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
index ee19dee..7cecf3a 100644 (file)
@@ -493,17 +493,17 @@ class Xml {
 
                $options = self::option( $other, 'other', $selected === 'other' );
 
-               foreach ( explode( "\n", $list ) as $option) {
+               foreach ( explode( "\n", $list ) as $option ) {
                                $value = trim( $option );
                                if ( $value == '' ) {
                                        continue;
-                               } elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
+                               } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
                                        // A new group is starting ...
                                        $value = trim( substr( $value, 1 ) );
                                        if( $optgroup ) $options .= self::closeElement( 'optgroup' );
                                        $options .= self::openElement( 'optgroup', array( 'label' => $value ) );
                                        $optgroup = true;
-                               } elseif ( substr( $value, 0, 2) == '**' ) {
+                               } elseif ( substr( $value, 0, 2 ) == '**' ) {
                                        // groupmember
                                        $value = trim( substr( $value, 2 ) );
                                        $options .= self::option( $value, $value, $selected === $value );
@@ -590,6 +590,7 @@ class Xml {
         * for JavaScript source code.
         * Illegal control characters are assumed not to be present.
         *
+        * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
         * @param string $string to escape
         * @return String
         */
@@ -621,72 +622,46 @@ class Xml {
        }
 
        /**
-        * Encode a variable of unknown type to JavaScript.
-        * Arrays are converted to JS arrays, objects are converted to JS associative
-        * arrays (objects). So cast your PHP associative arrays to objects before
-        * passing them to here.
+        * Encode a variable of arbitrary type to JavaScript.
+        * If the value is an XmlJsCode object, pass through the object's value verbatim.
         *
-        * @param $value
+        * @note Only use this function for generating JavaScript code. If generating output
+        *       for a proper JSON parser, just call FormatJson::encode() directly.
         *
-        * @return string
+        * @param mixed $value The value being encoded. Can be any type except a resource.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encodeJsVar( $value ) {
-               if ( is_bool( $value ) ) {
-                       $s = $value ? 'true' : 'false';
-               } elseif ( is_null( $value ) ) {
-                       $s = 'null';
-               } elseif ( is_int( $value ) || is_float( $value ) ) {
-                       $s = strval( $value );
-               } elseif ( is_array( $value ) && // Make sure it's not associative.
-                                       array_keys( $value ) === range( 0, count( $value ) - 1 ) ||
-                                       count( $value ) == 0
-                               ) {
-                       $s = '[';
-                       foreach ( $value as $elt ) {
-                               if ( $s != '[' ) {
-                                       $s .= ',';
-                               }
-                               $s .= self::encodeJsVar( $elt );
-                       }
-                       $s .= ']';
-               } elseif ( $value instanceof XmlJsCode ) {
-                       $s = $value->value;
-               } elseif ( is_object( $value ) || is_array( $value ) ) {
-                       // Objects and associative arrays
-                       $s = '{';
-                       foreach ( (array)$value as $name => $elt ) {
-                               if ( $s != '{' ) {
-                                       $s .= ',';
-                               }
-
-                               $s .= '"' . self::escapeJsString( $name ) . '":' .
-                                       self::encodeJsVar( $elt );
-                       }
-                       $s .= '}';
-               } else {
-                       $s = '"' . self::escapeJsString( $value ) . '"';
+       public static function encodeJsVar( $value, $pretty = false ) {
+               if ( $value instanceof XmlJsCode ) {
+                       return $value->value;
                }
-               return $s;
+               return FormatJson::encode( $value, $pretty, FormatJson::UTF8_OK );
        }
 
        /**
         * Create a call to a JavaScript function. The supplied arguments will be
         * encoded using Xml::encodeJsVar().
         *
+        * @since 1.17
         * @param string $name The name of the function to call, or a JavaScript expression
         *    which evaluates to a function object which is called.
-        * @param array $args of arguments to pass to the function.
-        *
-        * @since 1.17
-        *
-        * @return string
+        * @param array $args The arguments to pass to the function.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encodeJsCall( $name, $args ) {
+       public static function encodeJsCall( $name, $args, $pretty = false ) {
                foreach ( $args as &$arg ) {
-                       $arg = Xml::encodeJsVar( $arg );
+                       $arg = Xml::encodeJsVar( $arg, $pretty );
+                       if ( $arg === false ) {
+                               return false;
+                       }
                }
 
-               return "$name(" . implode( ', ', $args ) . ");\n";
+               return "$name(" . ( $pretty
+                       ? ( ' ' . implode( ', ', $args ) . ' ' )
+                       : implode( ',', $args )
+               ) . ");";
        }
 
        /**
@@ -963,6 +938,11 @@ class XmlSelect {
  *    Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
  *
  * Returns "a + b".
+ *
+ * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
+ *       exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
+ *       called for each individual element in that array.
+ *
  * @since 1.17
  */
 class XmlJsCode {
index 4d3c41b..895f3d3 100644 (file)
@@ -79,17 +79,17 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get the last author with the last modification time
-        * @param $article Article object
+        * @param Page $page
         * @return String HTML
         */
-       protected function getAuthor( Page $article ) {
-               $user = User::newFromName( $article->getUserText(), false );
+       protected function getAuthor( Page $page ) {
+               $user = User::newFromName( $page->getUserText(), false );
 
-               $timestamp = $article->getTimestamp();
+               $timestamp = $page->getTimestamp();
                if ( $timestamp ) {
                        $lang = $this->getLanguage();
-                       $d = $lang->date( $article->getTimestamp(), true );
-                       $t = $lang->time( $article->getTimestamp(), true );
+                       $d = $lang->date( $page->getTimestamp(), true );
+                       $t = $lang->time( $page->getTimestamp(), true );
                } else {
                        $d = '';
                        $t = '';
index dec3d84..3dd4c48 100644 (file)
@@ -43,21 +43,11 @@ class EditAction extends FormlessAction {
 
        public function show() {
                $page = $this->page;
-               $request = $this->getRequest();
                $user = $this->getUser();
-               $context = $this->getContext();
 
                if ( wfRunHooks( 'CustomEditor', array( $page, $user ) ) ) {
-                       if ( ExternalEdit::useExternalEngine( $context, 'edit' )
-                               && $this->getName() == 'edit' && !$request->getVal( 'section' )
-                               && !$request->getVal( 'oldid' ) )
-                       {
-                               $extedit = new ExternalEdit( $context );
-                               $extedit->execute();
-                       } else {
-                               $editor = new EditPage( $page );
-                               $editor->edit();
-                       }
+                       $editor = new EditPage( $page );
+                       $editor->edit();
                }
 
        }
index f2e61a5..8729426 100644 (file)
@@ -224,7 +224,7 @@ class HistoryAction extends FormlessAction {
                }
 
                if ( $offset ) {
-                       $offsets = array( 'rev_timestamp $oper ' . $dbr->addQuotes( $dbr->timestamp( $offset ) ) );
+                       $offsets = array( "rev_timestamp $oper " . $dbr->addQuotes( $dbr->timestamp( $offset ) ) );
                } else {
                        $offsets = array();
                }
@@ -256,7 +256,7 @@ class HistoryAction extends FormlessAction {
                        $this->getTitle()->getPrefixedText() . ' - ' .
                        $this->msg( 'history-feed-title' )->inContentLanguage()->text(),
                        $this->msg( 'history-feed-description' )->inContentLanguage()->text(),
-                       $this->getTitle()->getFullUrl( 'action=history' )
+                       $this->getTitle()->getFullURL( 'action=history' )
                );
 
                // Get a limit on number of feed entries. Provide a sane default
@@ -283,10 +283,10 @@ class HistoryAction extends FormlessAction {
                return new FeedItem(
                        $this->msg( 'nohistory' )->inContentLanguage()->text(),
                        $this->msg( 'history-feed-empty' )->inContentLanguage()->parseAsBlock(),
-                       $this->getTitle()->getFullUrl(),
+                       $this->getTitle()->getFullURL(),
                        wfTimestamp( TS_MW ),
                        '',
-                       $this->getTitle()->getTalkPage()->getFullUrl()
+                       $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
 
@@ -323,10 +323,10 @@ class HistoryAction extends FormlessAction {
                return new FeedItem(
                        $title,
                        $text,
-                       $this->getTitle()->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
+                       $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
                        $rev->getTimestamp(),
                        $rev->getUserText(),
-                       $this->getTitle()->getTalkPage()->getFullUrl()
+                       $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
 }
index 1e312d7..55fa108 100644 (file)
@@ -126,7 +126,7 @@ class InfoAction extends FormlessAction {
        /**
         * Creates a header that can be added to the output.
         *
-        * @param $header The header text.
+        * @param string $header The header text.
         * @return string The HTML.
         */
        protected function makeHeader( $header ) {
@@ -229,7 +229,7 @@ class InfoAction extends FormlessAction {
                }
 
                // Default sort key
-               $sortKey = $title->getCategorySortKey();
+               $sortKey = $title->getCategorySortkey();
                if ( !empty( $pageProperties['defaultsort'] ) ) {
                        $sortKey = $pageProperties['defaultsort'];
                }
index 00bb961..82cdc79 100644 (file)
@@ -96,6 +96,6 @@ class PurgeAction extends FormAction {
        }
 
        public function onSuccess() {
-               $this->getOutput()->redirect( $this->getTitle()->getFullUrl( $this->redirectParams ) );
+               $this->getOutput()->redirect( $this->getTitle()->getFullURL( $this->redirectParams ) );
        }
 }
index d1d457c..23db874 100644 (file)
@@ -195,7 +195,7 @@ class RawAction extends FormlessAction {
                        case 'next':
                                # output next revision, or nothing if there isn't one
                                if( $oldid ) {
-                                       $oldid = $this->getTitle()->getNextRevisionId( $oldid );
+                                       $oldid = $this->getTitle()->getNextRevisionID( $oldid );
                                }
                                $oldid = $oldid ? $oldid : -1;
                                break;
@@ -205,7 +205,7 @@ class RawAction extends FormlessAction {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+                               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
                                $oldid = $prev ? $prev : -1;
                                break;
                        case 'cur':
@@ -251,6 +251,10 @@ class RawAction extends FormlessAction {
 class RawPage extends RawAction {
        public $mOldId;
 
+       /**
+        * @param Page $page
+        * @param WebRequest|bool $request The WebRequest (default: false).
+        */
        function __construct( Page $page, $request = false ) {
                wfDeprecated( __CLASS__, '1.19' );
                parent::__construct( $page );
index d2d50ae..f386a8a 100644 (file)
@@ -445,7 +445,7 @@ abstract class ApiBase extends ContextSource {
                                                                $hintPipeSeparated = false;
                                                                break;
                                                        case 'limit':
-                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
+                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
                                                                if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
                                                                        $desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
                                                                }
@@ -1081,7 +1081,7 @@ abstract class ApiBase extends ContextSource {
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
                        // Bug 33482 - Allow entries with | in them for non-multiple values
-                       if ( in_array( $value, $allowedValues ) ) {
+                       if ( in_array( $value, $allowedValues, true ) ) {
                                return $value;
                        }
 
@@ -1165,7 +1165,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Validate and normalize of parameters of type 'user'
         * @param string $value Parameter value
-        * @param string $encParamName Parameter value
+        * @param string $encParamName Parameter name
         * @return string Validated and normalized parameter
         */
        private function validateUser( $value, $encParamName ) {
@@ -1535,7 +1535,7 @@ abstract class ApiBase extends ContextSource {
        public function getWatchlistUser( $params ) {
                if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
                        $user = User::newFromName( $params['owner'], false );
-                       if ( !($user && $user->getId()) ) {
+                       if ( !( $user && $user->getId() ) ) {
                                $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
                        }
                        $token = $user->getOption( 'watchlisttoken' );
index 55c60cc..278ea29 100644 (file)
@@ -43,8 +43,6 @@ class ApiCreateAccount extends ApiBase {
 
                $params = $this->extractRequestParams();
 
-               $result = array();
-
                // Init session if necessary
                if ( session_id() == '' ) {
                        wfSetupSession();
@@ -54,6 +52,10 @@ class ApiCreateAccount extends ApiBase {
                        $this->dieUsageMsg( 'noemail' );
                }
 
+               if ( $params['language'] && !Language::isSupportedLanguage( $params['language'] ) ) {
+                       $this->dieUsage( 'Invalid language parameter', 'langinvalid' );
+               }
+
                $context = new DerivativeContext( $this->getContext() );
                $context->setRequest( new DerivativeRequest(
                        $this->getContext()->getRequest(),
@@ -80,12 +82,10 @@ class ApiCreateAccount extends ApiBase {
                $result = array();
                if( $status->isGood() ) {
                        // Success!
+                       global $wgEmailAuthentication;
                        $user = $status->getValue();
 
-                       // If we showed up language selection links, and one was in use, be
-                       // smart (and sensible) and save that language as the user's preference
-                       global $wgLoginLanguageSelector, $wgEmailAuthentication;
-                       if( $wgLoginLanguageSelector && $params['language'] ) {
+                       if( $params['language'] ) {
                                $user->setOption( 'language', $params['language'] );
                        }
 
@@ -275,6 +275,10 @@ class ApiCreateAccount extends ApiBase {
                        'code' => 'aborted',
                        'info' => 'Account creation aborted by hook (info may vary)'
                );
+               $errors[] = array(
+                       'code' => 'langinvalid',
+                       'info' => 'Invalid language parameter'
+               );
 
                // 'passwordtooshort' has parameters. :(
                global $wgMinimalPasswordLength;
index abb6348..342a580 100644 (file)
@@ -56,30 +56,32 @@ class ApiFormatJson extends ApiFormatBase {
        }
 
        public function execute() {
-               $prefix = $suffix = '';
-
                $params = $this->extractRequestParams();
+               $json = FormatJson::encode(
+                       $this->getResultData(),
+                       $this->getIsHtml(),
+                       $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
+               );
                $callback = $params['callback'];
-               if ( !is_null( $callback ) ) {
-                       $prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ) . '(';
-                       $suffix = ')';
+               if ( $callback !== null ) {
+                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+                       $this->printText( "$callback($json)" );
+               } else {
+                       $this->printText( $json );
                }
-               $this->printText(
-                       $prefix .
-                       FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
-                       $suffix
-               );
        }
 
        public function getAllowedParams() {
                return array(
-                       'callback'  => null,
+                       'callback' => null,
+                       'utf8' => false,
                );
        }
 
        public function getParamDescription() {
                return array(
                        'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
+                       'utf8' => 'If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.',
                );
        }
 
index 183d48c..f9b85ef 100644 (file)
@@ -32,7 +32,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        private $mRootElemName = 'api';
        public static $namespace = 'http://www.mediawiki.org/xml/api/';
-       private $mDoubleQuote = false;
        private $mIncludeNamespace = false;
        private $mXslt = null;
 
@@ -50,7 +49,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $this->mDoubleQuote = $params['xmldoublequote'];
                $this->mIncludeNamespace = $params['includexmlnamespace'];
                $this->mXslt = $params['xslt'];
 
@@ -71,8 +69,7 @@ class ApiFormatXml extends ApiFormatBase {
                $this->printText(
                        self::recXmlPrint( $this->mRootElemName,
                                $data,
-                               $this->getIsHtml() ? - 2 : null,
-                               $this->mDoubleQuote
+                               $this->getIsHtml() ? - 2 : null
                        )
                );
        }
@@ -117,11 +114,10 @@ class ApiFormatXml extends ApiFormatBase {
         * @param $elemName
         * @param $elemValue
         * @param $indent
-        * @param $doublequote bool
         *
         * @return string
         */
-       public static function recXmlPrint( $elemName, $elemValue, $indent, $doublequote = false ) {
+       public static function recXmlPrint( $elemName, $elemValue, $indent ) {
                $retval = '';
                if ( !is_null( $indent ) ) {
                        $indent += 2;
@@ -134,9 +130,6 @@ class ApiFormatXml extends ApiFormatBase {
                if ( is_array( $elemValue ) ) {
                        if ( isset( $elemValue['*'] ) ) {
                                $subElemContent = $elemValue['*'];
-                               if ( $doublequote ) {
-                                       $subElemContent = Sanitizer::encodeAttribute( $subElemContent );
-                               }
                                unset( $elemValue['*'] );
 
                                // Add xml:space="preserve" to the
@@ -157,10 +150,6 @@ class ApiFormatXml extends ApiFormatBase {
                        $indElements = array();
                        $subElements = array();
                        foreach ( $elemValue as $subElemId => & $subElemValue ) {
-                               if ( is_string( $subElemValue ) && $doublequote ) {
-                                       $subElemValue = Sanitizer::encodeAttribute( $subElemValue );
-                               }
-
                                if ( is_int( $subElemId ) ) {
                                        $indElements[] = $subElemValue;
                                        unset( $elemValue[$subElemId] );
@@ -226,7 +215,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function getAllowedParams() {
                return array(
-                       'xmldoublequote' => false,
                        'xslt' => null,
                        'includexmlnamespace' => false,
                );
@@ -234,7 +222,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function getParamDescription() {
                return array(
-                       'xmldoublequote' => 'If specified, double quotes all attributes and content',
                        'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
                                . 'in the MediaWiki namespace whose page name ends with ".xsl"',
                        'includexmlnamespace' => 'If specified, adds an XML namespace'
index b2d7582..e4642dd 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 class ApiImageRotate extends ApiBase {
-
        private $mPageSet = null;
 
        public function __construct( $main, $action ) {
@@ -53,16 +52,13 @@ class ApiImageRotate extends ApiBase {
                }
        }
 
-
        public function execute() {
                $params = $this->extractRequestParams();
-               $rotation = $params[ 'rotation' ];
-               $user = $this->getUser();
+               $rotation = $params['rotation'];
 
                $pageSet = $this->getPageSet();
                $pageSet->execute();
 
-               $result = array();
                $result = array();
 
                self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
@@ -111,15 +107,17 @@ class ApiImageRotate extends ApiBase {
                                continue;
                        }
                        $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
-                       $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+                       $tmpFile = TempFSFile::factory( 'rotate_', $ext );
                        $dstPath = $tmpFile->getPath();
                        $err = $handler->rotate( $file, array(
                                "srcPath" => $srcPath,
                                "dstPath" => $dstPath,
-                               "rotation"=> $rotation
+                               "rotation" => $rotation
                        ) );
                        if ( !$err ) {
-                               $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+                               $comment = wfMessage(
+                                       'rotate-comment'
+                               )->numParams( $rotation )->inContentLanguage()->text();
                                $status = $file->upload( $dstPath,
                                        $comment, $comment, 0, false, false, $this->getUser() );
                                if ( $status->isGood() ) {
@@ -152,13 +150,14 @@ class ApiImageRotate extends ApiBase {
 
        /**
         * Checks that the user has permissions to perform rotations.
-        * @param $user User The user to check.
+        * @param User $user The user to check
+        * @param Title $title
         * @return string|null Permission error message, or null if there is no error
         */
        protected function checkPermissions( $user, $title ) {
                $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit' , $user ),
-                       $title->getUserPermissionsErrors( 'upload' , $user )
+                       $title->getUserPermissionsErrors( 'edit', $user ),
+                       $title->getUserPermissionsErrors( 'upload', $user )
                );
 
                if ( $permissionErrors ) {
@@ -179,7 +178,6 @@ class ApiImageRotate extends ApiBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               $pageSet = $this->getPageSet();
                $result = array(
                        'rotation' => array(
                                ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
@@ -198,7 +196,7 @@ class ApiImageRotate extends ApiBase {
 
        public function getParamDescription() {
                $pageSet = $this->getPageSet();
-               return $pageSet->getParamDescription() + array(
+               return $pageSet->getFinalParamDescription() + array(
                        'rotation' => 'Degrees to rotate image clockwise',
                        'token' => 'Edit token. You can get one of these through action=tokens',
                );
index 80bca2f..abd47b2 100644 (file)
@@ -83,7 +83,7 @@ class ApiMain extends ApiBase {
                'import' => 'ApiImport',
                'userrights' => 'ApiUserrights',
                'options' => 'ApiOptions',
-               'imagerotate' =>'ApiImageRotate',
+               'imagerotate' => 'ApiImageRotate',
        );
 
        /**
@@ -418,7 +418,7 @@ class ApiMain extends ApiBase {
                }
 
                // Log the request whether or not there was an error
-               $this->logRequest( microtime( true ) - $t);
+               $this->logRequest( microtime( true ) - $t );
 
                // Send cache headers after any code which might generate an error, to
                // avoid sending public cache headers for errors.
@@ -1048,6 +1048,7 @@ class ApiMain extends ApiBase {
                        'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
                        'origin' => array(
                                'When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain.',
+                               'This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).',
                                'This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org .',
                                'If this parameter does not match the Origin: header, a 403 response will be returned.',
                                'If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.',
index caf361a..315ace3 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Oct 13, 2006
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  */
 class ApiOpenSearch extends ApiBase {
 
+       /**
+        * Override built-in handling of format parameter.
+        * Only JSON is supported.
+        *
+        * @return ApiFormatBase
+        */
        public function getCustomPrinter() {
-               return $this->getMain()->createPrinterByName( 'json' );
+               $params = $this->extractRequestParams();
+               $format = $params['format'];
+               $allowed = array( 'json', 'jsonfm' );
+               if ( in_array( $format, $allowed ) ) {
+                       return $this->getMain()->createPrinterByName( $format );
+               }
+               return $this->getMain()->createPrinterByName( $allowed[0] );
        }
 
        public function execute() {
@@ -94,6 +104,10 @@ class ApiOpenSearch extends ApiBase {
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'suggest' => false,
+                       'format' => array(
+                               ApiBase::PARAM_DFLT => 'json',
+                               ApiBase::PARAM_TYPE => array( 'json', 'jsonfm' ),
+                       )
                );
        }
 
@@ -103,6 +117,7 @@ class ApiOpenSearch extends ApiBase {
                        'limit' => 'Maximum amount of results to return',
                        'namespace' => 'Namespaces to search',
                        'suggest' => 'Do nothing if $wgEnableOpenSearchSuggest is false',
+                       'format' => 'The format of the output',
                );
        }
 
index 074efe4..0645edb 100644 (file)
@@ -69,6 +69,9 @@ class ApiPageSet extends ApiBase {
        private $mFakePageId = -1;
        private $mCacheMode = 'public';
        private $mRequestedPageFields = array();
+       /**
+        * @var int
+        */
        private $mDefaultNamespace = NS_MAIN;
 
        /**
@@ -595,7 +598,7 @@ class ApiPageSet extends ApiBase {
                }
 
                foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
-                       $fieldValues[$pageId] = $row-> $fieldName;
+                       $fieldValues[$pageId] = $row->$fieldName;
                }
        }
 
index 134f4a0..49cc738 100644 (file)
@@ -158,7 +158,7 @@ class ApiPurge extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription()
+               return $this->getPageSet()->getFinalParamDescription()
                        + array( 'forcelinkupdate' => 'Update the links tables' );
        }
 
index f69ad23..4d9a772 100644 (file)
@@ -382,7 +382,6 @@ class ApiQuery extends ApiBase {
                $modules = $allModules;
                $tmp = $completeModules;
                $wasPosted = $this->getRequest()->wasPosted();
-               $main = $this->getMain();
 
                /** @var $module ApiQueryBase */
                foreach ( $allModules as $moduleName => $module ) {
@@ -513,7 +512,7 @@ class ApiQuery extends ApiBase {
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['special'] = '';
                        if ( $title->isSpecialPage() &&
-                                       !SpecialPageFactory::exists( $title->getDbKey() ) ) {
+                                       !SpecialPageFactory::exists( $title->getDBkey() ) ) {
                                $vals['missing'] = '';
                        } elseif ( $title->getNamespace() == NS_MEDIA &&
                                        !wfFindFile( $title ) ) {
@@ -697,7 +696,7 @@ class ApiQuery extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription() + array(
+               return $this->getPageSet()->getFinalParamDescription() + array(
                        'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
                        'list' => 'Which lists to get. Module help is available below',
                        'meta' => 'Which metadata to get about the site. Module help is available below',
index 496a0eb..952c2dc 100644 (file)
@@ -76,7 +76,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                if ( $dir == 'newer' ) {
                        $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
                } else {
-                       $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+                       $this->addWhereRange( 'cat_pages', 'older', $max, $min );
                }
 
                if ( isset( $params['prefix'] ) ) {
index 3ef6b84..6899808 100644 (file)
@@ -294,9 +294,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                        // We've reached the one extra which shows that there are additional pages to be had. Stop here...
                                        // We need to keep the parent page of this redir in
                                        if ( $this->hasNS ) {
-                                               $parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
                                        } else {
-                                               $parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[NS_FILE][$row->{$this->bl_title}];
                                        }
                                        $this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
                                        break;
@@ -377,8 +377,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $row->page_is_redirect ) {
                        $a['redirect'] = '';
                }
-               $ns = $this->hasNS ? $row-> { $this->bl_ns } : NS_FILE;
-               $parentID = $this->pageMap[$ns][$row-> { $this->bl_title } ];
+               $ns = $this->hasNS ? $row->{$this->bl_ns} : NS_FILE;
+               $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
                // Put all the results in an array first
                $this->resultArr[$parentID]['redirlinks'][] = $a;
                $this->getResult()->setIndexedTagName( $this->resultArr[$parentID]['redirlinks'], $this->bl_code );
index 7819ead..44fbf58 100644 (file)
@@ -432,7 +432,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( trim( $key ) == '' ) {
                        return '';
                }
-               $t = Title::newFromDbKey( $key );
+               $t = Title::newFromDBkey( $key );
                // This really shouldn't happen but we gotta check anyway
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $key ) );
index d9be9f2..ba90452 100644 (file)
@@ -63,7 +63,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                $this->addTables( 'ipblocks' );
                $this->addFields( 'ipb_auto' );
 
-               $this->addFieldsIf ( 'ipb_id', $fld_id );
+               $this->addFieldsIf( 'ipb_id', $fld_id );
                $this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
                $this->addFieldsIf( 'ipb_by_text', $fld_by );
                $this->addFieldsIf( 'ipb_by', $fld_byid );
index 69a6441..b2d3b1e 100644 (file)
@@ -49,7 +49,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
        /**
         * @param $resultPageSet ApiPageSet
-        * @return
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
@@ -174,7 +173,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                        break;
                                }
 
-                               $titles[] = Title :: makeTitle( NS_CATEGORY, $row->cl_to );
+                               $titles[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
                        }
                        $resultPageSet->populateFromTitles( $titles );
                }
index 18dcba8..7f73631 100644 (file)
@@ -48,8 +48,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
-        * @return
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
index fc77b4e..6f03bbe 100644 (file)
@@ -81,8 +81,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_title' . $sort,
-                                               'iwl_from' . $sort
+                                               'iwl_from' . $sort,
+                                               'iwl_title' . $sort
                                ));
                        }
                } else {
@@ -92,7 +92,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        } else {
                                $this->addOption( 'ORDER BY', array (
                                                'iwl_from' . $sort,
-                                               'iwl_prefix' . $sort
+                                               'iwl_prefix' . $sort,
+                                               'iwl_title' . $sort
                                ));
                        }
                }
index 556f147..87bdbfe 100644 (file)
@@ -170,9 +170,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                }
                                                break;
                                        }
-                                       $fit = $this->addPageSubItem( $pageId,
-                                               self::getInfo( $oldie, $prop, $result,
-                                                       $finalThumbParams, $params['metadataversion'] ) );
+                                       $fit = self::getTransformCount() < self::TRANSFORM_LIMIT &&
+                                               $this->addPageSubItem( $pageId,
+                                                       self::getInfo( $oldie, $prop, $result,
+                                                               $finalThumbParams, $params['metadataversion']
+                                                       )
+                                               );
                                        if ( !$fit ) {
                                                if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        $this->setContinueEnumParameter( 'start',
@@ -547,7 +550,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * Returns the descriptions for the properties provided by getPropertyNames()
         *
         * @param array $filter List of properties to filter out
-        *
+        * @param string $modulePrefix
         * @return array
         */
        public static function getPropertyDescriptions( $filter = array(), $modulePrefix = '' ) {
index ac65d2d..e6b02d7 100644 (file)
@@ -67,18 +67,15 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
-                       $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-                       if ( isset( $params['lang'] ) ) {
+               // Note that, since (ll_from, ll_lang) is a unique key, we don't need
+               // to sort by ll_title to ensure deterministic ordering.
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               if ( isset( $params['lang'] ) ) {
                        $this->addWhereFld( 'll_lang', $params['lang'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'll_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'll_from' . $sort );
-                       } else {
-                               $this->addOption( 'ORDER BY', array(
-                                                       'll_title' . $sort,
-                                                       'll_from' . $sort
-                               ));
                        }
+                       $this->addOption( 'ORDER BY', 'll_from' . $sort );
                } else {
                        // Don't order by ll_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
index 72e80b8..8aceab2 100644 (file)
@@ -159,15 +159,20 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                        $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
                        $id = intval( $cont[1] );
-                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $op = $params['dir'] === 'older' ? '<' : '>';
 
                        $this->addWhere(
                                "rc_timestamp $op $timestamp OR " .
                                "(rc_timestamp = $timestamp AND " .
-                               "rc_id <= $id)"
+                               "rc_id $op= $id)"
                        );
                }
 
+               $order = $params['dir'] === 'older' ? 'DESC' : 'ASC';
+               $this->addOption( 'ORDER BY', array(
+                       "rc_timestamp $order",
+                       "rc_id $order",
+               ) );
 
                $this->addWhereFld( 'rc_namespace', $params['namespace'] );
                $this->addWhereFld( 'rc_deleted', 0 );
index 810e1d6..f79083e 100644 (file)
@@ -121,7 +121,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data = array();
                $mainPage = Title::newMainPage();
                $data['mainpage'] = $mainPage->getPrefixedText();
-               $data['base'] = wfExpandUrl( $mainPage->getFullUrl(), PROTO_CURRENT );
+               $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
                $data['sitename'] = $GLOBALS['wgSitename'];
                $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
@@ -675,7 +675,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' variables             - Returns a list of variable IDs',
                                ' protocols             - Returns a list of protocols that are allowed in external links.',
                        ),
-                       'filteriw' =>  'Return only local or only nonlocal entries of the interwiki map',
+                       'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
                        'showalldb' => 'List all database servers, not just the one lagging the most',
                        'numberingroup' => 'Lists the number of users in user groups',
                        'inlanguagecode' => 'Language code for localised language names (best effort, use CLDR extension)',
index c4a1328..d219c91 100644 (file)
@@ -40,7 +40,7 @@ class ApiRsd extends ApiBase {
                $service = array( 'apis' => $this->formatRsdApiList() );
                ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
                ApiResult::setContent( $service, 'https://www.mediawiki.org/', 'engineLink' );
-               ApiResult::setContent( $service, Title::newMainPage()->getCanonicalUrl(), 'homePageLink' );
+               ApiResult::setContent( $service, Title::newMainPage()->getCanonicalURL(), 'homePageLink' );
 
                $result->setIndexedTagName( $service['apis'], 'api' );
 
index 58d5d9a..cae9673 100644 (file)
@@ -212,7 +212,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription() + array(
+               return $this->getPageSet()->getFinalParamDescription() + array(
                        'entirewatchlist' => 'Work on all watched pages',
                        'timestamp' => 'Timestamp to which to set the notification timestamp',
                        'torevid' => 'Revision to set the notification timestamp to (one page only)',
index 2dcf392..719032f 100644 (file)
@@ -444,9 +444,9 @@ class ApiUpload extends ApiBase {
                $verification = $this->mUpload->verifyUpload();
                if ( $verification['status'] === UploadBase::OK ) {
                        return;
-               } else {
-                       return $this->checkVerification( $verification );
                }
+
+               $this->checkVerification( $verification );
        }
 
        /**
@@ -455,7 +455,7 @@ class ApiUpload extends ApiBase {
        protected function checkVerification( array $verification ) {
                global $wgFileExtensions;
 
-               // TODO: Move them to ApiBase's message map
+               // @todo Move them to ApiBase's message map
                switch( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
index 2de7b48..d093b58 100644 (file)
@@ -354,7 +354,6 @@ class LocalisationCache {
         * @param $code
         * @param $key
         * @param $subkey
-        * @return
         */
        protected function loadSubitem( $code, $key, $subkey ) {
                if ( !in_array( $key, self::$splitKeys ) ) {
@@ -384,6 +383,9 @@ class LocalisationCache {
 
        /**
         * Returns true if the cache identified by $code is missing or expired.
+        *
+        * @param string $code
+        *
         * @return bool
         */
        public function isExpired( $code ) {
@@ -494,6 +496,7 @@ class LocalisationCache {
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
+               wfProfileIn( __METHOD__ );
                // Disable APC caching
                $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
                include( $_fileName );
@@ -504,8 +507,10 @@ class LocalisationCache {
                } elseif ( $_fileType == 'aliases' ) {
                        $data = compact( 'aliases' );
                } else {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
                }
+               wfProfileOut( __METHOD__ );
                return $data;
        }
 
@@ -606,9 +611,11 @@ class LocalisationCache {
         */
        protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
                global $IP;
+               wfProfileIn( __METHOD__ );
 
                $fileName = Language::getMessagesFileName( $code );
                if ( !file_exists( $fileName ) ) {
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -625,6 +632,7 @@ class LocalisationCache {
                $deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
                $deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
 
+               wfProfileOut( __METHOD__ );
                return $data;
        }
 
@@ -715,6 +723,7 @@ class LocalisationCache {
                wfProfileIn( __METHOD__ );
 
                if ( !$code ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Invalid language code requested" );
                }
                $this->recachedLangs[$code] = true;
@@ -783,6 +792,7 @@ class LocalisationCache {
                # This is done after the core because we know the fallback sequence now.
                # But it has a higher precedence for merging so that we can support things
                # like site-specific message overrides.
+               wfProfileIn( __METHOD__ . '-extensions' );
                $allData = $initialData;
                foreach ( $wgExtensionMessagesFiles as $fileName ) {
                        $data = $this->readPHPFile( $fileName, 'extension' );
@@ -803,6 +813,7 @@ class LocalisationCache {
                foreach ( $coreData as $key => $item ) {
                        $this->mergeItem( $key, $allData[$key], $item );
                }
+               wfProfileOut( __METHOD__ . '-extensions' );
 
                # Add cache dependencies for any referenced globals
                $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
@@ -842,6 +853,7 @@ class LocalisationCache {
                wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
 
                if ( is_null( $allData['namespaceNames'] ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
                                'Check that your languages/messages/MessagesEn.php file is intact.' );
                }
@@ -856,6 +868,7 @@ class LocalisationCache {
                }
 
                # Save to the persistent cache
+               wfProfileIn( __METHOD__ . '-write' );
                $this->store->startWrite( $code );
                foreach ( $allData as $key => $value ) {
                        if ( in_array( $key, self::$splitKeys ) ) {
@@ -867,6 +880,7 @@ class LocalisationCache {
                        }
                }
                $this->store->finishWrite();
+               wfProfileOut( __METHOD__ . '-write' );
 
                # Clear out the MessageBlobStore
                # HACK: If using a null (i.e. disabled) storage backend, we
@@ -967,7 +981,7 @@ interface LCStore {
 
        /**
         * Start a write transaction.
-        * @param $code Language code
+        * @param string $code Language code
         */
        function startWrite( $code );
 
@@ -979,8 +993,8 @@ interface LCStore {
        /**
         * Set a key to a given value. startWrite() must be called before this
         * is called, and finishWrite() must be called afterwards.
-        * @param $key
-        * @param $value
+        * @param string $key
+        * @param mixed $value
         */
        function set( $key, $value );
 }
index 7425978..6cc2a7e 100644 (file)
@@ -25,8 +25,8 @@
  *
  */
 define( 'MSG_LOAD_TIMEOUT', 60 );
-define( 'MSG_LOCK_TIMEOUT', 10 );
-define( 'MSG_WAIT_TIMEOUT', 10 );
+define( 'MSG_LOCK_TIMEOUT', 30 );
+define( 'MSG_WAIT_TIMEOUT', 30 );
 define( 'MSG_CACHE_VERSION', 1 );
 
 /**
@@ -75,12 +75,16 @@ class MessageCache {
         * Get the signleton instance of this class
         *
         * @since 1.18
-        * @return MessageCache object
+        * @return MessageCache
         */
        public static function singleton() {
                if ( is_null( self::$instance ) ) {
                        global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
-                       self::$instance = new self( wfGetMessageCacheStorage(), $wgUseDatabaseMessages, $wgMsgCacheExpiry );
+                       self::$instance = new self(
+                               wfGetMessageCacheStorage(),
+                               $wgUseDatabaseMessages,
+                               $wgMsgCacheExpiry
+                       );
                }
                return self::$instance;
        }
@@ -119,15 +123,13 @@ class MessageCache {
 
        /**
         * Try to load the cache from a local file.
-        * Actual format of the file depends on the $wgLocalMessageCacheSerialized
-        * setting.
         *
         * @param string $hash the hash of contents, to check validity.
-        * @param $code Mixed: Optional language code, see documenation of load().
-        * @return bool on failure.
+        * @param Mixed $code Optional language code, see documenation of load().
+        * @return array The cache array
         */
-       function loadFromLocal( $hash, $code ) {
-               global $wgCacheDirectory, $wgLocalMessageCacheSerialized;
+       function getLocalCache( $hash, $code ) {
+               global $wgCacheDirectory;
 
                $filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
 
@@ -139,31 +141,19 @@ class MessageCache {
                        return false; // No cache file
                }
 
-               if ( $wgLocalMessageCacheSerialized ) {
-                       // Check to see if the file has the hash specified
-                       $localHash = fread( $file, 32 );
-                       if ( $hash === $localHash ) {
-                               // All good, get the rest of it
-                               $serialized = '';
-                               while ( !feof( $file ) ) {
-                                       $serialized .= fread( $file, 100000 );
-                               }
-                               fclose( $file );
-                               return $this->setCache( unserialize( $serialized ), $code );
-                       } else {
-                               fclose( $file );
-                               return false; // Wrong hash
+               // Check to see if the file has the hash specified
+               $localHash = fread( $file, 32 );
+               if ( $hash === $localHash ) {
+                       // All good, get the rest of it
+                       $serialized = '';
+                       while ( !feof( $file ) ) {
+                               $serialized .= fread( $file, 100000 );
                        }
+                       fclose( $file );
+                       return unserialize( $serialized );
                } else {
-                       $localHash = substr( fread( $file, 40 ), 8 );
                        fclose( $file );
-                       if ( $hash != $localHash ) {
-                               return false; // Wrong hash
-                       }
-
-                       # Require overwrites the member variable or just shadows it?
-                       require( $filename );
-                       return $this->setCache( $this->mCache, $code );
+                       return false; // Wrong hash
                }
        }
 
@@ -192,55 +182,6 @@ class MessageCache {
                wfRestoreWarnings();
        }
 
-       function saveToScript( $array, $hash, $code ) {
-               global $wgCacheDirectory;
-
-               $filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
-               $tempFilename = $filename . '.tmp';
-               wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
-
-               wfSuppressWarnings();
-               $file = fopen( $tempFilename, 'w' );
-               wfRestoreWarnings();
-
-               if ( !$file ) {
-                       wfDebug( "Unable to open local cache file for writing\n" );
-                       return;
-               }
-
-               fwrite( $file, "<?php\n//$hash\n\n \$this->mCache = array(" );
-
-               foreach ( $array as $key => $message ) {
-                       $key = $this->escapeForScript( $key );
-                       $message = $this->escapeForScript( $message );
-                       fwrite( $file, "'$key' => '$message',\n" );
-               }
-
-               fwrite( $file, ");\n?>" );
-               fclose( $file);
-               rename( $tempFilename, $filename );
-       }
-
-       function escapeForScript( $string ) {
-               $string = str_replace( '\\', '\\\\', $string );
-               $string = str_replace( '\'', '\\\'', $string );
-               return $string;
-       }
-
-       /**
-        * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
-        *
-        * @return bool
-        */
-       function setCache( $cache, $code ) {
-               if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
-                       $this->mCache[$code] = $cache;
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Loads messages from caches or from database in this order:
         * (1) local message cache (if $wgUseLocalMessageCache is enabled)
@@ -257,15 +198,13 @@ class MessageCache {
         * or false if populating empty cache fails. Also returns true if MessageCache
         * is disabled.
         *
-        * @param bool|String $code String: language to which load messages
+        * @param bool|String $code Language to which load messages
         * @throws MWException
         * @return bool
         */
        function load( $code = false ) {
                global $wgUseLocalMessageCache;
 
-               $exception = null; // deferred error
-
                if( !is_string( $code ) ) {
                        # This isn't really nice, so at least make a note about it and try to
                        # fall back
@@ -291,94 +230,161 @@ class MessageCache {
                # Loading code starts
                wfProfileIn( __METHOD__ );
                $success = false; # Keep track of success
+               $staleCache = false; # a cache array with expired data, or false if none has been loaded
                $where = array(); # Debug info, delayed to avoid spamming debug log too much
                $cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
 
-               # (1) local cache
+               # Local cache
                # Hash of the contents is stored in memcache, to detect if local cache goes
-               # out of date (due to update in other thread?)
+               # out of date (e.g. due to replace() on some other server)
                if ( $wgUseLocalMessageCache ) {
                        wfProfileIn( __METHOD__ . '-fromlocal' );
 
                        $hash = $this->mMemc->get( wfMemcKey( 'messages', $code, 'hash' ) );
                        if ( $hash ) {
-                               $success = $this->loadFromLocal( $hash, $code );
-                               if ( $success ) $where[] = 'got from local cache';
+                               $cache = $this->getLocalCache( $hash, $code );
+                               if ( !$cache ) {
+                                       $where[] = 'local cache is empty or has the wrong hash';
+                               } elseif ( $this->isCacheExpired( $cache ) ) {
+                                       $where[] = 'local cache is expired';
+                                       $staleCache = $cache;
+                               } else {
+                                       $where[] = 'got from local cache';
+                                       $success = true;
+                                       $this->mCache[$code] = $cache;
+                               }
                        }
                        wfProfileOut( __METHOD__ . '-fromlocal' );
                }
 
-               # (2) memcache
-               # Fails if nothing in cache, or in the wrong version.
                if ( !$success ) {
-                       wfProfileIn( __METHOD__ . '-fromcache' );
-                       $cache = $this->mMemc->get( $cacheKey );
-                       $success = $this->setCache( $cache, $code );
-                       if ( $success ) {
-                               $where[] = 'got from global cache';
-                               $this->saveToCaches( $cache, false, $code );
-                       }
-                       wfProfileOut( __METHOD__ . '-fromcache' );
-               }
+                       # Try the global cache. If it is empty, try to acquire a lock. If
+                       # the lock can't be acquired, wait for the other thread to finish
+                       # and then try the global cache a second time.
+                       for ( $failedAttempts = 0; $failedAttempts < 2; $failedAttempts++ ) {
+                               wfProfileIn( __METHOD__ . '-fromcache' );
+                               $cache = $this->mMemc->get( $cacheKey );
+                               if ( !$cache ) {
+                                       $where[] = 'global cache is empty';
+                               } elseif ( $this->isCacheExpired( $cache ) ) {
+                                       $where[] = 'global cache is expired';
+                                       $staleCache = $cache;
+                               } else {
+                                       $where[] = 'got from global cache';
+                                       $this->mCache[$code] = $cache;
+                                       $this->saveToCaches( $cache, 'local-only', $code );
+                                       $success = true;
+                               }
 
-               # (3)
-               # Nothing in caches... so we need create one and store it in caches
-               if ( !$success ) {
-                       $where[] = 'cache is empty';
-                       $where[] = 'loading from database';
-
-                       if ( $this->lock( $cacheKey ) ) {
-                               $that = $this;
-                               $osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
-                                       $that->unlock( $cacheKey );
-                               } );
-                       }
-                       # Limit the concurrency of loadFromDB to a single process
-                       # This prevents the site from going down when the cache expires
-                       $statusKey = wfMemcKey( 'messages', $code, 'status' );
-                       $success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
-                       if ( $success ) { // acquired lock
-                               $cache = $this->mMemc;
-                               $isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
-                                       $cache->delete( $statusKey );
-                               } );
-                               $cache = $this->loadFromDB( $code );
-                               $success = $this->setCache( $cache, $code );
-                               if ( $success ) { // messages loaded
-                                       $success = $this->saveToCaches( $cache, true, $code );
-                                       $isc = null; // unlock
-                                       if ( !$success ) {
-                                               $this->mMemc->set( $statusKey, 'error', 60 * 5 );
-                                               wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
-                                               $exception = new MWException( "Could not save cache for '$code'." );
+                               wfProfileOut( __METHOD__ . '-fromcache' );
+
+                               if ( $success ) {
+                                       # Done, no need to retry
+                                       break;
+                               }
+
+                               # We need to call loadFromDB. Limit the concurrency to a single
+                               # process. This prevents the site from going down when the cache
+                               # expires.
+                               $statusKey = wfMemcKey( 'messages', $code, 'status' );
+                               $acquired = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
+                               if ( $acquired ) {
+                                       # Unlock the status key if there is an exception
+                                       $that = $this;
+                                       $statusUnlocker = new ScopedCallback( function () use ( $that, $statusKey ) {
+                                               $that->mMemc->delete( $statusKey );
+                                       } );
+
+                                       # Now let's regenerate
+                                       $where[] = 'loading from database';
+
+                                       # Lock the cache to prevent conflicting writes
+                                       # If this lock fails, it doesn't really matter, it just means the
+                                       # write is potentially non-atomic, e.g. the results of a replace()
+                                       # may be discarded.
+                                       if ( $this->lock( $cacheKey ) ) {
+                                               $mainUnlocker = new ScopedCallback( function () use ( $that, $cacheKey ) {
+                                                       $that->unlock( $cacheKey );
+                                               } );
+                                       } else {
+                                               $mainUnlocker = null;
+                                               $where[] = 'could not acquire main lock';
                                        }
+
+                                       $cache = $this->loadFromDB( $code );
+                                       $this->mCache[$code] = $cache;
+                                       $success = true;
+                                       $saveSuccess = $this->saveToCaches( $cache, 'all', $code );
+
+                                       # Unlock
+                                       ScopedCallback::consume( $mainUnlocker );
+                                       ScopedCallback::consume( $statusUnlocker );
+
+                                       if ( !$saveSuccess ) {
+                                               # Cache save has failed.
+                                               # There are two main scenarios where this could be a problem:
+                                               #
+                                               #   - The cache is more than the maximum size (typically
+                                               #     1MB compressed).
+                                               #
+                                               #   - Memcached has no space remaining in the relevant slab
+                                               #     class. This is unlikely with recent versions of
+                                               #     memcached.
+                                               #
+                                               # Either way, if there is a local cache, nothing bad will
+                                               # happen. If there is no local cache, disabling the message
+                                               # cache for all requests avoids incurring a loadFromDB()
+                                               # overhead on every request, and thus saves the wiki from
+                                               # complete downtime under moderate traffic conditions.
+                                               if ( !$wgUseLocalMessageCache ) {
+                                                       $this->mMemc->set( $statusKey, 'error', 60 * 5 );
+                                                       $where[] = 'could not save cache, disabled globally for 5 minutes';
+                                               } else {
+                                                       $where[] = "could not save global cache";
+                                               }
+                                       }
+
+                                       # Load from DB complete, no need to retry
+                                       break;
+                               } elseif ( $staleCache ) {
+                                       # Use the stale cache while some other thread constructs the new one
+                                       $where[] = 'using stale cache';
+                                       $this->mCache[$code] = $staleCache;
+                                       $success = true;
+                                       break;
+                               } elseif ( $failedAttempts > 0 ) {
+                                       # Already retried once, still failed, so don't do another lock/unlock cycle
+                                       # This case will typically be hit if memcached is down, or if
+                                       # loadFromDB() takes longer than MSG_WAIT_TIMEOUT
+                                       $where[] = "could not acquire status key.";
+                                       break;
                                } else {
-                                       $isc = null; // unlock
-                                       $exception = new MWException( "Could not load cache from DB for '$code'." );
+                                       $status = $this->mMemc->get( $statusKey );
+                                       if ( $status === 'error' ) {
+                                               # Disable cache
+                                               break;
+                                       } else {
+                                               # Wait for the other thread to finish, then retry
+                                               $where[] = 'waited for other thread to complete';
+                                               $this->lock( $cacheKey );
+                                               $this->unlock( $cacheKey );
+                                       }
                                }
-                       } else {
-                               $exception = new MWException( "Could not acquire '$statusKey' lock." );
                        }
-                       $osc = null; // unlock
                }
 
                if ( !$success ) {
+                       $where[] = 'loading FAILED - cache is disabled';
                        $this->mDisable = true;
                        $this->mCache = false;
-                       // This used to go on, but that led to lots of nasty side
-                       // effects like gadgets and sidebar getting cached with their
-                       // default content
-                       if ( $exception instanceof Exception ) {
-                               throw $exception;
-                       } else {
-                               throw new MWException( "MessageCache failed to load messages" );
-                       }
+                       # This used to throw an exception, but that led to nasty side effects like
+                       # the whole wiki being instantly down if the memcached server died
                } else {
                        # All good, just record the success
-                       $info = implode( ', ', $where );
-                       wfDebug( __METHOD__ . ": Loading $code... $info\n" );
                        $this->mLoadedLanguages[$code] = true;
                }
+               $info = implode( ', ', $where );
+               wfDebug( __METHOD__ . ": Loading $code... $info\n" );
                wfProfileOut( __METHOD__ );
                return $success;
        }
@@ -388,8 +394,8 @@ class MessageCache {
         * $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
         * on-demand from the database later.
         *
-        * @param string $code language code.
-        * @return Array: loaded messages for storing in caches.
+        * @param string $code Language code.
+        * @return array Loaded messages for storing in caches.
         */
        function loadFromDB( $code ) {
                wfProfileIn( __METHOD__ );
@@ -449,11 +455,15 @@ class MessageCache {
 
                foreach ( $res as $row ) {
                        $text = Revision::getRevisionText( $row );
-                       if( $text === false ) {
+                       if ( $text === false ) {
                                // Failed to fetch data; possible ES errors?
                                // Store a marker to fetch on-demand as a workaround...
                                $entry = '!TOO BIG';
-                               wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$row->page_title} ($code)" );
+                               wfDebugLog(
+                                       'MessageCache',
+                                       __METHOD__
+                                               . ": failed to load message page text for {$row->page_title} ($code)"
+                               );
                        } else {
                                $entry = ' ' . $text;
                        }
@@ -461,6 +471,7 @@ class MessageCache {
                }
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
+               $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
                wfProfileOut( __METHOD__ );
                return $cache;
        }
@@ -468,8 +479,8 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string $title name of the page changed.
-        * @param $text Mixed: new contents of the page.
+        * @param string $title Name of the page changed.
+        * @param mixed $text New contents of the page.
         */
        public function replace( $title, $text ) {
                global $wgMaxMsgCacheEntrySize;
@@ -502,7 +513,7 @@ class MessageCache {
                }
 
                # Update caches
-               $this->saveToCaches( $this->mCache[$code], true, $code );
+               $this->saveToCaches( $this->mCache[$code], 'all', $code );
                $this->unlock( $cacheKey );
 
                // Also delete cached sidebar... just in case it is affected
@@ -528,22 +539,42 @@ class MessageCache {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Is the given cache array expired due to time passing or a version change?
+        *
+        * @param $cache
+        * @return bool
+        */
+       protected function isCacheExpired( $cache ) {
+               if ( !isset( $cache['VERSION'] ) || !isset( $cache['EXPIRY'] ) ) {
+                       return true;
+               }
+               if ( $cache['VERSION'] != MSG_CACHE_VERSION ) {
+                       return true;
+               }
+               if ( wfTimestampNow() >= $cache['EXPIRY'] ) {
+                       return true;
+               }
+               return false;
+       }
+
        /**
         * Shortcut to update caches.
         *
-        * @param array $cache cached messages with a version.
-        * @param bool $memc Wether to update or not memcache.
-        * @param string $code Language code.
-        * @return bool on somekind of error.
+        * @param array $cache Cached messages with a version.
+        * @param string $dest Either "local-only" to save to local caches only
+        *   or "all" to save to all caches.
+        * @param string|bool $code Language code (default: false)
+        * @return bool
         */
-       protected function saveToCaches( $cache, $memc = true, $code = false ) {
+       protected function saveToCaches( $cache, $dest, $code = false ) {
                wfProfileIn( __METHOD__ );
-               global $wgUseLocalMessageCache, $wgLocalMessageCacheSerialized;
+               global $wgUseLocalMessageCache;
 
                $cacheKey = wfMemcKey( 'messages', $code );
 
-               if ( $memc ) {
-                       $success = $this->mMemc->set( $cacheKey, $cache, $this->mExpiry );
+               if ( $dest === 'all' ) {
+                       $success = $this->mMemc->set( $cacheKey, $cache );
                } else {
                        $success = true;
                }
@@ -552,12 +583,8 @@ class MessageCache {
                if ( $wgUseLocalMessageCache ) {
                        $serialized = serialize( $cache );
                        $hash = md5( $serialized );
-                       $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash, $this->mExpiry );
-                       if ( $wgLocalMessageCacheSerialized ) {
-                               $this->saveToLocal( $serialized, $hash, $code );
-                       } else {
-                               $this->saveToScript( $cache, $hash, $code );
-                       }
+                       $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash );
+                       $this->saveToLocal( $serialized, $hash, $code );
                }
 
                wfProfileOut( __METHOD__ );
@@ -567,17 +594,30 @@ class MessageCache {
        /**
         * Represents a write lock on the messages key
         *
-        * @param $key string
-        *
+        * @param string $key
         * @return Boolean: success
         */
        function lock( $key ) {
                $lockKey = $key . ':lock';
-               for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
+               $acquired = false;
+               $testDone = false;
+               for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$acquired; $i++ ) {
+                       $acquired = $this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT );
+                       if ( $acquired ) {
+                               break;
+                       }
+
+                       # Fail fast if memcached is totally down
+                       if ( !$testDone ) {
+                               $testDone = true;
+                               if ( !$this->mMemc->set( wfMemcKey( 'test' ), 'test', 1 ) ) {
+                                       break;
+                               }
+                       }
                        sleep( 1 );
                }
 
-               return $i >= MSG_WAIT_TIMEOUT;
+               return $acquired;
        }
 
        function unlock( $key ) {
@@ -586,70 +626,50 @@ class MessageCache {
        }
 
        /**
-        * Get a message from either the content language or the user language. The fallback
-        * language order is the users language fallback union the content language fallback.
-        * This list is then applied to find keys in the following order
-        * 1) MediaWiki:$key/$langcode (for every language except the content language where
-        *    we look at MediaWiki:$key)
-        * 2) Built-in messages via the l10n cache which is also in fallback order
+        * Get a message from either the content language or the user language.
         *
-        * @param string $key the message cache key
-        * @param $useDB Boolean: If true will look for the message in the DB, false only
-        *        get the message from the DB, false to use only the compiled l10n cache.
-        * @param bool|string|object $langcode Code of the language to get the message for.
-        *        - If string and a valid code, will create a standard language object
-        *        - If string but not a valid code, will create a basic language object
-        *        - If boolean and false, create object from the current users language
-        *        - If boolean and true, create object from the wikis content language
-        *        - If language object, use it as given
-        * @param $isFullKey Boolean: specifies whether $key is a two part key
-        *                   "msg/lang".
+        * @param string $key The message cache key
+        * @param bool $useDB Get the message from the DB, false to use only
+        *               the localisation
+        * @param bool|string $langcode Code of the language to get the message for, if
+        *                  it is a valid code create a language for that language,
+        *                  if it is a string but not a valid code then make a basic
+        *                  language object, if it is a false boolean then use the
+        *                  current users language (as a fallback for the old
+        *                  parameter functionality), or if it is a true boolean
+        *                  then use the wikis content language (also as a
+        *                  fallback).
+        * @param bool $isFullKey Specifies whether $key is a two part key "msg/lang".
         *
         * @throws MWException
-        * @return string|bool False if the message doesn't exist, otherwise the message
+        * @return string|bool
         */
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
                global $wgLanguageCode, $wgContLang;
 
-               wfProfileIn( __METHOD__ );
-
                if ( is_int( $key ) ) {
-                       // "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
+                       // "Non-string key given" exception sometimes happens for numerical
+                       // strings that become ints somewhere on their way here
                        $key = strval( $key );
                }
 
                if ( !is_string( $key ) ) {
-                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Non-string key given' );
                }
 
                if ( strval( $key ) === '' ) {
                        # Shortcut: the empty key is always missing
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
-
-               # Obtain the initial language object
-               if ( $isFullKey ) {
-                       $keyParts = explode( '/', $key );
-                       if ( count( $keyParts ) < 2 ) {
-                               throw new MWException( "Message key '$key' does not appear to be a full key." );
-                       }
-
-                       $langcode = array_pop( $keyParts );
-                       $key = implode( '/', $keyParts );
-               }
-
-               # Obtain a language object for the requested language from the passed language code
-               # Note that the language code could in fact be a language object already but we assume
-               # it's a string further below.
-               $requestedLangObj = wfGetLangObj( $langcode );
-               if ( !$requestedLangObj ) {
-                       wfProfileOut( __METHOD__ );
+               $lang = wfGetLangObj( $langcode );
+               if ( !$lang ) {
                        throw new MWException( "Bad lang code $langcode given" );
                }
-               $langcode = $requestedLangObj->getCode();
+
+               $langcode = $lang->getCode();
+
+               $message = false;
 
                # Normalise title-case input (with some inlining)
                $lckey = str_replace( ' ', '_', $key );
@@ -661,38 +681,25 @@ class MessageCache {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
-               # Loop through each language in the fallback list until we find something useful
-               $message = false;
-
                # Try the MediaWiki namespace
                if ( !$this->mDisable && $useDB ) {
-                       $fallbackChain = Language::getFallbacksIncludingSiteLanguage( $langcode );
-                       array_unshift( $fallbackChain, $langcode );
-
-                       foreach ( $fallbackChain as $langcode ) {
-                               if ( $langcode === $wgLanguageCode ) {
-                                       # Messages created in the content language will not have the /lang extension
-                                       $message = $this->getMsgFromNamespace( $uckey, $langcode );
-                               } else {
-                                       $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
-                               }
-
-                               if ( $message !== false ) {
-                                       break;
-                               }
+                       $title = $uckey;
+                       if ( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
+                               $title .= '/' . $langcode;
                        }
+                       $message = $this->getMsgFromNamespace( $title, $langcode );
                }
 
                # Try the array in the language object
                if ( $message === false ) {
-                       $message = $requestedLangObj->getMessage( $lckey );
-                       if ( is_null ( $message ) ) {
+                       $message = $lang->getMessage( $lckey );
+                       if ( is_null( $message ) ) {
                                $message = false;
                        }
                }
 
-               # If we still have no message, maybe the key was in fact a full key so try that
-               if( $message === false ) {
+               # Try the array of another language
+               if ( $message === false ) {
                        $parts = explode( '/', $lckey );
                        # We may get calls for things that are http-urls from sidebar
                        # Let's not load nonexistent languages for those
@@ -705,9 +712,16 @@ class MessageCache {
                        }
                }
 
+               # Is this a custom message? Try the default language in the db...
+               if ( ( $message === false || $message === '-' ) &&
+                       !$this->mDisable && $useDB &&
+                       !$isFullKey && ( $langcode != $wgLanguageCode )
+               ) {
+                       $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
+               }
+
                # Final fallback
-               if( $message === false ) {
-                       wfProfileOut( __METHOD__ );
+               if ( $message === false ) {
                        return false;
                }
 
@@ -721,7 +735,6 @@ class MessageCache {
                                '&#160;' => "\xc2\xa0",
                        ) );
 
-               wfProfileOut( __METHOD__ );
                return $message;
        }
 
@@ -729,9 +742,12 @@ class MessageCache {
         * Get a message from the MediaWiki namespace, with caching. The key must
         * first be converted to two-part lang/msg form if necessary.
         *
-        * @param string $title Message cache key with initial uppercase letter.
-        * @param string $code code denoting the language to try.
+        * Unlike self::get(), this function doesn't resolve fallback chains, and
+        * some callers require this behavior. LanguageConverter::parseCachedTable()
+        * and self::get() are some examples in core.
         *
+        * @param string $title Message cache key with initial uppercase letter.
+        * @param string $code Code denoting the language to try.
         * @return string|bool False on failure
         */
        function getMsgFromNamespace( $title, $code ) {
@@ -742,7 +758,7 @@ class MessageCache {
                                return substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                return false;
-                       } elseif( $entry === '!TOO BIG' ) {
+                       } elseif ( $entry === '!TOO BIG' ) {
                                // Fall through and try invididual message cache below
                        }
                } else {
@@ -780,17 +796,24 @@ class MessageCache {
                        $content = $revision->getContent();
                        if ( !$content ) {
                                // A possibly temporary loading failure.
-                               wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+                               wfDebugLog(
+                                       'MessageCache',
+                                       __METHOD__ . ": failed to load message page text for {$title} ($code)"
+                               );
                                $message = null; // no negative caching
                        } else {
                                // XXX: Is this the right way to turn a Content object into a message?
-                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
-                               //       MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or
+                               //       CssContent. MessageContent is *not* used for storing messages, it's
+                               //       only used for wrapping them when needed.
                                $message = $content->getWikitextForTransclusion();
 
                                if ( $message === false || $message === null ) {
-                                       wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
-                                                               . "(content model: " . $content->getContentHandler() . ")" );
+                                       wfDebugLog(
+                                               'MessageCache',
+                                               __METHOD__ . ": message content doesn't provide wikitext "
+                                                       . "(content model: " . $content->getContentHandler() . ")"
+                                       );
 
                                        $message = false; // negative caching
                                } else {
@@ -811,15 +834,15 @@ class MessageCache {
        }
 
        /**
-        * @param $message string
-        * @param $interface bool
-        * @param $language
-        * @param $title Title
+        * @param string $message
+        * @param bool $interface
+        * @param string $language Language code
+        * @param Title $title
         * @return string
         */
        function transform( $message, $interface = false, $language = null, $title = null ) {
                // Avoid creating parser if nothing to transform
-               if( strpos( $message, '{{' ) === false ) {
+               if ( strpos( $message, '{{' ) === false ) {
                        return $message;
                }
 
@@ -863,14 +886,16 @@ class MessageCache {
        }
 
        /**
-        * @param $text string
-        * @param $title Title
-        * @param $linestart bool
-        * @param $interface bool
-        * @param $language
+        * @param string $text
+        * @param Title $title
+        * @param bool $linestart Whether or not this is at the start of a line
+        * @param bool $interface Whether this is an interface message
+        * @param string $language Language code
         * @return ParserOutput|string
         */
-       public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null  ) {
+       public function parse( $text, $title = null, $linestart = true,
+               $interface = false, $language = null
+       ) {
                if ( $this->mInParser ) {
                        return htmlspecialchars( $text );
                }
@@ -929,12 +954,12 @@ class MessageCache {
        public function figureMessage( $key ) {
                global $wgLanguageCode;
                $pieces = explode( '/', $key );
-               if( count( $pieces ) < 2 ) {
+               if ( count( $pieces ) < 2 ) {
                        return array( $key, $wgLanguageCode );
                }
 
                $lang = array_pop( $pieces );
-               if( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
+               if ( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
                        return array( $key, $wgLanguageCode );
                }
 
@@ -947,7 +972,7 @@ class MessageCache {
         * If $code is the content language code, this will return all message keys
         * for which MediaWiki:msgkey exists. If $code is another language code, this
         * will ONLY return message keys for which MediaWiki:msgkey/$code exists.
-        * @param $code string
+        * @param string $code Language code
         * @return array of message keys (strings)
         */
        public function getAllMessageKeys( $code ) {
@@ -957,9 +982,12 @@ class MessageCache {
                        // Apparently load() failed
                        return null;
                }
-               $cache = $this->mCache[$code]; // Copy the cache
-               unset( $cache['VERSION'] ); // Remove the VERSION key
-               $cache = array_diff( $cache, array( '!NONEXISTENT' ) ); // Remove any !NONEXISTENT keys
+               // Remove administrative keys
+               $cache = $this->mCache[$code];
+               unset( $cache['VERSION'] );
+               unset( $cache['EXPIRY'] );
+               // Remove any !NONEXISTENT keys
+               $cache = array_diff( $cache, array( '!NONEXISTENT' ) );
                // Keys may appear with a capital first letter. lcfirst them.
                return array_map( array( $wgContLang, 'lcfirst' ), array_keys( $cache ) );
        }
index 39bf4c9..5f5d257 100644 (file)
@@ -190,6 +190,7 @@ class SquidUpdate {
                        $urlArr = array_unique( $urlArr ); // Remove duplicates
                        foreach ( $urlArr as $url ) {
                                if( !is_string( $url ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( 'Bad purge URL' );
                                }
                                $url = SquidUpdate::expand( $url );
@@ -199,6 +200,7 @@ class SquidUpdate {
                                        continue;
                                }
                                if ( !isset( $conf['host'] ) || !isset( $conf['port'] ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( "Invalid HTCP rule for URL $url\n" );
                                }
 
@@ -219,7 +221,7 @@ class SquidUpdate {
                                // implementation exists, so adapt to Squid
                                $htcpPacket = pack( 'nxxnCxNxxa*n',
                                        $htcpLen, $htcpDataLen, $htcpOpCLR,
-                                       $htcpTransID, $htcpSpecifier, 2);
+                                       $htcpTransID, $htcpSpecifier, 2 );
 
                                // Send out
                                wfDebug( "Purging URL $url via HTCP\n" );
index bfbacfa..694c1a1 100644 (file)
@@ -58,6 +58,17 @@ class UserCache {
                        : false; // user does not exist?
        }
 
+       /**
+        * Get the name of a user or return $ip if the user ID is 0
+        *
+        * @param integer $userId
+        * @param string $ip
+        * @since 1.21
+        */
+       public function getUserName( $userId, $ip ) {
+               return $userId > 0 ? $this->getProp( $userId, 'name' ) : $ip;
+       }
+
        /**
         * Preloads user names for given list of users.
         * @param array $userIds List of user IDs
index 9c20195..9c5ebcd 100644 (file)
@@ -1086,8 +1086,8 @@ abstract class ContentHandler {
                                $contentObjects[$k] = $v;
 
                                $v = $v->serialize();
-                               $contentTexts[ $k ] = $v;
-                               $args[ $k ] = $v;
+                               $contentTexts[$k] = $v;
+                               $args[$k] = $v;
                        }
                }
 
@@ -1098,7 +1098,7 @@ abstract class ContentHandler {
                foreach ( $contentTexts as $k => $orig ) {
                        /* @var Content $content */
 
-                       $modified = $args[ $k ];
+                       $modified = $args[$k];
                        $content = $contentObjects[$k];
 
                        if ( $modified !== $orig ) {
@@ -1106,7 +1106,7 @@ abstract class ContentHandler {
                                $content = $content->getContentHandler()->unserializeContent( $modified );
                        }
 
-                       $args[ $k ] = $content;
+                       $args[$k] = $content;
                }
 
                return $ok;
index 8be4eba..580ec75 100644 (file)
@@ -62,6 +62,7 @@ class WikitextContent extends TextContent {
                $sectionModelId = $with->getModel();
 
                if ( $sectionModelId != $myModelId  ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Incompatible content model for section: " .
                                "document uses $myModelId but " .
                                "section uses $sectionModelId." );
diff --git a/includes/db/ChronologyProtector.php b/includes/db/ChronologyProtector.php
new file mode 100644 (file)
index 0000000..447b238
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
+ * Kind of like Hawking's [[Chronology Protection Agency]].
+ */
+class ChronologyProtector {
+       var $startupPos;
+       var $shutdownPos = array();
+
+       /**
+        * Initialise a LoadBalancer to give it appropriate chronology protection.
+        *
+        * @param $lb LoadBalancer
+        */
+       function initLB( $lb ) {
+               if ( $this->startupPos === null ) {
+                       if ( !empty( $_SESSION[__CLASS__] ) ) {
+                               $this->startupPos = $_SESSION[__CLASS__];
+                       }
+               }
+               if ( !$this->startupPos ) {
+                       return;
+               }
+               $masterName = $lb->getServerName( 0 );
+
+               if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
+                       $info = $lb->parentInfo();
+                       $pos = $this->startupPos[$masterName];
+                       wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
+                       $lb->waitFor( $this->startupPos[$masterName] );
+               }
+       }
+
+       /**
+        * Notify the ChronologyProtector that the LoadBalancer is about to shut
+        * down. Saves replication positions.
+        *
+        * @param $lb LoadBalancer
+        */
+       function shutdownLB( $lb ) {
+               // Don't start a session, don't bother with non-replicated setups
+               if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) {
+                       return;
+               }
+               $masterName = $lb->getServerName( 0 );
+               if ( isset( $this->shutdownPos[$masterName] ) ) {
+                       // Already done
+                       return;
+               }
+               // Only save the position if writes have been done on the connection
+               $db = $lb->getAnyOpenConnection( 0 );
+               $info = $lb->parentInfo();
+               if ( !$db || !$db->doneWrites() ) {
+                       wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
+                       return;
+               }
+               $pos = $db->getMasterPos();
+               wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
+               $this->shutdownPos[$masterName] = $pos;
+       }
+
+       /**
+        * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
+        * May commit chronology data to persistent storage.
+        */
+       function shutdown() {
+               if ( session_id() != '' && count( $this->shutdownPos ) ) {
+                       wfDebug( __METHOD__ . ": saving master pos for " .
+                               count( $this->shutdownPos ) . " master(s)\n" );
+                       $_SESSION[__CLASS__] = $this->shutdownPos;
+               }
+       }
+}
index 5ad196d..2142232 100644 (file)
@@ -714,7 +714,6 @@ abstract class DatabaseBase implements DatabaseType {
         * an extension, et cetera). Do not use this to connect to the MediaWiki
         * database. Example uses in core:
         * @see LoadBalancer::reallyOpenConnection()
-        * @see ExternalUser_MediaWiki::initFromCond()
         * @see ForeignDBRepo::getMasterDB()
         * @see WebInstaller_DBConnect::execute()
         *
@@ -946,6 +945,10 @@ abstract class DatabaseBase implements DatabaseType {
                }
 
                if ( istainted( $sql ) & TC_MYSQL ) {
+                       if ( !Profiler::instance()->isStub() ) {
+                               wfProfileOut( $queryProf );
+                               wfProfileOut( $totalProf );
+                       }
                        throw new MWException( 'Tainted query found' );
                }
 
@@ -1091,17 +1094,22 @@ abstract class DatabaseBase implements DatabaseType {
         * @return String
         */
        protected function fillPreparedArg( $matches ) {
-               switch( $matches[1] ) {
-                       case '\\?': return '?';
-                       case '\\!': return '!';
-                       case '\\&': return '&';
+               switch ( $matches[1] ) {
+                       case '\\?':
+                               return '?';
+                       case '\\!':
+                               return '!';
+                       case '\\&':
+                               return '&';
                }
 
                list( /* $n */, $arg ) = each( $this->preparedArgs );
 
-               switch( $matches[1] ) {
-                       case '?': return $this->addQuotes( $arg );
-                       case '!': return $arg;
+               switch ( $matches[1] ) {
+                       case '?':
+                               return $this->addQuotes( $arg );
+                       case '!':
+                               return $arg;
                        case '&':
                                # return $this->addQuotes( file_get_contents( $arg ) );
                                throw new DBUnexpectedError( $this, '& mode is not implemented. If it\'s really needed, uncomment the line above.' );
@@ -1117,7 +1125,8 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $res Mixed: A SQL result
         */
-       public function freeResult( $res ) {}
+       public function freeResult( $res ) {
+       }
 
        /**
         * A SELECT wrapper which returns a single field from a single result row.
@@ -1137,8 +1146,8 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool|mixed The value from the field, or false on failure.
         */
        public function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
-               $options = array() )
-       {
+               $options = array()
+       {
                if ( !is_array( $options ) ) {
                        $options = array( $options );
                }
@@ -1582,19 +1591,19 @@ abstract class DatabaseBase implements DatabaseType {
        static function generalizeSQL( $sql ) {
                # This does the same as the regexp below would do, but in such a way
                # as to avoid crashing php on some large strings.
-               # $sql = preg_replace ( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql);
+               # $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
 
-               $sql = str_replace ( "\\\\", '', $sql );
-               $sql = str_replace ( "\\'", '', $sql );
-               $sql = str_replace ( "\\\"", '', $sql );
-               $sql = preg_replace ( "/'.*'/s", "'X'", $sql );
-               $sql = preg_replace ( '/".*"/s', "'X'", $sql );
+               $sql = str_replace( "\\\\", '', $sql );
+               $sql = str_replace( "\\'", '', $sql );
+               $sql = str_replace( "\\\"", '', $sql );
+               $sql = preg_replace( "/'.*'/s", "'X'", $sql );
+               $sql = preg_replace( '/".*"/s', "'X'", $sql );
 
                # All newlines, tabs, etc replaced by single space
-               $sql = preg_replace ( '/\s+/', ' ', $sql );
+               $sql = preg_replace( '/\s+/', ' ', $sql );
 
                # All numbers => N
-               $sql = preg_replace ( '/-?[0-9]+/s', 'N', $sql );
+               $sql = preg_replace( '/-?[0-9]+/s', 'N', $sql );
 
                return $sql;
        }
@@ -2988,7 +2997,8 @@ abstract class DatabaseBase implements DatabaseType {
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
                                        $callback();
                                        $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
-                               } catch ( Exception $e ) {}
+                               } catch ( Exception $e ) {
+                               }
                        }
                } while ( count( $this->mTrxIdleCallbacks ) );
 
@@ -3025,7 +3035,8 @@ abstract class DatabaseBase implements DatabaseType {
                                // log it if $wgDebugDBTransactions is enabled.
                                if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
                                        wfDebug( "$fname: Automatic transaction with writes in progress" .
-                                               " (from {$this->mTrxFname}), performing implicit commit!\n" );
+                                               " (from {$this->mTrxFname}), performing implicit commit!\n"
+                                       );
                                }
                        }
 
@@ -3139,8 +3150,8 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Boolean: true if operation was successful
         */
        public function duplicateTableStructure( $oldName, $newName, $temporary = false,
-               $fname = 'DatabaseBase::duplicateTableStructure' )
-       {
+               $fname = 'DatabaseBase::duplicateTableStructure'
+       {
                throw new MWException(
                        'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
        }
@@ -3285,7 +3296,8 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $options Array
         * @return void
         */
-       public function setSessionOptions( array $options ) {}
+       public function setSessionOptions( array $options ) {
+       }
 
        /**
         * Read and execute SQL commands from a file.
index 575f629..82b0e5a 100644 (file)
@@ -37,24 +37,31 @@ class DatabaseMssql extends DatabaseBase {
        function cascadingDeletes() {
                return true;
        }
+
        function cleanupTriggers() {
                return true;
        }
+
        function strictIPs() {
                return true;
        }
+
        function realTimestamps() {
                return true;
        }
+
        function implicitGroupby() {
                return false;
        }
+
        function implicitOrderby() {
                return false;
        }
+
        function functionalIndexes() {
                return true;
        }
+
        function unionSupportsOrderAndLimit() {
                return false;
        }
@@ -148,7 +155,7 @@ class DatabaseMssql extends DatabaseBase {
                }
 
                // MSSQL doesn't have EXTRACT(epoch FROM XXX)
-               if ( preg_match('#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
                        // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
                        $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
                }
@@ -202,9 +209,9 @@ class DatabaseMssql extends DatabaseBase {
                $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
                if ( $retErrors != null ) {
                        foreach ( $retErrors as $arrError ) {
-                               $strRet .= "SQLState: " . $arrError[ 'SQLSTATE'] . "\n";
-                               $strRet .= "Error Code: " . $arrError[ 'code'] . "\n";
-                               $strRet .= "Message: " . $arrError[ 'message'] . "\n";
+                               $strRet .= "SQLState: " . $arrError['SQLSTATE'] . "\n";
+                               $strRet .= "Error Code: " . $arrError['code'] . "\n";
+                               $strRet .= "Message: " . $arrError['message'] . "\n";
                        }
                } else {
                        $strRet = "No errors found";
@@ -429,9 +436,9 @@ class DatabaseMssql extends DatabaseBase {
                        // if we have an identity column
                        if( $identity ) {
                                // iterate through
-                               foreach ($a as $k => $v ) {
+                               foreach ( $a as $k => $v ) {
                                        if ( $k == $identity ) {
-                                               if( !is_null($v) ) {
+                                               if( !is_null( $v ) ) {
                                                        // there is a value being passed to us, we need to turn on and off inserted identity
                                                        $sqlPre = "SET IDENTITY_INSERT $table ON;";
                                                        $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
@@ -501,7 +508,7 @@ class DatabaseMssql extends DatabaseBase {
                        } elseif ( $ret != null ) {
                                // remember number of rows affected
                                $this->mAffectedRows = sqlsrv_rows_affected( $ret );
-                               if ( !is_null($identity) ) {
+                               if ( !is_null( $identity ) ) {
                                        // then we want to get the identity column value we were assigned and save it off
                                        $row = sqlsrv_fetch_object( $ret );
                                        $this->mInsertId = $row->$identity;
@@ -1093,37 +1100,96 @@ class MssqlResult {
                        $i++;
                }
                // http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
-               switch( $intType ) {
-                       case SQLSRV_SQLTYPE_BIGINT:             $strType = 'bigint'; break;
-                       case SQLSRV_SQLTYPE_BINARY:             $strType = 'binary'; break;
-                       case SQLSRV_SQLTYPE_BIT:                        $strType = 'bit'; break;
-                       case SQLSRV_SQLTYPE_CHAR:                       $strType = 'char'; break;
-                       case SQLSRV_SQLTYPE_DATETIME:           $strType = 'datetime'; break;
-                       case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $strType = 'decimal'; break;
-                       case SQLSRV_SQLTYPE_FLOAT:                      $strType = 'float'; break;
-                       case SQLSRV_SQLTYPE_IMAGE:                      $strType = 'image'; break;
-                       case SQLSRV_SQLTYPE_INT:                        $strType = 'int'; break;
-                       case SQLSRV_SQLTYPE_MONEY:                      $strType = 'money'; break;
-                       case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $strType = 'nchar'; break;
-                       case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $strType = 'numeric'; break;
-                       case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $strType = 'nvarchar'; break;
-                       // case SQLSRV_SQLTYPE_NVARCHAR('max'): $strType = 'nvarchar(MAX)'; break;
-                       case SQLSRV_SQLTYPE_NTEXT:                      $strType = 'ntext'; break;
-                       case SQLSRV_SQLTYPE_REAL:                       $strType = 'real'; break;
-                       case SQLSRV_SQLTYPE_SMALLDATETIME:      $strType = 'smalldatetime'; break;
-                       case SQLSRV_SQLTYPE_SMALLINT:           $strType = 'smallint'; break;
-                       case SQLSRV_SQLTYPE_SMALLMONEY:         $strType = 'smallmoney'; break;
-                       case SQLSRV_SQLTYPE_TEXT:                       $strType = 'text'; break;
-                       case SQLSRV_SQLTYPE_TIMESTAMP:          $strType = 'timestamp'; break;
-                       case SQLSRV_SQLTYPE_TINYINT:            $strType = 'tinyint'; break;
-                       case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $strType = 'uniqueidentifier'; break;
-                       case SQLSRV_SQLTYPE_UDT:                        $strType = 'UDT'; break;
-                       case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $strType = 'varbinary'; break;
-                       // case SQLSRV_SQLTYPE_VARBINARY('max'): $strType = 'varbinary(MAX)'; break;
-                       case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $strType = 'varchar'; break;
-                       // case SQLSRV_SQLTYPE_VARCHAR('max'): $strType = 'varchar(MAX)'; break;
-                       case SQLSRV_SQLTYPE_XML:                        $strType = 'xml'; break;
-                       default: $strType = $intType;
+               switch ( $intType ) {
+                       case SQLSRV_SQLTYPE_BIGINT:
+                               $strType = 'bigint';
+                               break;
+                       case SQLSRV_SQLTYPE_BINARY:
+                               $strType = 'binary';
+                               break;
+                       case SQLSRV_SQLTYPE_BIT:
+                               $strType = 'bit';
+                               break;
+                       case SQLSRV_SQLTYPE_CHAR:
+                               $strType = 'char';
+                               break;
+                       case SQLSRV_SQLTYPE_DATETIME:
+                               $strType = 'datetime';
+                               break;
+                       case SQLSRV_SQLTYPE_DECIMAL: // ($precision, $scale)
+                               $strType = 'decimal';
+                               break;
+                       case SQLSRV_SQLTYPE_FLOAT:
+                               $strType = 'float';
+                               break;
+                       case SQLSRV_SQLTYPE_IMAGE:
+                               $strType = 'image';
+                               break;
+                       case SQLSRV_SQLTYPE_INT:
+                               $strType = 'int';
+                               break;
+                       case SQLSRV_SQLTYPE_MONEY:
+                               $strType = 'money';
+                               break;
+                       case SQLSRV_SQLTYPE_NCHAR: // ($charCount):
+                               $strType = 'nchar';
+                               break;
+                       case SQLSRV_SQLTYPE_NUMERIC: // ($precision, $scale):
+                               $strType = 'numeric';
+                               break;
+                       case SQLSRV_SQLTYPE_NVARCHAR: // ($charCount)
+                               $strType = 'nvarchar';
+                               break;
+                       // case SQLSRV_SQLTYPE_NVARCHAR('max'):
+                       //       $strType = 'nvarchar(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_NTEXT:
+                               $strType = 'ntext';
+                               break;
+                       case SQLSRV_SQLTYPE_REAL:
+                               $strType = 'real';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLDATETIME:
+                               $strType = 'smalldatetime';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLINT:
+                               $strType = 'smallint';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLMONEY:
+                               $strType = 'smallmoney';
+                               break;
+                       case SQLSRV_SQLTYPE_TEXT:
+                               $strType = 'text';
+                               break;
+                       case SQLSRV_SQLTYPE_TIMESTAMP:
+                               $strType = 'timestamp';
+                               break;
+                       case SQLSRV_SQLTYPE_TINYINT:
+                               $strType = 'tinyint';
+                               break;
+                       case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER:
+                               $strType = 'uniqueidentifier';
+                               break;
+                       case SQLSRV_SQLTYPE_UDT:
+                               $strType = 'UDT';
+                               break;
+                       case SQLSRV_SQLTYPE_VARBINARY: // ($byteCount)
+                               $strType = 'varbinary';
+                               break;
+                       // case SQLSRV_SQLTYPE_VARBINARY('max'):
+                       //       $strType = 'varbinary(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_VARCHAR: // ($charCount)
+                               $strType = 'varchar';
+                               break;
+                       // case SQLSRV_SQLTYPE_VARCHAR('max'):
+                       //       $strType = 'varchar(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_XML:
+                               $strType = 'xml';
+                               break;
+                       default:
+                               $strType = $intType;
                }
                return $strType;
        }
index 0f7eb9e..d6f6809 100644 (file)
@@ -68,6 +68,7 @@ class DatabaseMysql extends DatabaseBase {
                # Fail now
                # Otherwise we get a suppressed fatal error, which is very hard to track down
                if ( !function_exists( 'mysql_connect' ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new DBConnectionError( $this, "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n" );
                }
 
index 7db032f..e59ca95 100644 (file)
@@ -206,7 +206,7 @@ class DatabaseOracle extends DatabaseBase {
        }
 
        function __destruct() {
-               if ($this->mOpened) {
+               if ( $this->mOpened ) {
                        wfSuppressWarnings();
                        $this->close();
                        wfRestoreWarnings();
@@ -791,7 +791,7 @@ class DatabaseOracle extends DatabaseBase {
                $endArray[] = strtoupper( $prefix . 'PAGE' );
                $endArray[] = strtoupper( $prefix . 'IMAGE' );
                $fixedOrderTabs = $endArray;
-               while ( ($row = $result->fetchRow()) !== false ) {
+               while ( ( $row = $result->fetchRow() ) !== false ) {
                        if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
                                $endArray[] = $row['table_name'];
                }
@@ -1125,12 +1125,12 @@ class DatabaseOracle extends DatabaseBase {
                $conds2 = array();
                foreach ( $conds as $col => $val ) {
                        if ( is_array( $val ) ) {
-                               $conds2[$col] = $this->wrapConditionsForWhere ( $table, $val, $col );
+                               $conds2[$col] = $this->wrapConditionsForWhere( $table, $val, $col );
                        } else {
                                if ( is_numeric( $col ) && $parentCol != null ) {
-                                       $this->wrapFieldForWhere ( $table, $parentCol, $val );
+                                       $this->wrapFieldForWhere( $table, $parentCol, $val );
                                } else {
-                                       $this->wrapFieldForWhere ( $table, $col, $val );
+                                       $this->wrapFieldForWhere( $table, $col, $val );
                                }
                                $conds2[$col] = $val;
                        }
index c6ac11a..52fab13 100644 (file)
@@ -556,8 +556,10 @@ class DatabasePostgres extends DatabaseBase {
        }
 
        /**
-        * This must be called after nextSequenceVal
-        * @return null
+        * Return the result of the last call to nextSequenceValue();
+        * This must be called after nextSequenceValue().
+        *
+        * @return integer|null
         */
        function insertId() {
                return $this->mInsertId;
@@ -1406,7 +1408,8 @@ SQL;
                return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
        }
 
-       function setFakeMaster( $enabled = true ) {}
+       function setFakeMaster( $enabled = true ) {
+       }
 
        function getDBname() {
                return $this->mDBname;
index 9a1c8bd..de58bab 100644 (file)
@@ -253,7 +253,8 @@ class FakeResultWrapper extends ResultWrapper {
                $this->pos = $row;
        }
 
-       function free() {}
+       function free() {
+       }
 
        // Callers want to be able to access fields with $this->fieldName
        function fetchObject() {
index 6bc0cdd..f8833f5 100644 (file)
 
 interface IORMRow {
 
-       /**
-        * Constructor.
-        *
-        * @since 1.20
-        *
-        * @param IORMTable $table
-        * @param array|null $fields
-        * @param boolean $loadDefaults
-        */
-       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false );
-
        /**
         * Load the specified fields from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|null $fields
         * @param boolean $override
@@ -74,6 +64,7 @@ interface IORMRow {
         * Gets the value of a field but first loads it if not done so already.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string$name
         *
@@ -155,6 +146,7 @@ interface IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $override
         */
@@ -167,6 +159,7 @@ interface IORMRow {
         * @since 1.20
         *
         * @param string|null $functionName
+        * @deprecated since 1.21
         *
         * @return boolean Success indicator
         */
@@ -176,6 +169,7 @@ interface IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return boolean Success indicator
         */
@@ -215,9 +209,9 @@ interface IORMRow {
 
        /**
         * Add an amount (can be negative) to the specified field (needs to be numeric).
-        * TODO: most off this stuff makes more sense in the table class
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string $field
         * @param integer $amount
@@ -239,6 +233,7 @@ interface IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|string|null $summaryFields
         */
@@ -248,6 +243,7 @@ interface IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $update
         */
@@ -257,6 +253,7 @@ interface IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $summaryMode
         */
@@ -266,6 +263,7 @@ interface IORMRow {
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return IORMTable
         */
index d469e86..be82f4e 100644 (file)
@@ -134,7 +134,8 @@ abstract class LBFactory {
         * Prepare all tracked load balancers for shutdown
         * STUB
         */
-       function shutdown() {}
+       function shutdown() {
+       }
 
        /**
         * Call a method of each tracked load balancer
@@ -201,7 +202,7 @@ class LBFactory_Simple extends LBFactory {
                                $flags |= DBO_COMPRESS;
                        }
 
-                       $servers = array(array(
+                       $servers = array( array(
                                'host' => $wgDBserver,
                                'user' => $wgDBuser,
                                'password' => $wgDBpassword,
@@ -256,6 +257,7 @@ class LBFactory_Simple extends LBFactory {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
                        $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
                }
                return $this->extLBs[$cluster];
        }
@@ -280,6 +282,9 @@ class LBFactory_Simple extends LBFactory {
                if ( $this->mainLB ) {
                        $this->chronProt->shutdownLB( $this->mainLB );
                }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
                $this->chronProt->shutdown();
                $this->commitMasterChanges();
        }
@@ -292,21 +297,27 @@ class LBFactory_Simple extends LBFactory {
  * LBFactory::enableBackend() to return to normal behavior
  */
 class LBFactory_Fake extends LBFactory {
-       function __construct( $conf ) {}
+       function __construct( $conf ) {
+       }
 
        function newMainLB( $wiki = false) {
                throw new DBAccessError;
        }
+
        function getMainLB( $wiki = false ) {
                throw new DBAccessError;
        }
+
        function newExternalLB( $cluster, $wiki = false ) {
                throw new DBAccessError;
        }
+
        function &getExternalLB( $cluster, $wiki = false ) {
                throw new DBAccessError;
        }
-       function forEachLB( $callback, $params = array() ) {}
+
+       function forEachLB( $callback, $params = array() ) {
+       }
 }
 
 /**
@@ -317,76 +328,3 @@ class DBAccessError extends MWException {
                parent::__construct( "Mediawiki tried to access the database via wfGetDB(). This is not allowed." );
        }
 }
-
-/**
- * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
- * Kind of like Hawking's [[Chronology Protection Agency]].
- */
-class ChronologyProtector {
-       var $startupPos;
-       var $shutdownPos = array();
-
-       /**
-        * Initialise a LoadBalancer to give it appropriate chronology protection.
-        *
-        * @param $lb LoadBalancer
-        */
-       function initLB( $lb ) {
-               if ( $this->startupPos === null ) {
-                       if ( !empty( $_SESSION[__CLASS__] ) ) {
-                               $this->startupPos = $_SESSION[__CLASS__];
-                       }
-               }
-               if ( !$this->startupPos ) {
-                       return;
-               }
-               $masterName = $lb->getServerName( 0 );
-
-               if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
-                       $info = $lb->parentInfo();
-                       $pos = $this->startupPos[$masterName];
-                       wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
-                       $lb->waitFor( $this->startupPos[$masterName] );
-               }
-       }
-
-       /**
-        * Notify the ChronologyProtector that the LoadBalancer is about to shut
-        * down. Saves replication positions.
-        *
-        * @param $lb LoadBalancer
-        */
-       function shutdownLB( $lb ) {
-               // Don't start a session, don't bother with non-replicated setups
-               if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) {
-                       return;
-               }
-               $masterName = $lb->getServerName( 0 );
-               if ( isset( $this->shutdownPos[$masterName] ) ) {
-                       // Already done
-                       return;
-               }
-               // Only save the position if writes have been done on the connection
-               $db = $lb->getAnyOpenConnection( 0 );
-               $info = $lb->parentInfo();
-               if ( !$db || !$db->doneWrites() ) {
-                       wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
-                       return;
-               }
-               $pos = $db->getMasterPos();
-               wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
-               $this->shutdownPos[$masterName] = $pos;
-       }
-
-       /**
-        * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
-        * May commit chronology data to persistent storage.
-        */
-       function shutdown() {
-               if ( session_id() != '' && count( $this->shutdownPos ) ) {
-                       wfDebug( __METHOD__ . ": saving master pos for " .
-                               count( $this->shutdownPos ) . " master(s)\n" );
-                       $_SESSION[__CLASS__] = $this->shutdownPos;
-               }
-       }
-}
index 2e4963d..3043946 100644 (file)
@@ -145,8 +145,8 @@ class LBFactory_Multi extends LBFactory {
                $section = $this->getSectionForWiki( $wiki );
                if ( !isset( $this->mainLBs[$section] ) ) {
                        $lb = $this->newMainLB( $wiki, $section );
-                       $this->chronProt->initLB( $lb );
                        $lb->parentInfo( array( 'id' => "main-$section" ) );
+                       $this->chronProt->initLB( $lb );
                        $this->mainLBs[$section] = $lb;
                }
                return $this->mainLBs[$section];
@@ -181,6 +181,7 @@ class LBFactory_Multi extends LBFactory {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
                        $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
                }
                return $this->extLBs[$cluster];
        }
@@ -296,6 +297,9 @@ class LBFactory_Multi extends LBFactory {
                foreach ( $this->mainLBs as $lb ) {
                        $this->chronProt->shutdownLB( $lb );
                }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
                $this->chronProt->shutdown();
                $this->commitMasterChanges();
        }
index 187870f..e2434a0 100644 (file)
@@ -219,6 +219,7 @@ class LoadBalancer {
                }
 
                if ( !$nonErrorLoads ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Empty server array given to LoadBalancer" );
                }
 
@@ -348,7 +349,7 @@ class LoadBalancer {
         * Set the master wait position
         * If a DB_SLAVE connection has been opened already, waits
         * Otherwise sets a variable telling it to wait if such a connection is opened
-        * @param $pos int
+        * @param $pos DBMasterPos
         */
        public function waitFor( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -366,7 +367,7 @@ class LoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param $pos int
+        * @param $pos DBMasterPos
         */
        public function waitForAll( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -399,7 +400,7 @@ class LoadBalancer {
         * @param $open bool
         * @return bool
         */
-       function doWait( $index, $open = false ) {
+       protected function doWait( $index, $open = false ) {
                # Find a connection to wait on
                $conn = $this->getAnyOpenConnection( $index );
                if ( !$conn ) {
@@ -443,8 +444,10 @@ class LoadBalancer {
                wfProfileIn( __METHOD__ );
 
                if ( $i == DB_LAST ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ . ' with deprecated server index DB_LAST' );
                } elseif ( $i === null || $i === false ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ . ' with invalid server index' );
                }
 
index 6c1f27f..ea6ff63 100644 (file)
@@ -42,18 +42,13 @@ class ORMRow implements IORMRow {
         */
        protected $fields = array( 'id' => null );
 
-       /**
-        * @since 1.20
-        * @var ORMTable
-        */
-       protected $table;
-
        /**
         * If the object should update summaries of linked items when changed.
         * For example, update the course_count field in universities when a course in courses is deleted.
         * Settings this to false can prevent needless updating work in situations
         * such as deleting a university, which will then delete all it's courses.
         *
+        * @deprecated since 1.21
         * @since 1.20
         * @var bool
         */
@@ -64,21 +59,29 @@ class ORMRow implements IORMRow {
         * This mode indicates that only summary fields got updated,
         * which allows for optimizations.
         *
+        * @deprecated since 1.21
         * @since 1.20
         * @var bool
         */
        protected $inSummaryMode = false;
 
+       /**
+        * @deprecated since 1.21
+        * @since 1.20
+        * @var ORMTable|null
+        */
+       protected $table;
+
        /**
         * Constructor.
         *
         * @since 1.20
         *
-        * @param IORMTable $table
+        * @param IORMTable|null $table Deprecated since 1.21
         * @param array|null $fields
-        * @param boolean $loadDefaults
+        * @param boolean $loadDefaults Deprecated since 1.21
         */
-       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false ) {
+       public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
                $this->table = $table;
 
                if ( !is_array( $fields ) ) {
@@ -96,6 +99,7 @@ class ORMRow implements IORMRow {
         * Load the specified fields from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|null $fields
         * @param boolean $override
@@ -160,6 +164,7 @@ class ORMRow implements IORMRow {
         * Gets the value of a field but first loads it if not done so already.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param $name string
         *
@@ -231,26 +236,11 @@ class ORMRow implements IORMRow {
                        && !is_null( $this->getField( 'id' ) );
        }
 
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param boolean $override Override already set fields with the provided values?
-        */
-       public function setFields( array $fields, $override = true ) {
-               foreach ( $fields as $name => $value ) {
-                       if ( $override || !$this->hasField( $name ) ) {
-                               $this->setField( $name, $value );
-                       }
-               }
-       }
-
        /**
         * Gets the fields => values to write to the table.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return array
         */
@@ -269,10 +259,10 @@ class ORMRow implements IORMRow {
                                switch ( $type ) {
                                        case 'array':
                                                $value = (array)$value;
-                                               // fall-through!
+                                       // fall-through!
                                        case 'blob':
                                                $value = serialize( $value );
-                                               // fall-through!
+                                       // fall-through!
                                }
 
                                $values[$this->table->getPrefixedField( $name )] = $value;
@@ -282,6 +272,22 @@ class ORMRow implements IORMRow {
                return $values;
        }
 
+       /**
+        * Sets multiple fields.
+        *
+        * @since 1.20
+        *
+        * @param array $fields The fields to set
+        * @param boolean $override Override already set fields with the provided values?
+        */
+       public function setFields( array $fields, $override = true ) {
+               foreach ( $fields as $name => $value ) {
+                       if ( $override || !$this->hasField( $name ) ) {
+                               $this->setField( $name, $value );
+                       }
+               }
+       }
+
        /**
         * Serializes the object to an associative array which
         * can then easily be converted into JSON or similar.
@@ -320,6 +326,7 @@ class ORMRow implements IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $override
         */
@@ -332,6 +339,7 @@ class ORMRow implements IORMRow {
         * when it already exists, or inserting it when it doesn't.
         *
         * @since 1.20
+        * @deprecated since 1.21 Use IORMTable->updateRow or ->insertRow
         *
         * @param string|null $functionName
         *
@@ -339,9 +347,9 @@ class ORMRow implements IORMRow {
         */
        public function save( $functionName = null ) {
                if ( $this->hasIdField() ) {
-                       return $this->saveExisting( $functionName );
+                       return $this->table->updateRow( $this, $functionName );
                } else {
-                       return $this->insert( $functionName );
+                       return $this->table->insertRow( $this, $functionName );
                }
        }
 
@@ -349,6 +357,7 @@ class ORMRow implements IORMRow {
         * Updates the object in the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string|null $functionName
         *
@@ -360,7 +369,7 @@ class ORMRow implements IORMRow {
                $success = $dbw->update(
                        $this->table->getName(),
                        $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
+                       $this->table->getPrefixedValues( $this->getWriteValues() ),
                        is_null( $functionName ) ? __METHOD__ : $functionName
                );
 
@@ -386,6 +395,7 @@ class ORMRow implements IORMRow {
         * Inserts the object into the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string|null $functionName
         * @param array|null $options
@@ -418,16 +428,14 @@ class ORMRow implements IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21, use IROMtable->removeRow
         *
         * @return boolean Success indicator
         */
        public function remove() {
                $this->beforeRemove();
 
-               $success = $this->table->delete( array( 'id' => $this->getId() ), __METHOD__ );
-
-               // DatabaseBase::delete does not always return true for success as documented...
-               $success = $success !== false;
+               $success = $this->table->removeRow( $this, __METHOD__ );
 
                if ( $success ) {
                        $this->onRemoved();
@@ -440,6 +448,7 @@ class ORMRow implements IORMRow {
         * Gets called before an object is removed from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         */
        protected function beforeRemove() {
                $this->loadFields( $this->getBeforeRemoveFields(), false, true );
@@ -463,6 +472,7 @@ class ORMRow implements IORMRow {
         * Can be overridden to get rid of linked data.
         *
         * @since 1.20
+        * @deprecated since 1.21
         */
        protected function onRemoved() {
                $this->setField( 'id', null );
@@ -503,51 +513,14 @@ class ORMRow implements IORMRow {
         * @throws MWException
         */
        public function setField( $name, $value ) {
-               $fields = $this->table->getFields();
-
-               if ( array_key_exists( $name, $fields ) ) {
-                       switch ( $fields[$name] ) {
-                               case 'int':
-                                       $value = (int)$value;
-                                       break;
-                               case 'float':
-                                       $value = (float)$value;
-                                       break;
-                               case 'bool':
-                                       $value = (bool)$value;
-                                       break;
-                               case 'array':
-                                       if ( is_string( $value ) ) {
-                                               $value = unserialize( $value );
-                                       }
-
-                                       if ( !is_array( $value ) ) {
-                                               $value = array();
-                                       }
-                                       break;
-                               case 'blob':
-                                       if ( is_string( $value ) ) {
-                                               $value = unserialize( $value );
-                                       }
-                                       break;
-                               case 'id':
-                                       if ( is_string( $value ) ) {
-                                               $value = (int)$value;
-                                       }
-                                       break;
-                       }
-
-                       $this->fields[$name] = $value;
-               } else {
-                       throw new MWException( 'Attempted to set unknown field ' . $name );
-               }
+               $this->fields[$name] = $value;
        }
 
        /**
         * Add an amount (can be negative) to the specified field (needs to be numeric).
-        * TODO: most off this stuff makes more sense in the table class
         *
         * @since 1.20
+        * @deprecated since 1.21, use IORMTable->addToField
         *
         * @param string $field
         * @param integer $amount
@@ -555,41 +528,14 @@ class ORMRow implements IORMRow {
         * @return boolean Success indicator
         */
        public function addToField( $field, $amount ) {
-               if ( $amount == 0 ) {
-                       return true;
-               }
-
-               if ( !$this->hasIdField() ) {
-                       return false;
-               }
-
-               $absoluteAmount = abs( $amount );
-               $isNegative = $amount < 0;
-
-               $dbw = $this->table->getWriteDbConnection();
-
-               $fullField = $this->table->getPrefixedField( $field );
-
-               $success = $dbw->update(
-                       $this->table->getName(),
-                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
-                       array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
-                       __METHOD__
-               );
-
-               if ( $success && $this->hasField( $field ) ) {
-                       $this->setField( $field, $this->getField( $field ) + $amount );
-               }
-
-               $this->table->releaseConnection( $dbw );
-
-               return $success;
+               return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
        }
 
        /**
         * Return the names of the fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return array
         */
@@ -601,6 +547,7 @@ class ORMRow implements IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|string|null $summaryFields
         */
@@ -612,6 +559,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $update
         */
@@ -623,6 +571,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $summaryMode
         */
@@ -630,40 +579,11 @@ class ORMRow implements IORMRow {
                $this->inSummaryMode = $summaryMode;
        }
 
-       /**
-        * Return if any fields got changed.
-        *
-        * @since 1.20
-        *
-        * @param IORMRow $object
-        * @param boolean|array $excludeSummaryFields
-        *  When set to true, summary field changes are ignored.
-        *  Can also be an array of fields to ignore.
-        *
-        * @return boolean
-        */
-       protected function fieldsChanged( IORMRow $object, $excludeSummaryFields = false ) {
-               $exclusionFields = array();
-
-               if ( $excludeSummaryFields !== false ) {
-                       $exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
-               }
-
-               foreach ( $this->fields as $name => $value ) {
-                       $excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
-
-                       if ( !$excluded && $object->getField( $name ) !== $value ) {
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
        /**
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return IORMTable
         */
index bcbe94a..3a432cd 100644 (file)
@@ -814,10 +814,59 @@ class ORMTable extends DBAccessBase implements IORMTable {
         */
        public function getFieldsFromDBResult( stdClass $result ) {
                $result = (array)$result;
-               return array_combine(
+
+               $rawFields = array_combine(
                        $this->unprefixFieldNames( array_keys( $result ) ),
                        array_values( $result )
                );
+
+               $fieldDefinitions = $this->getFields();
+               $fields = array();
+
+               foreach ( $rawFields as $name => $value ) {
+                       if ( array_key_exists( $name, $fieldDefinitions ) ) {
+                               switch ( $fieldDefinitions[$name] ) {
+                                       case 'int':
+                                               $value = (int)$value;
+                                               break;
+                                       case 'float':
+                                               $value = (float)$value;
+                                               break;
+                                       case 'bool':
+                                               if ( is_string( $value ) ) {
+                                                       $value = $value !== '0';
+                                               } elseif ( is_int( $value ) ) {
+                                                       $value = $value !== 0;
+                                               }
+                                               break;
+                                       case 'array':
+                                               if ( is_string( $value ) ) {
+                                                       $value = unserialize( $value );
+                                               }
+
+                                               if ( !is_array( $value ) ) {
+                                                       $value = array();
+                                               }
+                                               break;
+                                       case 'blob':
+                                               if ( is_string( $value ) ) {
+                                                       $value = unserialize( $value );
+                                               }
+                                               break;
+                                       case 'id':
+                                               if ( is_string( $value ) ) {
+                                                       $value = (int)$value;
+                                               }
+                                               break;
+                               }
+
+                               $fields[$name] = $value;
+                       } else {
+                               throw new MWException( 'Attempted to set unknown field ' . $name );
+                       }
+               }
+
+               return $fields;
        }
 
        /**
@@ -867,14 +916,15 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @param array $data
+        * @param array $fields
         * @param boolean $loadDefaults
         *
         * @return IORMRow
         */
-       public function newRow( array $data, $loadDefaults = false ) {
+       public function newRow( array $fields, $loadDefaults = false ) {
                $class = $this->getRowClass();
-               return new $class( $this, $data, $loadDefaults );
+
+               return new $class( $this, $fields, $loadDefaults );
        }
 
        /**
@@ -901,4 +951,157 @@ class ORMTable extends DBAccessBase implements IORMTable {
                return array_key_exists( $name, $this->getFields() );
        }
 
+       /**
+        * Updated the provided row in the database.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $row The row to save
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function updateRow( IORMRow $row, $functionName = null ) {
+               $dbw = $this->getWriteDbConnection();
+
+               $success = $dbw->update(
+                       $this->getName(),
+                       $this->getWriteValues( $row ),
+                       $this->getPrefixedValues( array( 'id' => $row->getId() ) ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName
+               );
+
+               $this->releaseConnection( $dbw );
+
+               // DatabaseBase::update does not always return true for success as documented...
+               return $success !== false;
+       }
+
+       /**
+        * Inserts the provided row into the database.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $row
+        * @param string|null $functionName
+        * @param array|null $options
+        *
+        * @return boolean Success indicator
+        */
+       public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
+               $dbw = $this->getWriteDbConnection();
+
+               $success = $dbw->insert(
+                       $this->getName(),
+                       $this->getWriteValues( $row ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       $options
+               );
+
+               // DatabaseBase::insert does not always return true for success as documented...
+               $success = $success !== false;
+
+               if ( $success ) {
+                       $row->setField( 'id', $dbw->insertId() );
+               }
+
+               $this->releaseConnection( $dbw );
+
+               return $success;
+       }
+
+       /**
+        * Gets the fields => values to write to the table.
+        *
+        * @since 1.20
+        *
+        * @param IORMRow $row
+        *
+        * @return array
+        */
+       protected function getWriteValues( IORMRow $row ) {
+               $values = array();
+
+               $rowFields = $row->getFields();
+
+               foreach ( $this->getFields() as $name => $type ) {
+                       if ( array_key_exists( $name, $rowFields ) ) {
+                               $value = $rowFields[$name];
+
+                               switch ( $type ) {
+                                       case 'array':
+                                               $value = (array)$value;
+                                       // fall-through!
+                                       case 'blob':
+                                               $value = serialize( $value );
+                                       // fall-through!
+                               }
+
+                               $values[$this->getPrefixedField( $name )] = $value;
+                       }
+               }
+
+               return $values;
+       }
+
+       /**
+        * Removes the provided row from the database.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $row
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function removeRow( IORMRow $row, $functionName = null ) {
+               $success = $this->delete(
+                       array( 'id' => $row->getId() ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName
+               );
+
+               // DatabaseBase::delete does not always return true for success as documented...
+               return $success !== false;
+       }
+
+       /**
+        * Add an amount (can be negative) to the specified field (needs to be numeric).
+        *
+        * @since 1.21
+        *
+        * @param array $conditions
+        * @param string $field
+        * @param integer $amount
+        *
+        * @return boolean Success indicator
+        * @throws MWException
+        */
+       public function addToField( array $conditions, $field, $amount ) {
+               if ( !array_key_exists( $field, $this->fields ) ) {
+                       throw new MWException( 'Unknown field "' . $field . '" provided' );
+               }
+
+               if ( $amount == 0 ) {
+                       return true;
+               }
+
+               $absoluteAmount = abs( $amount );
+               $isNegative = $amount < 0;
+
+               $fullField = $this->getPrefixedField( $field );
+
+               $dbw = $this->getWriteDbConnection();
+
+               $success = $dbw->update(
+                       $this->getName(),
+                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
+                       $this->getPrefixedValues( $conditions ),
+                       __METHOD__
+               ) !== false; // DatabaseBase::update does not always return true for success as documented...
+
+               $this->releaseConnection( $dbw );
+
+               return $success;
+       }
+
 }
index 8c39e1a..582b3ac 100644 (file)
@@ -135,10 +135,24 @@ class MWDebug {
         * @since 1.19
         * @param $msg string
         * @param $callerOffset int
-        * @param int $level A PHP error level. See sendWarning()
+        * @param $level int A PHP error level. See sendWarning()
+        * @param $log string: 'production' will always trigger a php error, 'auto'
+        *        will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
+        *        will only write to the debug log(s).
+        *
         * @return mixed
         */
-       public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+       public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
+               global $wgDevelopmentWarnings;
+
+               if ( $log === 'auto' && !$wgDevelopmentWarnings ) {
+                       $log = 'debug';
+               }
+
+               if ( $log === 'debug' ) {
+                       $level = false;
+               }
+
                $callerDescription = self::getCallerDescription( $callerOffset );
 
                self::sendWarning( $msg, $callerDescription, $level );
@@ -212,7 +226,8 @@ class MWDebug {
                }
 
                if ( $sendToLog ) {
-                       self::sendWarning( $msg, $callerDescription, E_USER_DEPRECATED );
+                       global $wgDevelopmentWarnings; // we could have a more specific $wgDeprecationWarnings setting.
+                       self::sendWarning( $msg, $callerDescription, $wgDevelopmentWarnings ? E_USER_DEPRECATED : false );
                }
 
                if ( self::$enabled ) {
@@ -267,23 +282,21 @@ class MWDebug {
        }
 
        /**
-        * Send a warning either to the debug log or by triggering an user PHP
-        * error depending on $wgDevelopmentWarnings.
+        * Send a warning to the debug log and optionally also trigger a PHP
+        * error, depending on the $level argument.
         *
-        * @param string $msg Message to send
-        * @param array $caller caller description get from getCallerDescription()
-        * @param $level error level to use if $wgDevelopmentWarnings is true
+        * @param $msg string Message to send
+        * @param $caller array caller description get from getCallerDescription()
+        * @param $level int|bool error level to use; set to false to not trigger an error
         */
        private static function sendWarning( $msg, $caller, $level ) {
-               global $wgDevelopmentWarnings;
-
                $msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
 
-               if ( $wgDevelopmentWarnings ) {
+               if ( $level !== false ) {
                        trigger_error( $msg, $level );
-               } else {
-                       wfDebug( "$msg\n" );
                }
+
+               wfDebug( "$msg\n" );
        }
 
        /**
index 1a26d0c..f9cb656 100644 (file)
@@ -508,7 +508,7 @@ class _DiffEngine {
                        reset( $seps );
                        $pt1 = $seps[0];
                        while ( $pt2 = next( $seps ) ) {
-                               $this->_compareseq ( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
+                               $this->_compareseq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
                                $pt1 = $pt2;
                        }
                }
index 0f3c77f..a69862d 100644 (file)
@@ -223,33 +223,6 @@ class DifferenceEngine extends ContextSource {
                        throw new PermissionsError( 'read', $permErrors );
                }
 
-               # If external diffs are enabled both globally and for the user,
-               # we'll use the application/x-external-editor interface to call
-               # an external diff tool like kompare, kdiff3, etc.
-               if ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
-                       //TODO: come up with a good solution for non-text content here.
-                       //      at least, the content format needs to be passed to the client somehow.
-                       //      Currently, action=raw will just fail for non-text content.
-
-                       $urls = array(
-                               'File' => array( 'Extension' => 'wiki', 'URL' =>
-                                       # This should be mOldPage, but it may not be set, see below.
-                                       $this->mNewPage->getCanonicalURL( array(
-                                               'action' => 'raw', 'oldid' => $this->mOldid ) )
-                               ),
-                               'File2' => array( 'Extension' => 'wiki', 'URL' =>
-                                       $this->mNewPage->getCanonicalURL( array(
-                                               'action' => 'raw', 'oldid' => $this->mNewid ) )
-                               ),
-                       );
-
-                       $externalEditor = new ExternalEdit( $this->getContext(), $urls );
-                       $externalEditor->execute();
-
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
                $rollback = '';
                $undoLink = '';
 
@@ -279,11 +252,6 @@ class DifferenceEngine extends ContextSource {
                } else {
                        wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
 
-                       $sk = $this->getSkin();
-                       if ( method_exists( $sk, 'suppressQuickbar' ) ) {
-                               $sk->suppressQuickbar();
-                       }
-
                        if ( $this->mNewPage->equals( $this->mOldPage ) ) {
                                $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                                $samePage = true;
@@ -304,7 +272,7 @@ class DifferenceEngine extends ContextSource {
                                }
                                if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
                                        $undoLink = Html::element( 'a', array(
-                                                       'href' => $this->mNewPage->getLocalUrl( array(
+                                                       'href' => $this->mNewPage->getLocalURL( array(
                                                                'action' => 'edit',
                                                                'undoafter' => $this->mOldid,
                                                                'undo' => $this->mNewid ) ),
@@ -414,7 +382,7 @@ class DifferenceEngine extends ContextSource {
                                        array( $msg ) );
                        } else {
                                # Give explanation and add a link to view the diff...
-                               $link = $this->getTitle()->getFullUrl( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
+                               $link = $this->getTitle()->getFullURL( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
                                $msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
                                $out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
                        }
diff --git a/includes/extauth/Hardcoded.php b/includes/extauth/Hardcoded.php
deleted file mode 100644 (file)
index dfb4674..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/**
- * External authentication with hardcoded user names and passwords
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports external authentication from a literal array dumped in
- * LocalSettings.php.  It's mostly useful for testing.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_Hardcoded';
- *   $wgExternalAuthConf = array(
- *       'Bob Smith' => array(
- *           'password' => 'literal string',
- *           'emailaddress' => 'bob@example.com',
- *       ),
- *   );
- *
- * Multiple names may be provided.  The keys of the inner arrays can be either
- * 'password', or the name of any preference.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_Hardcoded extends ExternalUser {
-       private $mName;
-
-       protected function initFromName( $name ) {
-               global $wgExternalAuthConf;
-
-               if ( isset( $wgExternalAuthConf[$name] ) ) {
-                       $this->mName = $name;
-                       return true;
-               }
-               return false;
-       }
-
-       protected function initFromId( $id ) {
-               return $this->initFromName( $id );
-       }
-
-       public function getId() {
-               return $this->mName;
-       }
-
-       public function getName() {
-               return $this->mName;
-       }
-
-       public function authenticate( $password ) {
-               global $wgExternalAuthConf;
-
-               return isset( $wgExternalAuthConf[$this->mName]['password'] )
-                       && $wgExternalAuthConf[$this->mName]['password'] == $password;
-       }
-
-       public function getPref( $pref ) {
-               global $wgExternalAuthConf;
-
-               if ( isset( $wgExternalAuthConf[$this->mName][$pref] ) ) {
-                       return $wgExternalAuthConf[$this->mName][$pref];
-               }
-               return null;
-       }
-
-       # TODO: Implement setPref() via regex on LocalSettings.  (Just kidding.)
-}
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
deleted file mode 100644 (file)
index c7f6a20..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * External authentication with external MediaWiki database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports authentication against an external MediaWiki database,
- * probably any version back to 1.5 or something.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_MediaWiki';
- *   $wgExternalAuthConf = array(
- *       'DBtype' => 'mysql',
- *       'DBserver' => 'localhost',
- *       'DBname' => 'wikidb',
- *       'DBuser' => 'quasit',
- *       'DBpassword' => 'a5Cr:yf9u-6[{`g',
- *       'DBprefix' => '',
- *   );
- *
- * All fields must be present.  These mean the same things as $wgDBtype,
- * $wgDBserver, etc.  This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs.  Kind of hard to reuse code when things might rely on who
- * knows what configuration globals.
- *
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
- * should be unlikely.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_MediaWiki extends ExternalUser {
-       private $mRow;
-
-       /**
-        * @var DatabaseBase
-        */
-       private $mDb;
-
-       /**
-        * @param $name string
-        * @return bool
-        */
-       protected function initFromName( $name ) {
-               # We might not need the 'usable' bit, but let's be safe.  Theoretically
-               # this might return wrong results for old versions, but it's probably
-               # good enough.
-               $name = User::getCanonicalName( $name, 'usable' );
-
-               if ( !is_string( $name ) ) {
-                       return false;
-               }
-
-               return $this->initFromCond( array( 'user_name' => $name ) );
-       }
-
-       /**
-        * @param $id int
-        * @return bool
-        */
-       protected function initFromId( $id ) {
-               return $this->initFromCond( array( 'user_id' => $id ) );
-       }
-
-       /**
-        * @param $cond array
-        * @return bool
-        */
-       private function initFromCond( $cond ) {
-               global $wgExternalAuthConf;
-
-               $this->mDb = DatabaseBase::factory( $wgExternalAuthConf['DBtype'],
-                       array(
-                               'host'        => $wgExternalAuthConf['DBserver'],
-                               'user'        => $wgExternalAuthConf['DBuser'],
-                               'password'    => $wgExternalAuthConf['DBpassword'],
-                               'dbname'      => $wgExternalAuthConf['DBname'],
-                               'tablePrefix' => $wgExternalAuthConf['DBprefix'],
-                       )
-               );
-
-               $row = $this->mDb->selectRow(
-                       'user',
-                       array(
-                               'user_name', 'user_id', 'user_password', 'user_email',
-                               'user_email_authenticated'
-                       ),
-                       $cond,
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       # TODO: Implement initFromCookie().
-
-       public function getId() {
-               return $this->mRow->user_id;
-       }
-
-       /**
-        * @return string
-        */
-       public function getName() {
-               return $this->mRow->user_name;
-       }
-
-       public function authenticate( $password ) {
-               # This might be wrong if anyone actually uses the UserComparePasswords hook
-               # (on either end), so don't use this if you those are incompatible.
-               return User::comparePasswords( $this->mRow->user_password, $password,
-                       $this->mRow->user_id );
-       }
-
-       public function getPref( $pref ) {
-               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does
-               # this normally.
-               if ( $pref === 'emailaddress'
-               && $this->row->user_email_authenticated !== null ) {
-                       return $this->mRow->user_email;
-               }
-               return null;
-       }
-
-       /**
-        * @return array
-        */
-       public function getGroups() {
-               # @todo FIXME: Untested.
-               $groups = array();
-               $res = $this->mDb->select(
-                       'user_groups',
-                       'ug_group',
-                       array( 'ug_user' => $this->mRow->user_id ),
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $groups[] = $row->ug_group;
-               }
-               return $groups;
-       }
-
-       # TODO: Implement setPref().
-}
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
deleted file mode 100644 (file)
index 0565a2e..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * External authentication with a vBulletin database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports the proprietary vBulletin forum system
- * <http://www.vbulletin.com>, versions 3.5 and up.  It calls no functions or
- * code, only reads from the database.  Example lines to put in
- * LocalSettings.php:
- *
- *   $wgExternalAuthType = 'ExternalUser_vB';
- *   $wgExternalAuthConf = array(
- *       'server' => 'localhost',
- *       'username' => 'forum',
- *       'password' => 'udE,jSqDJ<""p=fI.K9',
- *       'dbname' => 'forum',
- *       'tablePrefix' => '',
- *       'cookieprefix' => 'bb'
- *   );
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_vB extends ExternalUser {
-       private $mRow;
-
-       protected function initFromName( $name ) {
-               return $this->initFromCond( array( 'username' => $name ) );
-       }
-
-       protected function initFromId( $id ) {
-               return $this->initFromCond( array( 'userid' => $id ) );
-       }
-
-       protected function initFromCookie() {
-               # Try using the session table.  It will only have a row if the user has
-               # an active session, so it might not always work, but it's a lot easier
-               # than trying to convince PHP to give us vB's $_SESSION.
-               global $wgExternalAuthConf, $wgRequest;
-               if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) {
-                       $prefix = 'bb';
-               } else {
-                       $prefix = $wgExternalAuthConf['cookieprefix'];
-               }
-               if ( $wgRequest->getCookie( 'sessionhash', $prefix ) === null ) {
-                       return false;
-               }
-
-               $db = $this->getDb();
-
-               $row = $db->selectRow(
-                       array( 'session', 'user' ),
-                       $this->getFields(),
-                       array(
-                               'session.userid = user.userid',
-                               'sessionhash' => $wgRequest->getCookie( 'sessionhash', $prefix ),
-                       ),
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       private function initFromCond( $cond ) {
-               $db = $this->getDb();
-
-               $row = $db->selectRow(
-                       'user',
-                       $this->getFields(),
-                       $cond,
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       private function getDb() {
-               global $wgExternalAuthConf;
-               return DatabaseBase::factory( 'mysql',
-                       array(
-                               'host' => $wgExternalAuthConf['server'],
-                               'user' => $wgExternalAuthConf['username'],
-                               'password' => $wgExternalAuthConf['password'],
-                               'dbname' => $wgExternalAuthConf['dbname'],
-                               'tablePrefix' => $wgExternalAuthConf['tablePrefix'],
-                       )
-               );
-       }
-
-       private function getFields() {
-               return array( 'user.userid', 'username', 'password', 'salt', 'email',
-                       'usergroupid', 'membergroupids' );
-       }
-
-       public function getId() { return $this->mRow->userid; }
-       public function getName() { return $this->mRow->username; }
-
-       public function authenticate( $password ) {
-               # vBulletin seemingly strips whitespace from passwords
-               $password = trim( $password );
-               return $this->mRow->password == md5( md5( $password )
-                       . $this->mRow->salt );
-       }
-
-       public function getPref( $pref ) {
-               if ( $pref == 'emailaddress' && $this->mRow->email ) {
-                       # TODO: only return if validated?
-                       return $this->mRow->email;
-               }
-               return null;
-       }
-
-       public function getGroups() {
-               $groups = array( $this->mRow->usergroupid );
-               $groups = array_merge( $groups, explode( ',', $this->mRow->membergroupids ) );
-               $groups = array_unique( $groups );
-               return $groups;
-       }
-}
index c976998..92fee83 100644 (file)
@@ -319,7 +319,7 @@ class FSFileBackend extends FileBackendStore {
                        $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
-                       $ok = copy( $source, $dest );
+                       $ok = ( $source === $dest ) ? true : copy( $source, $dest );
                        $this->untrapWarnings();
                        // In some cases (at least over NFS), copy() returns true when it fails
                        if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
@@ -383,7 +383,7 @@ class FSFileBackend extends FileBackendStore {
                        $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
                } else { // immediate write
                        $this->trapWarnings();
-                       $ok = rename( $source, $dest );
+                       $ok = ( $source === $dest ) ? true : rename( $source, $dest );
                        $this->untrapWarnings();
                        clearstatcache(); // file no longer at source
                        if ( !$ok ) {
index 638e7cd..d505d6f 100644 (file)
@@ -261,17 +261,19 @@ abstract class FileBackend {
         *   - ignoreMissingSource : The operation will simply succeed and do
         *                           nothing if the source file does not exist.
         *   - overwrite           : Any destination file will be overwritten.
-        *   - overwriteSame       : An error will not be given if a file already
-        *                           exists at the destination that has the same
-        *                           contents as the new contents to be written there.
-        *   - headers             : If supplied, the backend will return these headers when
-        *                           GETs/HEADs of the destination file are made. Header values
-        *                           should be smaller than 256 bytes, often options or numbers.
-        *                           Content-Disposition headers can be longer, though the system
-        *                           might ignore or truncate ones that are too long to store.
-        *                           Existing headers will remain, but these will replace any
-        *                           conflicting previous headers, and headers will be removed
-        *                           if they are set to an empty string.
+        *   - overwriteSame       : If a file already exists at the destination with the
+        *                           same contents, then do nothing to the destination file
+        *                           instead of giving an error. This does not compare headers.
+        *                           This option is ignored if 'overwrite' is already provided.
+        *   - headers             : If supplied, the result of merging these headers with any
+        *                           existing source file headers (replacing conflicting ones)
+        *                           will be set as the destination file headers. Headers are
+        *                           deleted if their value is set to the empty string. When a
+        *                           file has headers they are included in responses to GET and
+        *                           HEAD requests to the backing store for that file.
+        *                           Header values should be no larger than 255 bytes, except for
+        *                           Content-Disposition. The system might ignore or truncate any
+        *                           headers that are too long to store (exact limits will vary).
         *                           Backends that don't support metadata ignore this. (since 1.21)
         *
         * $opts is an associative of boolean flags, including:
@@ -680,6 +682,8 @@ abstract class FileBackend {
         * The 'noAccess' and 'noListing' parameters works the same as in secure(),
         * except they are only applied *if* the directory/container had to be created.
         * These flags should always be set for directories that have private files.
+        * However, setting them is not guaranteed to actually do anything.
+        * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params
         * $params include:
@@ -707,7 +711,9 @@ abstract class FileBackend {
         * the container it belongs to. FS backends might add .htaccess
         * files whereas key/value store backends might revoke container
         * access to the storage user representing end-users in web requests.
-        * This is not guaranteed to actually do anything.
+        *
+        * This is not guaranteed to actually make files or listings publically hidden.
+        * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params
         * $params include:
@@ -737,6 +743,9 @@ abstract class FileBackend {
         * access to the storage user representing end-users in web requests.
         * This essentially can undo the result of secure() calls.
         *
+        * This is not guaranteed to actually make files or listings publically viewable.
+        * Additional server configuration may be needed to achieve the desired effect.
+        *
         * @param array $params
         * $params include:
         *   - dir            : storage directory
index 939315d..17b060c 100644 (file)
@@ -457,7 +457,7 @@ class FileBackendMultiWrite extends FileBackend {
         * @return bool Path container should have dir changes pushed to all backends
         */
        protected function replicateContainerDirChanges( $path ) {
-               list( , $shortCont,  ) = self::splitStoragePath( $path );
+               list( , $shortCont, ) = self::splitStoragePath( $path );
                return !in_array( $shortCont, $this->noPushDirConts );
        }
 
index 1a9ac3b..18a59fa 100644 (file)
@@ -276,10 +276,12 @@ abstract class FileBackendStore extends FileBackend {
         */
        protected function doMoveInternal( array $params ) {
                unset( $params['async'] ); // two steps, won't work here :)
+               $nsrc = FileBackend::normalizeStoragePath( $params['src'] );
+               $ndst = FileBackend::normalizeStoragePath( $params['dst'] );
                // Copy source to dest
                $status = $this->copyInternal( $params );
-               if ( $status->isOK() ) {
-                       // Delete source (only fails due to races or medium going down)
+               if ( $nsrc !== $ndst && $status->isOK() ) {
+                       // Delete source (only fails due to races or network problems)
                        $status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
                        $status->setResult( true, $status->value ); // ignore delete() errors
                }
@@ -303,9 +305,13 @@ abstract class FileBackendStore extends FileBackend {
        final public function describeInternal( array $params ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = $this->doDescribeInternal( $params );
-               $this->clearCache( array( $params['src'] ) );
-               $this->deleteFileCache( $params['src'] ); // persistent cache
+               if ( count( $params['headers'] ) ) {
+                       $status = $this->doDescribeInternal( $params );
+                       $this->clearCache( array( $params['src'] ) );
+                       $this->deleteFileCache( $params['src'] ); // persistent cache
+               } else {
+                       $status = Status::newGood(); // nothing to do
+               }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -1246,8 +1252,12 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
                        } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Given a FileBackendStoreOpHandle for the wrong backend." );
                        }
                }
index e019324..62e9fba 100644 (file)
@@ -46,7 +46,7 @@ abstract class FileOp {
 
        protected $doOperation = true; // boolean; operation is not a no-op
        protected $sourceSha1; // string
-       protected $destSameAsSource; // boolean
+       protected $overwriteSameCase; // boolean
        protected $destExists; // boolean
 
        /* Object life-cycle */
@@ -55,7 +55,7 @@ abstract class FileOp {
        const STATE_ATTEMPTED = 3;
 
        /**
-        * Build a new file operation transaction
+        * Build a new batch file operation transaction
         *
         * @param $backend FileBackendStore
         * @param $params Array
@@ -64,8 +64,10 @@ abstract class FileOp {
        final public function __construct( FileBackendStore $backend, array $params ) {
                $this->backend = $backend;
                list( $required, $optional ) = $this->allowedParams();
+               // @TODO: normalizeAnyStoragePaths() calls are overzealous, use a parameter list
                foreach ( $required as $name ) {
                        if ( isset( $params[$name] ) ) {
+                               // Normalize paths so the paths to the same file have the same string
                                $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
                        } else {
                                throw new MWException( "File operation missing parameter '$name'." );
@@ -73,6 +75,7 @@ abstract class FileOp {
                }
                foreach ( $optional as $name ) {
                        if ( isset( $params[$name] ) ) {
+                               // Normalize paths so the paths to the same file have the same string
                                $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
                        }
                }
@@ -341,7 +344,7 @@ abstract class FileOp {
 
        /**
         * Check for errors with regards to the destination file already existing.
-        * Also set the destExists, destSameAsSource and sourceSha1 member variables.
+        * Also set the destExists, overwriteSameCase and sourceSha1 member variables.
         * A bad status will be returned if there is no chance it can be overwritten.
         *
         * @param $predicates Array
@@ -354,7 +357,7 @@ abstract class FileOp {
                if ( $this->sourceSha1 === null ) { // file in storage?
                        $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
                }
-               $this->destSameAsSource = false;
+               $this->overwriteSameCase = false;
                $this->destExists = $this->fileExists( $this->params['dst'], $predicates );
                if ( $this->destExists ) {
                        if ( $this->getParam( 'overwrite' ) ) {
@@ -368,7 +371,7 @@ abstract class FileOp {
                                        // Give an error if the files are not identical
                                        $status->fatal( 'backend-fail-notsame', $this->params['dst'] );
                                } else {
-                                       $this->destSameAsSource = true; // OK
+                                       $this->overwriteSameCase = true; // OK
                                }
                                return $status; // do nothing; either OK or bad status
                        } else {
@@ -489,7 +492,7 @@ class CreateFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               if ( !$this->destSameAsSource ) {
+               if ( !$this->overwriteSameCase ) {
                        // Create the file at the destination
                        return $this->backend->createInternal( $this->setFlags( $this->params ) );
                }
@@ -561,8 +564,8 @@ class StoreFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Store the file at the destination
-               if ( !$this->destSameAsSource ) {
+               if ( !$this->overwriteSameCase ) {
+                       // Store the file at the destination
                        return $this->backend->storeInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
@@ -638,14 +641,19 @@ class CopyFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       // Copy the file into the destination
-                       if ( !$this->destSameAsSource ) {
-                               return $this->backend->copyInternal( $this->setFlags( $this->params ) );
-                       }
+               if ( $this->overwriteSameCase ) {
+                       $status = Status::newGood(); // nothing to do
+               } elseif ( $this->params['src'] === $this->params['dst'] ) {
+                       // Just update the destination file headers
+                       $headers = $this->getParam( 'headers' ) ?: array();
+                       $status = $this->backend->describeInternal( $this->setFlags( array(
+                               'src' => $this->params['dst'], 'headers' => $headers
+                       ) ) );
+               } else {
+                       // Copy the file to the destination
+                       $status = $this->backend->copyInternal( $this->setFlags( $this->params ) );
                }
-               return Status::newGood();
+               return $status;
        }
 
        /**
@@ -717,18 +725,27 @@ class MoveFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       if ( !$this->destSameAsSource ) {
-                               // Move the file into the destination
-                               return $this->backend->moveInternal( $this->setFlags( $this->params ) );
+               if ( $this->overwriteSameCase ) {
+                       if ( $this->params['src'] === $this->params['dst'] ) {
+                               // Do nothing to the destination (which is also the source)
+                               $status = Status::newGood();
                        } else {
-                               // Just delete source as the destination needs no changes
-                               $params = array( 'src' => $this->params['src'] );
-                               return $this->backend->deleteInternal( $this->setFlags( $params ) );
+                               // Just delete the source as the destination file needs no changes
+                               $status = $this->backend->deleteInternal( $this->setFlags(
+                                       array( 'src' => $this->params['src'] )
+                               ) );
                        }
+               } elseif ( $this->params['src'] === $this->params['dst'] ) {
+                       // Just update the destination file headers
+                       $headers = $this->getParam( 'headers' ) ?: array();
+                       $status = $this->backend->describeInternal( $this->setFlags(
+                               array( 'src' => $this->params['dst'], 'headers' => $headers )
+                       ) );
+               } else {
+                       // Move the file to the destination
+                       $status = $this->backend->moveInternal( $this->setFlags( $this->params ) );
                }
-               return Status::newGood();
+               return $status;
        }
 
        /**
index aadad5c..2f7e256 100644 (file)
@@ -1316,7 +1316,7 @@ class SwiftFileBackend extends FileBackendStore {
         *                           matches the expression and the request is not for a listing.
         *                           Setting this to '*' effectively makes a container public.
         *   -".rlistings:<regex>" : Grants access if the request is from a referrer host that
-        *                           matches the expression and the request for a listing.
+        *                           matches the expression and the request is for a listing.
         *
         * $writeGrps is a list of the possible criteria for a request to have
         * access to write to a container. Each item is of the following format:
index 0512a01..f534eff 100644 (file)
@@ -88,11 +88,22 @@ abstract class LockManager {
         *
         * @param array $paths List of resource names
         * @param $type integer LockManager::LOCK_* constant
+        * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
         * @return Status
         */
-       final public function lock( array $paths, $type = self::LOCK_EX ) {
+       final public function lock( array $paths, $type = self::LOCK_EX, $timeout = 0 ) {
                wfProfileIn( __METHOD__ );
-               $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+               $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
+               $start = microtime( true );
+               do {
+                       $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+                       $elapsed = microtime( true ) - $start;
+                       if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) {
+                               break; // success, timeout, or clock set back
+                       }
+                       usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times
+                       $elapsed = microtime( true ) - $start;
+               } while ( $elapsed < $timeout && $elapsed >= 0 );
                wfProfileOut( __METHOD__ );
                return $status;
        }
index cecd0ae..64155e6 100644 (file)
@@ -518,7 +518,7 @@ abstract class File {
         * @param $version integer version number.
         * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
         */
-       public function convertMetadataVersion($metadata, $version) {
+       public function convertMetadataVersion( $metadata, $version ) {
                $handler = $this->getHandler();
                if ( !is_array( $metadata ) ) {
                        // Just to make the return type consistent
@@ -681,7 +681,7 @@ abstract class File {
                if ( $mime === "unknown/unknown" ) {
                        return false; #unknown type, not trusted
                }
-               if ( in_array( $mime, $wgTrustedMediaFormats) ) {
+               if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
                        return true;
                }
 
@@ -737,7 +737,7 @@ abstract class File {
                        if ( $this->repo ) {
                                $script = $this->repo->getThumbScriptUrl();
                                if ( $script ) {
-                                       $this->transformScript = "$script?f=" . urlencode( $this->getName() );
+                                       $this->transformScript = wfAppendQuery( $script, array( 'f' => $this->getName() ) );
                                }
                        }
                }
@@ -910,8 +910,7 @@ abstract class File {
                                                // XXX: Pass in the storage path even though we are not rendering anything
                                                // and the path is supposed to be an FS path. This is due to getScalerType()
                                                // getting called on the path and clobbering $thumb->getUrl() if it's false.
-                                               $thumb = $handler->getTransform(
-                                                       $this, $thumbPath, $thumbUrl, $params );
+                                               $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                                                $thumb->setStoragePath( $thumbPath );
                                                break;
                                        }
index a96c1f3..edf623e 100644 (file)
@@ -54,7 +54,7 @@ class ForeignAPIFile extends File {
         */
        static function newFromTitle( Title $title, $repo ) {
                $data = $repo->fetchImageQuery( array(
-                       'titles'            => 'File:' . $title->getDBKey(),
+                       'titles'            => 'File:' . $title->getDBkey(),
                        'iiprop'            => self::getProps(),
                        'prop'              => 'imageinfo',
                        'iimetadataversion' => MediaHandler::getMetadataVersion()
@@ -67,7 +67,7 @@ class ForeignAPIFile extends File {
                                ? count( $data['query']['redirects'] ) - 1
                                : -1;
                        if( $lastRedirect >= 0 ) {
-                               $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
+                               $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
                                $img = new self( $newtitle, $repo, $info, true );
                                if( $img ) {
                                        $img->redirectedFrom( $title->getDBkey() );
@@ -166,7 +166,7 @@ class ForeignAPIFile extends File {
                }
                $ret = array();
                foreach( $metadata as $meta ) {
-                       $ret[ $meta['name'] ] = self::parseMetadata( $meta['value'] );
+                       $ret[$meta['name']] = self::parseMetadata( $meta['value'] );
                }
                return $ret;
        }
index 639228b..f8887cc 100644 (file)
@@ -382,6 +382,7 @@ class LocalFile extends File {
                                $this->$name = $value;
                        }
                } else {
+                       wfProfileOut( $fname );
                        throw new MWException( "Could not find data for image '{$this->getName()}'." );
                }
 
@@ -1590,7 +1591,7 @@ class LocalFile extends File {
         * @return String
         */
        function getDescriptionUrl() {
-               return $this->title->getLocalUrl();
+               return $this->title->getLocalURL();
        }
 
        /**
index 5c50592..2e86ae1 100644 (file)
@@ -218,6 +218,7 @@ class OldLocalFile extends LocalFile {
                                $this->$name = $value;
                        }
                } else {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Could not find data for image '{$this->archive_name}'." );
                }
 
index 8231e7f..cd14e4e 100644 (file)
@@ -510,8 +510,7 @@ abstract class DatabaseInstaller {
         * @return String
         */
        public function getInstallUserBox() {
-               return
-                       Html::openElement( 'fieldset' ) .
+               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' ) ) .
index b88ae61..f525319 100644 (file)
@@ -302,7 +302,7 @@ abstract class DatabaseUpdater {
         * @param string $fieldName The field to be modified
         * @param string $sqlPath The path to the SQL change path
         */
-       public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
+       public function modifyExtensionField( $tableName, $fieldName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
        }
 
@@ -865,6 +865,7 @@ abstract class DatabaseUpdater {
                if ( $wgLocalisationCacheConf['manualRecache'] ) {
                        $this->rebuildLocalisationCache();
                }
+               MessageBlobStore::clear();
                $this->output( "done.\n" );
        }
 
index ee07a13..0c288ae 100644 (file)
@@ -455,6 +455,8 @@ Ideally, this should not be accessible from the web.',
        'config-logo-help'                => "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.
 Upload an image of the appropriate size, and enter the URL here.
 
+You can use <code>\$wgStylePath</code> or <code>\$wgScriptPath</code> if your logo is relative to those paths.
+
 If you do not want a logo, leave this box blank.",
        'config-instantcommons'           => 'Enable Instant Commons',
        'config-instantcommons-help'      => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.
@@ -574,6 +576,7 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
  * @author Shirayuki
  * @author Siebrand
  * @author Umherirrender
+ * @author Waldir
  */
 $messages['qqq'] = array(
        'config-desc' => '{{desc}}',
@@ -602,6 +605,7 @@ Used as error message.',
        'config-page-name' => '{{Identical|Name}}',
        'config-page-options' => '{{Identical|Options}}',
        'config-page-install' => '{{Identical|Install}}',
+       'config-page-releasenotes' => '{{Identical|Release notes}}',
        'config-page-copying' => 'This is a link to the full GPL text',
        'config-restart' => 'Button text to confirm the installation procedure has to be restarted.',
        'config-copyright' => 'This message follows {{msg-mw|config-env-good}}.
@@ -744,6 +748,7 @@ See also:
 * $1 - full URL of index.php
 See also:
 * {{msg-mw|config-upgrade-done}}',
+       'config-regenerate' => 'This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.',
        'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
        'config-db-web-account-same' => 'checkbox label',
        'config-db-web-create' => 'checkbox label',
@@ -1043,12 +1048,10 @@ U gebruik tans $2.',
        'config-sqlite-dir' => 'Gids vir SQLite se data:',
        'config-oracle-def-ts' => 'Standaard tabelruimte:',
        'config-oracle-temp-ts' => 'Tydelike tabelruimte:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'MySQL-instellings',
        'config-header-postgres' => 'PostgreSQL-instellings',
        'config-header-sqlite' => 'SQLite-instellings',
        'config-header-oracle' => 'Oracle-instellings',
-       'config-header-ibm_db2' => 'Instellings vir IBM DB2',
        'config-invalid-db-type' => 'Ongeldige databasistipe',
        'config-missing-db-name' => 'U moet \'n waarde vir "Databasnaam" verskaf',
        'config-sqlite-readonly' => 'Die lêer <code>$1</code> kan nie geskryf word nie.',
@@ -1056,7 +1059,7 @@ U gebruik tans $2.',
        'config-upgrade-done-no-regenerate' => 'Opgradering is voltooi.
 
 U kan nou [$1 u wiki gebruik].',
-       'config-regenerate' => 'Herskep <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Herskep LocalSettings.php →',
        'config-show-table-status' => 'Die uitvoer van <code>SHOW TABLE STATUS</code> het gefaal!',
        'config-db-web-account' => 'Databasisgebruiker vir toegang tot die web',
        'config-mysql-engine' => 'Stoor-enjin:',
@@ -1698,7 +1701,6 @@ ResourceLoader, складнік MediaWiki, будзе абходзіць гэт
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:
 
 $1
@@ -1708,12 +1710,10 @@ $1
        'config-support-postgres' => '* $1 — вядомая сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php як кампіляваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў.',
        'config-support-sqlite' => '* $1 — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)',
        'config-support-oracle' => '* $1 зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])',
-       'config-support-ibm_db2' => '* $1 — база зьвестак маштабу прадпрыемства. ([http://www.php.net/manual/en/ibm-db2.installation.php Як скампіляваць PHP з падтрымкай IBM DB2])',
        'config-header-mysql' => 'Налады MySQL',
        'config-header-postgres' => 'Налады PostgreSQL',
        'config-header-sqlite' => 'Налады SQLite',
        'config-header-oracle' => 'Налады Oracle',
-       'config-header-ibm_db2' => 'Налады IBM DB2',
        'config-invalid-db-type' => 'Няслушны тып базы зьвестак',
        'config-missing-db-name' => 'Вы павінны ўвесьці значэньне парамэтру «Імя базы зьвестак»',
        'config-missing-db-host' => 'Вы павінны ўвесьці значэньне парамэтру «Хост базы зьвестак»',
@@ -1775,7 +1775,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Абнаўленьне скончанае.
 
 Цяпер Вы можаце [$1 пачаць працу з вікі].',
-       'config-regenerate' => 'Рэгенэраваць <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Рэгенэраваць LocalSettings.php →',
        'config-show-table-status' => "Запыт '<code>SHOW TABLE STATUS</code>' не атрымаўся!",
        'config-unknown-collation' => "'''Папярэджаньне:''' база зьвестак выкарыстоўвае нераспазнанае супастаўленьне.",
        'config-db-web-account' => 'Рахунак базы зьвестак для вэб-доступу',
@@ -1805,7 +1805,6 @@ chmod a+w $3</pre>',
 Гэта болей эфэктыўна за рэжым MySQL UTF-8, і дазваляе Вам выкарыстоўваць увесь дыяпазон сымбаляў Unicode.
 
 У '''рэжыме UTF-8''', MySQL ведае, якая табліцы сымбаляў выкарыстоўваецца ў Вашых зьвестках, і можа адпаведна прадстаўляць і канвэртаваць іх, але гэта не дазволіць Вам захоўваць сымбалі па-за межамі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыяпазону].",
-       'config-ibm_db2-low-db-pagesize' => "Вашая база зьвестак DB2 мае таблічную прасторну зь недастатковым памерам старонкі. Памер старонкі мусіць быць ня менш за '''32к'''.",
        'config-site-name' => 'Назва вікі:',
        'config-site-name-help' => 'Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.',
        'config-site-name-blank' => 'Увядзіце назву сайта.',
@@ -2224,7 +2223,6 @@ $1
 Това включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.
 
 Базата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'МедияУики поддържа следните системи за бази от данни:
 
 $1
@@ -2234,12 +2232,10 @@ $1
        'config-support-postgres' => '* $1 е популярна система за бази от данни с отворен изходен код, която е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как се компилира PHP с поддръжка на PostgreSQL]). Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.',
        'config-support-sqlite' => '* $1 е лека система за база от данни, която е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)',
        'config-support-oracle' => '* $1 е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])',
-       'config-support-ibm_db2' => '* $1 е комерсиална фирмена база от данни. ([http://www.php.net/manual/en/ibm-db2.installation.php Как се компилира PHP с поддръжка на IBM DB2])',
        'config-header-mysql' => 'Настройки за MySQL',
        'config-header-postgres' => 'Настройки за PostgreSQL',
        'config-header-sqlite' => 'Настройки за SQLite',
        'config-header-oracle' => 'Настройки за Oracle',
-       'config-header-ibm_db2' => 'Настройки за IBM DB2',
        'config-invalid-db-type' => 'Невалиден тип база от данни',
        'config-missing-db-name' => 'Необходимо е да се въведе стойност за "Име на базата от данни"',
        'config-missing-db-host' => 'Необходимо е да се въведе стойност за "Хост на базата от данни"',
@@ -2301,7 +2297,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Обновяването приключи.
 
 Вече е възможно [$1 да използвате уикито].',
-       'config-regenerate' => 'Създаване на <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Създаване на LocalSettings.php →',
        'config-show-table-status' => 'Заявката <code>SHOW TABLE STATUS</code> не сполучи!',
        'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колация.",
        'config-db-web-account' => 'Сметка за уеб достъп до базата от данни',
@@ -2926,7 +2922,7 @@ Da hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
        'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
 
 Gallout a rit [$1 kregiñ da implijout ho wiki].',
-       'config-regenerate' => 'Adgenel <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Adgenel LocalSettings.php →',
        'config-show-table-status' => "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
        'config-unknown-collation' => "'''Diwallit :''' Emañ an diaz roadennoù o renkañ an traoù diouzh un urzh lizherennek dianav.",
        'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
@@ -3501,7 +3497,6 @@ Zvažte umístění databáze někam zcela jinam, například do <code>/var/lib/
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Věštba',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki podporuje následující databázové systémy:
 
 $1
@@ -3511,12 +3506,10 @@ Pokud v nabídce níže nevidíte databázový systém, který chcete použít,
        'config-support-postgres' => '* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak přeložit PHP s podporou PostgreSQL]). Mohou se vyskytnout ještě nějaké menší chyby, použití v produkčním prostředí se nedoporučuje.',
        'config-support-sqlite' => '* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)',
        'config-support-oracle' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak přeložit PHP s podporou OCI8])',
-       'config-support-ibm_db2' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/ibm-db2.installation.php Jak přeložit PHP s podporou IBM DB2])',
        'config-header-mysql' => 'Nastavení MySQL',
        'config-header-postgres' => 'Nastavení PostgreSQL',
        'config-header-sqlite' => 'Nastavení SQLite',
        'config-header-oracle' => 'Nastavení Oracle',
-       'config-header-ibm_db2' => 'Nastavení IBM DB2',
        'config-invalid-db-type' => 'Chybný typ databáze',
        'config-missing-db-name' => 'Musíte zadat hodnotu pro „Jméno databáze“',
        'config-missing-db-host' => 'Musíte zadat hodnotu pro „Databázový server“',
@@ -3578,7 +3571,7 @@ To se ale '''nedoporučuje''', pokud s wiki nemáte problémy.",
        'config-upgrade-done-no-regenerate' => 'Aktualizace byla dokončena.
 
 Svou wiki teď můžete [$1 začít používat].',
-       'config-regenerate' => 'Přegenerovat <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Přegenerovat LocalSettings.php →',
        'config-show-table-status' => 'Dotaz <code>SHOW TABLE STATUS</code> se nezdařil!',
        'config-unknown-collation' => "'''Upozornění:''' Databáze používá nerozpoznané řazení.",
        'config-db-web-account' => 'Databázový účet pro webový přístup',
@@ -3608,7 +3601,6 @@ Databáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
 To je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.
 
 V '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-       'config-ibm_db2-low-db-pagesize' => "Vaše DB2 databáze má implicitní tabulkový prostor s nedostatečnou velikostí stránky. Velikost stránky musí být minimálně '''32K'''.",
        'config-site-name' => 'Název wiki:',
        'config-site-name-help' => 'Bude se zobrazovat v titulku prohlížeče a na dalších místech.',
        'config-site-name-blank' => 'Zadejte název serveru.',
@@ -3718,6 +3710,8 @@ Tento adresář by ideálně neměl být dostupný z webu.',
        'config-logo-help' => 'Základní vzhled MediaWiki zahrnuje místo pro logo o velikosti 135×160 pixelů nad bočním menu.
 Načtěte obrázek odpovídající velikosti a zadejte sem jeho URL.
 
+Pokud je vaše logo umístěno relativně vůči $wgStylePath nebo $wgScriptPath, můžete zde tyto proměnné použít.
+
 Pokud logo nechcete, ponechte toto pole prázdné.',
        'config-instantcommons' => 'Zapnout Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].
@@ -3868,6 +3862,7 @@ $messages['da'] = array(
 );
 
 /** German (Deutsch)
+ * @author Geitost
  * @author Kghbln
  * @author LWChris
  * @author Metalhead64
@@ -3940,7 +3935,7 @@ Dieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der v
 
 Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
 
-Eine <doclink href=Copying>Kopie der ''GNU General Public License''</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+Eine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
        'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]
 * [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]
@@ -4003,7 +3998,7 @@ Der Installationsvorgang könnte daher scheitern!",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
        'config-apc' => '[http://www.php.net/apc APC] ist installiert',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
-       'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
+       'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.
 Das Objektcaching kann daher nicht aktiviert werden.",
        'config-mod-security' => "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.
 Für weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
@@ -4092,12 +4087,12 @@ Nur Änderungen daran vornehmen, sofern es gute Gründe dafür gibt.',
 
 Das für sie vorgesehene Verzeichnis muss während des Installationsvorgangs beschreibbar sein.
 
-Es sollte '''nicht'' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
+Es sollte '''nicht''' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
 
 Das Installationsprogramm wird mit der Datei zusammen eine zusätzliche <code>.htaccess</code>-Datei erstellen. Sofern dies scheitert, können Dritte auf die Datendatei zugreifen.
 Dies umfasst die Nutzerdaten (E-Mail-Adressen, Passwörter, etc.) wie auch gelöschte Seitenversionen und andere vertrauliche Daten, die im Wiki gespeichert sind.
 
-Es ist daher zu erwägen die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
+Es ist daher zu erwägen, die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Standardtabellenraum:',
        'config-oracle-temp-ts' => 'Temporärer Tabellenraum:',
        'config-type-mysql' => 'MySQL',
@@ -4179,7 +4174,7 @@ Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki au
        'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
 
 Das Wiki kann nun [$1 genutzt werden].',
-       'config-regenerate' => '<code>LocalSettings.php</code> neu erstellen →',
+       'config-regenerate' => 'LocalSettings.php neu erstellen →',
        'config-show-table-status' => 'Die Abfrage <code>SHOW TABLE STATUS</code> ist gescheitert!',
        'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
        'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
@@ -4296,11 +4291,11 @@ Für den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hi
        'config-email-auth' => 'E-Mail-Authentifizierung ermöglichen',
        'config-email-auth-help' => "Sofern diese Funktion aktiviert ist, müssen Benutzer ihre E-Mail-Adresse bestätigen, indem sie den Bestätigungslink nutzen, der ihnen immer dann zugesandt wird, wenn sie ihre E-Mail-Adresse angeben oder ändern.
 Nur bestätigte E-Mail-Adressen können Nachrichten von anderen Benutzer oder Benachrichtigungsmitteilungen erhalten.
-Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mailfunktionen, '''empfohlen'''.",
+Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mail-Funktionen, '''empfohlen.'''",
        'config-email-sender' => 'E-Mail-Adresse für Antworten:',
        'config-email-sender-help' => 'Bitte hier die E-Mail-Adresse angeben, die als Absenderadresse bei ausgehenden E-Mails eingesetzt werden soll.
 Rücklaufende E-Mails werden an diese E-Mail-Adresse gesandt.
-Bei viele E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
+Bei vielen E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
        'config-upload-settings' => 'Hochladen von Bildern und Dateien',
        'config-upload-enable' => 'Das Hochladen von Dateien ermöglichen',
        'config-upload-help' => 'Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.
@@ -4312,9 +4307,11 @@ Hernach kann diese Option aktiviert werden.',
        'config-upload-deleted-help' => 'Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.
 Idealerweise sollte es nicht über das Internet zugänglich sein.',
        'config-logo' => 'URL des Logos:',
-       'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für eine Logo mit den Maßen 135x160 Pixel.
+       'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für ein Logo mit den Maßen 135x160 Pixel.
 Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.
 
+Du kannst $wgStylePath oder $wgScriptPath verwenden, falls dein Logo relativ zu diesen Pfaden ist.
+
 Sofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.',
        'config-instantcommons' => '„InstantCommons“ aktivieren',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.
@@ -4638,6 +4635,7 @@ $messages['eo'] = array(
 
 /** Spanish (español)
  * @author Armando-Martin
+ * @author Ciencia Al Poder
  * @author Crazymadlover
  * @author Danke7
  * @author Locos epraix
@@ -4874,7 +4872,6 @@ Considere la posibilidad de poner la base de datos en algún otro sitio, por eje
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki es compatible con los siguientes sistemas de bases de datos:
 
 $1
@@ -4884,12 +4881,10 @@ Si no encuentras en el listado el sistema de base de datos que estás intentando
        'config-support-postgres' => '$1 es un popular sistema de base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.',
        'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki ([http://www.php.net/manual/es/pdo.installation.php cómo compilar PHP con compatibilidad SQLite usando PDO]).',
        'config-support-oracle' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])',
-       'config-support-ibm_db2' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/ibm-db2.installation.php cómo compilar PHP con compatibilidad con ibm_db2]).', # Fuzzy
        'config-header-mysql' => 'Configuración de MySQL',
        'config-header-postgres' => 'Configuración de PostgreSQL',
        'config-header-sqlite' => 'Configuración de SQLite',
        'config-header-oracle' => 'Configuración de Oracle',
-       'config-header-ibm_db2' => 'Configuración de IBM DB2',
        'config-invalid-db-type' => 'Tipo de base de datos inválida',
        'config-missing-db-name' => 'Debes introducir un valor para "Nombre de la base de datos"',
        'config-missing-db-host' => 'Debe introducir un valor para "Servidor (host) de base de datos"',
@@ -4950,7 +4945,7 @@ Esto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualización completa.
 
 Usted puede ahora [$1  empezar a usar su wiki].',
-       'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> ha fallado!',
        'config-unknown-collation' => "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
        'config-db-web-account' => 'Cuenta de base de datos para acceso Web',
@@ -4980,7 +4975,6 @@ Las bases de datos MyISAM tienden a corromperse más a menudo que las bases de d
 Esto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.
 
 En '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-       'config-ibm_db2-low-db-pagesize' => "Su base de datos DB2 tiene un espacio de tablas por defecto con un tamaño de página insuficiente. El tamaño de página tiene que ser '''32 K''' o superior.",
        'config-site-name' => 'Nombre del wiki:',
        'config-site-name-help' => 'Esto aparecerá en la barra de título del navegador y en varios otros lugares.',
        'config-site-name-blank' => 'Ingresar un nombre de sitio.',
@@ -5083,14 +5077,14 @@ Para obtener más información, lea la [//www.mediawiki.org/wiki/Manual:Security
 
 Para habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.
 A continuación, habilite esta opción.',
-       'config-upload-deleted' => '*Directório para los archivos eliminados:',
+       'config-upload-deleted' => '*Directorio para los archivos eliminados:',
        'config-upload-deleted-help' => 'Elige un directorio en el que guardar los archivos eliminados.
 Lo ideal es una carpeta no accesible desde la red.',
        'config-logo' => 'URL del logo :',
        'config-logo-help' => 'La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.
 Cargue una imagen de tamaño adecuado e introduzca la dirección URL aquí.
 
-Si no desea un logotipo, deje esta casilla en blanco.',
+Si no desea un logotipo, deje esta casilla en blanco.', # Fuzzy
        'config-instantcommons' => 'Habilitar Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].
 Para ello, MediaWiki requiere acceso a Internet.
@@ -5568,13 +5562,10 @@ Asennus saattaa epäonnistua!",
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.', # Fuzzy
        'config-header-mysql' => 'MySQL-asetukset',
        'config-header-postgres' => 'PostgreSQL-asetukset',
        'config-header-sqlite' => 'SQLite-asetukset',
        'config-header-oracle' => 'Oracle-asetukset',
-       'config-header-ibm_db2' => 'IBM DB2 -asetukset',
        'config-invalid-db-type' => 'Virheellinen tietokantatyyppi',
        'config-missing-db-name' => 'Kenttä »Tietokannan nimi» on pakollinen',
        'config-invalid-db-name' => '”$1” ei kelpaa tietokannan nimeksi.
@@ -5598,7 +5589,7 @@ Tämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
        'config-upgrade-done-no-regenerate' => 'Päivitys valmis.
 
 Voit [$1 aloittaa wikin käytön].',
-       'config-regenerate' => 'Luo <code>LocalSettings.php</code> uudelleen →',
+       'config-regenerate' => 'Luo LocalSettings.php uudelleen →',
        'config-show-table-status' => 'Kysely <code>SHOW TABLE STATUS</code> epäonnistui!',
        'config-mysql-engine' => 'Tallennusmoottori',
        'config-mysql-innodb' => 'InnoDB',
@@ -5903,7 +5894,6 @@ Envisagez de placer la base de données ailleurs, par exemple dans <code>/var/li
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => "MediaWiki supporte ces systèmes de bases de données :
 
 $1
@@ -5913,12 +5903,10 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
        'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
        'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
        'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
-       'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale. ([http://www.php.net/manual/en/ibm-db2.installation.php Comment compiler PHP avec le support de DB2 d’IBM])",
        'config-header-mysql' => 'Paramètres de MySQL',
        'config-header-postgres' => 'Paramètres de PostgreSQL',
        'config-header-sqlite' => 'Paramètres de SQLite',
        'config-header-oracle' => 'Paramètres d’Oracle',
-       'config-header-ibm_db2' => 'paramètres de IBM DB2',
        'config-invalid-db-type' => 'Type de base de données non valide',
        'config-missing-db-name' => 'Vous devez saisir une valeur pour « Nom de la base de données »',
        'config-missing-db-host' => "Vous devez entrer une valeur pour « l'hôte de la base de données »",
@@ -5980,7 +5968,7 @@ Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre
        'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
 
 Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
-       'config-regenerate' => 'Regénérer <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regénérer LocalSettings.php →',
        'config-show-table-status' => 'Échec de la requête <code>SHOW TABLE STATUS</code> !',
        'config-unknown-collation' => "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
        'config-db-web-account' => "Compte de la base de données pour l'accès Web",
@@ -6007,7 +5995,6 @@ Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vo
 
 En ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
 En ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
-       'config-ibm_db2-low-db-pagesize' => "Votre base de données DB2 a un espace de stockage par défaut avec un pagesize insuffisant. Le pagesize doit être au minimum '''32K'''.",
        'config-site-name' => 'Nom du wiki :',
        'config-site-name-help' => 'Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.',
        'config-site-name-blank' => 'Entrez un nom de site.',
@@ -6112,10 +6099,12 @@ Ensuite, activez cette option.",
        'config-upload-deleted-help' => 'Choisissez un répertoire qui servira à archiver les fichiers supprimés.
 Idéalement, il ne devrait pas être accessible depuis le web.',
        'config-logo' => 'URL du logo :',
-       'config-logo-help' => "L'habillage (''skin'') par défaut de MediaWiki comprend l'espace pour un logo de 135x160 pixels dans le coin supérieur gauche.
-Téléchargez une image de la taille appropriée, et entrez l'URL ici.
+       'config-logo-help' => 'L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.
+Téléchargez une image de la taille appropriée, et entrez son URL ici.
+
+Vous pouvez utiliser $wgStylePath ou $wgScriptPath si votre logo est relatif à ces chemins.
 
-Si vous ne voulez pas d'un logo, laissez cette case vide.",
+Si vous ne voulez pas de logo, laissez cette case vide.',
        'config-instantcommons' => "Activer ''InstantCommons''",
        'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [//commons.wikimedia.org/ Wikimedia Commons].
 Pour se faire, il faut que MediaWiki accède à Internet.
@@ -6286,18 +6275,16 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
        'config-sqlite-dir' => 'Dossiér de les balyês SQLite :',
        'config-oracle-def-ts' => "Èspâço de stocâjo (''tablespace'') per dèfôt :",
        'config-oracle-temp-ts' => "Èspâço de stocâjo (''tablespace'') temporèro :",
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Paramètres de MySQL',
        'config-header-postgres' => 'Paramètres de PostgreSQL',
        'config-header-sqlite' => 'Paramètres de SQLite',
        'config-header-oracle' => 'Paramètres d’Oracle',
-       'config-header-ibm_db2' => 'Paramètres d’IBM DB2',
        'config-invalid-db-type' => 'Tipo de bâsa de balyês envalido',
        'config-missing-db-name' => 'Vos dête buchiér una valor por « Nom de la bâsa de balyês »',
        'config-missing-db-host' => 'Vos dête buchiér una valor por « Hôto de la bâsa de balyês »',
        'config-missing-db-server-oracle' => 'Vos dête buchiér una valor por « TNS de la bâsa de balyês »',
        'config-sqlite-readonly' => 'Lo fichiér <code>$1</code> est pas accèssiblo en ècritura.',
-       'config-regenerate' => 'Refâre <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Refâre LocalSettings.php →',
        'config-show-table-status' => 'Falyita de la requéta <code>SHOW TABLE STATUS</code> !',
        'config-db-web-account' => 'Compto de la bâsa de balyês por l’accès vouèbe',
        'config-db-web-account-same' => 'Utilisâd lo mémo compto que por l’enstalacion',
@@ -6389,18 +6376,18 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
 );
 
 /** Northern Frisian (Nordfriisk)
+ * @author Murma174
  * @author Pyt
  */
 $messages['frr'] = array(
        'mainpagetext' => "'''MediaWiki wörd ma erfolch instaliird.'''",
-       'mainpagedocfooter' => 'Heelp tu jü benjüting än konfigurasjoon foon e Wiki-software fanst dü önj dåt [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
-
-
-== Startheelpe ==
+       'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+== Getting started ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]",
 );
 
 /** Friulian (furlan)
@@ -6720,7 +6707,6 @@ Considere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/me
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki soporta os seguintes sistemas de bases de datos:
 
 $1
@@ -6730,12 +6716,10 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
        'config-support-postgres' => '* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción.',
        'config-support-sqlite' => '* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)',
        'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con soporte OCI8])',
-       'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial. ([http://www.php.net/manual/en/ibm-db2.installation.php Como compilar o PHP con soporte IBM DB2])',
        'config-header-mysql' => 'Configuración do MySQL',
        'config-header-postgres' => 'Configuración do PostgreSQL',
        'config-header-sqlite' => 'Configuración do SQLite',
        'config-header-oracle' => 'Configuración do Oracle',
-       'config-header-ibm_db2' => 'Configuración de IBM DB2',
        'config-invalid-db-type' => 'Tipo de base de datos incorrecto',
        'config-missing-db-name' => 'Debe escribir un valor "Nome da base de datos"',
        'config-missing-db-host' => 'Debe escribir un valor "Servidor da base de datos"',
@@ -6797,7 +6781,7 @@ Isto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualización completada.
 
 Xa pode [$1 comezar a usar o seu wiki].',
-       'config-regenerate' => 'Rexenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Rexenerar LocalSettings.php →',
        'config-show-table-status' => 'A pescuda <code>SHOW TABLE STATUS</code> fallou!',
        'config-unknown-collation' => "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
        'config-db-web-account' => 'Conta na base de datos para o acceso á internet',
@@ -6828,7 +6812,6 @@ Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango complet
 
 No '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,
 pero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
-       'config-ibm_db2-low-db-pagesize' => "A súa base de datos DB2 ten un espazo de táboa cun tamaño de páxina insuficiente. O tamaño de páxina debe ser '''32k''' ou maior.",
        'config-site-name' => 'Nome do wiki:',
        'config-site-name-help' => 'Isto aparecerá na barra de títulos do navegador e noutros lugares.',
        'config-site-name-blank' => 'Escriba o nome do sitio.',
@@ -6937,6 +6920,8 @@ O ideal é que non sexa accesible desde a web.',
        'config-logo-help' => 'A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles por riba do menú lateral.
 Cargue unha imaxe do tamaño axeitado e introduza o enderezo URL aquí.
 
+Pode utilizar $wgStylePath ou $wgScriptPath se o seu logo está relacionado con esas rutas.
+
 Se non quere un logo, deixe esta caixa en branco.',
        'config-instantcommons' => 'Activar Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].
@@ -7438,7 +7423,6 @@ $1
 כדאי לשקול לשים את מסד הנתונים במקום אחר לגמרי, למשל ב־<code dir="ltr">/var/lib/mediawiki/yourwik</code>.',
        'config-oracle-def-ts' => 'מרחב טבלאות לפי בררת מחדל (default tablespace):',
        'config-oracle-temp-ts' => 'מרחב טבלאות זמני (temporary tablespace):',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:
 
 $1
@@ -7448,12 +7432,10 @@ $1
        'config-support-postgres' => '$1 הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות.',
        'config-support-sqlite' => '* $1 הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)',
        'config-support-oracle' => '* $1 הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2' => '* $1 הוא מסד נתונים מסחרי ארגוני. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql' => 'הגדרות MySQL',
        'config-header-postgres' => 'הגדרות PostgreSQL',
        'config-header-sqlite' => 'הגדרות SQLite',
        'config-header-oracle' => 'הגדרות Oracle',
-       'config-header-ibm_db2' => 'תצורת IBM DB2',
        'config-invalid-db-type' => 'סוג מסד הנתונים שגוי',
        'config-missing-db-name' => 'עליך להזין ערך עבור "שם מסד הנתונים"',
        'config-missing-db-host' => 'יש להכניס ערך לשדה "שרת מסד הנתונים"',
@@ -7515,7 +7497,7 @@ chmod a+w $3</pre></div>',
        'config-upgrade-done-no-regenerate' => 'השדרוג הושלם.
 
 עכשיו אפשר [$1 להתחיל להשתמש בוויקי שלכם].',
-       'config-regenerate' => 'לחולל מחדש את <code>LocalSettings.php</code> ←',
+       'config-regenerate' => 'לחולל מחדש את LocalSettings.php ←',
        'config-show-table-status' => 'שאילתת <code>SHOW TABLE STATUS</code> נכשלה!',
        'config-unknown-collation' => "'''אזהרה:''' מסד הנתונים משתמש בשיטת מיון שאינה מוּכּרת.",
        'config-db-web-account' => 'חשבון במסד הנתונים לגישה מהרשת',
@@ -7545,7 +7527,6 @@ chmod a+w $3</pre></div>',
 זה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.
 
 ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
-       'config-ibm_db2-low-db-pagesize' => "במסד הנתונים DB2 שלכם יש מרחב טבלאות לפי מחדלי עם גודל דף בלתי־מספיק. גודל הדף צריך להיות '''32K''' או יותר.",
        'config-site-name' => 'שם הוויקי:',
        'config-site-name-help' => 'זה יופיע בשורת הכותרת של הדפדפן ובמקומות רבים אחרים.',
        'config-site-name-blank' => 'נא להזין שם לאתר.',
@@ -7992,7 +7973,7 @@ Zo by je na MediaWiki $1 aktualizował, klikń na '''Dale'''.",
        'config-upgrade-done-no-regenerate' => 'Aktualizacija dokónčena.
 
 Móžeš nětko [$1 swój wiki wužiwać].',
-       'config-regenerate' => '<code>LocalSettings.php</code> znowa wutworić →',
+       'config-regenerate' => 'LocalSettings.php znowa wutworić →',
        'config-show-table-status' => 'Naprašowanje <code>SHOW TABLE STATUS</code> je so njeporadźiło!',
        'config-unknown-collation' => "'''Warnowanje:''' Datowa banka njeznatu kolaciju wužiwa.",
        'config-db-web-account' => 'Konto datoweje banki za webpřistup',
@@ -8379,7 +8360,6 @@ A telepítő készít egy <code>.htaccess</code> fájlt az adatbázis mellé, az
 Fontold meg az adatbázis más helyre történő elhelyezését, például a <code>/var/lib/mediawiki/tewikid</code> könyvtárba.",
        'config-oracle-def-ts' => 'Alapértelmezett táblatér:',
        'config-oracle-temp-ts' => 'Ideiglenes táblatér:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'A MediaWiki a következő adatbázisrendszereket támogatja:
 
 $1
@@ -8389,12 +8369,10 @@ Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél
        'config-support-postgres' => '* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.',
        'config-support-sqlite' => '* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)',
        'config-support-oracle' => '* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])',
-       'config-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.', # Fuzzy
        'config-header-mysql' => 'MySQL-beállítások',
        'config-header-postgres' => 'PostgreSQL-beállítások',
        'config-header-sqlite' => 'SQLite-beállítások',
        'config-header-oracle' => 'Oracle-beállítások',
-       'config-header-ibm_db2' => 'IBM DB2-beállítások',
        'config-invalid-db-type' => 'Érvénytelen adatbázistípus',
        'config-missing-db-name' => 'Meg kell adnod az „Adatbázisnév” értékét',
        'config-missing-db-host' => 'Meg kell adnod az „Adatbázis hosztneve” értékét',
@@ -8456,7 +8434,7 @@ Ez '''nem ajánlott''', csak akkor, ha problémák vannak a wikivel.",
        'config-upgrade-done-no-regenerate' => "A frissítés befejeződött.
 
 Most már '''[$1 beléphetsz a wikibe]'''.",
-       'config-regenerate' => '<code>LocalSettings.php</code> elkészítése újra →',
+       'config-regenerate' => 'LocalSettings.php elkészítése újra →',
        'config-show-table-status' => 'A <code>SHOW TABLE STATUS</code> lekérdezés nem sikerült!',
        'config-unknown-collation' => "'''Figyelmeztetés:''' az adatbázis ismeretlen egybevetést használ.",
        'config-db-web-account' => 'A webes hozzáférésnél használt adatbázisfiók',
@@ -8485,7 +8463,6 @@ A '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható k
 Ez sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.
 
 '''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
-       'config-ibm_db2-low-db-pagesize' => "A DB2 adatbázisodnak alapértelmezett táblatere van elégtelen lapmérettel. A lapméretnek legalább '''32K'''-nak kell lennie.",
        'config-site-name' => 'A wiki neve:',
        'config-site-name-help' => 'A böngésző címsorában és még számos más helyen jelenik meg.',
        'config-site-name-blank' => 'Add meg az oldal nevét.',
@@ -9010,7 +8987,6 @@ Considera poner le base de datos in un loco completemente differente, per exempl
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki supporta le sequente systemas de base de datos:
 
 $1
@@ -9020,12 +8996,10 @@ Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora se
        'config-support-postgres' => '* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.',
        'config-support-sqlite' => '* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)',
        'config-support-oracle' => '* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])',
-       'config-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.', # Fuzzy
        'config-header-mysql' => 'Configuration de MySQL',
        'config-header-postgres' => 'Configuration de PostgreSQL',
        'config-header-sqlite' => 'Configuration de SQLite',
        'config-header-oracle' => 'Configuration de Oracle',
-       'config-header-ibm_db2' => 'Configurationes pro IBM DB2',
        'config-invalid-db-type' => 'Typo de base de datos invalide',
        'config-missing-db-name' => 'Tu debe entrar un valor pro "Nomine de base de datos"',
        'config-missing-db-host' => 'Tu debe entrar un valor pro "Host del base de datos"',
@@ -9087,7 +9061,7 @@ Isto '''non es recommendate''' si tu non ha problemas con tu wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualisation complete.
 
 Tu pote ora [$1 comenciar a usar tu wiki].',
-       'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar LocalSettings.php →',
        'config-show-table-status' => 'Le consulta <code>SHOW TABLE STATUS</code> falleva!',
        'config-unknown-collation' => "'''Aviso:''' Le base de datos usa un collation non recognoscite.",
        'config-db-web-account' => 'Conto de base de datos pro accesso via web',
@@ -9117,7 +9091,6 @@ Le bases de datos MyISAM tende a esser corrumpite plus frequentemente que le bas
 Isto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.
 
 In '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
-       'config-ibm_db2-low-db-pagesize' => 'Tu base de datos DB2 ha un "tablespace" (spatio de tabella) predefinite con un "pagesize" (dimension de pagina) insufficiente. Le "pagesize" debe esser \'\'\'32K\'\'\' o plus.',
        'config-site-name' => 'Nomine del wiki:',
        'config-site-name-help' => 'Isto apparera in le barra de titulo del navigator e in varie altere locos.',
        'config-site-name-blank' => 'Entra un nomine de sito.',
@@ -9625,7 +9598,7 @@ Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan w
        'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
 
 Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
-       'config-regenerate' => 'Regenerasi <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerasi LocalSettings.php →',
        'config-show-table-status' => 'Kueri <code>SHOW TABLE STATUS</code> gagal!',
        'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
        'config-db-web-account' => 'Akun basis data untuk akses web',
@@ -10439,7 +10412,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'アップグレードが完了しました。
 
 [$1 ウィキの使用を開始]することができます。',
-       'config-regenerate' => '<code>LocalSettings.php</code> を再生成→',
+       'config-regenerate' => 'LocalSettings.php を再生成→',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> クエリが失敗しました!',
        'config-unknown-collation' => "'''警告:''' データベースは認識されない照合を使用しています。",
        'config-db-web-account' => 'ウェブアクセスのためのデータベースアカウント',
@@ -10564,10 +10537,12 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
        'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
        'config-logo' => 'ロゴ のURL:',
-       'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
-適切なサイズの画像をアップロードして、そのURLをここに入力してください。
+       'config-logo-help' => 'MediaWiki の既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
+適切なサイズの画像をアップロードして、その URL をここに入力してください。
+
+ロゴが相対パスの場合は、$wgStylePath や $wgScriptPath を使用できます。
 
-ロゴが不要の場合は、このボックスを空白のままにしてください。',
+ロゴが不要の場合は、このを空白のままにしてください。',
        'config-instantcommons' => 'Instant Commons 機能を有効にする',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。
 これを使用するには、MediaWiki がインターネットに接続できる必要があります。
@@ -11142,7 +11117,6 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
        'config-oracle-def-ts' => '기본 테이블공간:',
        'config-oracle-temp-ts' => '임시 테이블공간:',
        'config-type-oracle' => '오라클',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => '미디어위키는 다음의 데이터베이스 시스템을 지원합니다:
 
 $1
        'config-support-postgres' => '* $1은 MySQL의 대안으로 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇가지 사소한 해결하지 못한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.',
        'config-support-sqlite' => '* $1는 매우 잘 지원하는 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)',
        'config-support-oracle' => '* $1은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])',
-       'config-support-ibm_db2' => '* $1는 상용 엔터프라이즈 데이터베이스입니다.([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2를 지원하여 PHP를 컴파일하는 방법])',
        'config-header-mysql' => 'MySQL 설정',
        'config-header-postgres' => 'PostgreSQL 설정',
        'config-header-sqlite' => 'SQLite 설정',
        'config-header-oracle' => '오라클 설정',
-       'config-header-ibm_db2' => 'IBM DB2 설정',
        'config-invalid-db-type' => '잘못된 데이터베이스 종류',
        'config-missing-db-name' => '"데이터베이스 이름"에 대한 값을 입력해야 합니다',
        'config-missing-db-host' => '"데이터베이스 호스트"에 대한 값을 입력해야 합니다',
@@ -11219,7 +11191,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '업그레이드가 완료되었습니다.
 
 이제 [$1 위키를 시작]할 수 있습니다.',
-       'config-regenerate' => '<code>LocalSettings.php</code> 다시 만들기 →',
+       'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!',
        'config-unknown-collation' => "'''경고:''' 데이터베이스가 인식하지 않는 정렬을 사용하고 있습니다.",
        'config-db-web-account' => '웹 접근을 위한 데이터베이스 계정',
@@ -11249,7 +11221,6 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
 '''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만
 [//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖의 문자를 저장할 수 없습니다.",
-       'config-ibm_db2-low-db-pagesize' => "DB2 데이터베이스에 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
        'config-site-name' => '위키 이름:',
        'config-site-name-help' => '브라우저 제목 표시줄과 다른 여러 곳에 나타납니다.',
        'config-site-name-blank' => '사이트 이름을 입력하세요.',
@@ -11356,8 +11327,10 @@ GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다
        'config-upload-deleted-help' => '삭제된 파일을 보관할 디렉토리를 선택하세요.
 이상적으로 웹에서 접근할 수 없게 해야 합니다.',
        'config-logo' => '로고 URL:',
-       'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고를 포함하고 있습니다.
-적당한 크기로 이미지를 올리고 URL을 여기에 입력하세요.
+       'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.
+적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.
+
+로고가 상대적인 경로에 있으면 $wgStylePath나 $wgScriptPath를 사용할 수 있습니다.
 
 로고 사용을 원하지 않으면 이 상자를 비우세요.',
        'config-instantcommons' => '인스턴트 공용 활성화',
@@ -12179,13 +12152,10 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken', # Fuzzy
        'config-header-mysql' => 'MySQL-Astellungen',
        'config-header-postgres' => 'PostgreSQL-Astellungen',
        'config-header-sqlite' => 'SQLite-Astellungen',
        'config-header-oracle' => 'Oracle-Astellungen',
-       'config-header-ibm_db2' => 'IBM DB2-Astellungen',
        'config-invalid-db-type' => 'Net valabelen Datebank-Typ',
        'config-missing-db-name' => 'Dir musst en Numm fir de Wäert "Numm vun der Datebank" uginn',
        'config-missing-db-host' => 'Dir musst e Wäert fir "Database host" uginn',
@@ -12200,7 +12170,7 @@ E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
        'config-upgrade-done-no-regenerate' => "D'Aktualisatioun ass ofgeschloss.
 
 Dir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
-       'config-regenerate' => '<code>LocalSettings.php</code> regeneréieren →',
+       'config-regenerate' => 'LocalSettings.php regeneréieren →',
        'config-db-web-account' => 'Datebankkont fir den Accès iwwer de Web',
        'config-db-web-account-same' => 'Dee selwechte Kont wéi bei der Installatioun benotzen',
        'config-db-web-create' => 'De Kont uleeë wann et e net scho gëtt',
@@ -12238,7 +12208,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-optional-continue' => 'Stellt mir méi Froen.',
        'config-optional-skip' => "Ech hunn es genuch, installéier just d'Wiki.",
        'config-profile' => 'Profil vun de Benotzerrechter:',
-       'config-profile-wiki' => 'Traditionell Wiki', # Fuzzy
+       'config-profile-wiki' => 'Oppe Wiki',
        'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
        'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
        'config-profile-private' => 'Privat Wiki',
@@ -12790,7 +12760,6 @@ $1
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'МедијаВики ги поддржува следниве системи на бази на податоци:
 
 $1
        'config-support-postgres' => '* $1 е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина.',
        'config-support-sqlite' => '* $1 е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)',
        'config-support-oracle' => '* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])',
-       'config-support-ibm_db2' => '* $1 е комерцијална база на податоциза фирми. ([http://www.php.net/manual/en/ibm-db2.installation.php Како да составите PHP со поддршка за IBM DB2])',
        'config-header-mysql' => 'Нагодувања на MySQL',
        'config-header-postgres' => 'Нагодувања на PostgreSQL',
        'config-header-sqlite' => 'Нагодувања на SQLite',
        'config-header-oracle' => 'Нагодувања на Oracle',
-       'config-header-ibm_db2' => 'Нагодувања на IBM DB2',
        'config-invalid-db-type' => 'Неважечки тип на база',
        'config-missing-db-name' => 'Мора да внесете значење за параметарот „Име на базата“',
        'config-missing-db-host' => 'Мора да внесете вредност за „Домаќин на базата на податоци“',
@@ -12867,7 +12834,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Надградбата заврши.
 
 Сега можете да [$1 почнете да го користите викито].',
-       'config-regenerate' => 'Пресоздај <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Пресоздај LocalSettings.php →',
        'config-show-table-status' => 'Барањето <code>SHOW TABLE STATUS</code> не успеа!',
        'config-unknown-collation' => "'''Предупредување:''' Базата корисни непрепознаена упатна споредба.",
        'config-db-web-account' => 'Сметка на базата за мрежен пристап',
@@ -12897,7 +12864,6 @@ chmod a+w $3</pre>',
 Ова е поефикасно отколку  TF-8 режимот на MySQL, и ви овозможува да ја користите целата палета на уникодни знаци.
 
 Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може соодветно да ги претстави и претвори, но нема да ви дозволи да складиратезнаци над [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основната повеќејазична рамнина].",
-       'config-ibm_db2-low-db-pagesize' => "Вашата база на податоци DB2 има основно-зададен табеларен простор со недоволна големина на страниците. Таа треба да изнесува барем '''32 килобајти'''.",
        'config-site-name' => 'Име на викито:',
        'config-site-name-help' => 'Ова ќе се појавува во заглавната лента на прелистувачот и на разни други места.',
        'config-site-name-blank' => 'Внесете име на мрежното место.',
@@ -13004,8 +12970,9 @@ chmod a+w $3</pre>',
        'config-upload-deleted-help' => 'Одберете во која папка да се архивираат избришаните податотеки.
 Најдобро би било ако таа не е достапна преку интернет.',
        'config-logo' => 'URL за логото:',
-       'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135 x 160 пиксели над страничната лента.
-Подигнете слика со соодветна големина, и тука внесете ја URL-адресата.
+       'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничната лента.
+
+Можете да употребите $wgStylePath или $wgScriptPath ако вашето лого е релативно на тие патеки.
 
 Ако не сакате да имате лого, тогаш оставете го ова поле празно.',
        'config-instantcommons' => 'Овозможи Instant Commons',
@@ -13177,7 +13144,7 @@ $1
        'config-connection-error' => '$1.
 
 താഴെ നൽകിയിരിക്കുന്ന ഹോസ്റ്റ്, ഉപയോക്തൃനാമം, രഹസ്യവാക്ക് എന്നിവ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.',
-       'config-regenerate' => '<code>LocalSettings.php</code> പുനഃസൃഷ്ടിക്കുക →',
+       'config-regenerate' => 'LocalSettings.php പുനഃസൃഷ്ടിക്കുക →',
        'config-mysql-engine' => 'സ്റ്റോറേജ് എൻജിൻ:',
        'config-site-name' => 'വിക്കിയുടെ പേര്:',
        'config-site-name-help' => 'ഇത് ബ്രൗസറിന്റെ ടൈറ്റിൽ ബാറിലും മറ്റനേകം ഇടങ്ങളിലും പ്രദർശിപ്പിക്കപ്പെടും.',
@@ -13532,7 +13499,7 @@ $messages['nan'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Nghtwlkr
  * @author 아라
@@ -13763,7 +13730,6 @@ Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/m
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki støtter følgende databasesystem:
 
 $1
@@ -13773,12 +13739,10 @@ Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg i
        'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.',
        'config-support-sqlite' => '* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)',
        'config-support-oracle' => '* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])',
-       'config-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.', # Fuzzy
        'config-header-mysql' => 'MySQL-innstillinger',
        'config-header-postgres' => 'PostgreSQL-innstillinger',
        'config-header-sqlite' => 'SQLite-innstillinger',
        'config-header-oracle' => 'Oracle-innstillinger',
-       'config-header-ibm_db2' => 'IBM DB2-innstillinger',
        'config-invalid-db-type' => 'Ugyldig databasetype',
        'config-missing-db-name' => 'Du må skrive inn en verdi for «Databasenavn»',
        'config-missing-db-host' => 'Du må skrive inn en verdi for «Databasevert»',
@@ -13840,7 +13804,7 @@ Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
        'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
 
 Du kan nå [$1 begynne å bruke wikien din].',
-       'config-regenerate' => 'Regenerer <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerer LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> etterspørselen mislyktes!',
        'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
        'config-db-web-account' => 'Databasekonto for nettilgang',
@@ -13864,7 +13828,6 @@ Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spek
 
 I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
 men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
-       'config-ibm_db2-low-db-pagesize' => "DB2-databasen din har et standard tabellområde med en utilstrekkelig pagesize. Pagesize må være '''32K''' eller større.",
        'config-site-name' => 'Navn på wiki:',
        'config-site-name-help' => 'Dette vil vises i tittellinjen i nettleseren og diverse andre steder.',
        'config-site-name-blank' => 'Skriv inn et nettstedsnavn.',
@@ -13995,11 +13958,17 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
 );
 
 /** Low German (Plattdüütsch)
+ * @author Joachim Mos
  */
 $messages['nds'] = array(
+       'config-page-name' => 'Naam',
+       'config-ns-generic' => 'Projekt',
+       'config-admin-name' => 'Dien Naam:',
+       'config-admin-password' => 'Passwoord:',
+       'config-help' => 'Hülp',
        'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
        'mainpagedocfooter' => 'Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
-un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
+un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.', # Fuzzy
 );
 
 /** Nedersaksisch (Nedersaksisch)
@@ -14268,7 +14237,6 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
 
 $1
@@ -14278,16 +14246,14 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
        'config-support-postgres' => '* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.',
        'config-support-sqlite' => '* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)',
        'config-support-oracle' => '* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).',
-       'config-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase. ([http://www.php.net/manual/en/ibm-db2.installation.php Hoe PHP compolieren met ondersteuning voor IBM DB2])',
        'config-header-mysql' => 'MySQL-instellingen',
        'config-header-postgres' => 'PostgreSQL-instellingen',
        'config-header-sqlite' => 'SQLite-instellingen',
        'config-header-oracle' => 'Oracle-instellingen',
-       'config-header-ibm_db2' => 'Instellingen voor IBM DB2',
        'config-invalid-db-type' => 'Ongeldig databasetype',
-       'config-missing-db-name' => 'U moet een waarde ingeven voor "Databasenaam"',
+       'config-missing-db-name' => 'U moet een waarde opgeven voor "Databasenaam"',
        'config-missing-db-host' => 'U moet een waarde invoeren voor "Databaseserver"',
-       'config-missing-db-server-oracle' => 'U moet een waarde voor "Database-TNS" ingeven',
+       'config-missing-db-server-oracle' => 'U moet een waarde opgeven voor "Database-TNS"',
        'config-invalid-db-server-oracle' => 'Ongeldige database-TMS "$1".
 Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
        'config-invalid-db-name' => 'Ongeldige databasenaam "$1".
@@ -14347,7 +14313,7 @@ Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
        'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
 
 U kunt nu [$1 uw wiki gebruiken].',
-       'config-regenerate' => '<code>LocalSettings.php</code> opnieuw aanmaken →',
+       'config-regenerate' => 'LocalSettings.php opnieuw aanmaken →',
        'config-show-table-status' => 'Het uitvoeren van <code>SHOW TABLE STATUS</code> is mislukt!',
        'config-unknown-collation' => "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
        'config-db-web-account' => 'Databasegebruiker voor webtoegang',
@@ -14378,7 +14344,6 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledig
 
 In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-       'config-ibm_db2-low-db-pagesize' => "Uw DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
        'config-site-name' => 'Naam van de wiki:',
        'config-site-name-help' => 'Deze naam verschijnt in de titelbalk van browsers en op andere plaatsen.',
        'config-site-name-blank' => 'Geef een naam op voor de site.',
@@ -14388,11 +14353,11 @@ Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Li
        'config-ns-other' => 'Andere (geef aan welke)',
        'config-ns-other-default' => 'MijnWiki',
        'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
-       'config-ns-invalid' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
+       'config-ns-invalid' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
 Geef een andere naamruimte op.',
-       'config-ns-conflict' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
+       'config-ns-conflict' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
 Geef een andere naam op voor de projectnaamruimte.',
        'config-admin-box' => 'Beheerdersgebruiker',
        'config-admin-name' => 'Uw naam:',
@@ -14488,7 +14453,7 @@ Idealiter is deze map niet via het web te benaderen.',
        'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
-Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
+Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.', # Fuzzy
        'config-instantcommons' => 'Instant Commons inschakelen',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].
 Hiervoor heeft MediaWiki toegang nodig tot Internet.
@@ -14497,7 +14462,7 @@ Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s
        'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
 Voer de licentie handmatig in.',
        'config-cc-again' => 'Opnieuw kiezen...',
-       'config-cc-not-chosen' => 'Kies alstublieft de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
+       'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
        'config-advanced-settings' => 'Gevorderde instellingen',
        'config-cache-options' => 'Instellingen voor het cachen van objecten:',
        'config-cache-help' => 'Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.
@@ -14522,7 +14487,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.',
        'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alstublieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
        'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als u nog wijzigingen wilt maken, klik dan op "{{int:config-back}}".',
        'config-install-step-done' => 'afgerond',
@@ -14717,9 +14682,9 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
 $1
 
 Als je het databasesysteem dat je wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
-       'config-missing-db-name' => 'Je moet een waarde ingeven voor "Databasenaam"',
+       'config-missing-db-name' => 'Je moet een waarde opgeven voor "Databasenaam"',
        'config-missing-db-host' => 'Je moet een waarde invoeren voor "Databaseserver"',
-       'config-missing-db-server-oracle' => 'Je moet een waarde voor "Database-TNS" ingeven',
+       'config-missing-db-server-oracle' => 'Je moet een waarde opgeven voor "Database-TNS"',
        'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
 Jij gebruikt $2.',
        'config-sqlite-name-help' => 'Kies een naam die je wiki identificeert.
@@ -14748,9 +14713,8 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledi
 
 In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-       'config-ibm_db2-low-db-pagesize' => "Je DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
        'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
        'config-admin-name' => 'Je naam:',
        'config-admin-password-mismatch' => 'De twee door jou ingevoerde wachtwoorden komen niet overeen.',
@@ -14794,8 +14758,8 @@ Daarmee wordt deze functie ingeschakeld.",
        'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
-Als je geen logo wilt gebruiken, kan je dit veld leeg laten.',
-       'config-cc-not-chosen' => 'Kies alsjeblieft de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
+Als je geen logo wilt gebruiken, kan je dit veld leeg laten.', # Fuzzy
+       'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
        'config-memcache-needservers' => 'Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.',
        'config-memcache-badip' => 'Je hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
        'config-memcache-noport' => 'Je hebt geen poort opgegeven voor de Memcachedserver: $1.
@@ -14804,7 +14768,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet je aanvullende instellingen maken, maar je kunt deze uitbreidingen nu inschakelen.',
        'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof je MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alsjeblieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
        'config-install-begin' => 'Als je nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als je nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
        'config-pg-no-plpgsql' => 'Je moet de taal PL/pgSQL installeren in de database $1',
@@ -14974,6 +14938,7 @@ $messages['pdc'] = array(
 /** Polish (polski)
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Holek
  * @author Saper
  * @author Sp5uhe
@@ -15201,7 +15166,6 @@ Zawiera ona nieopracowane dane użytkownika (adresy e-mail, zahaszowane hasła)
 Warto rozważyć umieszczenie w bazie danych zupełnie gdzie indziej, na przykład w <code>/var/lib/mediawiki/yourwiki</code> .",
        'config-oracle-def-ts' => 'Domyślna przestrzeń tabel',
        'config-oracle-temp-ts' => 'Przestrzeń tabel tymczasowych',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki może współpracować z następującymi systemami baz danych:
 
 $1
@@ -15211,12 +15175,10 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
        'config-support-postgres' => '* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL  ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.',
        'config-support-sqlite' => '* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)',
        'config-support-oracle' => '* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])',
-       'config-support-ibm_db2' => '* $1 jest komercyjną zaawansowaną bazą danych.', # Fuzzy
        'config-header-mysql' => 'Ustawienia MySQL',
        'config-header-postgres' => 'Ustawienia PostgreSQL',
        'config-header-sqlite' => 'Ustawienia SQLite',
        'config-header-oracle' => 'Ustawienia Oracle',
-       'config-header-ibm_db2' => 'ustawienia dla IBM DB2',
        'config-invalid-db-type' => 'Nieprawidłowy typ bazy danych',
        'config-missing-db-name' => 'Należy wpisać wartość w polu „Nazwa bazy danych”',
        'config-missing-db-host' => 'Musisz wpisać wartość w polu „Serwer bazy danych”',
@@ -15278,7 +15240,7 @@ Jest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
        'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
 
 Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
-       'config-regenerate' => 'Ponowne generowanie <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
        'config-show-table-status' => 'Zapytanie „<code>SHOW TABLE STATUS</code>” nie powiodło się!',
        'config-unknown-collation' => "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
        'config-db-web-account' => 'Konto bazy danych dla dostępu przez WWW',
@@ -15308,7 +15270,6 @@ Bazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż baz
 Jest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.
 
 W '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
-       'config-ibm_db2-low-db-pagesize' => "Baza danych DB2 posiada domyślny obszar tabel z niewystarczającym rozmiarem strony. Wartość rozmiaru strony musi być równa lub powyżej  '''32 K'''.",
        'config-site-name' => 'Nazwa wiki',
        'config-site-name-help' => 'Ten napis pojawi się w pasku tytułowym przeglądarki oraz w różnych innych miejscach.',
        'config-site-name-blank' => 'Wprowadź nazwę witryny.',
@@ -15351,7 +15312,7 @@ Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
        'config-optional-continue' => 'Zadaj mi więcej pytań.',
        'config-optional-skip' => 'Jestem już znudzony, po prostu zainstaluj wiki.',
        'config-profile' => 'Profil uprawnień użytkowników',
-       'config-profile-wiki' => 'Tradycyjne wiki', # Fuzzy
+       'config-profile-wiki' => 'Otwarte wiki',
        'config-profile-no-anon' => 'Wymagane utworzenie konta',
        'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
        'config-profile-private' => 'Prywatna wiki',
@@ -15417,7 +15378,7 @@ Najlepiej, aby nie był on dostępny z internetu.',
        'config-logo-help' => 'Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.
 Prześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.
 
-Jeśli nie chcesz logo, pozostaw to pole puste.',
+Jeśli nie chcesz logo, pozostaw to pole puste.', # Fuzzy
        'config-instantcommons' => 'Włącz Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].
 Aby to zrobić, MediaWiki wymaga dostępu do internetu.
@@ -15745,7 +15706,6 @@ Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav t
 Ch'a consìdera ëd buté la base ëd dàit tuta antrega da n'àutra part, për esempi an <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Spassi dla tàula dë stàndard:',
        'config-oracle-temp-ts' => 'Spassi dla tàula temporani:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
 
 $1
@@ -15755,12 +15715,10 @@ S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré,
        'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
        'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
        'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
-       'config-support-ibm_db2' => "* $1 a l'é na base ëd dàit d'asiendal comersial.", # Fuzzy
        'config-header-mysql' => 'Ampostassion MySQL',
        'config-header-postgres' => 'Ampostassion PostgreSQL',
        'config-header-sqlite' => 'Ampostassion SQLite',
        'config-header-oracle' => 'Ampostassion Oracle',
-       'config-header-ibm_db2' => "Ampostassion d'IBM DB2",
        'config-invalid-db-type' => 'Sòrt ëd ëd base ëd dàit pa bon-a',
        'config-missing-db-name' => 'A dev buteje un valor për "Nòm ëd la base ëd dàit"',
        'config-missing-db-host' => 'A dev buteje un valor për "l\'òspit ëd la base ëd dàit"',
@@ -15820,7 +15778,7 @@ Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki."
        'config-upgrade-done-no-regenerate' => 'Agiornament complet.
 
 It peule adess [$1 ancaminé a dovré toa wiki].',
-       'config-regenerate' => 'Generé torna <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Generé torna LocalSettings.php →',
        'config-show-table-status' => 'Arcesta <code>SHOW TABLE STATUS</code> falìa!',
        'config-unknown-collation' => "'''Avis:''' La base ëd dàit a deuvra na classificassion pa arconossùa.",
        'config-db-web-account' => "Cont dla base ëd dàit për l'acess a l'aragnà",
@@ -15850,7 +15808,6 @@ La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit Inn
 Sòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.
 
 An '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
-       'config-ibm_db2-low-db-pagesize' => "Soa base ëd dàit DB2 a l'ha në spassi d'ambaronament predefinì con na dimension ëd pàgina insuficent. La dimension ëd pàgina a dev esse '''32K''' o pi gròssa.",
        'config-site-name' => 'Nòm ëd la wiki:',
        'config-site-name-help' => "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
        'config-site-name-blank' => "Ch'a buta un nòm ëd sit.",
@@ -16367,7 +16324,6 @@ Considere colocar a base de dados num local completamente diferente, como, por e
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'O MediaWiki suporta as seguintes plataformas de base de dados:
 
 $1
@@ -16377,12 +16333,10 @@ Se a plataforma que pretende usar não está listada abaixo, siga as instruçõe
        'config-support-postgres' => '* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.',
        'config-support-sqlite' => '* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)',
        'config-support-oracle' => '* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2' => '* $1 é uma base de dados empresarial.', # Fuzzy
        'config-header-mysql' => 'Definições MySQL',
        'config-header-postgres' => 'Definições PostgreSQL',
        'config-header-sqlite' => 'Definições SQLite',
        'config-header-oracle' => 'Definições Oracle',
-       'config-header-ibm_db2' => 'Configurações da IBM DB2',
        'config-invalid-db-type' => 'O tipo de base de dados é inválido',
        'config-missing-db-name' => 'Tem de introduzir um valor para "Nome da base de dados"',
        'config-missing-db-host' => 'Tem de introduzir um valor para "Servidor da base de dados"',
@@ -16444,7 +16398,7 @@ Esta operação '''não é recomendada''' a menos que esteja a ter problemas com
        'config-upgrade-done-no-regenerate' => 'Actualização terminada.
 
 Agora pode [$1 começar a usar a sua wiki].',
-       'config-regenerate' => 'Regenerar o <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar o LocalSettings.php →',
        'config-show-table-status' => 'A consulta <code>SHOW TABLE STATUS</code> falhou!',
        'config-unknown-collation' => "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
        'config-db-web-account' => 'Conta na base de dados para acesso pela internet',
@@ -16475,7 +16429,6 @@ Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados t
 
 No modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,
 mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
-       'config-ibm_db2-low-db-pagesize' => "A sua base de dados DB2 tem um tablespace padrão com um pagesize insuficiente. O pagesize tem de ser '''32K'' ou maior.",
        'config-site-name' => 'Nome da wiki:',
        'config-site-name-help' => 'Este nome aparecerá no título da janela do seu browser e em vários outros sítios.',
        'config-site-name-blank' => 'Introduza o nome do site.',
@@ -16882,12 +16835,10 @@ Totuși, MediaWiki necesită PHP $2 sau mai nou.',
        'config-sqlite-dir' => 'Director de date SQLite:',
        'config-oracle-def-ts' => 'Spațiu de stocare („tablespace”) implicit:',
        'config-oracle-temp-ts' => 'Spațiu de stocare („tablespace”) temporar:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Setările MySQL',
        'config-header-postgres' => 'Setări PostgreSQL',
        'config-header-sqlite' => 'Setări SQLite',
        'config-header-oracle' => 'Setări Oracle',
-       'config-header-ibm_db2' => 'Setări IBM DB2',
        'config-invalid-db-type' => 'Tip de bază de date incorect',
        'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de date”',
        'config-connection-error' => '$1.
@@ -16896,7 +16847,7 @@ Verificați gazda, numele de utilizator și parola și reîncercați.',
        'config-upgrade-done-no-regenerate' => 'Actualizare completă.
 
 Acum puteți [$1 începe să vă folosiți wikiul].',
-       'config-regenerate' => 'Regenerare <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerare LocalSettings.php →',
        'config-unknown-collation' => 'AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.',
        'config-db-web-account' => 'Contul bazei de date pentru accesul web.',
        'config-db-web-create' => 'Creați contul dacă nu există deja',
@@ -16994,6 +16945,8 @@ $messages['roa-tara'] = array(
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
        'config-admin-email' => 'Indirizze e-mail:',
        'config-install-step-done' => 'fatte',
        'config-install-step-failed' => 'fallite',
@@ -17251,7 +17204,6 @@ MediaWiki требует поддержки UTF-8 для корректной р
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki поддерживает следующие СУБД:
 
 $1
        'config-support-postgres' => '* $1 — популярная открытая СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инструкция, как собрать PHP с поддержкой PostgreSQL]). Могут встречаться небольшие неисправленные ошибки, не рекомендуется для использования в рабочей системе.',
        'config-support-sqlite' => '* $1 — это легковесная система баз данных, имеющая очень хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инструкция, как собрать PHP с поддержкой SQLite], работающей посредством PDO)',
        'config-support-oracle' => '* $1 — это коммерческая база данных масштаба предприятия. ([http://www.php.net/manual/en/oci8.installation.php Как собрать PHP с поддержкой OCI8])',
-       'config-support-ibm_db2' => '$1 — коммерческая база данных масштаба предприятия.', # Fuzzy
        'config-header-mysql' => 'Настройки MySQL',
        'config-header-postgres' => 'Настройки PostgreSQL',
        'config-header-sqlite' => 'Настройки SQLite',
        'config-header-oracle' => 'Настройки Oracle',
-       'config-header-ibm_db2' => 'Настройки IBM DB2',
        'config-invalid-db-type' => 'Неверный тип базы данных',
        'config-missing-db-name' => 'Вы должны ввести значение параметра «Имя базы данных»',
        'config-missing-db-host' => 'Необходимо ввести значение параметра «Сервер базы данных»',
@@ -17328,7 +17278,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Обновление завершено.
 
 Теперь вы можете [$1 начать работу с вики].',
-       'config-regenerate' => 'Создать <code>LocalSettings.php</code> заново →',
+       'config-regenerate' => 'Создать LocalSettings.php заново →',
        'config-show-table-status' => 'Запрос «<code>SHOW TABLE STATUS</code>» не выполнен!',
        'config-unknown-collation' => "'''Внимание:''' База данных использует нераспознанные правила сортировки.",
        'config-db-web-account' => 'Учётная запись для доступа к базе данных из веб-сервера',
@@ -17357,7 +17307,6 @@ chmod a+w $3</pre>',
 Это более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.
 
 В '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
-       'config-ibm_db2-low-db-pagesize' => "В вашей базе данных DB2 по умолчанию задано табличное пространство с недостаточным размером страницы. Размер страницы должен быть не менее '''32K'''.",
        'config-site-name' => 'Название вики:',
        'config-site-name-help' => 'Название будет отображаться в заголовке окна браузера и в некоторых других местах вики.',
        'config-site-name-blank' => 'Введите название сайта.',
@@ -17730,17 +17679,15 @@ $messages['si'] = array(
        'config-sqlite-dir' => 'SQLite දත්ත නාමවලිය:',
        'config-oracle-def-ts' => 'සාමාන්‍ය වගු අවකාශය:',
        'config-oracle-temp-ts' => 'තාවකාලික වගු අවකාශය:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'MySQL සැකසුම්',
        'config-header-postgres' => 'PostgreSQL සැකසුම්',
        'config-header-sqlite' => 'SQLite සැකසුම්',
        'config-header-oracle' => 'ඔරකල් සැකසුම්',
-       'config-header-ibm_db2' => 'IBM DB2 සැකසුම්',
        'config-invalid-db-type' => 'වලංගු නොවන දත්ත සංචිත වර්ගය',
        'config-missing-db-name' => '"දත්ත සංචිත නාමය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
        'config-missing-db-host' => '"දත්ත සංචිත ධාරකය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
        'config-missing-db-server-oracle' => '"දත්ත සංචිත TNS" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
-       'config-regenerate' => 'නැවත ජනිත කරන්න <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'නැවත ජනිත කරන්න LocalSettings.php →',
        'config-db-web-account' => 'ජාල ප්‍රවේශනය සඳහා දත්ත සංචිත ගිණුම',
        'config-mysql-engine' => 'ආචයන එන්ජිම:',
        'config-mysql-innodb' => 'InnoDB',
@@ -17938,7 +17885,6 @@ Vendar pa MediaWiki zahteva PHP $2 ali višji.',
        'config-db-schema-help' => 'Ta shema je po navadi v redu.
 Spremenite jo samo, če veste, da jo morate.',
        'config-sqlite-dir' => 'Mapa podatkov SQLite:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki podpira naslednje sisteme zbirk podatkov:
 
 $1
@@ -17948,7 +17894,6 @@ $1
        'config-header-postgres' => 'Nastavitve PostgreSQL',
        'config-header-sqlite' => 'Nastavitve SQLite',
        'config-header-oracle' => 'Nastavitve Oracle',
-       'config-header-ibm_db2' => 'Nastavitve IBM DB2',
        'config-invalid-db-type' => 'Neveljavna vrsta zbirke podatkov',
        'config-missing-db-name' => 'Vnesti morate vrednost za »Ime zbirke podatkov«',
        'config-missing-db-host' => 'Vnesti morate vrednost za »Gostitelj zbirke podatkov«',
@@ -17971,7 +17916,7 @@ Preverite mapo podatkov in ime zbirke podatkov spodaj ter poskusite znova.',
        'config-upgrade-done-no-regenerate' => 'Nadgradnja je končana.
 
 Sedaj lahko [$1 začnete uporabljati vaš wiki].',
-       'config-regenerate' => 'Ponovno ustvari <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Ponovno ustvari LocalSettings.php →',
        'config-show-table-status' => 'Poizvedba <code>SHOW TABLE STATUS</code> ni uspela!',
        'config-unknown-collation' => "'''Opozorilo:''' Zbirke podatkov uporablja neprepoznano razvrščanje znakov.",
        'config-db-web-account' => 'Račun zbirke podatkov za spletni dostop',
@@ -18910,7 +18855,6 @@ Isaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang luga
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'DB2 ng IBM',
        'config-support-info' => 'Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:
 
 $1
@@ -18920,12 +18864,10 @@ Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamiti
        'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
        'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
        'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
-       'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.', # Fuzzy
        'config-header-mysql' => 'Mga katakdaan ng MySQL',
        'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
        'config-header-sqlite' => 'Mga katakdaan ng SQLite',
        'config-header-oracle' => 'Mga katakdaan ng Oracle',
-       'config-header-ibm_db2' => 'Mga katakdaan ng DB2 ng IBM',
        'config-invalid-db-type' => 'Hindi tanggap na uri ng kalipunan ng dato',
        'config-missing-db-name' => 'Dapat kang magpasok ng isang halaga para sa "Pangalan ng kalipunan ng dato"',
        'config-missing-db-host' => 'Dapat kang magpasok ng isang halaga para sa "Tagapagpasinaya ng kalipunan ng dato"',
@@ -18987,7 +18929,7 @@ Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>
        'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
 
 Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
-       'config-regenerate' => 'Muling likhain ang <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
        'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!', # Fuzzy
        'config-unknown-collation' => "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
        'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
@@ -19017,7 +18959,6 @@ May gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa
 Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.
 
 Sa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
-       'config-ibm_db2-low-db-pagesize' => "Ang kalipunan mo ng dato na DB2 ay mayroong isang likas na nakatakdang puwang ng talahanayan na mayroong hindi sapat na sukat ng pahina. Ang sukat ng pahina ay dapat na maging '''32K''' o mas mataas.",
        'config-site-name' => 'Pangalan ng wiki:',
        'config-site-name-help' => "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
        'config-site-name-blank' => 'Magpasok ng isang pangalan ng sityo.',
@@ -19522,7 +19463,6 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 За можливості розташуйте базу даних десь окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Простір таблиць за замовчуванням:',
        'config-oracle-temp-ts' => 'Тимчасовий простір таблиць:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki підтримує таки системи баз даних:
 
 $1
        'config-support-postgres' => '* $1 — популярна відкрита СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]). Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.',
        'config-support-sqlite' => '* $1 — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)',
        'config-support-oracle' => '* $1 — комерційна база даних масштабу підприємства. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])',
-       'config-support-ibm_db2' => '* $1 — комерційна база даних масштабу підприємства.', # Fuzzy
        'config-header-mysql' => 'Налаштування MySQL',
        'config-header-postgres' => 'Налаштування PostgreSQL',
        'config-header-sqlite' => 'Налаштування SQLite',
        'config-header-oracle' => 'Налаштування Oracle',
-       'config-header-ibm_db2' => 'Налаштування IBM DB2',
        'config-invalid-db-type' => 'Невірний тип бази даних',
        'config-missing-db-name' => "Ви повинні ввести значення параметру «Ім'я бази даних»",
        'config-missing-db-host' => 'Ви повинні ввести значення параметру «Хост бази даних»',
@@ -19599,7 +19537,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Оновлення завершено.
 
 Ви можете зараз [$1 починати використовувати свою вікі].',
-       'config-regenerate' => 'Повторно згенерувати <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Повторно згенерувати LocalSettings.php →',
        'config-show-table-status' => 'Запит <code>SHOW TABLE STATUS</code> не виконано!',
        'config-unknown-collation' => "'''Увага:''' База даних використовує нерозпізнане сортування.",
        'config-db-web-account' => 'Обліковий запис бази даних для інтернет-доступу',
@@ -19629,7 +19567,6 @@ chmod a+w $3</pre>',
 Це більш ефективно, ніж UTF-8 режим MySQL, і дозволяє використовувати увесь набір символів Юнікоду.
 
 У '''режимі UTF-8''' MySQL буде знати, якого символу стосуються Ваші дані, і могтиме відображати та конвертувати їх належним чином, але не дозволятиме зберігати символи, що виходять за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-       'config-ibm_db2-low-db-pagesize' => "У Вашій базі даних DB2 за замовчуванням заданий табличний простір з недостатнім розміром сторінки. Розмір сторінки має бути '''32K''' і більше.",
        'config-site-name' => 'Назва вікі:',
        'config-site-name-help' => 'Це буде відображатись у заголовку вікна браузера та у деяких інших місцях.',
        'config-site-name-blank' => 'Введіть назву сайту.',
@@ -20332,7 +20269,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '升级完成。
 
 现在您可以[$1 开始使用您的wiki]了。',
-       'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+       'config-regenerate' => '重新生成LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code>语句执行失败!',
        'config-unknown-collation' => "'''警告:'''数据库使用了无法识别的整理。",
        'config-db-web-account' => '供网页访问使用的数据库帐号',
@@ -20772,7 +20709,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '升級完成。
 
 現在您可以[$1 開始使用您的wiki]了。',
-       'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+       'config-regenerate' => '重新生成LocalSettings.php →',
        'config-show-table-status' => '查詢<code>SHOW TABLE STATUS</code>失敗!',
        'config-unknown-collation' => "'''警告:'''數據庫使用了無法識別的整理。",
        'config-db-web-account' => '供網頁訪問使用的數據庫帳號',
index 8aee15c..daac558 100644 (file)
@@ -997,7 +997,7 @@ abstract class Installer {
                }
 
                # Try the current value of LANG.
-               if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+               if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
                        $this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
                        return true;
                }
@@ -1408,10 +1408,10 @@ abstract class Installer {
                // then adding any callbacks that wanted to attach after a given step
                foreach( $coreInstallSteps as $step ) {
                        $this->installSteps[] = $step;
-                       if( isset( $this->extraInstallSteps[ $step['name'] ] ) ) {
+                       if( isset( $this->extraInstallSteps[$step['name']] ) ) {
                                $this->installSteps = array_merge(
                                        $this->installSteps,
-                                       $this->extraInstallSteps[ $step['name'] ]
+                                       $this->extraInstallSteps[$step['name']]
                                );
                        }
                }
@@ -1598,7 +1598,7 @@ abstract class Installer {
                $status = Status::newGood();
                try {
                        $page = WikiPage::factory( Title::newMainPage() );
-                       $content = new WikitextContent (
+                       $content = new WikitextContent(
                                wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
                                wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
                        );
@@ -1608,7 +1608,7 @@ abstract class Installer {
                                        EDIT_NEW,
                                        false,
                                        User::newFromName( 'MediaWiki default' ) );
-               } catch (MWException $e) {
+               } catch ( MWException $e ) {
                        //using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
                }
index 7cb3779..c9ebc7e 100644 (file)
@@ -62,12 +62,12 @@ class LocalSettingsGenerator {
                                'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
                                'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
-                               'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength'
+                               'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength', 'wgLogo',
                        ),
                        $db->getGlobalNames()
                );
 
-               $unescaped = array( 'wgRightsIcon' );
+               $unescaped = array( 'wgRightsIcon', 'wgLogo' );
                $boolItems = array(
                        'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
                        'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
@@ -227,7 +227,7 @@ class LocalSettingsGenerator {
                        case 'db':
                        case 'memcached':
                        case 'accel':
-                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType']);
+                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
                                break;
                        case 'none':
                        default:
@@ -273,7 +273,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 ## The relative URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+\$wgLogo             = \"{$this->values['wgLogo']}\";
 
 ## UPO means: this is also a user preference option
 
@@ -335,7 +335,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
 
 ## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+## names, ie 'cologneblue', 'monobook', 'vector':
 \$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
 
 ## For attaching licensing metadata to pages, and displaying an
index 06821f8..72514f2 100644 (file)
@@ -86,8 +86,7 @@ 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' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
index 9978a92..df1f610 100644 (file)
@@ -165,12 +165,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
                        array( 'doLogSearchPopulation' ),
                        array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
                        array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
                        array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
                        array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
                        array( 'doUpdateTranscacheField' ),
-                       array( 'renameEuWikiId' ),
                        array( 'doUpdateMimeMinorField' ),
 
                        // 1.17
@@ -179,7 +177,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        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( 'dropIndex', 'iwlinks',      'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
                        array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
                        array( 'doClFieldsUpdate' ),
                        array( 'doCollationUpdate' ),
@@ -229,6 +226,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        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( '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' ),
                );
        }
 
@@ -846,15 +848,6 @@ class MysqlUpdater extends DatabaseUpdater {
                return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
        }
 
-       protected function renameEuWikiId() {
-               if ( $this->db->fieldExists( 'external_user', 'eu_local_id', __METHOD__ ) ) {
-                       $this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
-                       return;
-               }
-
-               $this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
-       }
-
        protected function doUpdateMimeMinorField() {
                if ( $this->updateRowExists( 'mime_minor_length' ) ) {
                        $this->output( "...*_mime_minor fields are already long enough.\n" );
@@ -901,4 +894,18 @@ class MysqlUpdater extends DatabaseUpdater {
 
                $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
        }
+
+       protected function doIwlinksIndexNonUnique() {
+               $info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
+               if ( is_array( $info ) && $info[0]->Non_unique ) {
+                       $this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+                       return true;
+               }
+               if ( $this->skipSchema ) {
+                       $this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+                       return false;
+               }
+
+               return $this->applyPatch( 'patch-iwl_prefix_title_from-non-unique.sql', false, "Making iwl_prefix_title_from index non-UNIQUE" );
+       }
 }
index e853889..632015f 100644 (file)
@@ -59,8 +59,7 @@ class OracleInstaller extends DatabaseInstaller {
                if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
                        $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' ) .
index 4e5ae8c..e7ae8d5 100644 (file)
@@ -56,8 +56,7 @@ 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() ) .
@@ -137,7 +136,8 @@ class PostgresInstaller extends DatabaseInstaller {
                                $this->getVar( 'wgDBserver' ),
                                $user,
                                $password,
-                               $dbName);
+                               $dbName
+                       );
                        $status->value = $db;
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
index 0a4b5e6..08797b2 100644 (file)
@@ -89,7 +89,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        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', 'external_user',     'patch-external_user.sql' ),
                        array( 'addTable', 'sites',             'patch-sites.sql' ),
 
                        # Needed before new field
@@ -232,6 +231,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        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)' ),
@@ -251,6 +251,12 @@ class PostgresUpdater extends DatabaseUpdater {
                                array( 'cl_from', 'int4_ops', 'btree', 0 ),
                        ),
                        '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")' ),
                        array( 'checkIndex', 'logging_times', array(
                                array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
                        ),
@@ -613,7 +619,7 @@ END;
                }
        }
 
-       protected function changeNullableField( $table, $field, $null) {
+       protected function changeNullableField( $table, $field, $null ) {
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
                        $this->output( "...ERROR: expected column $table.$field to exist\n" );
@@ -770,7 +776,7 @@ END;
 
        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_from_title'" );
+                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'" );
                }
        }
 
index 47650b6..28d8d66 100644 (file)
@@ -49,7 +49,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
                        array( 'doLogSearchPopulation' ),
                        array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
                        array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
                        array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
                        array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
@@ -62,7 +61,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        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( 'dropIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
                        array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
                        array( 'doCollationUpdate' ),
                        array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
@@ -109,6 +107,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        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( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
                );
        }
 
index 35d649b..ac66cd9 100644 (file)
@@ -353,7 +353,7 @@ class WebInstaller extends Installer {
        public function getFingerprint() {
                // Get the base URL of the installation
                $url = $this->request->getFullRequestURL();
-               if ( preg_match( '!^(.*\?)!', $url, $m) ) {
+               if ( preg_match( '!^(.*\?)!', $url, $m ) ) {
                        // Trim query string
                        $url = $m[1];
                }
@@ -724,8 +724,7 @@ class WebInstaller extends Installer {
                        $attributes['for'] = $forId;
                }
 
-               return
-                       "<div class=\"config-block\">\n" .
+               return "<div class=\"config-block\">\n" .
                        "  <div class=\"config-block-label\">\n" .
                        Xml::tags( 'label',
                                $attributes,
@@ -767,8 +766,7 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
-               return
-                       $this->label(
+               return $this->label(
                                $params['label'],
                                $params['controlName'],
                                Xml::input(
@@ -814,8 +812,7 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
-               return
-                       $this->label(
+               return $this->label(
                                $params['label'],
                                $params['controlName'],
                                Xml::textarea(
@@ -898,8 +895,7 @@ class WebInstaller extends Installer {
                        $labelText = $this->parse( wfMessage( $params['label'] )->text() );
                }
 
-               return
-                       "<div class=\"config-input-check\">\n" .
+               return "<div class=\"config-input-check\">\n" .
                        $params['help'] .
                        "<label>\n" .
                        Xml::check(
index 9119c12..8aec289 100644 (file)
@@ -933,6 +933,10 @@ class WebInstaller_Options extends WebInstallerPage {
                                $this->getVar( 'wgDeletedDirectory' )
                        )
                );
+               // If we're using the default, let the user set it relative to $wgScriptPath
+               $curLogo = $this->getVar( 'wgLogo' );
+               $logoString = ( $curLogo == "/wiki/skins/common/images/wiki.png" ) ?
+                       '$wgStylePath/common/images/wiki.png' : $curLogo;
 
                $uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
                $this->addHTML(
@@ -954,6 +958,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        '</div>' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgLogo',
+                               'value' => $logoString,
                                'label' => 'config-logo',
                                'attribs' => array( 'dir' => 'ltr' ),
                                'help' => $this->parent->getHelpBox( 'config-logo-help' )
@@ -1051,8 +1056,7 @@ class WebInstaller_Options extends WebInstallerPage {
                }
                $wrapperStyle = ($this->getVar( '_LicenseCode' ) == 'cc-choose') ? '' : 'display: none';
 
-               return
-                       "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
+               return "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
                        Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
                        "</div>\n";
        }
@@ -1062,8 +1066,7 @@ class WebInstaller_Options extends WebInstallerPage {
                // If you change this height, also change it in config.css
                $expandJs = str_replace( '$1', '54em', $js );
                $reduceJs = str_replace( '$1', '70px', $js );
-               return
-                       '<p>'.
+               return '<p>'.
                        Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
                        '&#160;&#160;' .
                        htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
@@ -1242,7 +1245,7 @@ class WebInstaller_Complete extends WebInstallerPage {
                        // JS appears the only method that works consistently with IE7+
                        $this->addHtml( "\n<script type=\"" . $GLOBALS['wgJsMimeType'] .
                                '">jQuery( document ).ready( function() { document.location=' .
-                               Xml::encodeJsVar( $lsUrl) . "; } );</script>\n" );
+                               Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
                } else {
                        $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
                }
@@ -1308,7 +1311,9 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 }
 
 class WebInstaller_Readme extends WebInstaller_Document {
-       protected function getFileName() { return 'README'; }
+       protected function getFileName() {
+               return 'README';
+       }
 }
 
 class WebInstaller_ReleaseNotes extends WebInstaller_Document {
@@ -1324,9 +1329,13 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 }
 
 class WebInstaller_UpgradeDoc extends WebInstaller_Document {
-       protected function getFileName() { return 'UPGRADE'; }
+       protected function getFileName() {
+               return 'UPGRADE';
+       }
 }
 
 class WebInstaller_Copying extends WebInstaller_Document {
-       protected function getFileName() { return 'COPYING'; }
+       protected function getFileName() {
+               return 'COPYING';
+       }
 }
index d8f55c3..64925f7 100644 (file)
@@ -102,7 +102,7 @@ abstract class Job {
         * @deprecated 1.21
         */
        public static function safeBatchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
+               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
        }
 
        /**
@@ -195,15 +195,20 @@ abstract class Job {
 
        /**
         * @return bool Whether this job can be retried on failure by job runners
+        * @since 1.21
         */
        public function allowRetries() {
                return true;
        }
 
        /**
-        * Subclasses may need to override this to make duplication detection work
+        * Subclasses may need to override this to make duplication detection work.
+        * The resulting map conveys everything that makes the job unique. This is
+        * only checked if ignoreDuplicates() returns true, meaning that duplicate
+        * jobs are supposed to be ignored.
         *
         * @return Array Map of key/values
+        * @since 1.21
         */
        public function getDeduplicationInfo() {
                $info = array(
@@ -212,17 +217,21 @@ abstract class Job {
                        'title'     => $this->getTitle()->getDBkey(),
                        'params'    => $this->getParams()
                );
-               // Identical jobs with different "root" jobs should count as duplicates
                if ( is_array( $info['params'] ) ) {
+                       // Identical jobs with different "root" jobs should count as duplicates
                        unset( $info['params']['rootJobSignature'] );
                        unset( $info['params']['rootJobTimestamp'] );
+                       // Likewise for jobs with different delay times
+                       unset( $info['params']['jobReleaseTimestamp'] );
                }
                return $info;
        }
 
        /**
+        * @see JobQueue::deduplicateRootJob()
         * @param string $key A key that identifies the task
         * @return Array
+        * @since 1.21
         */
        public static function newRootJobParams( $key ) {
                return array(
@@ -232,7 +241,9 @@ abstract class Job {
        }
 
        /**
+        * @see JobQueue::deduplicateRootJob()
         * @return Array
+        * @since 1.21
         */
        public function getRootJobParams() {
                return array(
@@ -245,6 +256,16 @@ abstract class Job {
                );
        }
 
+       /**
+        * @see JobQueue::deduplicateRootJob()
+        * @return bool
+        * @since 1.22
+        */
+       public function hasRootJobParams() {
+               return isset( $this->params['rootJobSignature'] )
+                       && isset( $this->params['rootJobTimestamp'] );
+       }
+
        /**
         * Insert a single job into the queue.
         * @return bool true on success
index 9c152cd..17a1338 100644 (file)
@@ -36,7 +36,8 @@ abstract class JobQueue {
        protected $maxTries; // integer; maximum number of times to try a job
        protected $checkDelay; // boolean; allow delayed jobs
 
-       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+       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)
 
@@ -237,13 +238,37 @@ abstract class JobQueue {
                return 0; // not implemented
        }
 
+       /**
+        * Get the number of acquired jobs that can no longer be attempted.
+        * Queue classes should use caching if they are any slower without memcached.
+        *
+        * If caching is used, this number might be out of date for a minute.
+        *
+        * @return integer
+        * @throws MWException
+        */
+       final public function getAbandonedCount() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetAbandonedCount();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::getAbandonedCount()
+        * @return integer
+        */
+       protected function doGetAbandonedCount() {
+               return 0; // not implemented
+       }
+
        /**
         * Push a single jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param $jobs Job|Array
-        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
         * @return bool Returns false on failure
         * @throws MWException
         */
@@ -257,7 +282,7 @@ abstract class JobQueue {
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param array $jobs List of Jobs
-        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
         * @return bool Returns false on failure
         * @throws MWException
         */
@@ -402,12 +427,11 @@ abstract class JobQueue {
        protected function doDeduplicateRootJob( Job $job ) {
                global $wgMemc;
 
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+               if ( !$job->hasRootJobParams() ) {
+                       throw new MWException( "Cannot register root job; missing parameters." );
                }
+               $params = $job->getRootJobParams();
+
                $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
                // Callers should call batchInsert() and then this function so that if the insert
                // fails, the de-duplication registration will be aborted. Since the insert is
@@ -448,13 +472,10 @@ abstract class JobQueue {
        protected function doIsRootJobOldDuplicate( Job $job ) {
                global $wgMemc;
 
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
+               if ( !$job->hasRootJobParams() ) {
                        return false; // job has no de-deplication info
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
-                       return false;
                }
+               $params = $job->getRootJobParams();
 
                // Get the last time this root job was enqueued
                $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
@@ -542,7 +563,7 @@ abstract class JobQueue {
         * This does not include jobs that are currently acquired or delayed.
         * This should only be called on a queue that is no longer being popped.
         *
-        * @return Iterator|Traversable|Array
+        * @return Iterator
         * @throws MWException
         */
        abstract public function getAllQueuedJobs();
@@ -551,12 +572,12 @@ abstract class JobQueue {
         * Get an iterator to traverse over all delayed jobs in this queue.
         * This should only be called on a queue that is no longer being popped.
         *
-        * @return Iterator|Traversable|Array
+        * @return Iterator
         * @throws MWException
         * @since 1.22
         */
        public function getAllDelayedJobs() {
-               return array(); // not implemented
+               return new ArrayIterator( array() ); // not implemented
        }
 
        /**
index 3dba3c5..a8186ab 100644 (file)
@@ -118,6 +118,23 @@ abstract class JobQueueAggregator {
         */
        abstract protected function doGetAllReadyWikiQueues();
 
+       /**
+        * Purge all of the aggregator information
+        *
+        * @return bool Success
+        */
+       final public function purge() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doPurge();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueueAggregator::purge()
+        */
+       abstract protected function doPurge();
+
        /**
         * Get all databases that have a pending job.
         * This poll all the queues and is this expensive.
index 4b82cf9..15bb833 100644 (file)
@@ -108,6 +108,13 @@ class JobQueueAggregatorMemc extends JobQueueAggregator {
                        : array(); // cache is both empty and locked
        }
 
+       /**
+        * @see JobQueueAggregator::doPurge()
+        */
+       protected function doPurge() {
+               return $this->cache->delete( $this->getReadyQueueCacheKey() );
+       }
+
        /**
         * @return string
         */
index 512a24a..c6a799d 100644 (file)
@@ -101,8 +101,18 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                                        $pendingDBs[$type][] = $wiki;
                                }
                        } else { // cache miss
+                               // Avoid duplicated effort
+                               $conn->multi( Redis::MULTI );
+                               $conn->setnx( $this->getReadyQueueKey() . ":lock", 1 );
+                               $conn->expire( $this->getReadyQueueKey() . ":lock", 3600 );
+                               if ( $conn->exec() !== array( true, true ) ) { // lock
+                                       return array(); // already in progress
+                               }
+
                                $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
 
+                               $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
+
                                $now = time();
                                $map = array();
                                foreach ( $pendingDBs as $type => $wikis ) {
@@ -120,6 +130,23 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                }
        }
 
+       /**
+        * @see JobQueueAggregator::doPurge()
+        */
+       protected function doPurge() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->delete( $this->getReadyQueueKey() );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+               return true;
+       }
+
        /**
         * Get a connection to the server that handles all sub-queues for this queue
         *
index 4b22e94..d1e6eb4 100644 (file)
@@ -34,6 +34,9 @@ class JobQueueDB extends JobQueue {
        const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
        const MAX_OFFSET = 255; // integer; maximum number of rows to skip
 
+       /** @var BagOStuff */
+       protected $cache;
+
        protected $cluster = false; // string; name of an external DB cluster
 
        /**
@@ -45,8 +48,13 @@ class JobQueueDB extends JobQueue {
         * @param $params array
         */
        protected function __construct( array $params ) {
+               global $wgMemc;
+
                parent::__construct( $params );
+
                $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+               // Make sure that we don't use the SQL cache, which would be harmful
+               $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
        }
 
        protected function supportedOrders() {
@@ -62,11 +70,9 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doIsEmpty() {
-               global $wgMemc;
-
                $key = $this->getCacheKey( 'empty' );
 
-               $isEmpty = $wgMemc->get( $key );
+               $isEmpty = $this->cache->get( $key );
                if ( $isEmpty === 'true' ) {
                        return true;
                } elseif ( $isEmpty === 'false' ) {
@@ -77,7 +83,7 @@ class JobQueueDB extends JobQueue {
                $found = $dbr->selectField( // unclaimed job
                        'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
                );
-               $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+               $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
 
                return !$found;
        }
@@ -87,11 +93,9 @@ class JobQueueDB extends JobQueue {
         * @return integer
         */
        protected function doGetSize() {
-               global $wgMemc;
-
                $key = $this->getCacheKey( 'size' );
 
-               $size = $wgMemc->get( $key );
+               $size = $this->cache->get( $key );
                if ( is_int( $size ) ) {
                        return $size;
                }
@@ -101,7 +105,7 @@ class JobQueueDB extends JobQueue {
                        array( 'job_cmd' => $this->type, 'job_token' => '' ),
                        __METHOD__
                );
-               $wgMemc->set( $key, $size, self::CACHE_TTL_SHORT );
+               $this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
 
                return $size;
        }
@@ -111,13 +115,40 @@ class JobQueueDB extends JobQueue {
         * @return integer
         */
        protected function doGetAcquiredCount() {
+               if ( $this->claimTTL <= 0 ) {
+                       return 0; // no acknowledgements
+               }
+
+               $key = $this->getCacheKey( 'acquiredcount' );
+
+               $count = $this->cache->get( $key );
+               if ( is_int( $count ) ) {
+                       return $count;
+               }
+
+               list( $dbr, $scope ) = $this->getSlaveDB();
+               $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+                       array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+                       __METHOD__
+               );
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+               return $count;
+       }
+
+       /**
+        * @see JobQueue::doGetAbandonedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetAbandonedCount() {
                global $wgMemc;
 
                if ( $this->claimTTL <= 0 ) {
                        return 0; // no acknowledgements
                }
 
-               $key = $this->getCacheKey( 'acquiredcount' );
+               $key = $this->getCacheKey( 'abandonedcount' );
 
                $count = $wgMemc->get( $key );
                if ( is_int( $count ) ) {
@@ -126,7 +157,11 @@ class JobQueueDB extends JobQueue {
 
                list( $dbr, $scope ) = $this->getSlaveDB();
                $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
-                       array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+                       array(
+                               'job_cmd' => $this->type,
+                               "job_token != {$dbr->addQuotes( '' )}",
+                               "job_attempts >= " . $dbr->addQuotes( $this->maxTries )
+                       ),
                        __METHOD__
                );
                $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
@@ -158,15 +193,15 @@ class JobQueueDB extends JobQueue {
                        }
 
                        $key = $this->getCacheKey( 'empty' );
-                       $atomic = ( $flags & self::QoS_Atomic );
+                       $atomic = ( $flags & self::QOS_ATOMIC );
+                       $cache = $this->cache;
+                       $method = __METHOD__;
 
                        $dbw->onTransactionIdle(
-                               function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
+                               function() use ( $dbw, $cache, $rowSet, $rowList, $atomic, $key, $method, $scope
                        ) {
-                               global $wgMemc;
-
                                if ( $atomic ) {
-                                       $dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
+                                       $dbw->begin( $method ); // wrap all the job additions in one transaction
                                }
                                try {
                                        // Strip out any duplicate jobs that are already in the queue...
@@ -177,7 +212,7 @@ class JobQueueDB extends JobQueue {
                                                                'job_sha1'  => array_keys( $rowSet ),
                                                                'job_token' => '' // unclaimed
                                                        ),
-                                                       __METHOD__
+                                                       $method
                                                );
                                                foreach ( $res as $row ) {
                                                        wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
@@ -188,22 +223,22 @@ class JobQueueDB extends JobQueue {
                                        $rows = array_merge( $rowList, array_values( $rowSet ) );
                                        // Insert the job rows in chunks to avoid slave lag...
                                        foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
-                                               $dbw->insert( 'job', $rowBatch, __METHOD__ );
+                                               $dbw->insert( 'job', $rowBatch, $method );
                                        }
                                        wfIncrStats( 'job-insert', count( $rows ) );
                                        wfIncrStats( 'job-insert-duplicate',
                                                count( $rowSet ) + count( $rowList ) - count( $rows ) );
                                } catch ( DBError $e ) {
                                        if ( $atomic ) {
-                                               $dbw->rollback( __METHOD__ );
+                                               $dbw->rollback( $method );
                                        }
                                        throw $e;
                                }
                                if ( $atomic ) {
-                                       $dbw->commit( __METHOD__ );
+                                       $dbw->commit( $method );
                                }
 
-                               $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+                               $cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } );
                }
 
@@ -215,9 +250,7 @@ class JobQueueDB extends JobQueue {
         * @return Job|bool
         */
        protected function doPop() {
-               global $wgMemc;
-
-               if ( $wgMemc->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+               if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
                        return false; // queue is empty
                }
 
@@ -237,7 +270,7 @@ class JobQueueDB extends JobQueue {
                        }
                        // Check if we found a row to reserve...
                        if ( !$row ) {
-                               $wgMemc->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+                               $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
                                break; // nothing to do
                        }
                        wfIncrStats( 'job-pop' );
@@ -266,11 +299,9 @@ class JobQueueDB extends JobQueue {
         * @return Row|false
         */
        protected function claimRandom( $uuid, $rand, $gte ) {
-               global $wgMemc;
-
                list( $dbw, $scope ) = $this->getMasterDB();
                // Check cache to see if the queue has <= OFFSET items
-               $tinyQueue = $wgMemc->get( $this->getCacheKey( 'small' ) );
+               $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
 
                $row = false; // the row acquired
                $invertedDirection = false; // whether one job_random direction was already scanned
@@ -311,7 +342,7 @@ class JobQueueDB extends JobQueue {
                                );
                                if ( !$row ) {
                                        $tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
-                                       $wgMemc->set( $this->getCacheKey( 'small' ), 1, 30 );
+                                       $this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
                                        continue; // use job_random
                                }
                        }
@@ -404,8 +435,6 @@ class JobQueueDB extends JobQueue {
         * @return integer Number of jobs recycled/deleted
         */
        public function recycleAndDeleteStaleJobs() {
-               global $wgMemc;
-
                $now = time();
                list( $dbw, $scope ) = $this->getMasterDB();
                $count = 0; // affected rows
@@ -443,7 +472,7 @@ class JobQueueDB extends JobQueue {
                                );
                                $count += $dbw->affectedRows();
                                wfIncrStats( 'job-recycle', $dbw->affectedRows() );
-                               $wgMemc->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+                               $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
                        }
                }
 
@@ -512,16 +541,15 @@ class JobQueueDB extends JobQueue {
                // maintained. Having only the de-duplication registration succeed would cause
                // jobs to become no-ops without any actual jobs that made them redundant.
                list( $dbw, $scope ) = $this->getMasterDB();
-               $dbw->onTransactionIdle( function() use ( $params, $key, $scope ) {
-                       global $wgMemc;
-
-                       $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+               $cache = $this->cache;
+               $dbw->onTransactionIdle( function() use ( $cache, $params, $key, $scope ) {
+                       $timestamp = $cache->get( $key ); // current last timestamp of this job
                        if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
                                return true; // a newer version of this root job was enqueued
                        }
 
                        // Update the timestamp of the last root job started at the location...
-                       return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+                       return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
                } );
 
                return true;
@@ -551,10 +579,8 @@ class JobQueueDB extends JobQueue {
         * @return void
         */
        protected function doFlushCaches() {
-               global $wgMemc;
-
                foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
-                       $wgMemc->delete( $this->getCacheKey( $type ) );
+                       $this->cache->delete( $this->getCacheKey( $type ) );
                }
        }
 
index 351c71a..85f99b7 100644 (file)
@@ -40,6 +40,7 @@ class JobQueueGroup {
        const TYPE_ANY = 2; // integer; any job
 
        const USE_CACHE = 1; // integer; use process or persistent cache
+       const USE_PRIORITY = 2; // integer; respect deprioritization
 
        const PROC_CACHE_TTL = 15; // integer; seconds
 
@@ -146,6 +147,9 @@ class JobQueueGroup {
         */
        public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
                if ( is_string( $qtype ) ) { // specific job type
+                       if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $qtype ) ) {
+                               return false; // back off
+                       }
                        $job = $this->get( $qtype )->pop();
                        if ( !$job ) {
                                JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
@@ -167,6 +171,9 @@ class JobQueueGroup {
                        shuffle( $types ); // avoid starvation
 
                        foreach ( $types as $type ) { // for each queue...
+                               if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $type ) ) {
+                                       continue; // back off
+                               }
                                $job = $this->get( $type )->pop();
                                if ( $job ) { // found
                                        return $job;
@@ -264,10 +271,15 @@ class JobQueueGroup {
         * @return bool
         */
        public function isQueueDeprioritized( $type ) {
+               if ( $this->cache->has( 'isDeprioritized', $type, 5 ) ) {
+                       return $this->cache->get( 'isDeprioritized', $type );
+               }
                if ( $type === 'refreshLinks2' ) {
                        // Don't keep converting refreshLinks2 => refreshLinks jobs if the
                        // later jobs have not been done yet. This helps throttle queue spam.
-                       return !$this->get( 'refreshLinks' )->isEmpty();
+                       $deprioritized = !$this->get( 'refreshLinks' )->isEmpty();
+                       $this->cache->set( 'isDeprioritized', $type, $deprioritized );
+                       return $deprioritized;
                }
                return false;
        }
index bd23174..1b22c8d 100644 (file)
  *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
  *   - z-delayed    : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
  *   - h-idBySha1   : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
- *   - h-sha1Byid   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ *   - h-sha1ById   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
  *   - h-attempts   : A hash of (job ID => attempt count) used for job claiming/retries
  *   - h-data       : A hash of (job ID => serialized blobs) for job storage
  * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
  * If an ID appears in any of those lists, it should have a h-data entry for its ID.
  * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
- * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1Byid
- * entry and every h-sha1Byid must refer to an ID that is l-unclaimed. If a job has its
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
+ * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
  * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
  *
  * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
@@ -154,6 +154,23 @@ class JobQueueRedis extends JobQueue {
                }
        }
 
+       /**
+        * @see JobQueue::doGetAbandonedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetAbandonedCount() {
+               if ( $this->claimTTL <= 0 ) {
+                       return 0; // no acknowledgements
+               }
+               $conn = $this->getConnection();
+               try {
+                       return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
@@ -180,7 +197,7 @@ class JobQueueRedis extends JobQueue {
                $conn = $this->getConnection();
                try {
                        // Actually push the non-duplicate jobs into the queue...
-                       if ( $flags & self::QoS_Atomic ) {
+                       if ( $flags & self::QOS_ATOMIC ) {
                                $batches = array( $items ); // all or nothing
                        } else {
                                $batches = array_chunk( $items, 500 ); // avoid tying up the server
@@ -424,12 +441,11 @@ LUA;
         * @throws MWException
         */
        protected function doDeduplicateRootJob( Job $job ) {
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+               if ( !$job->hasRootJobParams() ) {
+                       throw new MWException( "Cannot register root job; missing parameters." );
                }
+               $params = $job->getRootJobParams();
+
                $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
 
                $conn = $this->getConnection();
@@ -598,8 +614,9 @@ LUA;
                        local released,abandoned,pruned = 0,0,0
                        -- Get all non-dead jobs that have an expired claim on them.
                        -- The score for each item is the last claim timestamp (UNIX).
-                       local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1],'WITHSCORES')
-                       for id,timestamp in ipairs(staleClaims) do
+                       local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+                       for k,id in ipairs(staleClaims) do
+                               local timestamp = redis.call('zScore',KEYS[1],id)
                                local attempts = redis.call('hGet',KEYS[2],id)
                                if attempts < ARGV[3] then
                                        -- Claim expired and retries left: re-enqueue the job
@@ -615,8 +632,8 @@ LUA;
                        end
                        -- Get all of the dead jobs that have been marked as dead for too long.
                        -- The score for each item is the last claim timestamp (UNIX).
-                       local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2],'WITHSCORES')
-                       for id,timestamp in ipairs(deadClaims) do
+                       local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2])
+                       for k,id in ipairs(deadClaims) do
                                -- Stale and out of retries: remove any traces of the job
                                redis.call('zRem',KEYS[5],id)
                                redis.call('hDel',KEYS[2],id)
index eececcb..f17a1a1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
+ * Wrapper for json_encode and json_decode.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @file
  */
 
-require_once __DIR__ . '/Services_JSON.php';
-
 /**
  * JSON formatter wrapper class
  */
 class FormatJson {
 
+       /**
+        * Skip escaping most characters above U+007F for readability and compactness.
+        * This encoding option saves 3 to 8 bytes (uncompressed) for each such character;
+        * however, it could break compatibility with systems that incorrectly handle UTF-8.
+        *
+        * @since 1.21
+        */
+       const UTF8_OK = 1;
+
+       /**
+        * Skip escaping the characters '<', '>', and '&', which have special meanings in
+        * HTML and XML.
+        *
+        * @warning Do not use this option for JSON that could end up in inline scripts.
+        * - HTML5, §4.3.1.2 Restrictions for contents of script elements
+        * - XML 1.0 (5th Ed.), §2.4 Character Data and Markup
+        *
+        * @since 1.21
+        */
+       const XMLMETA_OK = 2;
+
+       /**
+        * Skip escaping as many characters as reasonably possible.
+        *
+        * @warning When generating inline script blocks, use FormatJson::UTF8_OK instead.
+        *
+        * @since 1.21
+        */
+       const ALL_OK = 3;
+
+       /**
+        * Characters problematic in JavaScript.
+        *
+        * @note These are listed in ECMA-262 (5.1 Ed.), §7.3 Line Terminators along with U+000A (LF)
+        *       and U+000D (CR). However, PHP already escapes LF and CR according to RFC 4627.
+        */
+       private static $badChars = array(
+               "\xe2\x80\xa8", // U+2028 LINE SEPARATOR
+               "\xe2\x80\xa9", // U+2029 PARAGRAPH SEPARATOR
+       );
+
+       /**
+        * Escape sequences for characters listed in FormatJson::$badChars.
+        */
+       private static $badCharsEscaped = array(
+               '\u2028', // U+2028 LINE SEPARATOR
+               '\u2029', // U+2029 PARAGRAPH SEPARATOR
+       );
+
        /**
         * Returns the JSON representation of a value.
         *
-        * @param $value Mixed: the value being encoded. Can be any type except a resource.
-        * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
+        * @note Empty arrays are encoded as numeric arrays, not as objects, so cast any associative
+        *       array that might be empty to an object before encoding it.
         *
-        * @return string
+        * @note In pre-1.21 versions of MediaWiki, using this function for generating inline script
+        *       blocks may result in an XSS vulnerability, and quite likely will in XML documents
+        *       (cf. FormatJson::XMLMETA_OK). Use Xml::encodeJsVar() instead in such cases.
+        *
+        * @param mixed $value The value to encode. Can be any type except a resource.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @param int $escaping Bitfield consisting of _OK class constants
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encode( $value, $pretty = false ) {
-               if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
-                       $json = new Services_JSON();
-                       return $json->encode( $value, $pretty );
-               } else {
-                       return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
+       public static function encode( $value, $pretty = false, $escaping = 0 ) {
+               if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
+                       return self::encode53( $value, $pretty, $escaping );
                }
+               return self::encode54( $value, $pretty, $escaping );
        }
 
        /**
         * Decodes a JSON string.
         *
-        * @param string $value the json string being decoded.
-        * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
+        * @param string $value The JSON string being decoded
+        * @param bool $assoc When true, returned objects will be converted into associative arrays.
         *
-        * @return Mixed: the value encoded in json in appropriate PHP type.
-        * Values true, false and null (case-insensitive) are returned as true, false
-        * and "&null;" respectively. "&null;" is returned if the json cannot be
+        * @return mixed: the value encoded in JSON in appropriate PHP type.
+        * Values `"true"`, `"false"`, and `"null"` (case-insensitive) are returned as `true`, `false`
+        * and `null` respectively. `null` is returned if the JSON cannot be
         * decoded or if the encoded data is deeper than the recursion limit.
         */
        public static function decode( $value, $assoc = false ) {
-               if ( !function_exists( 'json_decode' ) ) {
-                       $json = $assoc ? new Services_JSON( SERVICES_JSON_LOOSE_TYPE ) :
-                               new Services_JSON();
-                       $jsonDec = $json->decode( $value );
-                       return $jsonDec;
-               } else {
-                       return json_decode( $value, $assoc );
+               return json_decode( $value, $assoc );
+       }
+
+       /**
+        * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
+        *
+        * @param mixed $value
+        * @param bool $pretty
+        * @param int $escaping
+        * @return string|bool
+        */
+       private static function encode54( $value, $pretty, $escaping ) {
+               // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
+               // which is hardly useful when '<' and '>' are escaped, and such escaping negatively
+               // impacts the human readability of URLs and similar strings.
+               $options = JSON_UNESCAPED_SLASHES;
+               $options |= $pretty ? JSON_PRETTY_PRINT : 0;
+               $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
+               $options |= ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+               $json = json_encode( $value, $options );
+               if ( $json === false ) {
+                       return false;
+               }
+               if ( $escaping & self::UTF8_OK ) {
+                       $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
                }
+               return $json;
        }
 
+       /**
+        * JSON encoder wrapper for PHP 5.3, which lacks native support for some encoding options.
+        * Therefore, the missing options are implemented here purely in PHP code.
+        *
+        * @param mixed $value
+        * @param bool $pretty
+        * @param int $escaping
+        * @return string|bool
+        */
+       private static function encode53( $value, $pretty, $escaping ) {
+               $options = ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+               $json = json_encode( $value, $options );
+               if ( $json === false ) {
+                       return false;
+               }
+               $json = str_replace( '\\/', '/', $json ); // emulate JSON_UNESCAPED_SLASHES
+               if ( $escaping & self::UTF8_OK ) {
+                       // JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
+                       // indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
+                       // them, we exploit the JSON extension's built-in decoder.
+                       // * We escape the input a second time, so any such sequence becomes \\uDDDD.
+                       // * To avoid interpreting escape sequences that were in the original input,
+                       //   each double-escaped backslash (\\\\) is replaced with \\\u005c.
+                       // * We strip one of the backslashes from each of the escape sequences to unescape.
+                       // * Then the JSON decoder can perform the actual unescaping.
+                       $json = str_replace( "\\\\\\\\", "\\\\\\u005c", addcslashes( $json, '\"' ) );
+                       $json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
+                       $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+               }
+               return $pretty ? self::prettyPrint( $json ) : $json;
+       }
+
+       /**
+        * Adds non-significant whitespace to an existing JSON representation of an object.
+        * Only needed for PHP < 5.4, which lacks the JSON_PRETTY_PRINT option.
+        *
+        * @param string $json
+        * @return string
+        */
+       private static function prettyPrint( $json ) {
+               $buf = '';
+               $indent = 0;
+               $json = strtr( $json, array( '\\\\' => '\\\\', '\"' => "\x01" ) );
+               for ( $i = 0, $n = strlen( $json ); $i < $n; $i += $skip ) {
+                       $skip = 1;
+                       switch ( $json[$i] ) {
+                               case ':':
+                                       $buf .= ': ';
+                                       break;
+                               case '[':
+                               case '{':
+                                       $indent++; // falls through
+                               case ',':
+                                       $buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
+                                       break;
+                               case ']':
+                               case '}':
+                                       $indent--;
+                                       $buf .= "\n" . str_repeat( '    ', $indent ) . $json[$i];
+                                       break;
+                               case '"':
+                                       $skip = strcspn( $json, '"', $i + 1 ) + 2;
+                                       $buf .= substr( $json, $i, $skip );
+                                       break;
+                               default:
+                                       $skip = strcspn( $json, ',]}"', $i + 1 ) + 1;
+                                       $buf .= substr( $json, $i, $skip );
+                       }
+               }
+               return str_replace( "\x01", '\"', preg_replace( '/ +$/m', '', $buf ) );
+       }
 }
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
deleted file mode 100644 (file)
index b7c101a..0000000
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
-* Converts to and from JSON format.
-*
-* JSON (JavaScript Object Notation) is a lightweight data-interchange
-* format. It is easy for humans to read and write. It is easy for machines
-* to parse and generate. It is based on a subset of the JavaScript
-* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
-* This feature can also be found in  Python. JSON is a text format that is
-* completely language independent but uses conventions that are familiar
-* to programmers of the C-family of languages, including C, C++, C#, Java,
-* JavaScript, Perl, TCL, and many others. These properties make JSON an
-* ideal data-interchange language.
-*
-* This package provides a simple encoder and decoder for JSON notation. It
-* is intended for use with client-side Javascript applications that make
-* use of HTTPRequest to perform server communication functions - data can
-* be encoded into JSON notation for use in a client-side javascript, or
-* decoded from incoming Javascript requests. JSON format is native to
-* Javascript, and can be directly eval()'ed with no further parsing
-* overhead
-*
-* All strings should be in ASCII or UTF-8 format!
-*
-* LICENSE: Redistribution and use in source and binary forms, with or
-* without modification, are permitted provided that the following
-* conditions are met: Redistributions of source code must retain the
-* above copyright notice, this list of conditions and the following
-* disclaimer. Redistributions in binary form must reproduce the above
-* copyright notice, this list of conditions and the following disclaimer
-* in the documentation and/or other materials provided with the
-* distribution.
-*
-* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-* DAMAGE.
-*
-* @file
-* @ingroup API
-* @author Michal Migurski <mike-json@teczno.com>
-* @author Matt Knapp <mdknapp[at]gmail[dot]com>
-* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
-* @copyright 2005 Michal Migurski
-* @version CVS: $Id$
-* @license http://www.opensource.org/licenses/bsd-license.php
-* @see http://pear.php.net/pepr/pepr-proposal-show.php?id=198
-*/
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_SLICE',   1);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_STR',  2);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_ARR',  3);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_OBJ',  4);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_CMT', 5);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_LOOSE_TYPE', 16);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
-
-/**
- * Converts to and from JSON format.
- *
- * Brief example of use:
- *
- * <code>
- * // create a new instance of Services_JSON
- * $json = new Services_JSON();
- *
- * // convert a complex value to JSON notation, and send it to the browser
- * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
- * $output = $json->encode($value);
- *
- * print($output);
- * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
- *
- * // accept incoming POST data, assumed to be in JSON notation
- * $input = file_get_contents('php://input', 1000000);
- * $value = $json->decode($input);
- * </code>
- *
- * @ingroup API
- */
-class Services_JSON
-{
-       /**
-        * constructs a new JSON instance
-        *
-        * @param $use Integer: object behavior flags; combine with boolean-OR
-        *
-        *      possible values:
-        *      - SERVICES_JSON_LOOSE_TYPE:  loose typing.
-        *                      "{...}" syntax creates associative arrays
-        *                      instead of objects in decode().
-        *      - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
-        *                      Values which can't be encoded (e.g. resources)
-        *                      appear as NULL instead of throwing errors.
-        *                      By default, a deeply-nested resource will
-        *                      bubble up with an error, so all return values
-        *                      from encode() should be checked with isError()
-        */
-       function __construct($use = 0)
-       {
-               $this->use = $use;
-       }
-
-       private static $mHavePear = null;
-       /**
-        * Returns cached result of class_exists('pear'), to avoid calling AutoLoader numerous times
-        * in cases when PEAR is not present.
-        * @return boolean
-        */
-       private static function pearInstalled() {
-               if ( self::$mHavePear === null ) {
-                       self::$mHavePear = class_exists( 'pear' );
-               }
-               return self::$mHavePear;
-       }
-
-       /**
-        * convert a string from one UTF-16 char to one UTF-8 char
-        *
-        * Normally should be handled by mb_convert_encoding, but
-        * provides a slower PHP-only method for installations
-        * that lack the multibyte string extension.
-        *
-        * @param string $utf16 UTF-16 character
-        * @return String: UTF-8 character
-        * @access private
-        */
-       function utf162utf8($utf16)
-       {
-               // oh please oh please oh please oh please oh please
-               if(function_exists('mb_convert_encoding')) {
-                       return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
-               }
-
-               $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
-
-               switch(true) {
-                       case ((0x7F & $bytes) == $bytes):
-                               // this case should never be reached, because we are in ASCII range
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0x7F & $bytes);
-
-                       case (0x07FF & $bytes) == $bytes:
-                               // return a 2-byte UTF-8 character
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0xC0 | (($bytes >> 6) & 0x1F))
-                                        . chr(0x80 | ($bytes & 0x3F));
-
-                       case (0xFC00 & $bytes) == 0xD800 && strlen($utf16) >= 4 && (0xFC & ord($utf16[2])) == 0xDC:
-                               // return a 4-byte UTF-8 character
-                               $char = ((($bytes & 0x03FF) << 10)
-                                          | ((ord($utf16[2]) & 0x03) << 8)
-                                          | ord($utf16[3]));
-                               $char += 0x10000;
-                               return chr(0xF0 | (($char >> 18) & 0x07))
-                                        . chr(0x80 | (($char >> 12) & 0x3F))
-                                        . chr(0x80 | (($char >> 6) & 0x3F))
-                                        . chr(0x80 | ($char & 0x3F));
-
-                       case (0xFFFF & $bytes) == $bytes:
-                               // return a 3-byte UTF-8 character
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0xE0 | (($bytes >> 12) & 0x0F))
-                                        . chr(0x80 | (($bytes >> 6) & 0x3F))
-                                        . chr(0x80 | ($bytes & 0x3F));
-               }
-
-               // ignoring UTF-32 for now, sorry
-               return '';
-       }
-
-       /**
-        * convert a string from one UTF-8 char to one UTF-16 char
-        *
-        * Normally should be handled by mb_convert_encoding, but
-        * provides a slower PHP-only method for installations
-        * that lack the multibyte string extension.
-        *
-        * @param string $utf8 UTF-8 character
-        * @return String: UTF-16 character
-        * @access private
-        */
-       function utf82utf16($utf8)
-       {
-               // oh please oh please oh please oh please oh please
-               if(function_exists('mb_convert_encoding')) {
-                       return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-               }
-
-               switch(strlen($utf8)) {
-                       case 1:
-                               // this case should never be reached, because we are in ASCII range
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return $utf8;
-
-                       case 2:
-                               // return a UTF-16 character from a 2-byte UTF-8 char
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0x07 & (ord($utf8[0]) >> 2))
-                                        . chr((0xC0 & (ord($utf8[0]) << 6))
-                                                | (0x3F & ord($utf8[1])));
-
-                       case 3:
-                               // return a UTF-16 character from a 3-byte UTF-8 char
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr((0xF0 & (ord($utf8[0]) << 4))
-                                                | (0x0F & (ord($utf8[1]) >> 2)))
-                                        . chr((0xC0 & (ord($utf8[1]) << 6))
-                                                | (0x7F & ord($utf8[2])));
-
-                       case 4:
-                               // return a UTF-16 surrogate pair from a 4-byte UTF-8 char
-                               if(ord($utf8[0]) > 0xF4) return ''; # invalid
-                               $char = ((0x1C0000 & (ord($utf8[0]) << 18))
-                                          | (0x03F000 & (ord($utf8[1]) << 12))
-                                          | (0x000FC0 & (ord($utf8[2]) << 6))
-                                          | (0x00003F & ord($utf8[3])));
-                               if($char > 0x10FFFF) return ''; # invalid
-                               $char -= 0x10000;
-                               return chr(0xD8 | (($char >> 18) & 0x03))
-                                        . chr(($char >> 10) & 0xFF)
-                                        . chr(0xDC | (($char >> 8) & 0x03))
-                                        . chr($char & 0xFF);
-               }
-
-               // ignoring UTF-32 for now, sorry
-               return '';
-       }
-
-       /**
-        * encodes an arbitrary variable into JSON format
-        *
-        * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-        *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a string, note that encode() always expects it
-        *                      to be in ASCII or UTF-8 format!
-        * @param $pretty Boolean: pretty-print output with indents and newlines
-        *
-        * @return mixed JSON string representation of input var or an error if a problem occurs
-        * @access public
-        */
-       function encode($var, $pretty=false)
-       {
-               $this->indent = 0;
-               $this->pretty = $pretty;
-               $this->nameValSeparator = $pretty ? ': ' : ':';
-               return $this->encode2($var);
-       }
-
-       /**
-        * encodes an arbitrary variable into JSON format
-        *
-        * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-        *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a string, note that encode() always expects it
-        *                      to be in ASCII or UTF-8 format!
-        *
-        * @return mixed JSON string representation of input var or an error if a problem occurs
-        * @access private
-        */
-       function encode2($var)
-       {
-               if ($this->pretty) {
-                       $close = "\n" . str_repeat("\t", $this->indent);
-                       $open = $close . "\t";
-                       $mid = ',' . $open;
-               }
-               else {
-                       $open = $close = '';
-                       $mid = ',';
-               }
-
-               switch (gettype($var)) {
-                       case 'boolean':
-                               return $var ? 'true' : 'false';
-
-                       case 'NULL':
-                               return 'null';
-
-                       case 'integer':
-                               return (int) $var;
-
-                       case 'double':
-                       case 'float':
-                               return (float) $var;
-
-                       case 'string':
-                               // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
-                               $ascii = '';
-                               $strlen_var = strlen($var);
-
-                          /*
-                               * Iterate over every character in the string,
-                               * escaping with a slash or encoding to UTF-8 where necessary
-                               */
-                               for ($c = 0; $c < $strlen_var; ++$c) {
-
-                                       $ord_var_c = ord($var[$c]);
-
-                                       switch (true) {
-                                               case $ord_var_c == 0x08:
-                                                       $ascii .= '\b';
-                                                       break;
-                                               case $ord_var_c == 0x09:
-                                                       $ascii .= '\t';
-                                                       break;
-                                               case $ord_var_c == 0x0A:
-                                                       $ascii .= '\n';
-                                                       break;
-                                               case $ord_var_c == 0x0C:
-                                                       $ascii .= '\f';
-                                                       break;
-                                               case $ord_var_c == 0x0D:
-                                                       $ascii .= '\r';
-                                                       break;
-
-                                               case $ord_var_c == 0x22:
-                                               case $ord_var_c == 0x2F:
-                                               case $ord_var_c == 0x5C:
-                                                       // double quote, slash, slosh
-                                                       $ascii .= '\\'.$var[$c];
-                                                       break;
-
-                                               case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
-                                                       // characters U-00000000 - U-0000007F (same as ASCII)
-                                                       $ascii .= $var[$c];
-                                                       break;
-
-                                               case (($ord_var_c & 0xE0) == 0xC0):
-                                                       // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       $char = pack('C*', $ord_var_c, ord($var[$c + 1]));
-                                                       $c += 1;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                                                       break;
-
-                                               case (($ord_var_c & 0xF0) == 0xE0):
-                                                       // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       $char = pack('C*', $ord_var_c,
-                                                                       ord($var[$c + 1]),
-                                                                       ord($var[$c + 2]));
-                                                       $c += 2;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                                                       break;
-
-                                               case (($ord_var_c & 0xF8) == 0xF0):
-                                                       // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       // These will always return a surrogate pair
-                                                       $char = pack('C*', $ord_var_c,
-                                                                       ord($var[$c + 1]),
-                                                                       ord($var[$c + 2]),
-                                                                       ord($var[$c + 3]));
-                                                       $c += 3;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       if($utf16 == '') {
-                                                               $ascii .= '\ufffd';
-                                                       } else {
-                                                               $utf16 = str_split($utf16, 2);
-                                                               $ascii .= sprintf('\u%04s\u%04s', bin2hex($utf16[0]), bin2hex($utf16[1]));
-                                                       }
-                                                       break;
-                                       }
-                               }
-
-                               return '"'.$ascii.'"';
-
-                       case 'array':
-                          /*
-                               * As per JSON spec if any array key is not an integer
-                               * we must treat the the whole array as an object. We
-                               * also try to catch a sparsely populated associative
-                               * array with numeric keys here because some JS engines
-                               * will create an array with empty indexes up to
-                               * max_index which can cause memory issues and because
-                               * the keys, which may be relevant, will be remapped
-                               * otherwise.
-                               *
-                               * As per the ECMA and JSON specification an object may
-                               * have any string as a property. Unfortunately due to
-                               * a hole in the ECMA specification if the key is a
-                               * ECMA reserved word or starts with a digit the
-                               * parameter is only accessible using ECMAScript's
-                               * bracket notation.
-                               */
-
-                               // treat as a JSON object
-                               if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
-                                       $this->indent++;
-                                       $properties = array_map(array($this, 'name_value'),
-                                                               array_keys($var),
-                                                               array_values($var));
-                                       $this->indent--;
-
-                                       foreach($properties as $property) {
-                                               if($this->isError($property)) {
-                                                       return $property;
-                                               }
-                                       }
-
-                                       return '{' . $open . join($mid, $properties) . $close . '}';
-                               }
-
-                               // treat it like a regular array
-                               $this->indent++;
-                               $elements = array_map(array($this, 'encode2'), $var);
-                               $this->indent--;
-
-                               foreach($elements as $element) {
-                                       if($this->isError($element)) {
-                                               return $element;
-                                       }
-                               }
-
-                               return '[' . $open . join($mid, $elements) . $close . ']';
-
-                       case 'object':
-                               $vars = get_object_vars($var);
-
-                               $this->indent++;
-                               $properties = array_map(array($this, 'name_value'),
-                                                       array_keys($vars),
-                                                       array_values($vars));
-                               $this->indent--;
-
-                               foreach($properties as $property) {
-                                       if($this->isError($property)) {
-                                               return $property;
-                                       }
-                               }
-
-                               return '{' . $open . join($mid, $properties) . $close . '}';
-
-                       default:
-                               return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
-                                       ? 'null'
-                                       : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
-               }
-       }
-
-       /**
-        * array-walking function for use in generating JSON-formatted name-value pairs
-        *
-        * @param string $name name of key to use
-        * @param $value Mixed: reference to an array element to be encoded
-        *
-        * @return String: JSON-formatted name-value pair, like '"name":value'
-        * @access private
-        */
-       function name_value($name, $value)
-       {
-               $encoded_value = $this->encode2($value);
-
-               if($this->isError($encoded_value)) {
-                       return $encoded_value;
-               }
-
-               return $this->encode2(strval($name)) . $this->nameValSeparator . $encoded_value;
-       }
-
-       /**
-        * reduce a string by removing leading and trailing comments and whitespace
-        *
-        * @param string $str string value to strip of comments and whitespace
-        *
-        * @return String: string value stripped of comments and whitespace
-        * @access private
-        */
-       function reduce_string($str)
-       {
-               $str = preg_replace(array(
-
-                               // eliminate single line comments in '// ...' form
-                               '#^\s*//(.+)$#m',
-
-                               // eliminate multi-line comments in '/* ... */' form, at start of string
-                               '#^\s*/\*(.+)\*/#Us',
-
-                               // eliminate multi-line comments in '/* ... */' form, at end of string
-                               '#/\*(.+)\*/\s*$#Us'
-
-                       ), '', $str);
-
-               // eliminate extraneous space
-               return trim($str);
-       }
-
-       /**
-        * decodes a JSON string into appropriate variable
-        *
-        * @param string $str JSON-formatted string
-        *
-        * @return mixed number, boolean, string, array, or object
-        *                 corresponding to given JSON input string.
-        *                 See argument 1 to Services_JSON() above for object-output behavior.
-        *                 Note that decode() always returns strings
-        *                 in ASCII or UTF-8 format!
-        * @access public
-        */
-       function decode($str)
-       {
-               $str = $this->reduce_string($str);
-
-               switch (strtolower($str)) {
-                       case 'true':
-                               return true;
-
-                       case 'false':
-                               return false;
-
-                       case 'null':
-                               return null;
-
-                       default:
-                               $m = array();
-
-                               if (is_numeric($str)) {
-                                       // Lookie-loo, it's a number
-
-                                       // This would work on its own, but I'm trying to be
-                                       // good about returning integers where appropriate:
-                                       // return (float)$str;
-
-                                       // Return float or int, as appropriate
-                                       return ((float)$str == (integer)$str)
-                                               ? (integer)$str
-                                               : (float)$str;
-
-                               } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
-                                       // STRINGS RETURNED IN UTF-8 FORMAT
-                                       $delim = substr($str, 0, 1);
-                                       $chrs = substr($str, 1, -1);
-                                       $utf8 = '';
-                                       $strlen_chrs = strlen($chrs);
-
-                                       for ($c = 0; $c < $strlen_chrs; ++$c) {
-
-                                               $substr_chrs_c_2 = substr($chrs, $c, 2);
-                                               $ord_chrs_c = ord($chrs[$c]);
-
-                                               switch (true) {
-                                                       case $substr_chrs_c_2 == '\b':
-                                                               $utf8 .= chr(0x08);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\t':
-                                                               $utf8 .= chr(0x09);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\n':
-                                                               $utf8 .= chr(0x0A);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\f':
-                                                               $utf8 .= chr(0x0C);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\r':
-                                                               $utf8 .= chr(0x0D);
-                                                               ++$c;
-                                                               break;
-
-                                                       case $substr_chrs_c_2 == '\\"':
-                                                       case $substr_chrs_c_2 == '\\\'':
-                                                       case $substr_chrs_c_2 == '\\\\':
-                                                       case $substr_chrs_c_2 == '\\/':
-                                                               if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
-                                                                  ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
-                                                                       $utf8 .= $chrs[++$c];
-                                                               }
-                                                               break;
-
-                                                       case preg_match('/\\\uD[89AB][0-9A-F]{2}\\\uD[C-F][0-9A-F]{2}/i', substr($chrs, $c, 12)):
-                                                               // escaped unicode surrogate pair
-                                                               $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 4), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 8), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 10), 2)));
-                                                               $utf8 .= $this->utf162utf8($utf16);
-                                                               $c += 11;
-                                                               break;
-
-                                                       case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
-                                                               // single, escaped unicode character
-                                                               $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 4), 2)));
-                                                               $utf8 .= $this->utf162utf8($utf16);
-                                                               $c += 5;
-                                                               break;
-
-                                                       case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
-                                                               $utf8 .= $chrs[$c];
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xE0) == 0xC0:
-                                                               // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                                               //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 2);
-                                                               ++$c;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xF0) == 0xE0:
-                                                               // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 3);
-                                                               $c += 2;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xF8) == 0xF0:
-                                                               // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 4);
-                                                               $c += 3;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xFC) == 0xF8:
-                                                               // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 5);
-                                                               $c += 4;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xFE) == 0xFC:
-                                                               // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 6);
-                                                               $c += 5;
-                                                               break;
-
-                                               }
-
-                                       }
-
-                                       return $utf8;
-
-                               } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
-                                       // array, or object notation
-
-                                       if ($str[0] == '[') {
-                                               $stk = array(SERVICES_JSON_IN_ARR);
-                                               $arr = array();
-                                       } else {
-                                               if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                       $stk = array(SERVICES_JSON_IN_OBJ);
-                                                       $obj = array();
-                                               } else {
-                                                       $stk = array(SERVICES_JSON_IN_OBJ);
-                                                       $obj = new stdClass();
-                                               }
-                                       }
-
-                                       array_push($stk, array( 'what'  => SERVICES_JSON_SLICE,
-                                                               'where' => 0,
-                                                               'delim' => false));
-
-                                       $chrs = substr($str, 1, -1);
-                                       $chrs = $this->reduce_string($chrs);
-
-                                       if ($chrs == '') {
-                                               if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                                       return $arr;
-
-                                               } else {
-                                                       return $obj;
-
-                                               }
-                                       }
-
-                                       //print("\nparsing {$chrs}\n");
-
-                                       $strlen_chrs = strlen($chrs);
-
-                                       for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
-                                               $top = end($stk);
-                                               $substr_chrs_c_2 = substr($chrs, $c, 2);
-
-                                               if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
-                                                       // found a comma that is not inside a string, array, etc.,
-                                                       // OR we've reached the end of the character list
-                                                       $slice = substr($chrs, $top['where'], ($c - $top['where']));
-                                                       array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
-                                                       //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                                       if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                                               // we are in an array, so just push an element onto the stack
-                                                               array_push($arr, $this->decode($slice));
-
-                                                       } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                                               // we are in an object, so figure
-                                                               // out the property name and set an
-                                                               // element in an associative array,
-                                                               // for now
-                                                               $parts = array();
-
-                                                               if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                                                       // "name":value pair
-                                                                       $key = $this->decode($parts[1]);
-                                                                       $val = $this->decode($parts[2]);
-
-                                                                       if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                                               $obj[$key] = $val;
-                                                                       } else {
-                                                                               $obj->$key = $val;
-                                                                       }
-                                                               } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                                                       // name:value pair, where name is unquoted
-                                                                       $key = $parts[1];
-                                                                       $val = $this->decode($parts[2]);
-
-                                                                       if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                                               $obj[$key] = $val;
-                                                                       } else {
-                                                                               $obj->$key = $val;
-                                                                       }
-                                                               }
-
-                                                       }
-
-                                               } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
-                                                       // found a quote, and we are not inside a string
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
-                                                       //print("Found start of string at {$c}\n");
-
-                                               } elseif (($chrs[$c] == $top['delim']) &&
-                                                                ($top['what'] == SERVICES_JSON_IN_STR) &&
-                                                                (($chrs[$c - 1] != '\\') ||
-                                                                ($chrs[$c - 1] == '\\' && $chrs[$c - 2] == '\\'))) {
-                                                       // found a quote, we're in a string, and it's not escaped
-                                                       array_pop($stk);
-                                                       //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
-                                               } elseif (($chrs[$c] == '[') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a left-bracket, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
-                                                       //print("Found start of array at {$c}\n");
-
-                                               } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
-                                                       // found a right-bracket, and we're in an array
-                                                       array_pop($stk);
-                                                       //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               } elseif (($chrs[$c] == '{') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a left-brace, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
-                                                       //print("Found start of object at {$c}\n");
-
-                                               } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
-                                                       // found a right-brace, and we're in an object
-                                                       array_pop($stk);
-                                                       //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               } elseif (($substr_chrs_c_2 == '/*') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a comment start, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
-                                                       $c++;
-                                                       //print("Found start of comment at {$c}\n");
-
-                                               } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
-                                                       // found a comment end, and we're in one now
-                                                       array_pop($stk);
-                                                       $c++;
-
-                                                       for ($i = $top['where']; $i <= $c; ++$i)
-                                                               $chrs = substr_replace($chrs, ' ', $i, 1);
-
-                                                       //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               }
-
-                                       }
-
-                                       if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                               return $arr;
-
-                                       } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                               return $obj;
-
-                                       }
-
-                               }
-               }
-       }
-
-       /**
-        * @todo Ultimately, this should just call PEAR::isError()
-        * @return bool
-        */
-       function isError($data, $code = null)
-       {
-               if ( self::pearInstalled() ) {
-                       //avoid some strict warnings on PEAR isError check (looks like http://pear.php.net/bugs/bug.php?id=9950 has been around for some time)
-                       return @PEAR::isError($data, $code);
-               } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
-                               is_subclass_of($data, 'services_json_error'))) {
-                       return true;
-               }
-
-               return false;
-       }
-}
-
-
-// Hide the PEAR_Error variant from Doxygen
-/// @cond
-if (class_exists('PEAR_Error')) {
-
-       /**
-        * @ingroup API
-        */
-       class Services_JSON_Error extends PEAR_Error
-       {
-               function Services_JSON_Error($message = 'unknown error', $code = null,
-                                               $mode = null, $options = null, $userinfo = null)
-               {
-                       parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
-               }
-       }
-
-} else {
-/// @endcond
-
-       /**
-        * @todo Ultimately, this class shall be descended from PEAR_Error
-        * @ingroup API
-        */
-       class Services_JSON_Error
-       {
-               function Services_JSON_Error($message = 'unknown error', $code = null,
-                                               $mode = null, $options = null, $userinfo = null)
-               {
-                       $this->message = $message;
-               }
-
-               function __toString()
-               {
-                       return $this->message;
-               }
-       }
-}
diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php
new file mode 100644 (file)
index 0000000..8a9e6db
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Formatter for delete log 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats delete log entries.
+ *
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+                       if ( count( $this->getMessageParameters() ) < 5 ) {
+                               return "$key-legacy";
+                       }
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               if ( isset( $this->parsedParametersDeleteLog ) ) {
+                       return $this->parsedParametersDeleteLog;
+               }
+
+               $params = parent::getMessageParameters();
+               $subtype = $this->entry->getSubtype();
+               if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+                       // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
+                       // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
+                       if (
+                               ( $subtype === 'event' && count( $params ) === 6 ) ||
+                               ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
+                       ) {
+                               $paramStart = $subtype === 'revision' ? 4 : 3;
+
+                               $old = $this->parseBitField( $params[$paramStart+1] );
+                               $new = $this->parseBitField( $params[$paramStart+2] );
+                               list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+                               $changes = array();
+                               foreach ( $hid as $v ) {
+                                       $changes[] = $this->msg( "$v-hid" )->plain();
+                               }
+                               foreach ( $unhid as $v ) {
+                                       $changes[] = $this->msg( "$v-unhid" )->plain();
+                               }
+                               foreach ( $extra as $v ) {
+                                       $changes[] = $this->msg( $v )->plain();
+                               }
+                               $changeText = $this->context->getLanguage()->listToText( $changes );
+
+                               $newParams = array_slice( $params, 0, 3 );
+                               $newParams[3] = $changeText;
+                               $count = count( explode( ',', $params[$paramStart] ) );
+                               $newParams[4] = $this->context->getLanguage()->formatNum( $count );
+                               return $this->parsedParametersDeleteLog = $newParams;
+                       } else {
+                               return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+                       }
+               }
+
+               return $this->parsedParametersDeleteLog = $params;
+       }
+
+       protected function parseBitField( $string ) {
+               // Input is like ofield=2134 or just the number
+               if ( strpos( $string, 'field=' ) === 1 ) {
+                       list( , $field ) = explode( '=', $string );
+                       return (int) $field;
+               } else {
+                       return (int) $string;
+               }
+       }
+
+       public function getActionLinks() {
+               $user = $this->context->getUser();
+               if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+                       return '';
+               }
+
+               switch ( $this->entry->getSubtype() ) {
+               case 'delete': // Show undelete link
+                       if( $user->isAllowed( 'undelete' ) ) {
+                               $message = 'undeletelink';
+                       } else {
+                               $message = 'undeleteviewlink';
+                       }
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Undelete' ),
+                               $this->msg( $message )->escaped(),
+                               array(),
+                               array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+
+               case 'revision': // If an edit was hidden from a page give a review link to the history
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
+                               return '';
+                       }
+
+                       // Different revision types use different URL params...
+                       $key = $params[3];
+                       // This is a CSV of the IDs
+                       $ids = explode( ',', $params[4] );
+
+                       $links = array();
+
+                       // If there's only one item, we can show a diff link
+                       if ( count( $ids ) == 1 ) {
+                               // Live revision diffs...
+                               if ( $key == 'oldid' || $key == 'revision' ) {
+                                       $links[] = Linker::linkKnown(
+                                               $this->entry->getTarget(),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'diff' => intval( $ids[0] ),
+                                                       'unhide' => 1
+                                               )
+                                       );
+                               // Deleted revision diffs...
+                               } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
+                                       $links[] = Linker::linkKnown(
+                                               SpecialPage::getTitleFor( 'Undelete' ),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
+                                                       'diff'      => 'prev',
+                                                       'timestamp' => $ids[0]
+                                               )
+                                       );
+                               }
+                       }
+
+                       // View/modify link...
+                       $links[] = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => $key,
+                                       'ids' => implode( ',', $ids ),
+                               )
+                       );
+
+                       return $this->msg( 'parentheses' )->rawParams(
+                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
+
+               case 'event': // Hidden log items, give review link
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) ) {
+                               return '';
+                       }
+                       // This is a CSV of the IDs
+                       $query = $params[3];
+                       // Link to each hidden object ID, $params[1] is the url param
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => 'logging',
+                                       'ids' => $query
+                               )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+               default:
+                       return '';
+               }
+       }
+}
index ace26bb..683dc03 100644 (file)
@@ -814,395 +814,3 @@ class LegacyLogFormatter extends LogFormatter {
        }
 }
 
-/**
- * This class formats move log entries.
- * @since 1.19
- */
-class MoveLogFormatter extends LogFormatter {
-       public function getPreloadTitles() {
-               $params = $this->extractParameters();
-               return array( Title::newFromText( $params[3] ) );
-       }
-
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( isset( $params[4] ) && $params[4] === '1' ) {
-                       $key .= '-noredirect';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-               $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
-               $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
-               $params[2] = Message::rawParam( $oldname );
-               $params[3] = Message::rawParam( $newname );
-               return $params;
-       }
-
-       public function getActionLinks() {
-               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
-                       || $this->entry->getSubtype() !== 'move'
-                       || !$this->context->getUser()->isAllowed( 'move' ) )
-               {
-                       return '';
-               }
-
-               $params = $this->extractParameters();
-               $destTitle = Title::newFromText( $params[3] );
-               if ( !$destTitle ) {
-                       return '';
-               }
-
-               $revert = Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Movepage' ),
-                       $this->msg( 'revertmove' )->escaped(),
-                       array(),
-                       array(
-                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
-                               'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
-                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
-                               'wpMovetalk' => 0
-                       )
-               );
-               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-       }
-}
-
-/**
- * This class formats delete log entries.
- * @since 1.19
- */
-class DeleteLogFormatter extends LogFormatter {
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
-                       if ( count( $this->getMessageParameters() ) < 5 ) {
-                               return "$key-legacy";
-                       }
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               if ( isset( $this->parsedParametersDeleteLog ) ) {
-                       return $this->parsedParametersDeleteLog;
-               }
-
-               $params = parent::getMessageParameters();
-               $subtype = $this->entry->getSubtype();
-               if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
-                       // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
-                       // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
-                       if (
-                               ( $subtype === 'event' && count( $params ) === 6 ) ||
-                               ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
-                       ) {
-                               $paramStart = $subtype === 'revision' ? 4 : 3;
-
-                               $old = $this->parseBitField( $params[$paramStart+1] );
-                               $new = $this->parseBitField( $params[$paramStart+2] );
-                               list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
-                               $changes = array();
-                               foreach ( $hid as $v ) {
-                                       $changes[] = $this->msg( "$v-hid" )->plain();
-                               }
-                               foreach ( $unhid as $v ) {
-                                       $changes[] = $this->msg( "$v-unhid" )->plain();
-                               }
-                               foreach ( $extra as $v ) {
-                                       $changes[] = $this->msg( $v )->plain();
-                               }
-                               $changeText = $this->context->getLanguage()->listToText( $changes );
-
-                               $newParams = array_slice( $params, 0, 3 );
-                               $newParams[3] = $changeText;
-                               $count = count( explode( ',', $params[$paramStart] ) );
-                               $newParams[4] = $this->context->getLanguage()->formatNum( $count );
-                               return $this->parsedParametersDeleteLog = $newParams;
-                       } else {
-                               return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
-                       }
-               }
-
-               return $this->parsedParametersDeleteLog = $params;
-       }
-
-       protected function parseBitField( $string ) {
-               // Input is like ofield=2134 or just the number
-               if ( strpos( $string, 'field=' ) === 1 ) {
-                       list( , $field ) = explode( '=', $string );
-                       return (int) $field;
-               } else {
-                       return (int) $string;
-               }
-       }
-
-       public function getActionLinks() {
-               $user = $this->context->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
-                       return '';
-               }
-
-               switch ( $this->entry->getSubtype() ) {
-               case 'delete': // Show undelete link
-                       if( $user->isAllowed( 'undelete' ) ) {
-                               $message = 'undeletelink';
-                       } else {
-                               $message = 'undeleteviewlink';
-                       }
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Undelete' ),
-                               $this->msg( $message )->escaped(),
-                               array(),
-                               array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
-                       );
-                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-
-               case 'revision': // If an edit was hidden from a page give a review link to the history
-                       $params = $this->extractParameters();
-                       if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
-                               return '';
-                       }
-
-                       // Different revision types use different URL params...
-                       $key = $params[3];
-                       // This is a CSV of the IDs
-                       $ids = explode( ',', $params[4] );
-
-                       $links = array();
-
-                       // If there's only one item, we can show a diff link
-                       if ( count( $ids ) == 1 ) {
-                               // Live revision diffs...
-                               if ( $key == 'oldid' || $key == 'revision' ) {
-                                       $links[] = Linker::linkKnown(
-                                               $this->entry->getTarget(),
-                                               $this->msg( 'diff' )->escaped(),
-                                               array(),
-                                               array(
-                                                       'diff' => intval( $ids[0] ),
-                                                       'unhide' => 1
-                                               )
-                                       );
-                               // Deleted revision diffs...
-                               } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
-                                       $links[] = Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Undelete' ),
-                                               $this->msg( 'diff' )->escaped(),
-                                               array(),
-                                               array(
-                                                       'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
-                                                       'diff'      => 'prev',
-                                                       'timestamp' => $ids[0]
-                                               )
-                                       );
-                               }
-                       }
-
-                       // View/modify link...
-                       $links[] = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Revisiondelete' ),
-                               $this->msg( 'revdel-restore' )->escaped(),
-                               array(),
-                               array(
-                                       'target' => $this->entry->getTarget()->getPrefixedText(),
-                                       'type' => $key,
-                                       'ids' => implode( ',', $ids ),
-                               )
-                       );
-
-                       return $this->msg( 'parentheses' )->rawParams(
-                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
-
-               case 'event': // Hidden log items, give review link
-                       $params = $this->extractParameters();
-                       if ( !isset( $params[3] ) ) {
-                               return '';
-                       }
-                       // This is a CSV of the IDs
-                       $query = $params[3];
-                       // Link to each hidden object ID, $params[1] is the url param
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Revisiondelete' ),
-                               $this->msg( 'revdel-restore' )->escaped(),
-                               array(),
-                               array(
-                                       'target' => $this->entry->getTarget()->getPrefixedText(),
-                                       'type' => 'logging',
-                                       'ids' => $query
-                               )
-                       );
-                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-               default:
-                       return '';
-               }
-       }
-}
-
-/**
- * This class formats patrol log entries.
- * @since 1.19
- */
-class PatrolLogFormatter extends LogFormatter {
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( isset( $params[5] ) && $params[5] ) {
-                       $key .= '-auto';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-
-               $target = $this->entry->getTarget();
-               $oldid = $params[3];
-               $revision = $this->context->getLanguage()->formatNum( $oldid, true );
-
-               if ( $this->plaintext ) {
-                       $revlink = $revision;
-               } elseif ( $target->exists() ) {
-                       $query = array(
-                               'oldid' => $oldid,
-                               'diff' => 'prev'
-                       );
-                       $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
-               } else {
-                       $revlink = htmlspecialchars( $revision );
-               }
-
-               $params[3] = Message::rawParam( $revlink );
-               return $params;
-       }
-}
-
-/**
- * This class formats new user log entries.
- * @since 1.19
- */
-class NewUsersLogFormatter extends LogFormatter {
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-               $subtype = $this->entry->getSubtype();
-               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       if ( isset( $params[3] ) ) {
-                               $target = User::newFromId( $params[3] );
-                       } else {
-                               $target = User::newFromName( $this->entry->getTarget()->getText(), false );
-                       }
-                       $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
-                       $params[3] = $target->getName();
-               }
-               return $params;
-       }
-
-       public function getComment() {
-               $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
-               if ( $timestamp < '20080129000000' ) {
-                       # Suppress $comment from old entries (before 2008-01-29),
-                       # not needed and can contain incorrect links
-                       return '';
-               }
-               return parent::getComment();
-       }
-
-       public function getPreloadTitles() {
-               $subtype = $this->entry->getSubtype();
-               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       //add the user talk to LinkBatch for the userLink
-                       return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
-               }
-               return array();
-       }
-}
-
-/**
- * This class formats rights log entries.
- * @since 1.21
- */
-class RightsLogFormatter extends LogFormatter {
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
-               global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
-               if ( !$this->plaintext ) {
-                       $text = $wgContLang->ucfirst( $title->getText() );
-                       $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
-                       if ( count( $parts ) === 2 ) {
-                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                       htmlspecialchars( $title->getPrefixedText() ) );
-
-                               if ( $titleLink !== false ) {
-                                       return $titleLink;
-                               }
-                       }
-               }
-
-               return parent::makePageLink( $title, $parameters );
-       }
-
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-                       $key .= '-legacy';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-
-               // Really old entries
-               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-                       return $params;
-               }
-
-               $oldGroups = $params[3];
-               $newGroups = $params[4];
-
-               // Less old entries
-               if ( $oldGroups === '' ) {
-                       $oldGroups = array();
-               } elseif ( is_string( $oldGroups ) ) {
-                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
-               }
-               if ( $newGroups === '' ) {
-                       $newGroups = array();
-               } elseif ( is_string( $newGroups ) ) {
-                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
-               }
-
-               $userName = $this->entry->getTarget()->getText();
-               if ( !$this->plaintext && count( $oldGroups ) ) {
-                       foreach ( $oldGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
-                       }
-               }
-               if ( !$this->plaintext && count( $newGroups ) ) {
-                       foreach ( $newGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
-                       }
-               }
-
-               $lang = $this->context->getLanguage();
-               if ( count( $oldGroups ) ) {
-                       $params[3] = $lang->listToText( $oldGroups );
-               } else {
-                       $params[3] = $this->msg( 'rightsnone' )->text();
-               }
-               if ( count( $newGroups ) ) {
-                       // Array_values is used here because of bug 42211
-                       // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
-                       $params[4] = $lang->listToText( array_values( $newGroups ) );
-               } else {
-                       $params[4] = $this->msg( 'rightsnone' )->text();
-               }
-
-               return $params;
-       }
-}
diff --git a/includes/logging/MoveLogFormatter.php b/includes/logging/MoveLogFormatter.php
new file mode 100644 (file)
index 0000000..8dafb4a
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Formatter for move log 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats move log entries.
+ *
+ * @since 1.19
+ */
+class MoveLogFormatter extends LogFormatter {
+       public function getPreloadTitles() {
+               $params = $this->extractParameters();
+               return array( Title::newFromText( $params[3] ) );
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( isset( $params[4] ) && $params[4] === '1' ) {
+                       $key .= '-noredirect';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+               $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
+               $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
+               $params[2] = Message::rawParam( $oldname );
+               $params[3] = Message::rawParam( $newname );
+               return $params;
+       }
+
+       public function getActionLinks() {
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $this->entry->getSubtype() !== 'move'
+                       || !$this->context->getUser()->isAllowed( 'move' ) )
+               {
+                       return '';
+               }
+
+               $params = $this->extractParameters();
+               $destTitle = Title::newFromText( $params[3] );
+               if ( !$destTitle ) {
+                       return '';
+               }
+
+               $revert = Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Movepage' ),
+                       $this->msg( 'revertmove' )->escaped(),
+                       array(),
+                       array(
+                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
+                               'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
+                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+                               'wpMovetalk' => 0
+                       )
+               );
+               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+       }
+}
diff --git a/includes/logging/NewUsersLogFormatter.php b/includes/logging/NewUsersLogFormatter.php
new file mode 100644 (file)
index 0000000..ed37b6a
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Formatter for new user log 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats new user log entries.
+ *
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+                       if ( isset( $params[3] ) ) {
+                               $target = User::newFromId( $params[3] );
+                       } else {
+                               $target = User::newFromName( $this->entry->getTarget()->getText(), false );
+                       }
+                       $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
+                       $params[3] = $target->getName();
+               }
+               return $params;
+       }
+
+       public function getComment() {
+               $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
+               if ( $timestamp < '20080129000000' ) {
+                       # Suppress $comment from old entries (before 2008-01-29),
+                       # not needed and can contain incorrect links
+                       return '';
+               }
+               return parent::getComment();
+       }
+
+       public function getPreloadTitles() {
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+                       //add the user talk to LinkBatch for the userLink
+                       return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
+               }
+               return array();
+       }
+}
diff --git a/includes/logging/PatrolLogFormatter.php b/includes/logging/PatrolLogFormatter.php
new file mode 100644 (file)
index 0000000..74ab196
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Formatter for new user log 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats patrol log entries.
+ *
+ * @since 1.19
+ */
+class PatrolLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( isset( $params[5] ) && $params[5] ) {
+                       $key .= '-auto';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               $target = $this->entry->getTarget();
+               $oldid = $params[3];
+               $revision = $this->context->getLanguage()->formatNum( $oldid, true );
+
+               if ( $this->plaintext ) {
+                       $revlink = $revision;
+               } elseif ( $target->exists() ) {
+                       $query = array(
+                               'oldid' => $oldid,
+                               'diff' => 'prev'
+                       );
+                       $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
+               } else {
+                       $revlink = htmlspecialchars( $revision );
+               }
+
+               $params[3] = Message::rawParam( $revlink );
+               return $params;
+       }
+}
diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php
new file mode 100644 (file)
index 0000000..67bd4d0
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Formatter for user rights log 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
+ * @author Alexandre Emsenhuber
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats rights log entries.
+ *
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+       protected function makePageLink( Title $title = null, $parameters = array() ) {
+               global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+               if ( !$this->plaintext ) {
+                       $text = $wgContLang->ucfirst( $title->getText() );
+                       $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+                       if ( count( $parts ) === 2 ) {
+                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+                                       htmlspecialchars( $title->getPrefixedText() ) );
+
+                               if ( $titleLink !== false ) {
+                                       return $titleLink;
+                               }
+                       }
+               }
+
+               return parent::makePageLink( $title, $parameters );
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       $key .= '-legacy';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               // Really old entries
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       return $params;
+               }
+
+               $oldGroups = $params[3];
+               $newGroups = $params[4];
+
+               // Less old entries
+               if ( $oldGroups === '' ) {
+                       $oldGroups = array();
+               } elseif ( is_string( $oldGroups ) ) {
+                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+               }
+               if ( $newGroups === '' ) {
+                       $newGroups = array();
+               } elseif ( is_string( $newGroups ) ) {
+                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+               }
+
+               $userName = $this->entry->getTarget()->getText();
+               if ( !$this->plaintext && count( $oldGroups ) ) {
+                       foreach ( $oldGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+               if ( !$this->plaintext && count( $newGroups ) ) {
+                       foreach ( $newGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+
+               $lang = $this->context->getLanguage();
+               if ( count( $oldGroups ) ) {
+                       $params[3] = $lang->listToText( $oldGroups );
+               } else {
+                       $params[3] = $this->msg( 'rightsnone' )->text();
+               }
+               if ( count( $newGroups ) ) {
+                       // Array_values is used here because of bug 42211
+                       // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
+                       $params[4] = $lang->listToText( array_values( $newGroups ) );
+               } else {
+                       $params[4] = $this->msg( 'rightsnone' )->text();
+               }
+
+               return $params;
+       }
+}
index 46d1b95..e1bacf3 100644 (file)
@@ -65,8 +65,8 @@ class BmpHandler extends BitmapHandler {
                fclose( $f );
 
                // Extract binary form of width and height from the header
-               $w = substr( $header, 18, 4);
-               $h = substr( $header, 22, 4);
+               $w = substr( $header, 18, 4 );
+               $h = substr( $header, 22, 4 );
 
                // Convert the unsigned long 32 bits (little endian):
                try {
index e2dc68b..1d8337d 100644 (file)
@@ -765,16 +765,16 @@ class BitmapHandler extends ImageHandler {
        public function rotate( $file, $params ) {
                global $wgImageMagickConvertCommand;
 
-               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+               $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
                $scene = false;
 
                $scaler = self::getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
-                                       wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+                                       wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
                                        " -rotate -$rotation " .
-                                       wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+                                       wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) ) . " 2>&1";
                                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
                                wfProfileIn( 'convert' );
                                $retval = 0;
index 4698966..0831e68 100644 (file)
@@ -263,7 +263,7 @@ class DjVuImage {
                        $retval = '';
                        $txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
                        wfProfileOut( 'djvutxt' );
-                       if( $retval == 0) {
+                       if( $retval == 0 ) {
                                # Strip some control characters
                                $txt = preg_replace( "/[\013\035\037]/", "", $txt );
                                $reg = <<<EOR
index 1671ab2..98c423f 100644 (file)
@@ -51,11 +51,11 @@ class ExifBitmapHandler extends BitmapHandler {
 
                // Treat Software as a special case because in can contain
                // an array of (SoftwareName, Version).
-               if (isset( $metadata['Software'] )
+               if ( isset( $metadata['Software'] )
                        && is_array( $metadata['Software'] )
-                       && is_array( $metadata['Software'][0])
+                       && is_array( $metadata['Software'][0] )
                        && isset( $metadata['Software'][0][0] )
-                       && isset( $metadata['Software'][0][1])
+                       && isset( $metadata['Software'][0][1] )
                ) {
                        $metadata['Software'] = $metadata['Software'][0][0] . ' (Version '
                                . $metadata['Software'][0][1] . ')';
index 1a7d772..5bcb484 100644 (file)
@@ -79,7 +79,7 @@ class FormatMetadata {
                        }
 
                        //This is done differently as the tag is an array.
-                       if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3) {
+                       if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
                                //hour min sec array
 
                                $h = explode( '/', $vals[0] );
@@ -682,7 +682,7 @@ class FormatMetadata {
                                                $urgency = 'high';
                                        } elseif ( $val == 5 ) {
                                                $urgency = 'normal';
-                                       } elseif ( $val <= 8 && $val > 5) {
+                                       } elseif ( $val <= 8 && $val > 5 ) {
                                                $urgency = 'low';
                                        }
 
index 419afee..6ee0399 100644 (file)
@@ -160,7 +160,7 @@ abstract class ImageHandler extends MediaHandler {
                $width = intval( $width );
 
                # Sanity check $width
-               if( $width <= 0) {
+               if( $width <= 0 ) {
                        wfDebug( __METHOD__ . ": Invalid destination width: $width\n" );
                        return false;
                }
@@ -187,7 +187,7 @@ abstract class ImageHandler extends MediaHandler {
                if ( !$this->normaliseParams( $image, $params ) ) {
                        return false;
                }
-               $url = $script . '&' . wfArrayToCgi( $this->getScriptParams( $params ) );
+               $url = wfAppendQuery( $script, $this->getScriptParams( $params ) );
 
                if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
                        return new ThumbnailImage( $image, $url, false, $params );
index 3551943..cb0fbb3 100644 (file)
@@ -69,18 +69,18 @@ class JpegHandler extends ExifBitmapHandler {
        public function rotate( $file, $params ) {
                global $wgJpegTran;
 
-               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+               $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
 
-               if( $wgJpegTran && is_file( $wgJpegTran ) ){
+               if( $wgJpegTran && is_file( $wgJpegTran ) ) {
                        $cmd = wfEscapeShellArg( $wgJpegTran ) .
                                " -rotate " . wfEscapeShellArg( $rotation ) .
-                               " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
-                               " " . wfEscapeShellArg( $params[ 'srcPath' ] ) .  " 2>&1";
-                               wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
-                               wfProfileIn( 'jpegtran' );
-                               $retval = 0;
-                               $err = wfShellExec( $cmd, $retval, $env );
-                               wfProfileOut( 'jpegtran' );
+                               " -outfile " . wfEscapeShellArg( $params['dstPath'] ) .
+                               " " . wfEscapeShellArg( $params['srcPath'] ) . " 2>&1";
+                       wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+                       wfProfileIn( 'jpegtran' );
+                       $retval = 0;
+                       $err = wfShellExec( $cmd, $retval, $env );
+                       wfProfileOut( 'jpegtran' );
                        if ( $retval !== 0 ) {
                                $this->logErrorForExternalProcess( $retval, $err, $cmd );
                                return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
index b36bfa9..b67f3d3 100644 (file)
@@ -136,7 +136,7 @@ abstract class MediaHandler {
        static function getMetadataVersion() {
                $version = Array( '2' ); // core metadata version
                wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
-               return implode( ';', $version);
+               return implode( ';', $version );
        }
 
        /**
index 1f95bc3..1c2dfdd 100644 (file)
@@ -151,7 +151,12 @@ abstract class MediaTransformOutput {
                if ( $this->isError() ) {
                        return false;
                } elseif ( $this->path === null ) {
-                       return $this->file->getLocalRefPath();
+                       return $this->file->getLocalRefPath(); // assume thumb was not scaled
+               } elseif ( FileBackend::isStoragePath( $this->path ) ) {
+                       $be = $this->file->getRepo()->getBackend();
+                       // The temp file will be process cached by FileBackend
+                       $fsFile = $be->getLocalReference( array( 'src' => $this->path ) );
+                       return $fsFile ? $fsFile->getPath() : false;
                } else {
                        return $this->path; // may return false
                }
index 87f705c..e65a558 100644 (file)
@@ -214,9 +214,9 @@ class PNGMetadataExtractor {
                                                        continue;
                                                }
                                        }
-                                       $finalKeyword = self::$text_chunks[ $items[1] ];
-                                       $text[ $finalKeyword ][ $items[3] ] = $items[5];
-                                       $text[ $finalKeyword ]['_type'] = 'lang';
+                                       $finalKeyword = self::$text_chunks[$items[1]];
+                                       $text[$finalKeyword][$items[3]] = $items[5];
+                                       $text[$finalKeyword]['_type'] = 'lang';
 
                                } else {
                                        // Error reading iTXt chunk
@@ -251,9 +251,9 @@ class PNGMetadataExtractor {
                                        throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
                                }
 
-                               $finalKeyword = self::$text_chunks[ $keyword ];
-                               $text[ $finalKeyword ][ 'x-default' ] = $content;
-                               $text[ $finalKeyword ]['_type'] = 'lang';
+                               $finalKeyword = self::$text_chunks[$keyword];
+                               $text[$finalKeyword]['x-default'] = $content;
+                               $text[$finalKeyword]['_type'] = 'lang';
 
                        } elseif ( $chunk_type == 'zTXt' ) {
                                if ( function_exists( 'gzuncompress' ) ) {
@@ -303,9 +303,9 @@ class PNGMetadataExtractor {
                                                throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
                                        }
 
-                                       $finalKeyword = self::$text_chunks[ $keyword ];
-                                       $text[ $finalKeyword ][ 'x-default' ] = $content;
-                                       $text[ $finalKeyword ]['_type'] = 'lang';
+                                       $finalKeyword = self::$text_chunks[$keyword];
+                                       $text[$finalKeyword]['x-default'] = $content;
+                                       $text[$finalKeyword]['_type'] = 'lang';
 
                                } else {
                                        wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping." );
index e07fd86..f21d6b0 100644 (file)
@@ -179,7 +179,7 @@ class SVGReader {
         * @param string $metafield that we will fill with the result
         */
        private function readField( $name, $metafield=null ) {
-               $this->debug ( "Read field $metafield" );
+               $this->debug( "Read field $metafield" );
                if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
@@ -201,7 +201,7 @@ class SVGReader {
         * @throws MWException
         */
        private function readXml( $metafield=null ) {
-               $this->debug ( "Read top level metadata" );
+               $this->debug( "Read top level metadata" );
                if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
@@ -220,7 +220,7 @@ class SVGReader {
         * @param string $name of the element that we are reading from
         */
        private function animateFilter( $name ) {
-               $this->debug ( "animate filter for tag $name" );
+               $this->debug( "animate filter for tag $name" );
                if( $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
index d9cca3f..081433b 100644 (file)
@@ -993,15 +993,15 @@ class XMPReader {
                if ( $elm !== self::NS_RDF . ' li' ) {
                        throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
                }
-               if ( !isset( $attribs[ self::NS_XML . ' lang'] )
-                       || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[ self::NS_XML . ' lang' ] ) )
+               if ( !isset( $attribs[self::NS_XML . ' lang'] )
+                       || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] ) )
                {
                        throw new MWException( __METHOD__
                                . " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
                }
 
                // Lang is case-insensitive.
-               $this->itemLang = strtolower( $attribs[ self::NS_XML . ' lang' ] );
+               $this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
 
                // need to add curItem[0] on again since one is for the specific item
                // and one is for the entire group.
index b7b35dc..f727400 100644 (file)
@@ -214,7 +214,7 @@ class XMPValidate {
                        // this only validates standalone properties, not arrays, etc
                        return;
                }
-               if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val) ) {
+               if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
                        //this is a rather naive check.
                        wfDebugLog( 'XMP', __METHOD__ . " Expected Lang code but got $val" );
                        $val = null;
index 661e53f..5118366 100644 (file)
@@ -34,9 +34,7 @@ $verbose = true;
 
 if( defined( 'PRETTY_UTF8' ) ) {
        function pretty( $string ) {
-               return preg_replace( '/([\x00-\xff])/e',
-                       'sprintf("%02X", ord("$1"))',
-                       $string );
+               return strtoupper( bin2hex( $string ) );
        }
 } else {
        /**
@@ -44,9 +42,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
         * @return string
         */
        function pretty( $string ) {
-               return trim( preg_replace( '/(.)/use',
-                       'sprintf("%04X ", utf8ToCodepoint("$1"))',
-                       $string ) );
+               return strtoupper( utf8ToHexSequence( $string ) );
        }
 }
 
index 9b96a07..e8fec93 100644 (file)
@@ -76,9 +76,11 @@ function hexSequenceToUtf8( $sequence ) {
  * @private
  */
 function utf8ToHexSequence( $str ) {
-       return rtrim( preg_replace( '/(.)/uSe',
-                                   'sprintf("%04x ", utf8ToCodepoint("$1"))',
-                                   $str ) );
+       $buf = '';
+       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+               $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
+       }
+       return rtrim( $buf );
 }
 
 /**
index 0d96ed6..bc2acb3 100644 (file)
@@ -55,9 +55,9 @@
  *              'compress_threshold' => 10240,
  *              'persistent' => true));
  *
- * $mc->add('key', array('some', 'array'));
- * $mc->replace('key', 'some random string');
- * $val = $mc->get('key');
+ * $mc->add( 'key', array( 'some', 'array' ) );
+ * $mc->replace( 'key', 'some random string' );
+ * $val = $mc->get( 'key' );
  *
  * @author  Ryan T. Dean <rtdean@cytherianage.net>
  * @version 0.1.2
@@ -489,17 +489,17 @@ class MWMemcached {
                        }
                        $key = is_array( $key ) ? $key[1] : $key;
                        if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[ intval( $sock ) ] = array();
+                               $sock_keys[intval( $sock )] = array();
                                $socks[] = $sock;
                        }
-                       $sock_keys[ intval( $sock ) ][] = $key;
+                       $sock_keys[intval( $sock )][] = $key;
                }
 
                $gather = array();
                // Send out the requests
                foreach ( $socks as $sock ) {
                        $cmd = 'gets';
-                       foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
+                       foreach ( $sock_keys[intval( $sock )] as $key ) {
                                $cmd .= ' ' . $key;
                        }
                        $cmd .= "\r\n";
index 87f787d..b6bf3f8 100644 (file)
@@ -222,8 +222,8 @@ class SqlBagOStuff extends BagOStuff {
 
                $dataRows = array();
                foreach ( $keysByTable as $serverIndex => $serverKeys ) {
-                       $db = $this->getDB( $serverIndex );
                        try {
+                               $db = $this->getDB( $serverIndex );
                                foreach ( $serverKeys as $tableName => $tableKeys ) {
                                        $res = $db->select( $tableName,
                                                array( 'keyname', 'value', 'exptime' ),
@@ -244,10 +244,10 @@ class SqlBagOStuff extends BagOStuff {
                        if ( isset( $dataRows[$key] ) ) { // HIT?
                                $row = $dataRows[$key];
                                $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
-                               $db = $this->getDB( $row->serverIndex );
-                               if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
-                                       $this->debug( "get: key has expired, deleting" );
-                                       try {
+                               try {
+                                       $db = $this->getDB( $row->serverIndex );
+                                       if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
+                                               $this->debug( "get: key has expired, deleting" );
                                                $db->begin( __METHOD__ );
                                                # Put the expiry time in the WHERE condition to avoid deleting a
                                                # newly-inserted value
@@ -255,12 +255,12 @@ class SqlBagOStuff extends BagOStuff {
                                                        array( 'keyname' => $key, 'exptime' => $row->exptime ),
                                                        __METHOD__ );
                                                $db->commit( __METHOD__ );
-                                       } catch ( DBQueryError $e ) {
-                                               $this->handleWriteError( $e, $row->serverIndex );
+                                               $values[$key] = false;
+                                       } else { // HIT
+                                               $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
                                        }
-                                       $values[$key] = false;
-                               } else { // HIT
-                                       $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+                               } catch ( DBQueryError $e ) {
+                                       $this->handleWriteError( $e, $row->serverIndex );
                                }
                        } else { // MISS
                                $values[$key] = false;
index 542ac0f..36bfb48 100644 (file)
@@ -555,7 +555,7 @@ class CoreParserFunctions {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canTalk() )
                        return '';
-               return wfEscapeWikiText( $t->getTalkPage()->getPrefixedUrl() );
+               return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
        }
        static function subjectpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
@@ -567,7 +567,7 @@ class CoreParserFunctions {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) )
                        return '';
-               return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedUrl() );
+               return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
        }
 
        /**
@@ -753,7 +753,7 @@ class CoreParserFunctions {
         */
        static function anchorencode( $parser, $text ) {
                $text = $parser->killMarkers( $text );
-               return substr( $parser->guessSectionNameFromWikiText( $text ), 1);
+               return (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
        }
 
        static function special( $parser, $text ) {
index a2da307..08b1f3e 100644 (file)
@@ -337,7 +337,7 @@ class DateFormatter {
        function makeIsoYear( $year ) {
                # Assumes the year is in a nice format, as enforced by the regex
                if ( substr( $year, -2 ) == 'BC' ) {
-                       $num = intval(substr( $year, 0, -3 )) - 1;
+                       $num = intval( substr( $year, 0, -3 ) ) - 1;
                        # PHP bug note: sprintf( "%04d", -1 ) fails poorly
                        $text = sprintf( '-%04d', $num );
 
index 49b2d33..f125510 100644 (file)
@@ -406,7 +406,8 @@ class LinkHolderArray {
                $text = preg_replace_callback(
                        '/(<!--LINK .*?-->)/',
                        $replacer->cb(),
-                       $text);
+                       $text
+               );
 
                wfProfileOut( __METHOD__ . '-replace' );
                wfProfileOut( __METHOD__ );
index 8209f8a..611eb02 100644 (file)
@@ -1252,7 +1252,7 @@ class Parser {
                        ));
                        $titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
                        return'<a href="' .
-                               htmlspecialchars( $titleObj->getLocalUrl() ) .
+                               htmlspecialchars( $titleObj->getLocalURL() ) .
                                "\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
                } else {
                        return $m[0];
@@ -1533,6 +1533,7 @@ class Parser {
 
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
                }
                $s = array_shift( $bits );
@@ -2606,6 +2607,7 @@ class Parser {
                                }
                                break;
                        default:
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
@@ -2756,7 +2758,7 @@ class Parser {
                        case 'talkpagenamee':
                                if ( $this->mTitle->canTalk() ) {
                                        $talkPage = $this->mTitle->getTalkPage();
-                                       $value = wfEscapeWikiText( $talkPage->getPrefixedUrl() );
+                                       $value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
                                } else {
                                        $value = '';
                                }
@@ -2767,10 +2769,10 @@ class Parser {
                                break;
                        case 'subjectpagenamee':
                                $subjPage = $this->mTitle->getSubjectPage();
-                               $value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
+                               $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
                                break;
                        case 'pageid': // requested in bug 23427
-                               $pageid = $this->getTitle()->getArticleId();
+                               $pageid = $this->getTitle()->getArticleID();
                                if( $pageid == 0 ) {
                                        # 0 means the page doesn't exist in the database,
                                        # which means the user is previewing a new page.
@@ -3245,6 +3247,7 @@ class Parser {
                                        $result = $this->callParserFunction( $frame, $func, $funcArgs );
                                } catch ( Exception $ex ) {
                                        wfProfileOut( __METHOD__ . '-pfunc' );
+                                       wfProfileOut( __METHOD__ );
                                        throw $ex;
                                }
 
@@ -3289,7 +3292,7 @@ class Parser {
                if ( !$found && $title ) {
                        if ( !Profiler::instance()->isPersistent() ) {
                                # Too many unique items can kill profiling DBs/collectors
-                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBkey();
                                wfProfileIn( $titleProfileIn ); // template in
                        }
                        wfProfileIn( __METHOD__ . '-loadtpl' );
@@ -3592,7 +3595,7 @@ class Parser {
                }
 
                $dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
-               $this->mTplDomCache[ $titleText ] = $dom;
+               $this->mTplDomCache[$titleText] = $dom;
 
                if ( !$title->equals( $cacheTitle ) ) {
                        $this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
@@ -3775,7 +3778,7 @@ class Parser {
                        return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
                }
 
-               $url = $title->getFullUrl( "action=$action" );
+               $url = $title->getFullURL( "action=$action" );
 
                if ( strlen( $url ) > 255 ) {
                        return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
@@ -3811,8 +3814,8 @@ class Parser {
                $dbw->replace( 'transcache', array( 'tc_url' ), array(
                        'tc_url' => $url,
                        'tc_time' => $dbw->timestamp( time() ),
-                       'tc_contents' => $text)
-               );
+                       'tc_contents' => $text
+               ) );
                return $text;
        }
 
index d0c57ab..7cb91da 100644 (file)
@@ -169,6 +169,10 @@ class Preprocessor_DOM implements Preprocessor {
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
+                       if ( $cacheable ) {
+                               wfProfileOut( __METHOD__ . '-cacheable' );
+                       }
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
@@ -183,6 +187,11 @@ class Preprocessor_DOM implements Preprocessor {
                        // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
                        $result = $dom->loadXML( $xml, 1 << 19 );
                        if ( !$result ) {
+                               wfProfileOut( __METHOD__ . '-loadXML' );
+                               if ( $cacheable ) {
+                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                               }
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( __METHOD__ . ' generated invalid XML' );
                        }
                }
@@ -397,7 +406,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                                                if ( $stack->top ) {
                                                        $part = $stack->top->getCurrentPart();
-                                                       if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+                                                       if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
                                                                $part->visualEnd = $wsStart;
                                                        }
                                                        // Else comments abutting, no change in visual end
@@ -746,7 +755,7 @@ class PPDStack {
                        $class = $this->elementClass;
                        $this->stack[] = new $class( $data );
                }
-               $this->top = $this->stack[ count( $this->stack ) - 1 ];
+               $this->top = $this->stack[count( $this->stack ) - 1];
                $this->accum =& $this->top->getAccum();
        }
 
@@ -757,7 +766,7 @@ class PPDStack {
                $temp = array_pop( $this->stack );
 
                if ( count( $this->stack ) ) {
-                       $this->top = $this->stack[ count( $this->stack ) - 1 ];
+                       $this->top = $this->stack[count( $this->stack ) - 1];
                        $this->accum =& $this->top->getAccum();
                } else {
                        $this->top = self::$false;
@@ -1014,11 +1023,13 @@ class PPFrame_DOM implements PPFrame {
 
                while ( count( $iteratorStack ) > 1 ) {
                        $level = count( $outStack ) - 1;
-                       $iteratorNode =& $iteratorStack[ $level ];
+                       $iteratorNode =& $iteratorStack[$level];
                        $out =& $outStack[$level];
                        $index =& $indexStack[$level];
 
-                       if ( $iteratorNode instanceof PPNode_DOM ) $iteratorNode = $iteratorNode->node;
+                       if ( $iteratorNode instanceof PPNode_DOM ) {
+                               $iteratorNode = $iteratorNode->node;
+                       }
 
                        if ( is_array( $iteratorNode ) ) {
                                if ( $index >= count( $iteratorNode ) ) {
@@ -1148,9 +1159,7 @@ class PPFrame_DOM implements PPFrame {
 
                                        # Insert a heading marker only for <h> children of <root>
                                        # This is to stop extractSections from going over multiple tree levels
-                                       if ( $contextNode->parentNode->nodeName == 'root'
-                                         && $this->parser->ot['html'] )
-                                       {
+                                       if ( $contextNode->parentNode->nodeName == 'root' && $this->parser->ot['html'] ) {
                                                # Insert heading index marker
                                                $headingIndex = $contextNode->getAttribute( 'i' );
                                                $titleText = $this->title->getPrefixedDBkey();
index fad1adb..469ce80 100644 (file)
@@ -332,7 +332,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                                                if ( $stack->top ) {
                                                        $part = $stack->top->getCurrentPart();
-                                                       if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+                                                       if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
                                                                $part->visualEnd = $wsStart;
                                                        }
                                                        // Else comments abutting, no change in visual end
@@ -591,9 +591,19 @@ class Preprocessor_Hash implements Preprocessor {
                                                                $lastNode = $node;
                                                        }
                                                        if ( !$node ) {
+                                                               if ( $cacheable ) {
+                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
+                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                                                               }
+                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
+                                                               if ( $cacheable ) {
+                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
+                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                                                               }
+                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -952,7 +962,7 @@ class PPFrame_Hash implements PPFrame {
 
                while ( count( $iteratorStack ) > 1 ) {
                        $level = count( $outStack ) - 1;
-                       $iteratorNode =& $iteratorStack[ $level ];
+                       $iteratorNode =& $iteratorStack[$level];
                        $out =& $outStack[$level];
                        $index =& $indexStack[$level];
 
index 5ecdc4f..c732b8d 100644 (file)
@@ -537,7 +537,7 @@ class Profiler {
                                $eventCount = $this->mCalls[$name];
                                $timeSum = (float) ($elapsed * 1000);
                                $memorySum = (float)$this->mMemory[$name];
-                               $name = substr($name, 0, 255);
+                               $name = substr( $name, 0, 255 );
 
                                // Kludge
                                $timeSum = ($timeSum >= 0) ? $timeSum : 0;
index abefa81..1cf4fa7 100644 (file)
@@ -58,7 +58,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
                                continue;
                        }
                        $pfline = sprintf( "%s %s %d %f %f %f %f %s\n", $this->getProfileID(), "-", $pfdata['count'],
-                               $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry);
+                               $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry );
                        $length = strlen( $pfline );
                        /* printf("<!-- $pfline -->"); */
                        if ( $length + $plength > 1400 ) {
index 27f682c..5d335b0 100644 (file)
@@ -234,6 +234,7 @@ class ResourceLoader {
                foreach ( $registrations as $name => $info ) {
                        // Disallow duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
+                               wfProfileOut( __METHOD__ );
                                // A module has already been registered by this name
                                throw new MWException(
                                        'ResourceLoader duplicate registration error. ' .
@@ -243,6 +244,7 @@ class ResourceLoader {
 
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
                        }
 
@@ -251,6 +253,7 @@ class ResourceLoader {
                                // Old calling convention
                                // Validate the input
                                if ( !( $info instanceof ResourceLoaderModule ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( 'ResourceLoader invalid module error. ' .
                                                'Instances of ResourceLoaderModule expected.' );
                                }
@@ -286,8 +289,12 @@ class ResourceLoader {
 
                // Add the testrunner (which configures QUnit) to the dependencies.
                // Since it must be ready before any of the test suites are executed.
-               foreach( $testModules['qunit'] as $moduleName => $moduleProps ) {
-                       $testModules['qunit'][$moduleName]['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
+               foreach( $testModules['qunit'] as &$module ) {
+                       // Make sure all test modules are top-loading so that when QUnit starts
+                       // on document-ready, it will run once and finish. If some tests arrive
+                       // later (possibly after QUnit has already finished) they will be ignored.
+                       $module['position'] = 'top';
+                       $module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
                }
 
                foreach( $testModules as $id => $names ) {
@@ -594,6 +601,8 @@ class ResourceLoader {
                                // no matter how often we call ob_get_clean(), so instead of doing
                                // the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
                                // we have to be safe here and avoid an infinite loop.
+                               // Caching the level is not an option, need to allow it to
+                               // shorten the loop on-the-fly (bug 46836)
                                for ( $i = 0; $i < ob_get_level(); $i++ ) {
                                        ob_end_clean();
                                }
@@ -671,8 +680,8 @@ class ResourceLoader {
         * @return String: Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
-               array $modules, $missing = array() )
-       {
+               array $modules, $missing = array()
+       {
                $out = '';
                $exceptions = '';
                if ( $modules === array() && $missing === array() ) {
@@ -863,7 +872,9 @@ class ResourceLoader {
                                // output javascript "[]" instead of "{}". This fixes that.
                                (object)$styles,
                                (object)$messages
-                       ) );
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
@@ -892,7 +903,7 @@ class ResourceLoader {
                        // ResourceLoaderFileModule::getStyle can return the styles
                        // as a string or an array of strings. This is to allow separation in
                        // the front-end.
-                       $styles = (array) $styles;
+                       $styles = (array)$styles;
                        foreach ( $styles as $style ) {
                                $style = trim( $style );
                                // Don't output an empty "@media print { }" block (bug 40498)
@@ -984,12 +995,12 @@ class ResourceLoader {
         * @return string
         */
        public static function makeLoaderRegisterScript( $name, $version = null,
-               $dependencies = null, $group = null, $source = null )
-       {
+               $dependencies = null, $group = null, $source = null
+       {
                if ( is_array( $name ) ) {
                        return Xml::encodeJsCall( 'mw.loader.register', array( $name ) );
                } else {
-                       $version = (int) $version > 1 ? (int) $version : 1;
+                       $version = (int)$version > 1 ? (int)$version : 1;
                        return Xml::encodeJsCall( 'mw.loader.register',
                                array( $name, $version, $dependencies, $group, $source ) );
                }
@@ -1039,7 +1050,7 @@ class ResourceLoader {
         * @return string
         */
        public static function makeConfigSetScript( array $configuration ) {
-               return Xml::encodeJsCall( 'mw.config.set', array( $configuration ) );
+               return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), ResourceLoader::inDebugMode() );
        }
 
        /**
index cedb5dc..2718bcb 100644 (file)
@@ -187,8 +187,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        public function __construct( $options = array(), $localBasePath = null,
-               $remoteBasePath = null )
-       {
+               $remoteBasePath = null
+       {
                global $IP, $wgScriptPath, $wgResourceBasePath;
                $this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
                if ( $remoteBasePath !== null ) {
@@ -209,7 +209,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'debugScripts':
                                case 'loaderScripts':
                                case 'styles':
-                                       $this->{$member} = (array) $option;
+                                       $this->{$member} = (array)$option;
                                        break;
                                // Collated lists of file paths
                                case 'languageScripts':
@@ -228,26 +228,26 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                                                "'$key' given, string expected."
                                                        );
                                                }
-                                               $this->{$member}[$key] = (array) $value;
+                                               $this->{$member}[$key] = (array)$value;
                                        }
                                        break;
                                // Lists of strings
                                case 'dependencies':
                                case 'messages':
                                case 'targets':
-                                       $this->{$member} = (array) $option;
+                                       $this->{$member} = (array)$option;
                                        break;
                                // Single strings
                                case 'group':
                                case 'position':
                                case 'localBasePath':
                                case 'remoteBasePath':
-                                       $this->{$member} = (string) $option;
+                                       $this->{$member} = (string)$option;
                                        break;
                                // Single booleans
                                case 'debugRaw':
                                case 'raw':
-                                       $this->{$member} = (bool) $option;
+                                       $this->{$member} = (bool)$option;
                                        break;
                        }
                }
@@ -481,7 +481,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected static function collateFilePathListByOption( array $list, $option, $default ) {
                $collatedFiles = array();
-               foreach ( (array) $list as $key => $value ) {
+               foreach ( (array)$list as $key => $value ) {
                        if ( is_int( $key ) ) {
                                // File name as the value
                                if ( !isset( $collatedFiles[$default] ) ) {
index 0f8e54c..e840300 100644 (file)
@@ -108,7 +108,7 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return array|int|Mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context ->getLanguage() );
+               $this->language = Language::factory( $context->getLanguage() );
                $cache = wfGetCache( CACHE_ANYTHING );
                $key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
 
index 03f3cc3..f6a7114 100644 (file)
@@ -319,7 +319,7 @@ abstract class ResourceLoaderModule {
                        ), __METHOD__
                );
                if ( !is_null( $deps ) ) {
-                       $this->fileDeps[$skin] = (array) FormatJson::decode( $deps, true );
+                       $this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
                } else {
                        $this->fileDeps[$skin] = array();
                }
index 1cc5c1a..340d7df 100644 (file)
@@ -37,15 +37,19 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
         * @return Array: List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               global $wgHandheldStyle;
+               global $wgUseSiteJs, $wgUseSiteCss, $wgHandheldStyle;
 
-               $pages = array(
-                       'MediaWiki:Common.js' => array( 'type' => 'script' ),
-                       'MediaWiki:Common.css' => array( 'type' => 'style' ),
-                       'MediaWiki:' . ucfirst( $context->getSkin() ) . '.js' => array( 'type' => 'script' ),
-                       'MediaWiki:' . ucfirst( $context->getSkin() ) . '.css' => array( 'type' => 'style' ),
-                       'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
-               );
+               $pages = array();
+               if ( $wgUseSiteJs ) {
+                       $pages['MediaWiki:Common.js'] = array( 'type' => 'script' );
+                       $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = array( 'type' => 'script' );
+               }
+               if ( $wgUseSiteCss ) {
+                       $pages['MediaWiki:Common.css'] = array( 'type' => 'style' );
+                       $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = array( 'type' => 'style' );
+
+               }
+               $pages['MediaWiki:Print.css'] = array( 'type' => 'style', 'media' => 'print' );
                if ( $wgHandheldStyle ) {
                        $pages['MediaWiki:Handheld.css'] = array(
                                'type' => 'style',
index 32cf6b2..5919cde 100644 (file)
@@ -27,6 +27,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        /* Protected Members */
 
        protected $modifiedTime = array();
+       protected $targets = array( 'desktop', 'mobile' );
 
        /* Protected Methods */
 
@@ -184,7 +185,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               global $IP, $wgLoadScript, $wgLegacyJavaScriptGlobals;
+               global $IP, $wgLegacyJavaScriptGlobals;
 
                $out = file_get_contents( "$IP/resources/startup.js" );
                if ( $context->getOnly() === 'scripts' ) {
@@ -224,7 +225,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                "};\n";
 
                        // Conditional script injection
-                       $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCgi( $query ) );
+                       $scriptTag = Html::linkedScript( wfAppendQuery( wfScript( 'load' ), $query ) );
                        $out .= "if ( isCompatible() ) {\n" .
                                "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
                                "}\n" .
index bdb240e..9795cd0 100644 (file)
@@ -56,43 +56,44 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
        public function getStyles( ResourceLoaderContext $context ) {
                global $wgAllowUserCssPrefs, $wgUser;
 
-               if ( $wgAllowUserCssPrefs ) {
-                       $options = $wgUser->getOptions();
+               if ( !$wgAllowUserCssPrefs ) {
+                       return array();
+               }
 
-                       // Build CSS rules
-                       $rules = array();
+               $options = $wgUser->getOptions();
 
-                       // Underline: 2 = browser default, 1 = always, 0 = never
-                       if ( $options['underline'] < 2 ) {
-                               $rules[] = "a { text-decoration: " .
-                                       ( $options['underline'] ? 'underline' : 'none' ) . "; }";
-                       } else {
-                               # The scripts of these languages are very hard to read with underlines
-                               $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
-                               'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
-                       }
-                       if ( $options['justify'] ) {
-                               $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
-                       }
-                       if ( !$options['showtoc'] ) {
-                               $rules[] = "#toc { display: none; }\n";
-                       }
-                       if ( !$options['editsection'] ) {
-                               $rules[] = ".editsection { display: none; }\n";
-                       }
-                       if ( $options['editfont'] !== 'default' ) {
-                               // Double-check that $options['editfont'] consists of safe characters only
-                               if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
-                                       $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
-                               }
-                       }
-                       $style = implode( "\n", $rules );
-                       if ( $this->getFlip( $context ) ) {
-                               $style = CSSJanus::transform( $style, true, false );
+               // Build CSS rules
+               $rules = array();
+
+               // Underline: 2 = browser default, 1 = always, 0 = never
+               if ( $options['underline'] < 2 ) {
+                       $rules[] = "a { text-decoration: " .
+                               ( $options['underline'] ? 'underline' : 'none' ) . "; }";
+               } else {
+                       # The scripts of these languages are very hard to read with underlines
+                       $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
+                       'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
+               }
+               if ( $options['justify'] ) {
+                       $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+               }
+               if ( !$options['showtoc'] ) {
+                       $rules[] = "#toc { display: none; }\n";
+               }
+               if ( !$options['editsection'] ) {
+                       $rules[] = ".editsection { display: none; }\n";
+               }
+               if ( $options['editfont'] !== 'default' ) {
+                       // Double-check that $options['editfont'] consists of safe characters only
+                       if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
+                               $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
                        }
-                       return array( 'all' => $style );
                }
-               return array();
+               $style = implode( "\n", $rules );
+               if ( $this->getFlip( $context ) ) {
+                       $style = CSSJanus::transform( $style, true, false );
+               }
+               return array( 'all' => $style );
        }
 
        /**
index 1316f42..7586bb7 100644 (file)
@@ -33,12 +33,15 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               global $wgUser;
+               global $wgUser, $wgUseSiteJs, $wgUseSiteCss;
 
                $userName = $context->getUser();
                if ( $userName === null ) {
                        return array();
                }
+               if ( !$wgUseSiteJs && !$wgUseSiteCss ) {
+                       return array();
+               }
 
                // Use $wgUser is possible; allows to skip a lot of code
                if ( is_object( $wgUser ) && $wgUser->getName() == $userName ) {
@@ -55,8 +58,12 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
                        if ( in_array( $group, array( '*', 'user' ) ) ) {
                                continue;
                        }
-                       $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
-                       $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+                       if ( $wgUseSiteJs ) {
+                               $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
+                       }
+                       if ( $wgUseSiteCss ) {
+                               $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+                       }
                }
                return $pages;
        }
index 177302c..7a04e47 100644 (file)
@@ -35,11 +35,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
+               global $wgAllowUserJs, $wgAllowUserCss;
                $username = $context->getUser();
 
                if ( $username === null ) {
                        return array();
                }
+               if ( !$wgAllowUserJs && !$wgAllowUserCss ) {
+                       return array();
+               }
 
                // Get the normalized title of the user's user page
                $userpageTitle = Title::makeTitleSafe( NS_USER, $username );
@@ -50,14 +54,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
                $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
 
-               $pages = array(
-                       "$userpage/common.js" => array( 'type' => 'script' ),
-                       "$userpage/" . $context->getSkin() . '.js' =>
-                               array( 'type' => 'script' ),
-                       "$userpage/common.css" => array( 'type' => 'style' ),
-                       "$userpage/" . $context->getSkin() . '.css' =>
-                               array( 'type' => 'style' ),
-               );
+               $pages = array();
+               if ( $wgAllowUserJs ) {
+                       $pages["$userpage/common.js"] = array( 'type' => 'script' );
+                       $pages["$userpage/" . $context->getSkin() . '.js'] = array( 'type' => 'script' );
+               }
+               if ( $wgAllowUserCss ) {
+                       $pages["$userpage/common.css"] = array( 'type' => 'style' );
+                       $pages["$userpage/" . $context->getSkin() . '.css'] = array( 'type' => 'style' );
+               }
 
                // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
                // we need to exclude that page from this module. In that case, the excludepage
index 4624cbc..0b7e196 100644 (file)
@@ -56,7 +56,9 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
        public function getScript( ResourceLoaderContext $context ) {
                global $wgUser;
                return Xml::encodeJsCall( 'mw.user.options.set',
-                       array( $wgUser->getOptions() ) );
+                       array( $wgUser->getOptions() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index 6d787c5..92ebbe9 100644 (file)
@@ -35,10 +35,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        /**
         * Fetch the tokens for the current user.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Array: List of tokens keyed by token type
+        * @return array: List of tokens keyed by token type
         */
-       protected function contextUserTokens( ResourceLoaderContext $context ) {
+       protected function contextUserTokens() {
                global $wgUser;
 
                return array(
@@ -54,7 +53,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall( 'mw.user.tokens.set',
-                       array( $this->contextUserTokens( $context ) ) );
+                       array( $this->contextUserTokens() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index 1ace383..ae5d934 100644 (file)
@@ -242,8 +242,7 @@ class RevDel_RevisionItem extends RevDel_Item {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->list->msg( 'diff' )->escaped();
                } else {
-                       return
-                               Linker::linkKnown(
+                       return Linker::linkKnown(
                                        $this->list->title,
                                        $this->list->msg( 'diff' )->escaped(),
                                        array(),
index b2108de..fcbec9e 100644 (file)
@@ -68,7 +68,7 @@ abstract class RevDel_List extends RevisionListBase {
 
                for ( $this->reset(); $this->current(); $this->next() ) {
                        $item = $this->current();
-                       unset( $missing[ $item->getId() ] );
+                       unset( $missing[$item->getId()] );
 
                        $oldBits = $item->getBits();
                        // Build the actual new rev_deleted bitfield
index fe351c5..d2e10e1 100644 (file)
@@ -40,7 +40,7 @@ class RevisionDeleter {
         */
        protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
                if( $diff & $field ) {
-                       $arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
+                       $arr[( $new & $field ) ? 0 : 1][] = $desc;
                }
        }
 
index 4a501fd..605a71b 100644 (file)
@@ -99,7 +99,7 @@ class SearchMySQL extends SearchEngine {
                                $strippedVariants = array_unique( $strippedVariants );
 
                                $searchon .= $modifier;
-                               if( count( $strippedVariants) > 1 )
+                               if( count( $strippedVariants ) > 1 )
                                        $searchon .= '(';
                                foreach( $strippedVariants as $stripped ) {
                                        $stripped = $this->normalizeText( $stripped );
@@ -111,7 +111,7 @@ class SearchMySQL extends SearchEngine {
                                        }
                                        $searchon .= "$quote$stripped$quote$wildcard ";
                                }
-                               if( count( $strippedVariants) > 1 )
+                               if( count( $strippedVariants ) > 1 )
                                        $searchon .= ')';
 
                                // Match individual terms or quoted phrase in result highlighting...
index b0ea97f..dd152f7 100644 (file)
  */
 class SearchOracle extends SearchEngine {
 
-       private $reservedWords = array ('ABOUT' => 1,
-                                                                       'ACCUM' => 1,
-                                                                       'AND' => 1,
-                                                                       'BT' => 1,
-                                                                       'BTG' => 1,
-                                                                       'BTI' => 1,
-                                                                       'BTP' => 1,
-                                                                       'FUZZY' => 1,
-                                                                       'HASPATH' => 1,
-                                                                       'INPATH' => 1,
-                                                                       'MINUS' => 1,
-                                                                       'NEAR' => 1,
-                                                                       'NOT' => 1,
-                                                                       'NT' => 1,
-                                                                       'NTG' => 1,
-                                                                       'NTI' => 1,
-                                                                       'NTP' => 1,
-                                                                       'OR' => 1,
-                                                                       'PT' => 1,
-                                                                       'RT' => 1,
-                                                                       'SQE' => 1,
-                                                                       'SYN' => 1,
-                                                                       'TR' => 1,
-                                                                       'TRSYN' => 1,
-                                                                       'TT' => 1,
-                                                                       'WITHIN' => 1);
+       private $reservedWords = array(
+               'ABOUT' => 1,
+               'ACCUM' => 1,
+               'AND' => 1,
+               'BT' => 1,
+               'BTG' => 1,
+               'BTI' => 1,
+               'BTP' => 1,
+               'FUZZY' => 1,
+               'HASPATH' => 1,
+               'INPATH' => 1,
+               'MINUS' => 1,
+               'NEAR' => 1,
+               'NOT' => 1,
+               'NT' => 1,
+               'NTG' => 1,
+               'NTI' => 1,
+               'NTP' => 1,
+               'OR' => 1,
+               'PT' => 1,
+               'RT' => 1,
+               'SQE' => 1,
+               'SYN' => 1,
+               'TR' => 1,
+               'TRSYN' => 1,
+               'TT' => 1,
+               'WITHIN' => 1,
+       );
 
        /**
         * Creates an instance of this class
@@ -199,8 +201,8 @@ class SearchOracle extends SearchEngine {
                                // Search terms in all variant forms, only
                                // apply on wiki with LanguageConverter
                                $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
-                               if( is_array( $temp_terms )) {
-                                       $temp_terms = array_unique( array_values( $temp_terms ));
+                               if( is_array( $temp_terms ) ) {
+                                       $temp_terms = array_unique( array_values( $temp_terms ) );
                                        foreach( $temp_terms as $t ) {
                                                $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $t );
                                        }
@@ -227,9 +229,9 @@ class SearchOracle extends SearchEngine {
        private function escapeTerm( $t ) {
                global $wgContLang;
                $t = $wgContLang->normalizeForSearch( $t );
-               $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{'.$t.'}' : $t;
-               $t = preg_replace('/^"(.*)"$/', '($1)', $t);
-               $t = preg_replace('/([-&|])/', '\\\\$1', $t);
+               $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t;
+               $t = preg_replace( '/^"(.*)"$/', '($1)', $t );
+               $t = preg_replace( '/([-&|])/', '\\\\$1', $t );
                return $t;
        }
        /**
index 56464e9..b8d5dc1 100644 (file)
@@ -86,18 +86,18 @@ class SearchPostgres extends SearchEngine {
                wfDebug( "parseQuery received: $term \n" );
 
                ## No backslashes allowed
-               $term = preg_replace('/\\\/', '', $term);
+               $term = preg_replace( '/\\\/', '', $term );
 
                ## Collapse parens into nearby words:
-               $term = preg_replace('/\s*\(\s*/', ' (', $term);
-               $term = preg_replace('/\s*\)\s*/', ') ', $term);
+               $term = preg_replace( '/\s*\(\s*/', ' (', $term );
+               $term = preg_replace( '/\s*\)\s*/', ') ', $term );
 
                ## Treat colons as word separators:
-               $term = preg_replace('/:/', ' ', $term);
+               $term = preg_replace( '/:/', ' ', $term );
 
                $searchstring = '';
                $m = array();
-               if( preg_match_all('/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
+               if( preg_match_all( '/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
                        foreach( $m as $terms ) {
                                if ( strlen( $terms[1] ) ) {
                                        $searchstring .= ' & !';
@@ -118,19 +118,19 @@ class SearchPostgres extends SearchEngine {
                }
 
                ## Strip out leading junk
-               $searchstring = preg_replace('/^[\s\&\|]+/', '', $searchstring);
+               $searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
 
                ## Remove any doubled-up operators
-               $searchstring = preg_replace('/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring);
+               $searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
 
                ## Remove any non-spaced operators (e.g. "Zounds!")
-               $searchstring = preg_replace('/([^ ])[\!\&\|]/', "$1", $searchstring);
+               $searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
 
                ## Remove any trailing whitespace or operators
-               $searchstring = preg_replace('/[\s\!\&\|]+$/', '', $searchstring);
+               $searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
 
                ## Remove unnecessary quotes around everything
-               $searchstring = preg_replace('/^[\'"](.*)[\'"]$/', "$1", $searchstring);
+               $searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
 
                ## Quote the whole thing
                $searchstring = $this->db->addQuotes( $searchstring );
@@ -169,7 +169,7 @@ class SearchPostgres extends SearchEngine {
                }
                else {
                        $m = array();
-                       if( preg_match_all("/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
+                       if( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
                                foreach( $m as $terms ) {
                                        $this->searchTerms[$terms[1]] = $terms[1];
                                }
index f3f4788..ee30d9b 100644 (file)
@@ -101,7 +101,7 @@ class SearchSqlite extends SearchEngine {
                                $strippedVariants = array_unique( $strippedVariants );
 
                                $searchon .= $modifier;
-                               if( count( $strippedVariants) > 1 )
+                               if( count( $strippedVariants ) > 1 )
                                        $searchon .= '(';
                                foreach( $strippedVariants as $stripped ) {
                                        if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
@@ -112,7 +112,7 @@ class SearchSqlite extends SearchEngine {
                                        }
                                        $searchon .= "$quote$stripped$quote$wildcard ";
                                }
-                               if( count( $strippedVariants) > 1 )
+                               if( count( $strippedVariants ) > 1 )
                                        $searchon .= ')';
 
                                // Match individual terms or quoted phrase in result highlighting...
index eabcda3..35199d6 100644 (file)
@@ -66,7 +66,7 @@ class SearchUpdate implements DeferrableUpdate {
                $lc = SearchEngine::legalSearchChars() . '&#;';
 
                if( $this->mText === false ) {
-                       $search->updateTitle($this->mId,
+                       $search->updateTitle( $this->mId,
                                $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
                        wfProfileOut( __METHOD__ );
                        return;
index 0509272..4cd48b8 100644 (file)
@@ -130,7 +130,7 @@ class MediaWikiSite extends Site {
                                // Also consider smaxage if maxage is used.
                        );
 
-                       $url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+                       $url = wfAppendQuery( $this->getFileUrl( wfScript( 'api' ) ), $args );
 
                        // Go on call the external site
                        //@todo: we need a good way to specify a timeout here.
@@ -185,7 +185,7 @@ class MediaWikiSite extends Site {
                // the single page in the "pages" substructure.
                if ( isset( $externalData['query']['pages'] ) ) {
                        $pages = array_values( $externalData['query']['pages'] );
-                       if ( count( $pages) === 1 ) {
+                       if ( count( $pages ) === 1 ) {
                                return $pages[0];
                        }
                }
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
deleted file mode 100644 (file)
index c9c82ad..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-/**
- * Implements Special:Activeusers
- *
- * Copyright © 2008 Aaron Schulz
- *
- * 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
- */
-
-/**
- * This class is used to get a list of active users. The ones with specials
- * rights (sysop, bureaucrat, developer) will have them displayed
- * next to their names.
- *
- * @ingroup SpecialPage
- */
-class ActiveUsersPager extends UsersPager {
-
-       /**
-        * @var FormOptions
-        */
-       protected $opts;
-
-       /**
-        * @var Array
-        */
-       protected $hideGroups = array();
-
-       /**
-        * @var Array
-        */
-       protected $hideRights = array();
-
-       /**
-        * @param $context IContextSource
-        * @param $group null Unused
-        * @param string $par Parameter passed to the page
-        */
-       function __construct( IContextSource $context = null, $group = null, $par = null ) {
-               global $wgActiveUserDays;
-
-               parent::__construct( $context );
-
-               $this->RCMaxAge = $wgActiveUserDays;
-               $un = $this->getRequest()->getText( 'username', $par );
-               $this->requestedUser = '';
-               if ( $un != '' ) {
-                       $username = Title::makeTitleSafe( NS_USER, $un );
-                       if( !is_null( $username ) ) {
-                               $this->requestedUser = $username->getText();
-                       }
-               }
-
-               $this->setupOptions();
-       }
-
-       public function setupOptions() {
-               $this->opts = new FormOptions();
-
-               $this->opts->add( 'hidebots', false, FormOptions::BOOL );
-               $this->opts->add( 'hidesysops', false, FormOptions::BOOL );
-
-               $this->opts->fetchValuesFromRequest( $this->getRequest() );
-
-               if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
-                       $this->hideRights[] = 'bot';
-               }
-               if ( $this->opts->getValue( 'hidesysops' ) == 1 ) {
-                       $this->hideGroups[] = 'sysop';
-               }
-       }
-
-       function getIndexField() {
-               return 'rc_user_text';
-       }
-
-       function getQueryInfo() {
-               $dbr = wfGetDB( DB_SLAVE );
-               $conds = array( 'rc_user > 0' ); // Users - no anons
-               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
-                       $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
-               }
-               $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
-               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
-                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
-
-               if( $this->requestedUser != '' ) {
-                       $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
-               }
-
-               return array(
-                       'tables' => array( 'recentchanges', 'ipblocks' ),
-                       'fields' => array(
-                               'user_name' => 'rc_user_text', // for Pager inheritance
-                               'rc_user_text', // for Pager
-                               'user_id' => 'rc_user',
-                               'recentedits' => 'COUNT(*)',
-                               'ipb_deleted' => 'MAX(ipb_deleted)'
-                       ),
-                       'options' => array(
-                               'GROUP BY' => array( 'rc_user_text', 'user_id' ),
-                               'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
-                       ),
-                       'join_conds' => array( // check for suppression blocks
-                               'ipblocks' => array( 'LEFT JOIN', array(
-                                       'rc_user=ipb_user',
-                                       'ipb_auto' => 0 # avoid duplicate blocks
-                               )),
-                       ),
-                       'conds' => $conds
-               );
-       }
-
-       function formatRow( $row ) {
-               $userName = $row->user_name;
-
-               $ulinks = Linker::userLink( $row->user_id, $userName );
-               $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
-
-               $lang = $this->getLanguage();
-
-               $list = array();
-               $user = User::newFromId( $row->user_id );
-
-               // User right filter
-               foreach( $this->hideRights as $right ) {
-                       // Calling User::getRights() within the loop so that
-                       // if the hideRights() filter is empty, we don't have to
-                       // trigger the lazy-init of the big userrights array in the
-                       // User object
-                       if ( in_array( $right, $user->getRights() ) ) {
-                               return '';
-                       }
-               }
-
-               // User group filter
-               // Note: This is a different loop than for user rights,
-               // because we're reusing it to build the group links
-               // at the same time
-               foreach( $user->getGroups() as $group ) {
-                       if ( in_array( $group, $this->hideGroups ) ) {
-                               return '';
-                       }
-                       $list[] = self::buildGroupLink( $group, $userName );
-               }
-
-               $groups = $lang->commaList( $list );
-
-               $item = $lang->specialList( $ulinks, $groups );
-               if( $row->ipb_deleted ) {
-                       $item = "<span class=\"deleted\">$item</span>";
-               }
-               $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
-                       ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
-               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
-
-               return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
-       }
-
-       function getPageHeader() {
-               global $wgScript;
-
-               $self = $this->getTitle();
-               $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
-
-               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
-               $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
-               $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
-
-               $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
-
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
-                       'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
-
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
-                       'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
-
-               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";# Submit button and form bottom
-               $out .= Xml::closeElement( 'fieldset' );
-               $out .= Xml::closeElement( 'form' );
-
-               return $out;
-       }
-}
-
-/**
- * @ingroup SpecialPage
- */
-class SpecialActiveUsers extends SpecialPage {
-
-       /**
-        * Constructor
-        */
-       public function __construct() {
-               parent::__construct( 'Activeusers' );
-       }
-
-       /**
-        * Show the special page
-        *
-        * @param $par Mixed: parameter passed to the page or null
-        */
-       public function execute( $par ) {
-               global $wgActiveUserDays;
-
-               $this->setHeaders();
-               $this->outputHeader();
-
-               $out = $this->getOutput();
-               $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
-                       array( 'activeusers-intro', $this->getLanguage()->formatNum( $wgActiveUserDays ) ) );
-
-               $up = new ActiveUsersPager( $this->getContext(), null, $par );
-
-               # getBody() first to check, if empty
-               $usersbody = $up->getBody();
-
-               $out->addHTML( $up->getPageHeader() );
-               if ( $usersbody ) {
-                       $out->addHTML(
-                               $up->getNavigationBar() .
-                               Html::rawElement( 'ul', array(), $usersbody ) .
-                               $up->getNavigationBar()
-                       );
-               } else {
-                       $out->addWikiMsg( 'activeusers-noresult' );
-               }
-       }
-
-       protected function getGroupName() {
-               return 'users';
-       }
-}
index a60c8ef..855d409 100644 (file)
@@ -53,7 +53,7 @@ class SpecialAllmessages extends SpecialPage {
                $this->setHeaders();
 
                global $wgUseDatabaseMessages;
-               if( !$wgUseDatabaseMessages ) {
+               if ( !$wgUseDatabaseMessages ) {
                        $out->addWikiMsg( 'allmessagesnotsupportedDB' );
                        return;
                } else {
@@ -121,15 +121,15 @@ class AllmessagesTablePager extends TablePager {
                $request = $this->getRequest();
 
                $this->filter = $request->getVal( 'filter', 'all' );
-               if( $this->filter === 'all' ) {
+               if ( $this->filter === 'all' ) {
                        $this->custom = null; // So won't match in either case
                } else {
-                       $this->custom = ($this->filter == 'unmodified');
+                       $this->custom = ( $this->filter == 'unmodified' );
                }
 
                $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
                $prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
-               if( $prefix !== null ) {
+               if ( $prefix !== null ) {
                        $this->displayPrefix = $prefix->getDBkey();
                        $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
                } else {
@@ -139,7 +139,7 @@ class AllmessagesTablePager extends TablePager {
 
                // The suffix that may be needed for message names if we're in a
                // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
-               if( $this->foreign ) {
+               if ( $this->foreign ) {
                        $this->suffix = '/' . $this->langcode;
                } else {
                        $this->suffix = '';
@@ -159,36 +159,36 @@ class AllmessagesTablePager extends TablePager {
                        Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
                        '<tr>
                                <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
-                               "</td>\n
-                               <td class=\"mw-input\">" .
-                                       Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
-                               "</td>\n
+                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+                       "</td>\n
+                       <td class=\"mw-input\">" .
+                       Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
+                       "</td>\n
                        </tr>
                        <tr>\n
-                               <td class='mw-label'>" .
-                                       $this->msg( 'allmessages-filter' )->escaped() .
-                               "</td>\n
+                       <td class='mw-label'>" .
+                       $this->msg( 'allmessages-filter' )->escaped() .
+                       "</td>\n
                                <td class='mw-input'>" .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
-                                               'filter',
-                                               'unmodified',
-                                               'mw-allmessages-form-filter-unmodified',
-                                               ( $this->filter == 'unmodified' )
-                                       ) .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
-                                               'filter',
-                                               'all',
-                                               'mw-allmessages-form-filter-all',
-                                               ( $this->filter == 'all' )
-                                       ) .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
-                                               'filter',
-                                               'modified',
-                                               'mw-allmessages-form-filter-modified',
-                                       ( $this->filter == 'modified' )
-                               ) .
-                               "</td>\n
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+                               'filter',
+                               'unmodified',
+                               'mw-allmessages-form-filter-unmodified',
+                               ( $this->filter == 'unmodified' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+                               'filter',
+                               'all',
+                               'mw-allmessages-form-filter-all',
+                               ( $this->filter == 'all' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+                               'filter',
+                               'modified',
+                               'mw-allmessages-form-filter-modified',
+                               ( $this->filter == 'modified' )
+                       ) .
+                       "</td>\n
                        </tr>
                        <tr>\n
                                <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
@@ -197,16 +197,16 @@ class AllmessagesTablePager extends TablePager {
 
                        '<tr>
                                <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
-                               '</td>
-                               <td class="mw-input">' .
-                                       $this->getLimitSelect() .
-                               '</td>
+                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+                       '</td>
+                       <td class="mw-input">' .
+                       $this->getLimitSelect() .
+                       '</td>
                        <tr>
                                <td></td>
                                <td>' .
-                                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
-                               "</td>\n
+                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+                       "</td>\n
                        </tr>" .
 
                        Xml::closeElement( 'table' ) .
@@ -219,7 +219,7 @@ class AllmessagesTablePager extends TablePager {
        function getAllMessages( $descending ) {
                wfProfileIn( __METHOD__ );
                $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
-               if( $descending ) {
+               if ( $descending ) {
                        rsort( $messageNames );
                } else {
                        asort( $messageNames );
@@ -260,18 +260,19 @@ class AllmessagesTablePager extends TablePager {
 
                foreach ( $res as $s ) {
                        $exists = false;
-                       if( $foreign ) {
+                       if ( $foreign ) {
                                $title = explode( '/', $s->page_title );
-                               if( count( $title ) === 2 && $langcode == $title[1]
-                                       && isset( $xNames[$title[0]] ) ) {
+                               if ( count( $title ) === 2 && $langcode == $title[1]
+                                       && isset( $xNames[$title[0]] )
+                               ) {
                                        $exists = $title[0];
                                }
-                       } elseif( isset( $xNames[$s->page_title] ) ) {
+                       } elseif ( isset( $xNames[$s->page_title] ) ) {
                                $exists = $s->page_title;
                        }
-                       if( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
+                       if ( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
                                $pageFlags[$exists] = true;
-                       } elseif( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
+                       } elseif ( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
                                $talkFlags[$exists] = true;
                        }
                }
@@ -293,24 +294,25 @@ class AllmessagesTablePager extends TablePager {
                $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
 
                $count = 0;
-               foreach( $messageNames as $key ) {
+               foreach ( $messageNames as $key ) {
                        $customised = isset( $statuses['pages'][$key] );
-                       if( $customised !== $this->custom &&
+                       if ( $customised !== $this->custom &&
                                ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
                                ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
                        ) {
                                $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
                                $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
                                $result->result[] = array(
-                                       'am_title'      => $key,
-                                       'am_actual'     => $actual,
-                                       'am_default'    => $default,
+                                       'am_title' => $key,
+                                       'am_actual' => $actual,
+                                       'am_default' => $default,
                                        'am_customised' => $customised,
                                        'am_talk_exists' => isset( $statuses['talks'][$key] )
                                );
                                $count++;
                        }
-                       if( $count == $limit ) {
+
+                       if ( $count == $limit ) {
                                break;
                        }
                }
@@ -321,26 +323,26 @@ class AllmessagesTablePager extends TablePager {
                return Xml::openElement( 'table', array( 'class' => 'mw-datatable TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
                        "<thead><tr>
                                <th rowspan=\"2\">" .
-                                       $this->msg( 'allmessagesname' )->escaped() . "
+                       $this->msg( 'allmessagesname' )->escaped() . "
                                </th>
                                <th>" .
-                                       $this->msg( 'allmessagesdefault' )->escaped() .
-                               "</th>
+                       $this->msg( 'allmessagesdefault' )->escaped() .
+                       "</th>
                        </tr>\n
                        <tr>
                                <th>" .
-                                       $this->msg( 'allmessagescurrent' )->escaped() .
-                               "</th>
+                       $this->msg( 'allmessagescurrent' )->escaped() .
+                       "</th>
                        </tr></thead><tbody>\n";
        }
 
        function formatValue( $field, $value ) {
-               switch( $field ) {
+               switch ( $field ) {
                        case 'am_title' :
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
                                $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
 
-                               if( $this->mCurrentRow->am_customised ) {
+                               if ( $this->mCurrentRow->am_customised ) {
                                        $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
                                } else {
                                        $title = Linker::link(
@@ -376,7 +378,7 @@ class AllmessagesTablePager extends TablePager {
                $s = parent::formatRow( $row );
 
                // But if there's a customised message, add that too.
-               if( $row->am_customised ) {
+               if ( $row->am_customised ) {
                        $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
                        $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
                        if ( $formatted == '' ) {
@@ -390,19 +392,19 @@ class AllmessagesTablePager extends TablePager {
 
        function getRowAttrs( $row, $isSecond = false ) {
                $arr = array();
-               if( $row->am_customised ) {
+               if ( $row->am_customised ) {
                        $arr['class'] = 'allmessages-customised';
                }
-               if( !$isSecond ) {
+               if ( !$isSecond ) {
                        $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
                }
                return $arr;
        }
 
        function getCellAttrs( $field, $value ) {
-               if( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
+               if ( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
                        return array( 'rowspan' => '2', 'class' => $field );
-               } elseif( $field == 'am_title' ) {
+               } elseif ( $field == 'am_title' ) {
                        return array( 'class' => $field );
                } else {
                        return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
index f9cb5cd..942b767 100644 (file)
@@ -88,15 +88,15 @@ class SpecialAllpages extends IncludableSpecialPage {
                $namespaces = $wgContLang->getNamespaces();
 
                $out->setPageTitle(
-                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
-                       $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
-                       $this->msg( 'allarticles' )
+                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
+                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+                               $this->msg( 'allarticles' )
                );
                $out->addModuleStyles( 'mediawiki.special' );
 
-               if( $par !== null ) {
+               if ( $par !== null ) {
                        $this->showChunk( $namespace, $par, $to, $hideredirects );
-               } elseif( $from !== null && $to === null ) {
+               } elseif ( $from !== null && $to === null ) {
                        $this->showChunk( $namespace, $from, $to, $hideredirects );
                } else {
                        $this->showToplevel( $namespace, $from, $to, $hideredirects );
@@ -188,10 +188,13 @@ class SpecialAllpages extends IncludableSpecialPage {
                $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
                $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
 
-               if( isset( $from ) )
+               if ( isset( $from ) ) {
                        $where[] = 'page_title >= ' . $dbr->addQuotes( $from );
-               if( isset( $to ) )
+               }
+
+               if ( isset( $to ) ) {
                        $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
+               }
 
                global $wgMemc;
                $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
@@ -201,7 +204,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                $maxPerSubpage = intval( $count / $this->maxLineCount );
                $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
 
-               if( !is_array( $lines ) ) {
+               if ( !is_array( $lines ) ) {
                        $options = array( 'LIMIT' => 1 );
                        $options['ORDER BY'] = 'page_title ASC';
                        $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
@@ -210,7 +213,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        $lines = array( $firstTitle );
                        # If we are going to show n rows, we need n+1 queries to find the relevant titles.
                        $done = false;
-                       while( !$done ) {
+                       while ( !$done ) {
                                // Fetch the last title of this chunk and the first of the next
                                $chunk = ( $lastTitle === false )
                                        ? array()
@@ -223,7 +226,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                                );
 
                                $s = $dbr->fetchObject( $res );
-                               if( $s ) {
+                               if ( $s ) {
                                        array_push( $lines, $s->page_title );
                                } else {
                                        // Final chunk, but ended prematurely. Go back and find the end.
@@ -233,8 +236,9 @@ class SpecialAllpages extends IncludableSpecialPage {
                                        array_push( $lines, $endTitle );
                                        $done = true;
                                }
+
                                $s = $res->fetchObject();
-                               if( $s ) {
+                               if ( $s ) {
                                        array_push( $lines, $s->page_title );
                                        $lastTitle = $s->page_title;
                                } else {
@@ -249,8 +253,8 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                // If there are only two or less sections, don't even display them.
                // Instead, display the first section directly.
-               if( count( $lines ) <= 2 ) {
-                       if( !empty( $lines ) ) {
+               if ( count( $lines ) <= 2 ) {
+                       if ( !empty( $lines ) ) {
                                $this->showChunk( $namespace, $from, $to, $hideredirects );
                        } else {
                                $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
@@ -260,7 +264,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                # At this point, $lines should contain an even number of elements.
                $out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-               while( count ( $lines ) > 0 ) {
+               while ( count( $lines ) > 0 ) {
                        $inpoint = array_shift( $lines );
                        $outpoint = array_shift( $lines );
                        $out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
@@ -269,19 +273,19 @@ class SpecialAllpages extends IncludableSpecialPage {
                $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
 
                # Is there more?
-               if( $this->including() ) {
+               if ( $this->including() ) {
                        $out2 = '';
                } else {
-                       if( isset( $from ) || isset( $to ) ) {
-                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-                                               '<tr>
+                       if ( isset( $from ) || isset( $to ) ) {
+                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                                       '<tr>
                                                        <td>' .
-                                                               $nsForm .
-                                                       '</td>
+                                       $nsForm .
+                                       '</td>
                                                        <td class="mw-allpages-nav">' .
-                                                               Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
-                                                                       array(), array(), 'known' ) .
-                                                       "</td>
+                                       Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
+                                               array(), array(), 'known' ) .
+                                       "</td>
                                                </tr>" .
                                        Xml::closeElement( 'table' );
                        } else {
@@ -297,10 +301,10 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @param string $inpoint lower limit of pagenames
         * @param string $outpoint upper limit of pagenames
         * @param $namespace Integer (Default NS_MAIN)
-        * @param bool $hideredirects dont show redirects (default FALSE)
+        * @param bool $hideRedirects don't show redirects. Default: false
         * @return string
         */
-       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
+       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
                global $wgContLang;
                $inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
                $outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
@@ -308,15 +312,20 @@ class SpecialAllpages extends IncludableSpecialPage {
                $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
                $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
 
-               $queryparams = $namespace ? "namespace=$namespace&" : '';
+               $queryParams = array (
+                       'from' => $inpoint,
+                       'to' => $outpoint,
+               );
 
-               $queryhideredirects = array();
-               if ( $hideredirects ) {
-                       $queryhideredirects['hideredirects'] = 1;
+               if( $namespace ) {
+                       $queryParams['namespace'] = $namespace;
+               }
+               if ( $hideRedirects ) {
+                       $queryParams['hideredirects'] = 1;
                }
 
-               $special = $this->getTitle();
-               $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode( $inpoint ) . '&to=' . urlencode( $outpoint ), $queryhideredirects ) );
+               $link = htmlspecialchars(
+                       $this->getTitle()->getLocalURL( $queryParams ) );
 
                $out = $this->msg( 'alphaindexline' )->rawParams(
                        "<a href=\"$link\">$inpointf</a></td><td>",
@@ -360,7 +369,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $conds['page_is_redirect'] = 0;
                        }
 
-                       if( $toKey !== "" ) {
+                       if ( $toKey !== "" ) {
                                $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
                        }
 
@@ -369,33 +378,36 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $conds,
                                __METHOD__,
                                array(
-                                       'ORDER BY'  => 'page_title',
-                                       'LIMIT'     => $this->maxPerPage + 1,
+                                       'ORDER BY' => 'page_title',
+                                       'LIMIT' => $this->maxPerPage + 1,
                                        'USE INDEX' => 'name_title',
                                )
                        );
 
-                       if( $res->numRows() > 0 ) {
+                       if ( $res->numRows() > 0 ) {
                                $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
-                               while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::newFromRow( $s );
-                                       if( $t ) {
+                                       if ( $t ) {
                                                $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
                                                        Linker::link( $t ) .
-                                                       ($s->page_is_redirect ? '</div>' : '' );
+                                                       ( $s->page_is_redirect ? '</div>' : '' );
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if( $n % 3 == 0 ) {
+
+                                       if ( $n % 3 == 0 ) {
                                                $out .= '<tr>';
                                        }
+
                                        $out .= "<td style=\"width:33%\">$link</td>";
                                        $n++;
-                                       if( $n % 3 == 0 ) {
+                                       if ( $n % 3 == 0 ) {
                                                $out .= "</tr>\n";
                                        }
                                }
-                               if( ($n % 3) != 0 ) {
+
+                               if ( ( $n % 3 ) != 0 ) {
                                        $out .= "</tr>\n";
                                }
                                $out .= Xml::closeElement( 'table' );
@@ -407,7 +419,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                if ( $this->including() ) {
                        $out2 = '';
                } else {
-                       if( $from == '' ) {
+                       if ( $from == '' ) {
                                // First chunk; no previous link.
                                $prevTitle = null;
                        } else {
@@ -424,20 +436,20 @@ class SpecialAllpages extends IncludableSpecialPage {
                                );
 
                                # Get first title of previous complete chunk
-                               if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
                                        $pt = $dbr->fetchObject( $res_prev );
                                        $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
                                } else {
                                        # The previous chunk is not complete, need to link to the very first title
                                        # available in the database
                                        $options = array( 'LIMIT' => 1 );
-                                       if ( ! $dbr->implicitOrderby() ) {
+                                       if ( !$dbr->implicitOrderby() ) {
                                                $options['ORDER BY'] = 'page_title';
                                        }
                                        $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
                                                array( 'page_namespace' => $namespace ), __METHOD__, $options );
                                        # Show the previous link if it s not the current requested chunk
-                                       if( $from != $reallyFirstPage_title ) {
+                                       if ( $from != $reallyFirstPage_title ) {
                                                $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
                                        } else {
                                                $prevTitle = null;
@@ -448,23 +460,25 @@ class SpecialAllpages extends IncludableSpecialPage {
                        $self = $this->getTitle();
 
                        $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-                                               '<tr>
+                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                               '<tr>
                                                        <td>' .
-                                                               $nsForm .
-                                                       '</td>
+                               $nsForm .
+                               '</td>
                                                        <td class="mw-allpages-nav">' .
-                                                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
+                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
 
                        # Do we put a previous link ?
-                       if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+                       if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
                                $query = array( 'from' => $prevTitle->getText() );
 
-                               if( $namespace )
+                               if ( $namespace ) {
                                        $query['namespace'] = $namespace;
+                               }
 
-                               if( $hideredirects )
+                               if ( $hideredirects ) {
                                        $query['hideredirects'] = $hideredirects;
+                               }
 
                                $prevLink = Linker::linkKnown(
                                        $self,
@@ -475,16 +489,18 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
                        }
 
-                       if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                                # $s is the first link of the next chunk
                                $t = Title::makeTitle( $namespace, $s->page_title );
                                $query = array( 'from' => $t->getText() );
 
-                               if( $namespace )
+                               if ( $namespace ) {
                                        $query['namespace'] = $namespace;
+                               }
 
-                               if( $hideredirects )
+                               if ( $hideredirects ) {
                                        $query['hideredirects'] = $hideredirects;
+                               }
 
                                $nextLink = Linker::linkKnown(
                                        $self,
@@ -500,15 +516,21 @@ class SpecialAllpages extends IncludableSpecialPage {
                $output->addHTML( $out2 . $out );
 
                $links = array();
-               if ( isset( $prevLink ) ) $links[] = $prevLink;
-               if ( isset( $nextLink ) ) $links[] = $nextLink;
+               if ( isset( $prevLink ) ) {
+                       $links[] = $prevLink;
+               }
+
+               if ( isset( $nextLink ) ) {
+                       $links[] = $nextLink;
+               }
 
                if ( count( $links ) ) {
                        $output->addHTML(
                                Html::element( 'hr' ) .
-                               Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                       $this->getLanguage()->pipeList( $links )
-                               ) );
+                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+                                               $this->getLanguage()->pipeList( $links )
+                                       )
+                       );
                }
 
        }
@@ -519,8 +541,10 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @return array( int namespace, string dbkey, string pagename ) or NULL on error
         */
        protected function getNamespaceKeyAndText( $ns, $text ) {
-               if ( $text == '' )
-                       return array( $ns, '', '' ); # shortcut for common case
+               if ( $text == '' ) {
+                       # shortcut for common case
+                       return array( $ns, '', '' );
+               }
 
                $t = Title::makeTitleSafe( $ns, $text );
                if ( $t && $t->isLocal() ) {
index b0f333c..fafe75f 100644 (file)
@@ -43,12 +43,16 @@ class AncientPagesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'revision' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'rev_timestamp' ),
-                       'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0,
-                                       'page_latest=rev_id' )
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'rev_timestamp'
+                       ),
+                       'conds' => array(
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0,
+                               'page_latest=rev_id'
+                       )
                );
        }
 
index bfa2f95..e61f12b 100644 (file)
@@ -31,6 +31,7 @@ class SpecialBlankpage extends UnlistedSpecialPage {
        public function __construct() {
                parent::__construct( 'Blankpage' );
        }
+
        public function execute( $par ) {
                $this->setHeaders();
                $this->getOutput()->addWikiMsg( 'intentionallyblankpage' );
index 50fdbc2..53f7f4d 100644 (file)
@@ -110,10 +110,10 @@ class SpecialBlock extends FormSpecialPage {
                        $s = HTMLForm::formatErrors( $this->preErrors );
                        if ( $s ) {
                                $form->addHeaderText( Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'error' ),
-                                               $s
-                                       ) );
+                                       'div',
+                                       array( 'class' => 'error' ),
+                                       $s
+                               ) );
                        }
                }
        }
@@ -241,8 +241,7 @@ class SpecialBlock extends FormSpecialPage {
                if ( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
                        && ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
                                || $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
-                       )
-               {
+               ) {
                        $fields['HardBlock']['default'] = $block->isHardblock();
                        $fields['CreateAccount']['default'] = $block->prevents( 'createaccount' );
                        $fields['AutoBlock']['default'] = $block->isAutoblocking();
@@ -460,8 +459,8 @@ class SpecialBlock extends FormSpecialPage {
                $i = 0;
                $target = null;
 
-               while( true ) {
-                       switch( $i++ ) {
+               while ( true ) {
+                       switch ( $i++ ) {
                                case 0:
                                        # The HTMLForm will check wpTarget first and only if it doesn't get
                                        # a value use the default, which will be generated from the options
@@ -620,8 +619,8 @@ class SpecialBlock extends FormSpecialPage {
                        # but $data['target'] gets overriden by (non-normalized) request variable
                        # from previous request.
                        if ( $target === $performer->getName() &&
-                               ( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) )
-                       {
+                               ( $data['PreviousTarget'] !== $target || !$data['Confirm'] )
+                       {
                                return array( 'ipb-blockingself' );
                        }
                } elseif ( $type == Block::TYPE_RANGE ) {
@@ -634,9 +633,9 @@ class SpecialBlock extends FormSpecialPage {
                        return array( 'badipaddress' );
                }
 
-               if ( ( strlen( $data['Expiry'] ) == 0) || ( strlen( $data['Expiry'] ) > 50 )
-                       || !self::parseExpiryInput( $data['Expiry'] ) )
-               {
+               if ( ( strlen( $data['Expiry'] ) == 0 ) || ( strlen( $data['Expiry'] ) > 50 )
+                       || !self::parseExpiryInput( $data['Expiry'] )
+               {
                        return array( 'ipb_expiry_invalid' );
                }
 
@@ -703,9 +702,9 @@ class SpecialBlock extends FormSpecialPage {
                        $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
                        # Show form unless the user is already aware of this...
-                       if( $blockNotConfirmed || $reblockNotAllowed ) {
+                       if ( $blockNotConfirmed || $reblockNotAllowed ) {
                                return array( array( 'ipb_already_blocked', $block->getTarget() ) );
-                       # Otherwise, try to update the block...
+                               # Otherwise, try to update the block...
                        } else {
                                # This returns direct blocks before autoblocks/rangeblocks, since we should
                                # be sure the user is blocked by now it should work for our purposes
@@ -865,7 +864,7 @@ class SpecialBlock extends FormSpecialPage {
                                # User is trying to unblock themselves
                                if ( $performer->isAllowed( 'unblockself' ) ) {
                                        return true;
-                               # User blocked themselves and is now trying to reverse it
+                                       # User blocked themselves and is now trying to reverse it
                                } elseif ( $performer->blockedBy() === $performer->getName() ) {
                                        return true;
                                } else {
index e10df4f..eb25eaf 100644 (file)
@@ -55,10 +55,10 @@ class SpecialBlockList extends SpecialPage {
 
                $action = $request->getText( 'action' );
 
-               if( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
+               if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
                        # B/C @since 1.18: Unblock interface is now at Special:Unblock
                        $title = SpecialPage::getTitleFor( 'Unblock', $this->target );
-                       $out->redirect( $title->getFullUrl() );
+                       $out->redirect( $title->getFullURL() );
                        return;
                }
 
@@ -120,7 +120,7 @@ class SpecialBlockList extends SpecialPage {
                if ( $this->target !== '' ) {
                        list( $target, $type ) = Block::parseTarget( $this->target );
 
-                       switch( $type ) {
+                       switch ( $type ) {
                                case Block::TYPE_ID:
                                case Block::TYPE_AUTO:
                                        $conds['ipb_id'] = $target;
@@ -148,16 +148,16 @@ class SpecialBlockList extends SpecialPage {
                }
 
                # Apply filters
-               if( in_array( 'userblocks', $this->options ) ) {
+               if ( in_array( 'userblocks', $this->options ) ) {
                        $conds['ipb_user'] = 0;
                }
-               if( in_array( 'tempblocks', $this->options ) ) {
+               if ( in_array( 'tempblocks', $this->options ) ) {
                        $conds['ipb_expiry'] = 'infinity';
                }
-               if( in_array( 'addressblocks', $this->options ) ) {
+               if ( in_array( 'addressblocks', $this->options ) ) {
                        $conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
                }
-               if( in_array( 'rangeblocks', $this->options ) ) {
+               if ( in_array( 'rangeblocks', $this->options ) ) {
                        $conds[] = "ipb_range_end = ipb_range_start";
                }
 
@@ -169,7 +169,7 @@ class SpecialBlockList extends SpecialPage {
 
                # Show additional header for the local block only when other blocks exists.
                # Not necessary in a standard installation without such extensions enabled
-               if( count( $otherBlockLink ) ) {
+               if ( count( $otherBlockLink ) ) {
                        $out->addHTML(
                                Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
                        );
@@ -179,8 +179,8 @@ class SpecialBlockList extends SpecialPage {
                if ( $pager->getNumRows() ) {
                        $out->addHTML(
                                $pager->getNavigationBar() .
-                               $pager->getBody().
-                               $pager->getNavigationBar()
+                                       $pager->getBody() .
+                                       $pager->getNavigationBar()
                        );
 
                } elseif ( $this->target ) {
@@ -190,7 +190,7 @@ class SpecialBlockList extends SpecialPage {
                        $out->addWikiMsg( 'ipblocklist-empty' );
                }
 
-               if( count( $otherBlockLink ) ) {
+               if ( count( $otherBlockLink ) ) {
                        $out->addHTML(
                                Html::rawElement(
                                        'h2',
@@ -199,7 +199,7 @@ class SpecialBlockList extends SpecialPage {
                                ) . "\n"
                        );
                        $list = '';
-                       foreach( $otherBlockLink as $link ) {
+                       foreach ( $otherBlockLink as $link ) {
                                $list .= Html::rawElement( 'li', array(), $link ) . "\n";
                        }
                        $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
@@ -238,7 +238,7 @@ class BlockListPager extends TablePager {
                                'ipb_params' => 'blocklist-params',
                                'ipb_reason' => 'blocklist-reason',
                        );
-                       foreach( $headers as $key => $val ) {
+                       foreach ( $headers as $key => $val ) {
                                $headers[$key] = $this->msg( $val )->text();
                        }
                }
@@ -267,17 +267,17 @@ class BlockListPager extends TablePager {
 
                $formatted = '';
 
-               switch( $name ) {
+               switch ( $name ) {
                        case 'ipb_timestamp':
                                $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
                                break;
 
                        case 'ipb_target':
-                               if( $row->ipb_auto ) {
+                               if ( $row->ipb_auto ) {
                                        $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
                                } else {
                                        list( $target, $type ) = Block::parseTarget( $row->ipb_address );
-                                       switch( $type ) {
+                                       switch ( $type ) {
                                                case Block::TYPE_USER:
                                                case Block::TYPE_IP:
                                                        $formatted = Linker::userLink( $target->getId(), $target );
@@ -295,9 +295,9 @@ class BlockListPager extends TablePager {
                                break;
 
                        case 'ipb_expiry':
-                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
-                               if( $this->getUser()->isAllowed( 'block' ) ) {
-                                       if( $row->ipb_auto ) {
+                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+                               if ( $this->getUser()->isAllowed( 'block' ) ) {
+                                       if ( $row->ipb_auto ) {
                                                $links[] = Linker::linkKnown(
                                                        SpecialPage::getTitleFor( 'Unblock' ),
                                                        $msg['unblocklink'],
@@ -441,7 +441,7 @@ class BlockListPager extends TablePager {
                }
 
                $ua = UserArray::newFromIDs( $userids );
-               foreach( $ua as $user ) {
+               foreach ( $ua as $user ) {
                        $name = str_replace( ' ', '_', $user->getName() );
                        $lb->add( NS_USER, $name );
                        $lb->add( NS_USER_TALK, $name );
index 85a3019..1e5b524 100644 (file)
@@ -39,7 +39,7 @@ class SpecialBlockme extends UnlistedSpecialPage {
                $this->outputHeader();
 
                $ip = $this->getRequest()->getIP();
-               if( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
+               if ( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
                        $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
                        return;
                }
index bdbd77b..0774c44 100644 (file)
@@ -53,8 +53,8 @@ class SpecialBookSources extends SpecialPage {
                $this->outputHeader();
                $this->isbn = self::cleanIsbn( $isbn ? $isbn : $this->getRequest()->getText( 'isbn' ) );
                $this->getOutput()->addHTML( $this->makeForm() );
-               if( strlen( $this->isbn ) > 0 ) {
-                       if( !self::isValidISBN( $this->isbn ) ) {
+               if ( strlen( $this->isbn ) > 0 ) {
+                       if ( !self::isValidISBN( $this->isbn ) ) {
                                $this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
                        }
                        $this->showList();
@@ -69,29 +69,29 @@ class SpecialBookSources extends SpecialPage {
        public static function isValidISBN( $isbn ) {
                $isbn = self::cleanIsbn( $isbn );
                $sum = 0;
-               if( strlen( $isbn ) == 13 ) {
-                       for( $i = 0; $i < 12; $i++ ) {
-                               if( $i % 2 == 0 ) {
+               if ( strlen( $isbn ) == 13 ) {
+                       for ( $i = 0; $i < 12; $i++ ) {
+                               if ( $i % 2 == 0 ) {
                                        $sum += $isbn[$i];
                                } else {
                                        $sum += 3 * $isbn[$i];
                                }
                        }
 
-                       $check = (10 - ($sum % 10)) % 10;
+                       $check = ( 10 - ( $sum % 10 ) ) % 10;
                        if ( $check == $isbn[12] ) {
                                return true;
                        }
-               } elseif( strlen( $isbn ) == 10 ) {
-                       for( $i = 0; $i < 9; $i++ ) {
-                               $sum += $isbn[$i] * ($i + 1);
+               } elseif ( strlen( $isbn ) == 10 ) {
+                       for ( $i = 0; $i < 9; $i++ ) {
+                               $sum += $isbn[$i] * ( $i + 1 );
                        }
 
                        $check = $sum % 11;
-                       if( $check == 10 ) {
+                       if ( $check == 10 ) {
                                $check = "X";
                        }
-                       if( $check == $isbn[9] ) {
+                       if ( $check == $isbn[9] ) {
                                return true;
                        }
                }
@@ -143,7 +143,7 @@ class SpecialBookSources extends SpecialPage {
                # Check for a local page such as Project:Book_sources and use that if available
                $page = $this->msg( 'booksources' )->inContentLanguage()->text();
                $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
-               if( is_object( $title ) && $title->exists() ) {
+               if ( is_object( $title ) && $title->exists() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $content = $rev->getContent();
 
@@ -162,7 +162,7 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addWikiMsg( 'booksources-text' );
                $this->getOutput()->addHTML( '<ul>' );
                $items = $wgContLang->getBookstoreList();
-               foreach( $items as $label => $url )
+               foreach ( $items as $label => $url )
                        $this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
                $this->getOutput()->addHTML( '</ul>' );
                return true;
index fac4123..e6fd58d 100644 (file)
@@ -88,7 +88,7 @@ class BrokenRedirectsPage extends QueryPage {
         * @return array
         */
        function getOrderFields() {
-               return array ( 'rd_namespace', 'rd_title', 'rd_from' );
+               return array( 'rd_namespace', 'rd_title', 'rd_from' );
        }
 
        /**
@@ -138,7 +138,7 @@ class BrokenRedirectsPage extends QueryPage {
 
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
-               if( $this->getUser()->isAllowed( 'delete' ) ) {
+               if ( $this->getUser()->isAllowed( 'delete' ) ) {
                        $links[] = Linker::linkKnown(
                                $fromObj,
                                $this->msg( 'brokenredirects-delete' )->escaped(),
index 9040c64..f7256a4 100644 (file)
@@ -42,12 +42,12 @@ class SpecialCategories extends SpecialPage {
 
                $this->getOutput()->addHTML(
                        Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
-                       $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
-                       $cap->getStartForm( $from ) .
-                       $cap->getNavigationBar() .
-                       '<ul>' . $cap->getBody() . '</ul>' .
-                       $cap->getNavigationBar() .
-                       Html::closeElement( 'div' )
+                               $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
+                               $cap->getStartForm( $from ) .
+                               $cap->getNavigationBar() .
+                               '<ul>' . $cap->getBody() . '</ul>' .
+                               $cap->getNavigationBar() .
+                               Html::closeElement( 'div' )
                );
        }
 
@@ -66,7 +66,7 @@ class CategoryPager extends AlphabeticPager {
        function __construct( IContextSource $context, $from ) {
                parent::__construct( $context );
                $from = str_replace( ' ', '_', $from );
-               if( $from !== '' ) {
+               if ( $from !== '' ) {
                        $from = Title::capitalize( $from, NS_CATEGORY );
                        $this->setOffset( $from );
                        $this->setIncludeOffset( true );
@@ -92,6 +92,7 @@ class CategoryPager extends AlphabeticPager {
                unset( $this->mDefaultQuery['from'] );
                return $this->mDefaultQuery;
        }
+
 #      protected function getOrderTypeMessages() {
 #              return array( 'abc' => 'special-categories-sort-abc',
 #                      'count' => 'special-categories-sort-count' );
@@ -126,13 +127,19 @@ class CategoryPager extends AlphabeticPager {
        public function getStartForm( $from ) {
                global $wgScript;
 
-               return
-                       Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
-                               Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                               Xml::fieldset( $this->msg( 'categories' )->text(),
-                                       Xml::inputLabel( $this->msg( 'categoriesfrom' )->text(),
+               return Xml::tags(
+                       'form',
+                       array( 'method' => 'get', 'action' => $wgScript ),
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+                               Xml::fieldset(
+                                       $this->msg( 'categories' )->text(),
+                                       Xml::inputLabel(
+                                               $this->msg( 'categoriesfrom' )->text(),
                                                'from', 'from', 20, $from ) .
-                                       ' ' .
-                                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) ) );
+                                                       ' ' .
+                                                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+                                       )
+                               )
+               );
        }
 }
index 59a0257..2086fd3 100644 (file)
@@ -89,8 +89,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $this->mNewEmail = $request->getVal( 'wpNewEmail' );
 
                if ( $request->wasPosted()
-                       && $user->matchEditToken( $request->getVal( 'token' ) ) )
-               {
+                       && $user->matchEditToken( $request->getVal( 'token' ) )
+               {
                        $info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
                        if ( $info === true ) {
                                $this->doReturnTo();
@@ -138,15 +138,15 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $this->getOutput()->addHTML(
                        Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) .
-                       Xml::openElement( 'form',
-                               array(
-                                       'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl(),
-                                       'id' => 'mw-changeemail-form' ) ) . "\n" .
-                       Html::hidden( 'token', $user->getEditToken() ) . "\n" .
-                       Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
-                       $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
-                       Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+                               Xml::openElement( 'form',
+                                       array(
+                                               'method' => 'post',
+                                               'action' => $this->getTitle()->getLocalURL(),
+                                               'id' => 'mw-changeemail-form' ) ) . "\n" .
+                               Html::hidden( 'token', $user->getEditToken() ) . "\n" .
+                               Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+                               $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
+                               Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
                );
                $items = array(
                        array( 'wpName', 'username', 'text', $user->getName() ),
@@ -159,17 +159,17 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $this->getOutput()->addHTML(
                        $this->pretty( $items ) .
-                       "\n" .
-                       "<tr>\n" .
+                               "\n" .
+                               "<tr>\n" .
                                "<td></td>\n" .
                                '<td class="mw-input">' .
-                                       Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
-                                       Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+                               Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
+                               Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
                                "</td>\n" .
-                       "</tr>\n" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'fieldset' ) . "\n"
+                               "</tr>\n" .
+                               Xml::closeElement( 'table' ) .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'fieldset' ) . "\n"
                );
        }
 
@@ -181,7 +181,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $out = '';
                foreach ( $fields as $list ) {
                        list( $name, $label, $type, $value ) = $list;
-                       if( $type == 'text' ) {
+                       if ( $type == 'text' ) {
                                $field = htmlspecialchars( $value );
                        } else {
                                $attribs = array( 'id' => $name );
@@ -241,8 +241,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                if ( !$status->isGood() ) {
                        $this->getOutput()->addHTML(
                                '<p class="error">' .
-                               $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
-                               '</p>' );
+                                       $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
+                                       '</p>' );
                        return false;
                }
 
index 73eb97f..95fbb0d 100644 (file)
@@ -52,46 +52,46 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $this->mDomain = $request->getVal( 'wpDomain' );
 
                $user = $this->getUser();
-               if( !$request->wasPosted() && !$user->isLoggedIn() ) {
+               if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
                        $this->error( $this->msg( 'resetpass-no-info' )->text() );
                        return;
                }
 
-               if( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
+               if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
                        $this->doReturnTo();
                        return;
                }
 
                $this->checkReadOnly();
 
-               if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
                        try {
                                $this->mDomain = $wgAuth->getDomain();
-                               if( !$wgAuth->allowPasswordChange() ) {
+                               if ( !$wgAuth->allowPasswordChange() ) {
                                        $this->error( $this->msg( 'resetpass_forbidden' )->text() );
                                        return;
                                }
 
                                $this->attemptReset( $this->mNewpass, $this->mRetype );
 
-                               if( $user->isLoggedIn() ) {
+                               if ( $user->isLoggedIn() ) {
                                        $this->doReturnTo();
                                } else {
                                        LoginForm::setLoginToken();
                                        $token = LoginForm::getLoginToken();
                                        $data = array(
-                                               'action'       => 'submitlogin',
-                                               'wpName'       => $this->mUserName,
-                                               'wpDomain'     => $this->mDomain,
+                                               'action' => 'submitlogin',
+                                               'wpName' => $this->mUserName,
+                                               'wpDomain' => $this->mDomain,
                                                'wpLoginToken' => $token,
-                                               'wpPassword'   => $request->getVal( 'wpNewPassword' ),
+                                               'wpPassword' => $request->getVal( 'wpNewPassword' ),
                                        ) + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
                                        $login = new LoginForm( new FauxRequest( $data, true ) );
                                        $login->setContext( $this->getContext() );
                                        $login->execute( null );
                                }
                                return;
-                       } catch( PasswordError $e ) {
+                       } catch ( PasswordError $e ) {
                                $this->error( $e->getMessage() );
                        }
                }
@@ -127,12 +127,12 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $rememberMe = '<tr>' .
                                '<td></td>' .
                                '<td class="mw-input">' .
-                                       Xml::checkLabel(
-                                               $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
-                                               'wpRemember', 'wpRemember',
-                                               $this->getRequest()->getCheck( 'wpRemember' ) ) .
+                               Xml::checkLabel(
+                                       $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
+                                       'wpRemember', 'wpRemember',
+                                       $this->getRequest()->getCheck( 'wpRemember' ) ) .
                                '</td>' .
-                       '</tr>';
+                               '</tr>';
                        $submitMsg = 'resetpass_submit';
                        $oldpassMsg = 'resetpass-temp-password';
                } else {
@@ -142,11 +142,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $extraFields = array();
                wfRunHooks( 'ChangePasswordForm', array( &$extraFields ) );
                $prettyFields = array(
-                                       array( 'wpName', 'username', 'text', $this->mUserName ),
-                                       array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
-                                       array( 'wpNewPassword', 'newpassword', 'password', null ),
-                                       array( 'wpRetype', 'retypenew', 'password', null ),
-                               );
+                       array( 'wpName', 'username', 'text', $this->mUserName ),
+                       array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
+                       array( 'wpNewPassword', 'newpassword', 'password', null ),
+                       array( 'wpRetype', 'retypenew', 'password', null ),
+               );
                $prettyFields = array_merge( $prettyFields, $extraFields );
                $hiddenFields = array(
                        'token' => $user->getEditToken(),
@@ -154,31 +154,31 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        'wpDomain' => $this->mDomain,
                ) + $this->getRequest()->getValues( 'returnto', 'returntoquery' );
                $hiddenFieldsStr = '';
-               foreach( $hiddenFields as $fieldname => $fieldvalue ) {
+               foreach ( $hiddenFields as $fieldname => $fieldvalue ) {
                        $hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n";
                }
                $this->getOutput()->addHTML(
                        Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
-                       Xml::openElement( 'form',
-                               array(
-                                       'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl(),
-                                       'id' => 'mw-resetpass-form' ) ) . "\n" .
-                       $hiddenFieldsStr .
-                       $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
-                       Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
-                       $this->pretty( $prettyFields ) . "\n" .
-                       $rememberMe .
-                       "<tr>\n" .
+                               Xml::openElement( 'form',
+                                       array(
+                                               'method' => 'post',
+                                               'action' => $this->getTitle()->getLocalURL(),
+                                               'id' => 'mw-resetpass-form' ) ) . "\n" .
+                               $hiddenFieldsStr .
+                               $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
+                               Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
+                               $this->pretty( $prettyFields ) . "\n" .
+                               $rememberMe .
+                               "<tr>\n" .
                                "<td></td>\n" .
                                '<td class="mw-input">' .
-                                       Xml::submitButton( $this->msg( $submitMsg )->text() ) .
-                                       Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+                               Xml::submitButton( $this->msg( $submitMsg )->text() ) .
+                               Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
                                "</td>\n" .
-                       "</tr>\n" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'fieldset' ) . "\n"
+                               "</tr>\n" .
+                               Xml::closeElement( 'table' ) .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'fieldset' ) . "\n"
                );
        }
 
@@ -190,7 +190,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $out = '';
                foreach ( $fields as $list ) {
                        list( $name, $label, $type, $value ) = $list;
-                       if( $type == 'text' ) {
+                       if ( $type == 'text' ) {
                                $field = htmlspecialchars( $value );
                        } else {
                                $attribs = array( 'id' => $name );
@@ -205,10 +205,13 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        }
                        $out .= "<tr>\n";
                        $out .= "\t<td class='mw-label'>";
-                       if ( $type != 'text' )
+
+                       if ( $type != 'text' ) {
                                $out .= Xml::label( $this->msg( $label )->text(), $name );
-                       else
+                       } else {
                                $out .= $this->msg( $label )->escaped();
+                       }
+
                        $out .= "</td>\n";
                        $out .= "\t<td class='mw-input'>";
                        $out .= $field;
@@ -229,11 +232,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $user = User::newFromName( $this->mUserName );
                }
 
-               if( !$user || $user->isAnon() ) {
+               if ( !$user || $user->isAnon() ) {
                        throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
                }
 
-               if( $newpass !== $retype ) {
+               if ( $newpass !== $retype ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
                        throw new PasswordError( $this->msg( 'badretype' )->text() );
                }
@@ -243,7 +246,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        throw new PasswordError( $this->msg( 'login-throttled' )->text() );
                }
 
-               if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
+               if ( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
                        throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
                }
@@ -257,7 +260,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $user->setPassword( $this->mNewpass );
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
                        $this->mNewpass = $this->mOldpass = $this->mRetype = '';
-               } catch( PasswordError $e ) {
+               } catch ( PasswordError $e ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
                        throw new PasswordError( $e->getMessage() );
                }
index c3bd3fe..3b82326 100644 (file)
@@ -110,7 +110,7 @@ class SpecialComparePages extends SpecialPage {
                $rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
                $rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
 
-               if( $rev1 && $rev2 ) {
+               if ( $rev1 && $rev2 ) {
                        $revision = Revision::newFromId( $rev1 );
 
                        if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
@@ -128,11 +128,11 @@ class SpecialComparePages extends SpecialPage {
        }
 
        public static function revOrTitle( $revision, $title ) {
-               if( $revision ) {
+               if ( $revision ) {
                        return $revision;
-               } elseif( $title ) {
+               } elseif ( $title ) {
                        $title = Title::newFromText( $title );
-                       if( $title instanceof Title ) {
+                       if ( $title instanceof Title ) {
                                return $title->getLatestRevID();
                        }
                }
index 078c386..3287c63 100644 (file)
  * @author Rob Church <robchur@gmail.com>
  */
 class EmailConfirmation extends UnlistedSpecialPage {
-
-       /**
-        * Constructor
-        */
        public function __construct() {
                parent::__construct( 'Confirmemail' );
        }
@@ -41,16 +37,16 @@ class EmailConfirmation extends UnlistedSpecialPage {
        /**
         * Main execution point
         *
-        * @param $code Confirmation code passed to the page
+        * @param null|string $code Confirmation code passed to the page
         */
        function execute( $code ) {
                $this->setHeaders();
 
                $this->checkReadOnly();
 
-               if( $code === null || $code === '' ) {
-                       if( $this->getUser()->isLoggedIn() ) {
-                               if( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
+               if ( $code === null || $code === '' ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               if ( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
                                        $this->showRequestForm();
                                } else {
                                        $this->getOutput()->addWikiMsg( 'confirmemail_noemail' );
@@ -62,7 +58,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                        array(),
                                        array( 'returnto' => $this->getTitle()->getPrefixedText() )
                                );
-                               $this->getOutput()->addHTML( $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
+                               $this->getOutput()->addHTML(
+                                       $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse()
+                               );
                        }
                } else {
                        $this->attemptConfirm( $code );
@@ -75,7 +73,10 @@ class EmailConfirmation extends UnlistedSpecialPage {
        function showRequestForm() {
                $user = $this->getUser();
                $out = $this->getOutput();
-               if( $this->getRequest()->wasPosted() && $user->matchEditToken( $this->getRequest()->getText( 'token' ) ) ) {
+
+               if ( $this->getRequest()->wasPosted() &&
+                       $user->matchEditToken( $this->getRequest()->getText( 'token' ) )
+               ) {
                        $status = $user->sendConfirmationMail();
                        if ( $status->isGood() ) {
                                $out->addWikiMsg( 'confirmemail_sent' );
@@ -83,7 +84,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
                        }
                } else {
-                       if( $user->isEmailConfirmed() ) {
+                       if ( $user->isEmailConfirmed() ) {
                                // date and time are separate parameters to facilitate localisation.
                                // $time is kept for backward compat reasons.
                                // 'emailauthenticated' is also used in SpecialPreferences.php
@@ -94,11 +95,19 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $t = $lang->userTime( $emailAuthenticated, $user );
                                $out->addWikiMsg( 'emailauthenticated', $time, $d, $t );
                        }
-                       if( $user->isEmailConfirmationPending() ) {
-                               $out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
+
+                       if ( $user->isEmailConfirmationPending() ) {
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>",
+                                       'confirmemail_pending'
+                               );
                        }
+
                        $out->addWikiMsg( 'confirmemail_text' );
-                       $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
+                       $form = Xml::openElement(
+                               'form',
+                               array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL() )
+                       );
                        $form .= Html::hidden( 'token', $user->getEditToken() );
                        $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
                        $form .= Xml::closeElement( 'form' );
@@ -114,20 +123,21 @@ class EmailConfirmation extends UnlistedSpecialPage {
         */
        function attemptConfirm( $code ) {
                $user = User::newFromConfirmationCode( $code );
-               if( is_object( $user ) ) {
-                       $user->confirmEmail();
-                       $user->saveSettings();
-                       $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
-                       $this->getOutput()->addWikiMsg( $message );
-                       if( !$this->getUser()->isLoggedIn() ) {
-                               $title = SpecialPage::getTitleFor( 'Userlogin' );
-                               $this->getOutput()->returnToMain( true, $title );
-                       }
-               } else {
+               if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+                       return;
                }
-       }
 
+               $user->confirmEmail();
+               $user->saveSettings();
+               $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
+               $this->getOutput()->addWikiMsg( $message );
+
+               if ( !$this->getUser()->isLoggedIn() ) {
+                       $title = SpecialPage::getTitleFor( 'Userlogin' );
+                       $this->getOutput()->returnToMain( true, $title );
+               }
+       }
 }
 
 /**
@@ -137,16 +147,13 @@ class EmailConfirmation extends UnlistedSpecialPage {
  * @ingroup SpecialPage
  */
 class EmailInvalidation extends UnlistedSpecialPage {
-
        public function __construct() {
                parent::__construct( 'Invalidateemail' );
        }
 
        function execute( $code ) {
                $this->setHeaders();
-
                $this->checkReadOnly();
-
                $this->attemptInvalidate( $code );
        }
 
@@ -158,15 +165,17 @@ class EmailInvalidation extends UnlistedSpecialPage {
         */
        function attemptInvalidate( $code ) {
                $user = User::newFromConfirmationCode( $code );
-               if( is_object( $user ) ) {
-                       $user->invalidateEmail();
-                       $user->saveSettings();
-                       $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
-                       if( !$this->getUser()->isLoggedIn() ) {
-                               $this->getOutput()->returnToMain();
-                       }
-               } else {
+               if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+                       return;
+               }
+
+               $user->invalidateEmail();
+               $user->saveSettings();
+               $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
+
+               if ( !$this->getUser()->isLoggedIn() ) {
+                       $this->getOutput()->returnToMain();
                }
        }
 }
index b118059..932f05e 100644 (file)
@@ -28,7 +28,6 @@
  */
 
 class SpecialContributions extends SpecialPage {
-
        protected $opts;
 
        public function __construct() {
@@ -89,11 +88,17 @@ class SpecialContributions extends SpecialPage {
                if ( $this->opts['contribs'] != 'newbie' ) {
                        $target = $nt->getText();
                        $out->addSubtitle( $this->contributionsSub( $userObj ) );
-                       $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'contributions-title', $target )->plain() ) );
+                       $out->setHTMLTitle( $this->msg(
+                               'pagetitle',
+                               $this->msg( 'contributions-title', $target )->plain()
+                       ) );
                        $this->getSkin()->setRelevantUser( $userObj );
                } else {
                        $out->addSubtitle( $this->msg( 'sp-contributions-newbies-sub' ) );
-                       $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'sp-contributions-newbies-title' )->plain() ) );
+                       $out->setHTMLTitle( $this->msg(
+                               'pagetitle',
+                               $this->msg( 'sp-contributions-newbies-title' )->plain()
+                       ) );
                }
 
                if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
@@ -103,10 +108,8 @@ class SpecialContributions extends SpecialPage {
                }
 
                $this->opts['associated'] = $request->getBool( 'associated' );
-
-               $this->opts['nsInvert'] = (bool) $request->getVal( 'nsInvert' );
-
-               $this->opts['tagfilter'] = (string) $request->getVal( 'tagfilter' );
+               $this->opts['nsInvert'] = (bool)$request->getVal( 'nsInvert' );
+               $this->opts['tagfilter'] = (string)$request->getVal( 'tagfilter' );
 
                // Allows reverts to have the bot flag in recent changes. It is just here to
                // be passed in the form at the top of the page
@@ -152,7 +155,7 @@ class SpecialContributions extends SpecialPage {
                                $apiParams['month'] = $this->opts['month'];
                        }
 
-                       $url = wfScript( 'api' ) . '?' . wfArrayToCgi( $apiParams );
+                       $url = wfAppendQuery( wfScript( 'api' ), $apiParams );
 
                        $out->redirect( $url, '301' );
                        return;
@@ -162,7 +165,6 @@ class SpecialContributions extends SpecialPage {
                $this->addFeedLinks( array( 'action' => 'feedcontributions', 'user' => $target ) );
 
                if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id ) ) ) {
-
                        $out->addHTML( $this->getForm() );
 
                        $pager = new ContribsPager( $this->getContext(), array(
@@ -176,18 +178,20 @@ class SpecialContributions extends SpecialPage {
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ) );
+
                        if ( !$pager->getNumRows() ) {
                                $out->addWikiMsg( 'nocontribs', $target );
                        } else {
                                # Show a message about slave lag, if applicable
                                $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-                               if ( $lag > 0 )
+                               if ( $lag > 0 ) {
                                        $out->showLagWarning( $lag );
+                               }
 
                                $out->addHTML(
                                        '<p>' . $pager->getNavigationBar() . '</p>' .
-                                       $pager->getBody() .
-                                       '<p>' . $pager->getNavigationBar() . '</p>'
+                                               $pager->getBody() .
+                                               '<p>' . $pager->getNavigationBar() . '</p>'
                                );
                        }
                        $out->preventClickjacking( $pager->getPreventClickjacking() );
@@ -195,16 +199,16 @@ class SpecialContributions extends SpecialPage {
                        # Show the appropriate "footer" message - WHOIS tools, etc.
                        if ( $this->opts['contribs'] == 'newbie' ) {
                                $message = 'sp-contributions-footer-newbies';
-                       } elseif( IP::isIPAddress( $target ) ) {
+                       } elseif ( IP::isIPAddress( $target ) ) {
                                $message = 'sp-contributions-footer-anon';
-                       } elseif( $userObj->isAnon() ) {
+                       } elseif ( $userObj->isAnon() ) {
                                // No message for non-existing users
                                $message = '';
                        } else {
                                $message = 'sp-contributions-footer';
                        }
 
-                       if( $message ) {
+                       if ( $message ) {
                                if ( !$this->msg( $message, $target )->isDisabled() ) {
                                        $out->wrapWikiMsg(
                                                "<div class='mw-contributions-footer'>\n$1\n</div>",
@@ -267,9 +271,9 @@ class SpecialContributions extends SpecialPage {
                if ( $oldMsg->exists() ) {
                        $linksWithParentheses = $this->msg( 'parentheses' )->rawParams( $links )->escaped();
                        return $oldMsg->rawParams( "$user $linksWithParentheses" );
-               } else {
-                       return $this->msg( 'contribsub2' )->rawParams( $user, $links );
                }
+
+               return $this->msg( 'contribsub2' )->rawParams( $user, $links );
        }
 
        /**
@@ -309,9 +313,7 @@ class SpecialContributions extends SpecialPage {
                                SpecialPage::getTitleFor( 'Log', 'block' ),
                                $this->msg( 'sp-contributions-blocklog' )->escaped(),
                                array(),
-                               array(
-                                       'page' => $userpage->getPrefixedText()
-                               )
+                               array( 'page' => $userpage->getPrefixedText() )
                        );
                }
                # Uploads
@@ -398,10 +400,28 @@ class SpecialContributions extends SpecialPage {
                        $this->opts['topOnly'] = false;
                }
 
-               $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+               $form = Html::openElement(
+                       'form',
+                       array(
+                               'method' => 'get',
+                               'action' => $wgScript,
+                               'class' => 'mw-contributions-form'
+                       )
+               );
 
                # Add hidden params for tracking except for parameters in $skipParameters
-               $skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
+               $skipParameters = array(
+                       'namespace',
+                       'nsInvert',
+                       'deletedOnly',
+                       'target',
+                       'contribs',
+                       'year',
+                       'month',
+                       'topOnly',
+                       'associated'
+               );
+
                foreach ( $this->opts as $name => $value ) {
                        if ( in_array( $name, $skipParameters ) ) {
                                continue;
@@ -412,80 +432,102 @@ class SpecialContributions extends SpecialPage {
                $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
 
                if ( $tagFilter ) {
-                       $filterSelection =
-                               Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
-                               Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+                       $filterSelection = Html::rawElement(
+                               'td',
+                               array( 'class' => 'mw-label' ),
+                               array_shift( $tagFilter )
+                       );
+                       $filterSelection .= Html::rawElement(
+                               'td',
+                               array( 'class' => 'mw-input' ),
+                               implode( '&#160', $tagFilter )
+                       );
                } else {
                        $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
                }
 
-               $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
-                       Xml::radioLabel(
-                               $this->msg( 'sp-contributions-newbies' )->text(),
-                               'contribs',
-                               'newbie',
-                               'newbie',
-                               $this->opts['contribs'] == 'newbie',
-                               array( 'class' => 'mw-input' )
-                       ) . '<br />' .
-                       Xml::radioLabel(
-                               $this->msg( 'sp-contributions-username' )->text(),
-                               'contribs',
-                               'user',
-                               'user',
-                               $this->opts['contribs'] == 'user',
-                               array( 'class' => 'mw-input' )
-                       ) . ' ' .
-                       Html::input(
-                               'target',
-                               $this->opts['target'],
-                               'text',
-                               array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
-                                       ( $this->opts['target'] ? array() : array( 'autofocus' )
+               $labelNewbies = Xml::radioLabel(
+                       $this->msg( 'sp-contributions-newbies' )->text(),
+                       'contribs',
+                       'newbie',
+                       'newbie',
+                       $this->opts['contribs'] == 'newbie',
+                       array( 'class' => 'mw-input' )
+               );
+               $labelUsername = Xml::radioLabel(
+                       $this->msg( 'sp-contributions-username' )->text(),
+                       'contribs',
+                       'user',
+                       'user',
+                       $this->opts['contribs'] == 'user',
+                       array( 'class' => 'mw-input' )
+               );
+               $input = Html::input(
+                       'target',
+                       $this->opts['target'],
+                       'text',
+                       array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
+                               ( $this->opts['target'] ? array() : array( 'autofocus' )
                                )
-                       ) . ' '
+               );
+               $targetSelection = Html::rawElement(
+                       'td',
+                       array( 'colspan' => 2 ),
+                       $labelNewbies . '<br />' . $labelUsername . ' ' . $input . ' '
                );
 
-               $namespaceSelection =
-                       Xml::tags( 'td', array( 'class' => 'mw-label' ),
-                               Xml::label(
-                                       $this->msg( 'namespace' )->text(),
-                                       'namespace',
-                                       ''
-                               )
-                       ) .
-                       Html::rawElement( 'td', null,
-                               Html::namespaceSelector( array(
-                                       'selected' => $this->opts['namespace'],
-                                       'all'      => '',
-                               ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
+               $namespaceSelection = Xml::tags(
+                       'td',
+                       array( 'class' => 'mw-label' ),
+                       Xml::label(
+                               $this->msg( 'namespace' )->text(),
+                               'namespace',
+                               ''
+                       )
+               );
+               $namespaceSelection .= Html::rawElement(
+                       'td',
+                       null,
+                       Html::namespaceSelector(
+                               array( 'selected' => $this->opts['namespace'], 'all' => '' ),
+                               array(
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
-                               ) ) .
-                               '&#160;' .
-                               Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-                                       Xml::checkLabel(
-                                               $this->msg( 'invert' )->text(),
-                                               'nsInvert',
-                                               'nsInvert',
-                                               $this->opts['nsInvert'],
-                                               array( 'title' => $this->msg( 'tooltip-invert' )->text(), 'class' => 'mw-input' )
-                                       ) . '&#160;'
-                               ) .
-                               Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-                                       Xml::checkLabel(
-                                               $this->msg( 'namespace_association' )->text(),
-                                               'associated',
-                                               'associated',
-                                               $this->opts['associated'],
-                                               array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
-                                       ) . '&#160;'
                                )
-                       );
+                       ) . '&#160;' .
+                       Html::rawElement(
+                               'span',
+                               array( 'style' => 'white-space: nowrap' ),
+                               Xml::checkLabel(
+                                       $this->msg( 'invert' )->text(),
+                                       'nsInvert',
+                                       'nsInvert',
+                                       $this->opts['nsInvert'],
+                                       array(
+                                               'title' => $this->msg( 'tooltip-invert' )->text(),
+                                               'class' => 'mw-input'
+                                       )
+                               ) . '&#160;'
+                       ) .
+                       Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                               Xml::checkLabel(
+                                       $this->msg( 'namespace_association' )->text(),
+                                       'associated',
+                                       'associated',
+                                       $this->opts['associated'],
+                                       array(
+                                               'title' => $this->msg( 'tooltip-namespace_association' )->text(),
+                                               'class' => 'mw-input'
+                                       )
+                               ) . '&#160;'
+                       )
+               );
 
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
-                       $deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                       $deletedOnlyCheck = Html::rawElement(
+                               'span',
+                               array( 'style' => 'white-space: nowrap' ),
                                Xml::checkLabel(
                                        $this->msg( 'history-show-deleted' )->text(),
                                        'deletedOnly',
@@ -498,46 +540,50 @@ class SpecialContributions extends SpecialPage {
                        $deletedOnlyCheck = '';
                }
 
-               $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
-                       $deletedOnlyCheck .
-                       Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-                               Xml::checkLabel(
-                                       $this->msg( 'sp-contributions-toponly' )->text(),
-                                       'topOnly',
-                                       'mw-show-top-only',
-                                       $this->opts['topOnly'],
-                                       array( 'class' => 'mw-input' )
-                               )
+               $checkLabelTopOnly = Html::rawElement(
+                       'span',
+                       array( 'style' => 'white-space: nowrap' ),
+                       Xml::checkLabel(
+                               $this->msg( 'sp-contributions-toponly' )->text(),
+                               'topOnly',
+                               'mw-show-top-only',
+                               $this->opts['topOnly'],
+                               array( 'class' => 'mw-input' )
                        )
                );
+               $extraOptions = Html::rawElement(
+                       'td',
+                       array( 'colspan' => 2 ),
+                       $deletedOnlyCheck . $checkLabelTopOnly
+               );
 
                $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
                        Xml::dateMenu(
                                $this->opts['year'],
                                $this->opts['month']
                        ) . ' ' .
-                       Xml::submitButton(
-                               $this->msg( 'sp-contributions-submit' )->text(),
-                               array( 'class' => 'mw-submit' )
-                       )
+                               Xml::submitButton(
+                                       $this->msg( 'sp-contributions-submit' )->text(),
+                                       array( 'class' => 'mw-submit' )
+                               )
                );
 
-               $form .=
-                       Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
-                       Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
-                               Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
-                               Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
-                       );
+               $form .= Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() );
+               $form .= Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+                       Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+                       Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+               );
 
                $explain = $this->msg( 'sp-contributions-explain' );
                if ( !$explain->isBlank() ) {
                        $form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
                }
-               $form .= Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+
+               $form .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' );
+
                return $form;
        }
 
@@ -564,7 +610,15 @@ class ContribsPager extends ReverseChronologicalPager {
        function __construct( IContextSource $context, array $options ) {
                parent::__construct( $context );
 
-               $msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
+               $msgs = array(
+                       'diff',
+                       'hist',
+                       'newarticle',
+                       'pipe-separator',
+                       'rev-delundel',
+                       'rollbacklink',
+                       'uctop'
+               );
 
                foreach ( $msgs as $msg ) {
                        $this->messages[$msg] = $this->msg( $msg )->escaped();
@@ -603,7 +657,11 @@ class ContribsPager extends ReverseChronologicalPager {
         * @return ResultWrapper
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo(
+                       $offset,
+                       $limit,
+                       $descending
+               );
                $pager = $this;
 
                /*
@@ -673,15 +731,15 @@ class ContribsPager extends ReverseChronologicalPager {
                $join_cond['user'] = Revision::userJoinCond();
 
                $queryInfo = array(
-                       'tables'     => $tables,
-                       'fields'     => array_merge(
+                       'tables' => $tables,
+                       'fields' => array_merge(
                                Revision::selectFields(),
                                Revision::selectUserFields(),
                                array( 'page_namespace', 'page_title', 'page_is_new',
                                        'page_latest', 'page_is_redirect', 'page_len' )
                        ),
-                       'conds'      => $conds,
-                       'options'    => array( 'USE INDEX' => array( 'revision' => $index ) ),
+                       'conds' => $conds,
+                       'options' => array( 'USE INDEX' => array( 'revision' => $index ) ),
                        'join_conds' => $join_cond
                );
 
@@ -709,7 +767,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        # ignore local groups with the bot right
                        # @todo FIXME: Global groups may have 'bot' rights
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
-                       if( count( $groupsWithBotPermission ) ) {
+                       if ( count( $groupsWithBotPermission ) ) {
                                $tables[] = 'user_groups';
                                $condition[] = 'ug_group IS NULL';
                                $join_conds['user_groups'] = array(
@@ -729,12 +787,15 @@ class ContribsPager extends ReverseChronologicalPager {
                                $index = 'usertext_timestamp';
                        }
                }
+
                if ( $this->deletedOnly ) {
                        $condition[] = 'rev_deleted != 0';
                }
+
                if ( $this->topOnly ) {
                        $condition[] = 'rev_id = page_latest';
                }
+
                return array( $tables, $index, $condition, $join_conds );
        }
 
@@ -746,20 +807,20 @@ class ContribsPager extends ReverseChronologicalPager {
 
                        if ( !$this->associated ) {
                                return array( "page_namespace $eq_op $selectedNS" );
-                       } else {
-                               $associatedNS = $this->mDb->addQuotes (
-                                       MWNamespace::getAssociated( $this->namespace )
-                               );
-                               return array(
-                                       "page_namespace $eq_op $selectedNS " .
-                                       $bool_op .
-                                       " page_namespace $eq_op $associatedNS"
-                               );
                        }
 
-               } else {
-                       return array();
+                       $associatedNS = $this->mDb->addQuotes(
+                               MWNamespace::getAssociated( $this->namespace )
+                       );
+
+                       return array(
+                               "page_namespace $eq_op $selectedNS " .
+                                       $bool_op .
+                                       " page_namespace $eq_op $associatedNS"
+                       );
                }
+
+               return array();
        }
 
        function getIndexField() {
@@ -773,7 +834,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $batch = new LinkBatch();
                # Give some pointers to make (last) links
                foreach ( $this->mResult as $row ) {
-                       if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+                       if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
                                $revIds[] = $row->rev_parent_id;
                        }
                        if ( isset( $row->rev_id ) ) {
@@ -830,7 +891,7 @@ class ContribsPager extends ReverseChronologicalPager {
                 */
                wfSuppressWarnings();
                $rev = new Revision( $row );
-               $validRevision = (bool) $rev->getId();
+               $validRevision = (bool)$rev->getId();
                wfRestoreWarnings();
 
                if ( $validRevision ) {
@@ -850,8 +911,8 @@ class ContribsPager extends ReverseChronologicalPager {
                                $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
                                # Add rollback link
                                if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
-                                       && $page->quickUserCan( 'edit', $user ) )
-                               {
+                                       && $page->quickUserCan( 'edit', $user )
+                               {
                                        $this->preventClickjacking();
                                        $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
                                }
@@ -881,11 +942,18 @@ class ContribsPager extends ReverseChronologicalPager {
                                // For some reason rev_parent_id isn't populated for this row.
                                // Its rumoured this is true on wikipedia for some revisions (bug 34922).
                                // Next best thing is to have the total number of bytes.
-                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+                               $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;
-                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
-                                               $parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff .= ChangesList::showCharacterDifference(
+                                       $parentLen,
+                                       $row->rev_len,
+                                       $this->getContext()
+                               );
+                               $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
                        }
 
                        $lang = $this->getLanguage();
@@ -932,7 +1000,9 @@ class ContribsPager extends ReverseChronologicalPager {
                                $del .= ' ';
                        }
 
-                       $diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
+                       $diffHistLinks = $this->msg( 'parentheses' )
+                               ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )
+                               ->escaped();
                        $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
 
                        # Denote if username is redacted for this edit
@@ -941,7 +1011,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        }
 
                        # Tags, if any.
-                       list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
+                       list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
+                               $row->ts_tags,
+                               'contributions'
+                       );
                        $classes = array_merge( $classes, $newClasses );
                        $ret .= " $tagSummary";
                }
@@ -966,7 +1039,8 @@ class ContribsPager extends ReverseChronologicalPager {
         */
        function getSqlComment() {
                if ( $this->namespace || $this->deletedOnly ) {
-                       return 'contributions page filtered for namespace or RevisionDeleted edits'; // potentially slow, see CR r58153
+                       // potentially slow, see CR r58153
+                       return 'contributions page filtered for namespace or RevisionDeleted edits';
                } else {
                        return 'contributions page unfiltered';
                }
index e374979..901c7f9 100644 (file)
@@ -30,10 +30,15 @@ class DeletedContribsPager extends IndexPager {
        var $messages, $target;
        var $namespace = '', $mDb;
 
+       /**
+        * @var string Navigation bar with paging links.
+        */
+       protected $mNavigationBar;
+
        function __construct( IContextSource $context, $target, $namespace = false ) {
                parent::__construct( $context );
                $msgs = array( 'deletionlog', 'undeleteviewlink', 'diff' );
-               foreach( $msgs as $msg ) {
+               foreach ( $msgs as $msg ) {
                        $this->messages[$msg] = $this->msg( $msg )->escaped();
                }
                $this->target = $target;
@@ -52,17 +57,17 @@ class DeletedContribsPager extends IndexPager {
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
                // Paranoia: avoid brute force searches (bug 17792)
-               if( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
-               } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
                                ' != ' . Revision::SUPPRESSED_USER;
                }
                return array(
                        'tables' => array( 'archive' ),
                        'fields' => array(
-                               'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', 'ar_minor_edit',
-                               'ar_user', 'ar_user_text', 'ar_deleted'
+                               'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment',
+                               'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted'
                        ),
                        'conds' => $conds,
                        'options' => array( 'USE INDEX' => $index )
@@ -107,8 +112,17 @@ class DeletedContribsPager extends IndexPager {
                $lang = $this->getLanguage();
                $limits = $lang->pipeList( $limitLinks );
 
-               $this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
-                       $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
+               $firstLast = $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) );
+               $firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped();
+               $prevNext = $this->msg( 'viewprevnext' )
+                       ->rawParams(
+                               $pagingLinks['prev'],
+                               $pagingLinks['next'],
+                               $limits
+                       )->escaped();
+               $separator = $this->msg( 'word-separator' )->escaped();
+               $this->mNavigationBar = $firstLast . $separator . $prevNext;
+
                return $this->mNavigationBar;
        }
 
@@ -138,15 +152,15 @@ class DeletedContribsPager extends IndexPager {
                $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
                $rev = new Revision( array(
-                               'title'      => $page,
-                               'id'         => $row->ar_rev_id,
-                               'comment'    => $row->ar_comment,
-                               'user'       => $row->ar_user,
-                               'user_text'  => $row->ar_user_text,
-                               'timestamp'  => $row->ar_timestamp,
-                               'minor_edit' => $row->ar_minor_edit,
-                               'deleted'    => $row->ar_deleted,
-                               ) );
+                       'title' => $page,
+                       'id' => $row->ar_rev_id,
+                       'comment' => $row->ar_comment,
+                       'user' => $row->ar_user,
+                       'user_text' => $row->ar_user_text,
+                       'timestamp' => $row->ar_timestamp,
+                       'minor_edit' => $row->ar_minor_edit,
+                       'deleted' => $row->ar_deleted,
+               ) );
 
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
@@ -168,7 +182,7 @@ class DeletedContribsPager extends IndexPager {
 
                $user = $this->getUser();
 
-               if( $user->isAllowed( 'deletedtext' ) ) {
+               if ( $user->isAllowed( 'deletedtext' ) ) {
                        $last = Linker::linkKnown(
                                $undelete,
                                $this->messages['diff'],
@@ -184,9 +198,10 @@ class DeletedContribsPager extends IndexPager {
                }
 
                $comment = Linker::revComment( $rev );
-               $date = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ) );
+               $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
+               $date = htmlspecialchars( $date );
 
-               if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $link = $date; // unusable link
                } else {
                        $link = Linker::linkKnown(
@@ -200,7 +215,7 @@ class DeletedContribsPager extends IndexPager {
                        );
                }
                // Style deleted items
-               if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
@@ -210,7 +225,7 @@ class DeletedContribsPager extends IndexPager {
                        array( 'class' => 'mw-changeslist-title' )
                );
 
-               if( $rev->isMinor() ) {
+               if ( $rev->isMinor() ) {
                        $mflag = ChangesList::flag( 'minor' );
                } else {
                        $mflag = '';
@@ -218,7 +233,9 @@ class DeletedContribsPager extends IndexPager {
 
                // Revision delete link
                $del = Linker::getRevDeleteLink( $user, $rev, $page );
-               if ( $del ) $del .= ' ';
+               if ( $del ) {
+                       $del .= ' ';
+               }
 
                $tools = Html::rawElement(
                        'span',
@@ -231,7 +248,7 @@ class DeletedContribsPager extends IndexPager {
                $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
                # Denote if username is redacted for this edit
-               if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
                }
 
@@ -254,7 +271,7 @@ class DeletedContribsPager extends IndexPager {
 class DeletedContributionsPage extends SpecialPage {
        function __construct() {
                parent::__construct( 'DeletedContributions', 'deletedhistory',
-               /*listed*/ true, /*function*/ false, /*file*/ false );
+               /*listed*/true, /*function*/false, /*file*/false );
        }
 
        /**
@@ -265,6 +282,7 @@ class DeletedContributionsPage extends SpecialPage {
         */
        function execute( $par ) {
                global $wgQueryPageDefaultLimit;
+
                $this->setHeaders();
                $this->outputHeader();
 
@@ -321,23 +339,27 @@ class DeletedContributionsPage extends SpecialPage {
 
                # Show a message about slave lag, if applicable
                $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-               if( $lag > 0 )
+               if ( $lag > 0 ) {
                        $out->showLagWarning( $lag );
+               }
 
                $out->addHTML(
                        '<p>' . $pager->getNavigationBar() . '</p>' .
-                       $pager->getBody() .
-                       '<p>' . $pager->getNavigationBar() . '</p>' );
+                               $pager->getBody() .
+                               '<p>' . $pager->getNavigationBar() . '</p>' );
 
                # If there were contributions, and it was a valid user or IP, show
                # the appropriate "footer" message - WHOIS tools, etc.
-               if( $target != 'newbies' ) {
+               if ( $target != 'newbies' ) {
                        $message = IP::isIPAddress( $target )
                                ? 'sp-contributions-footer-anon'
                                : 'sp-contributions-footer';
 
-                       if( !$this->msg( $message )->isDisabled() ) {
-                               $out->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
+                       if ( !$this->msg( $message )->isDisabled() ) {
+                               $out->wrapWikiMsg(
+                                       "<div class='mw-contributions-footer'>\n$1\n</div>",
+                                       array( $message, $target )
+                               );
                        }
                }
        }
@@ -358,11 +380,12 @@ class DeletedContributionsPage extends SpecialPage {
                $nt = $userObj->getUserPage();
                $id = $userObj->getID();
                $talk = $nt->getTalkPage();
-               if( $talk ) {
+               if ( $talk ) {
                        # Talk page link
                        $tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
-                       if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
-                               if( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+                       if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
+                               # Block / Change block / Unblock links
+                               if ( $this->getUser()->isAllowed( 'block' ) ) {
                                        if ( $userObj->isBlocked() ) {
                                                $tools[] = Linker::linkKnown( # Change block link
                                                        SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
@@ -377,8 +400,8 @@ class DeletedContributionsPage extends SpecialPage {
                                                                'ip' => $nt->getDBkey()
                                                        )
                                                );
-                                       }
-                                       else { # User is not blocked
+                                       } else {
+                                               # User is not blocked
                                                $tools[] = Linker::linkKnown( # Block link
                                                        SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
                                                        $this->msg( 'blocklink' )->escaped()
@@ -419,7 +442,7 @@ class DeletedContributionsPage extends SpecialPage {
                        # Add a link to change user rights for privileged users
                        $userrightsPage = new UserrightsPage();
                        $userrightsPage->setContext( $this->getContext() );
-                       if( $userrightsPage->userCanChangeRights( $userObj ) ) {
+                       if ( $userrightsPage->userCanChangeRights( $userObj ) ) {
                                $tools[] = Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
                                        $this->msg( 'sp-contributions-userrights' )->escaped()
@@ -432,7 +455,8 @@ class DeletedContributionsPage extends SpecialPage {
 
                        // Show a note if the user is blocked and display the last block log entry.
                        if ( $userObj->isBlocked() ) {
-                               $out = $this->getOutput(); // LogEventsList::showLogExtract() wants the first parameter by ref
+                               // LogEventsList::showLogExtract() wants the first parameter by ref
+                               $out = $this->getOutput();
                                LogEventsList::showLogExtract(
                                        $out,
                                        'block',
@@ -458,9 +482,9 @@ class DeletedContributionsPage extends SpecialPage {
                $oldMsg = $this->msg( 'contribsub' );
                if ( $oldMsg->exists() ) {
                        return $oldMsg->rawParams( "$user ($links)" );
-               } else {
-                       return $this->msg( 'contribsub2' )->rawParams( $user, $links );
                }
+
+               return $this->msg( 'contribsub2' )->rawParams( $user, $links );
        }
 
        /**
@@ -499,27 +523,38 @@ class DeletedContributionsPage extends SpecialPage {
                        $f .= "\t" . Html::hidden( $name, $value ) . "\n";
                }
 
-               $f .= Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() ) .
-                       Xml::tags( 'label', array( 'for' => 'target' ), $this->msg( 'sp-contributions-username' )->parse() ) . ' ' .
-                       Html::input( 'target', $options['target'], 'text', array(
+               $f .= Xml::openElement( 'fieldset' );
+               $f .= Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() );
+               $f .= Xml::tags(
+                       'label',
+                       array( 'for' => 'target' ),
+                       $this->msg( 'sp-contributions-username' )->parse()
+               ) . ' ';
+               $f .= Html::input(
+                       'target',
+                       $options['target'],
+                       'text',
+                       array(
                                'size' => '20',
                                'required' => ''
-                       ) + ( $options['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
-                       Html::namespaceSelector(
-                               array(
-                                       'selected' => $options['namespace'],
-                                       'all' => '',
-                                       'label' => $this->msg( 'namespace' )->text()
-                               ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
-                                       'class' => 'namespaceselector',
-                               )
-                       ) . ' ' .
-                       Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+                       ) + ( $options['target'] ? array() : array( 'autofocus' ) )
+               ) . ' ';
+               $f .= Html::namespaceSelector(
+                       array(
+                               'selected' => $options['namespace'],
+                               'all' => '',
+                               'label' => $this->msg( 'namespace' )->text()
+                       ),
+                       array(
+                               'name' => 'namespace',
+                               'id' => 'namespace',
+                               'class' => 'namespaceselector',
+                       )
+               ) . ' ';
+               $f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
+               $f .= Xml::closeElement( 'fieldset' );
+               $f .= Xml::closeElement( 'form' );
+
                return $f;
        }
 
index d2838e0..ad06d5f 100644 (file)
@@ -88,7 +88,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                # was $wgUser
                if( $mode instanceof User ) {
                        $args = func_get_args();
-                       if( count( $args >= 4 ) ) {
+                       if ( count( $args ) >= 4 ) {
                                $mode = $args[3];
                        }
                }
index b5ad589..163e5c6 100644 (file)
@@ -119,11 +119,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                throw new ThrottledError;
                        case 'mailnologin':
                        case 'usermaildisabled':
-                               throw new  ErrorPageError( $error, "{$error}text" );
+                               throw new ErrorPageError( $error, "{$error}text" );
                        default:
                                # It's a hook error
                                list( $title, $msg, $params ) = $error;
-                               throw new  ErrorPageError( $title, $msg, $params );
+                               throw new ErrorPageError( $title, $msg, $params );
                }
                // Got a valid target user name? Else ask for one.
                $ret = self::getTarget( $this->mTarget );
index 7abfefe..ed3321e 100644 (file)
@@ -187,7 +187,7 @@ class SpecialExport extends SpecialPage {
                $out->addWikiMsg( 'exporttext' );
 
                $form = Xml::openElement( 'form', array( 'method' => 'post',
-                       'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
+                       'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) );
                $form .= Xml::inputLabel( $this->msg( 'export-addcattext' )->text(), 'catname', 'catname', 40 ) . '&#160;';
                $form .= Xml::submitButton( $this->msg( 'export-addcat' )->text(), array( 'name' => 'addcat' ) ) . '<br />';
 
index 3fe64e6..cc5cd5b 100644 (file)
@@ -113,14 +113,14 @@ class FileDuplicateSearchPage extends QueryPage {
 
                # Create the input form
                $out->addHTML(
-                       Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
-                       Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' )
+                       Html::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+                       Html::openElement( 'fieldset' ) . "\n" .
+                       Html::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) . "\n" .
+                       Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . "\n" .
+                       Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) . "\n" .
+                       Html::closeElement( 'fieldset' ) . "\n" .
+                       Html::closeElement( 'form' )
                );
 
                if( $this->file ) {
index aa56041..fc6172f 100644 (file)
@@ -182,7 +182,7 @@ class SpecialImport extends SpecialPage {
        private function showForm() {
                global $wgImportSources, $wgExportMaxLinkDepth;
 
-               $action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
+               $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
                $user = $this->getUser();
                $out = $this->getOutput();
 
index d204d50..ab42549 100644 (file)
@@ -112,7 +112,7 @@ class SpecialJavaScriptTest extends SpecialPage {
                if( !in_array( $state, $validStates ) ) {
                        throw new MWException( __METHOD__
                                . ' given an invalid state. Must be one of "'
-                               . join( '", "', $validStates) . '".'
+                               . join( '", "', $validStates ) . '".'
                        );
                }
                return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
index ebb3021..eefc1b7 100644 (file)
@@ -419,7 +419,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                $feed = new $wgFeedClasses[$type](
                        $this->feedTitle(),
                        $this->msg( 'tagline' )->text(),
-                       $this->getTitle()->getFullUrl()
+                       $this->getTitle()->getFullURL()
                );
 
                $pager = new NewPagesPager( $this, $this->opts );
index 8f8c981..2f49803 100644 (file)
@@ -70,9 +70,8 @@ class SpecialPagesWithProp extends QueryPage {
                        ),
                ), $this->getContext() );
                $form->setMethod( 'get' );
-               $form->setAction( $this->getTitle()->getFullUrl() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+               $form->setWrapperLegendMsg( 'pageswithprop-legend' );
                $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
                $form->setSubmitTextMsg( 'pageswithprop-submit' );
 
@@ -125,7 +124,7 @@ class SpecialPagesWithProp extends QueryPage {
                $ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
                if ( $result->pp_value !== '' ) {
                        $value = $this->msg( 'parentheses' )
-                               ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
+                               ->rawParams( Html::element( 'span', array( 'class' => 'prop-value' ), $result->pp_value ) )
                                ->escaped();
                        $ret .= " $value";
                }
index 90b0ac8..6b335c3 100644 (file)
@@ -249,7 +249,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $username,
                        $passwordBlock,
                        count( $passwords ),
-                       '<' . Title::newMainPage()->getCanonicalUrl() . '>',
+                       '<' . Title::newMainPage()->getCanonicalURL() . '>',
                        round( $wgNewPasswordExpiry / 86400 )
                );
 
@@ -292,7 +292,7 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        protected function canChangePassword( User $user ) {
-               global $wgPasswordResetRoutes, $wgAuth;
+               global $wgPasswordResetRoutes, $wgEnableEmail, $wgAuth;
 
                // Maybe password resets are disabled, or there are no allowable routes
                if ( !is_array( $wgPasswordResetRoutes ) ||
@@ -306,6 +306,11 @@ class SpecialPasswordReset extends FormSpecialPage {
                        return 'resetpass_forbidden';
                }
 
+               // Maybe email features have been disabled
+               if ( !$wgEnableEmail ) {
+                       return 'passwordreset-emaildisabled';
+               }
+
                // Maybe the user is blocked (check this here rather than relying on the parent
                // method as we have a more specific error message to use here
                if ( $user->isBlocked() ) {
index eb89bec..5927851 100644 (file)
@@ -83,6 +83,13 @@ class SpecialProtectedpages extends SpecialPage {
                }
 
                $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+               if( !$title ) {
+                       wfProfileOut( __METHOD__ );
+                       return Html::rawElement( 'li', array(),
+                               Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription( $this->getContext(), $row->page_namespace, $row->page_title ) ) ) . "\n";
+               }
+
                $link = Linker::link( $title );
 
                $description_items = array ();
@@ -202,16 +209,14 @@ class SpecialProtectedpages extends SpecialPage {
         * @return string Formatted HTML
         */
        protected function getExpiryCheck( $indefOnly ) {
-               return
-                       Xml::checkLabel( $this->msg( 'protectedpages-indef' )->text(), 'indefonly', 'indefonly', $indefOnly ) . "\n";
+               return Xml::checkLabel( $this->msg( 'protectedpages-indef' )->text(), 'indefonly', 'indefonly', $indefOnly ) . "\n";
        }
 
        /**
         * @return string Formatted HTML
         */
        protected function getCascadeCheck( $cascadeOnly ) {
-               return
-                       Xml::checkLabel( $this->msg( 'protectedpages-cascade' )->text(), 'cascadeonly', 'cascadeonly', $cascadeOnly ) . "\n";
+               return Xml::checkLabel( $this->msg( 'protectedpages-cascade' )->text(), 'cascadeonly', 'cascadeonly', $cascadeOnly ) . "\n";
        }
 
        /**
@@ -220,8 +225,7 @@ class SpecialProtectedpages extends SpecialPage {
        protected function getSizeLimit( $sizetype, $size ) {
                $max = $sizetype === 'max';
 
-               return
-                       Xml::radioLabel( $this->msg( 'minimum-size' )->text(), 'sizetype', 'min', 'wpmin', !$max ) .
+               return Xml::radioLabel( $this->msg( 'minimum-size' )->text(), 'sizetype', 'min', 'wpmin', !$max ) .
                        '&#160;' .
                        Xml::radioLabel( $this->msg( 'maximum-size' )->text(), 'sizetype', 'max', 'wpmax', $max ) .
                        '&#160;' .
index 6a94deb..ab53bb5 100644 (file)
@@ -81,6 +81,13 @@ class SpecialProtectedtitles extends SpecialPage {
                }
 
                $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
+               if( !$title ) {
+                       wfProfileOut( __METHOD__ );
+                       return Html::rawElement( 'li', array(),
+                               Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription( $this->getContext(), $row->pt_namespace, $row->pt_title ) ) ) . "\n";
+               }
+
                $link = Linker::link( $title );
 
                $description_items = array ();
@@ -176,8 +183,7 @@ class SpecialProtectedtitles extends SpecialPage {
                        $options[] = Xml::option( $text, $type, $selected );
                }
 
-               return
-                       Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
+               return Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
                        Xml::tags( 'select',
                                array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
                                implode( "\n", $options ) );
@@ -200,7 +206,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
                $this->mConds = $conds;
                $this->level = $level;
                $this->namespace = $namespace;
-               $this->size = intval($size);
+               $this->size = intval( $size );
                parent::__construct( $form->getContext() );
        }
 
index ba5a4ac..2b25b78 100644 (file)
@@ -72,7 +72,7 @@ class RandomPage extends SpecialPage {
                $redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
                $query = array_merge( $this->getRequest()->getValues(), $redirectParam );
                unset( $query['title'] );
-               $this->getOutput()->redirect( $title->getFullUrl( $query ) );
+               $this->getOutput()->redirect( $title->getFullURL( $query ) );
        }
 
        /**
index 008678f..d9145b8 100644 (file)
@@ -66,7 +66,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Create a FormOptions object with options as specified by the user
         *
-        * @param $parameters array
+        * @param array $parameters
         *
         * @return FormOptions
         */
@@ -91,7 +91,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Get custom show/hide filters
         *
-        * @return Array Map of filter URL param names to properties (msg/default)
+        * @return array Map of filter URL param names to properties (msg/default)
         */
        protected function getCustomFilters() {
                if ( $this->customFilters === null ) {
@@ -132,7 +132,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Main execution point
         *
-        * @param $subpage String
+        * @param string $subpage
         */
        public function execute( $subpage ) {
                $this->rcSubpage = $subpage;
@@ -172,6 +172,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
                if( $feedFormat ) {
                        list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+                       /** @var ChangesFeed $changesFeed */
                        $changesFeed->execute( $formatter, $rows, $lastmod, $opts );
                } else {
                        $this->webOutput( $rows, $opts );
@@ -183,7 +184,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Return an array with a ChangesFeed object and ChannelFeed object
         *
-        * @return Array
+        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+        * @return array
         */
        public function getFeedObject( $feedFormat ) {
                $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
@@ -199,8 +201,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Process $par and put options found if $opts
         * Mainly used when including the page
         *
-        * @param $par String
-        * @param $opts FormOptions
+        * @param string $par
+        * @param FormOptions $opts
         */
        public function parseParameters( $par, FormOptions $opts ) {
                $bits = preg_split( '/\s*,\s*/', trim( $par ) );
@@ -252,8 +254,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Don't use this if we are using the patrol feature, patrol changes don't
         * update the timestamp
         *
-        * @param $feedFormat String
-        * @return String or false
+        * @param string $feedFormat
+        * @return string|bool
         */
        public function checkLastModified( $feedFormat ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -270,7 +272,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Return an array of conditions depending of options set in $opts
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts
         * @return array
         */
        public function buildMainQueryConds( FormOptions $opts ) {
@@ -362,9 +364,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Process the query
         *
-        * @param $conds Array
-        * @param $opts FormOptions
-        * @return bool|ResultWrapper result or false (for Recentchangeslinked only)
+        * @param array $conds
+        * @param FormOptions $opts
+        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
         */
        public function doMainQuery( $conds, $opts ) {
                $tables = array( 'recentchanges' );
@@ -468,8 +470,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Send output to the OutputPage object, only called if not used feeds
         *
-        * @param array $rows of database rows
-        * @param $opts FormOptions
+        * @param array $rows Database rows
+        * @param FormOptions $opts
         */
        public function webOutput( $rows, $opts ) {
                global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
@@ -567,8 +569,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Return the text to be displayed above the changes
         *
-        * @param $opts FormOptions
-        * @return String: XHTML
+        * @param FormOptions $opts
+        * @return string XHTML
         */
        public function doHeader( $opts ) {
                global $wgScript;
@@ -629,8 +631,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Get options to be displayed in a form
         *
-        * @param $opts FormOptions
-        * @return Array
+        * @param FormOptions $opts
+        * @return array
         */
        function getExtraOptions( $opts ) {
                $extraOpts = array();
@@ -653,7 +655,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Send the text to be displayed above the options
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts Unused
         */
        function setTopText( FormOptions $opts ) {
                global $wgContLang;
@@ -675,7 +677,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Send the text to be displayed after the options, for use in
         * Recentchangeslinked
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts
         */
        function setBottomText( FormOptions $opts ) {}
 
@@ -683,8 +685,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Creates the choose namespace selection
         *
         * @todo Uses radio buttons (HASHAR)
-        * @param $opts FormOptions
-        * @return String
+        * @param FormOptions $opts
+        * @return string
         */
        protected function namespaceFilterForm( FormOptions $opts ) {
                $nsSelect = Html::namespaceSelector(
@@ -708,8 +710,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Create a input to filter changes by categories
         *
-        * @param $opts FormOptions
-        * @return Array
+        * @param FormOptions $opts
+        * @return array
         */
        protected function categoryFilterForm( FormOptions $opts ) {
                list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
@@ -724,8 +726,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Filter $rows by categories set in $opts
         *
-        * @param array $rows of database rows
-        * @param $opts FormOptions
+        * @param array $rows Database rows
+        * @param FormOptions $opts
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
                $categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
@@ -788,10 +790,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Makes change an option link which carries all the other options
         *
-        * @param $title Title
-        * @param array $override options to override
-        * @param array $options current options
-        * @param $active Boolean: whether to show the link in bold
+        * @param string $title Title
+        * @param array $override Options to override
+        * @param array $options Current options
+        * @param bool $active Whether to show the link in bold
         * @return string
         */
        function makeOptionsLink( $title, $override, $options, $active = false ) {
@@ -816,8 +818,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Creates the options panel.
         *
-        * @param $defaults Array
-        * @param $nondefaults Array
+        * @param array $defaults
+        * @param array $nondefaults
         * @return string
         */
        function optionsPanel( $defaults, $nondefaults ) {
@@ -849,6 +851,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $wgRCLinkDays = array_unique( $wgRCLinkDays );
 
                // limit links
+               $cl = array();
                foreach( $wgRCLinkLimits as $value ) {
                        $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
@@ -856,6 +859,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $cl = $lang->pipeList( $cl );
 
                // day links, reset 'from' to none
+               $dl = array();
                foreach( $wgRCLinkDays as $value ) {
                        $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
index 391c4a7..bdeb770 100644 (file)
@@ -56,7 +56,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
                                ->inContentLanguage()->text(),
                        $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
-                       $this->getTitle()->getFullUrl()
+                       $this->getTitle()->getFullURL()
                );
                return array( $feed, $feedObj );
        }
@@ -183,7 +183,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                }
                        }
 
-                       if( $dbr->unionSupportsOrderAndLimit()) {
+                       if( $dbr->unionSupportsOrderAndLimit() ) {
                                $order = array( 'ORDER BY' => 'rc_timestamp DESC' );
                        } else {
                                $order = array();
@@ -198,7 +198,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                $join_conds + array( $link_table => array( 'INNER JOIN', $subjoin ) )
                        );
 
-                       if( $dbr->unionSupportsOrderAndLimit())
+                       if( $dbr->unionSupportsOrderAndLimit() )
                                $query = $dbr->limitResult( $query, $limit );
 
                        $subsql[] = $query;
index 5a5f8ff..3a7399a 100644 (file)
@@ -312,7 +312,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addHTML(
                                Xml::openElement( 'form', array(
                                        'method' => 'POST',
-                                       'action' => $this->getTitle()->getLocalUrl(
+                                       'action' => $this->getTitle()->getLocalURL(
                                                'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
                                                '&file=' . urlencode( $archiveName ) .
                                                '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
@@ -393,7 +393,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // Show form if the user can submit
                if( $this->mIsAllowed ) {
                        $out = Xml::openElement( 'form', array( 'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
+                                       'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
                                Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
                                $this->buildCheckBoxes() .
@@ -581,7 +581,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                foreach( $this->checks as $item ) {
                        list( /* message */, $name, $field ) = $item;
                        $val = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
-                       if( $val < -1 || $val > 1) {
+                       if( $val < -1 || $val > 1 ) {
                                $val = -1; // -1 for existing value
                        }
                        $bitfield[$field] = $val;
index 6c40148..a4ab7a8 100644 (file)
@@ -257,8 +257,14 @@ class SpecialSearch extends SpecialPage {
                        $textMatches = $search->searchText( $rewritten );
                }
 
+               $textStatus = null;
+               if( $textMatches instanceof Status ) {
+                       $textStatus = $textMatches;
+                       $textMatches = null;
+               }
+
                // did you mean... suggestions
-               if( $textMatches && $textMatches->hasSuggestion() ) {
+               if( $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
                        $st = SpecialPage::getTitleFor( 'Search' );
 
                        # mirror Go/Search behavior of original request ..
@@ -381,7 +387,7 @@ class SpecialSearch extends SpecialPage {
                        }
                        $titleMatches->free();
                }
-               if( $textMatches ) {
+               if( $textMatches && !$textStatus ) {
                        // output appropriate heading
                        if( $numTextMatches > 0 && $numTitleMatches > 0 ) {
                                // if no title matches the heading is redundant
@@ -402,8 +408,14 @@ class SpecialSearch extends SpecialPage {
                        $textMatches->free();
                }
                if( $num === 0 ) {
-                       $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
-                       $this->showCreateLink( $t );
+                       if ( $textStatus ) {
+                               $out->addHTML( '<div class="error">' .
+                                       htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+                       } else {
+                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+                                       array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
+                               $this->showCreateLink( $t );
+                       }
                }
                $out->addHtml( "</div>" );
 
@@ -912,8 +924,7 @@ class SpecialSearch extends SpecialPage {
                        $hidden .= Html::hidden( $key, $value );
                }
                // Return final output
-               return
-                       Xml::openElement(
+               return Xml::openElement(
                                'fieldset',
                                array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
                        ) .
@@ -1098,7 +1109,8 @@ class SpecialSearch extends SpecialPage {
                        'a',
                        array(
                                'href' => $this->getTitle()->getLocalURL( $stParams ),
-                               'title' => $tooltip),
+                               'title' => $tooltip
+                       ),
                        $label
                );
        }
index bc1b600..ec924b0 100644 (file)
@@ -171,11 +171,7 @@ class SpecialStatistics extends SpecialPage {
                                $this->formatRow( $this->msg( 'statistics-users' )->parse(),
                                                $this->getLanguage()->formatNum( $this->users ),
                                                array( 'class' => 'mw-statistics-users' ) ) .
-                               $this->formatRow( $this->msg( 'statistics-users-active' )->parse() . ' ' .
-                                                       Linker::linkKnown(
-                                                               SpecialPage::getTitleFor( 'Activeusers' ),
-                                                               $this->msg( 'listgrouprights-members' )->escaped()
-                                                       ),
+                               $this->formatRow( $this->msg( 'statistics-users-active' )->parse(),
                                                $this->getLanguage()->formatNum( $this->activeUsers ),
                                                array( 'class' => 'mw-statistics-users-active' ),
                                                'statistics-users-active-desc',
index e036348..0e8cf58 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class PageArchive {
-
        /**
         * @var Title
         */
@@ -44,7 +43,7 @@ class PageArchive {
        protected $revisionStatus;
 
        function __construct( $title ) {
-               if( is_null( $title ) ) {
+               if ( is_null( $title ) ) {
                        throw new MWException( __METHOD__ . ' given a null title.' );
                }
                $this->title = $title;
@@ -67,14 +66,14 @@ class PageArchive {
         * given title prefix.
         * Returns result wrapper with (ar_namespace, ar_title, count) fields.
         *
-        * @param string $prefix title prefix
+        * @param string $prefix Title prefix
         * @return ResultWrapper
         */
        public static function listPagesByPrefix( $prefix ) {
                $dbr = wfGetDB( DB_SLAVE );
 
                $title = Title::newFromText( $prefix );
-               if( $title ) {
+               if ( $title ) {
                        $ns = $title->getNamespace();
                        $prefix = $title->getDBkey();
                } else {
@@ -82,36 +81,36 @@ class PageArchive {
                        // @todo handle bare namespace names cleanly?
                        $ns = 0;
                }
+
                $conds = array(
                        'ar_namespace' => $ns,
                        'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
                );
+
                return self::listPages( $dbr, $conds );
        }
 
        /**
-        * @param $dbr DatabaseBase
-        * @param $condition
+        * @param DatabaseBase $dbr
+        * @param string|array $condition
         * @return bool|ResultWrapper
         */
        protected static function listPages( $dbr, $condition ) {
-               return $dbr->resultObject(
-                       $dbr->select(
-                               array( 'archive' ),
-                               array(
-                                       'ar_namespace',
-                                       'ar_title',
-                                       'count' => 'COUNT(*)'
-                               ),
-                               $condition,
-                               __METHOD__,
-                               array(
-                                       'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
-                                       'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
-                                       'LIMIT' => 100,
-                               )
+               return $dbr->resultObject( $dbr->select(
+                       array( 'archive' ),
+                       array(
+                               'ar_namespace',
+                               'ar_title',
+                               'count' => 'COUNT(*)'
+                       ),
+                       $condition,
+                       __METHOD__,
+                       array(
+                               'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
+                               'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
+                               'LIMIT' => 100,
                        )
-               );
+               ) );
        }
 
        /**
@@ -141,8 +140,8 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__,
                        array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-               $ret = $dbr->resultObject( $res );
-               return $ret;
+
+               return $dbr->resultObject( $res );
        }
 
        /**
@@ -154,26 +153,28 @@ class PageArchive {
         * @todo Does this belong in Image for fuller encapsulation?
         */
        function listFiles() {
-               if( $this->title->getNamespace() == NS_FILE ) {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res = $dbr->select(
-                               'filearchive',
-                               ArchivedFile::selectFields(),
-                               array( 'fa_name' => $this->title->getDBkey() ),
-                               __METHOD__,
-                               array( 'ORDER BY' => 'fa_timestamp DESC' ) );
-                       $ret = $dbr->resultObject( $res );
-                       return $ret;
+               if ( $this->title->getNamespace() != NS_FILE ) {
+                       return null;
                }
-               return null;
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'filearchive',
+                       ArchivedFile::selectFields(),
+                       array( 'fa_name' => $this->title->getDBkey() ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'fa_timestamp DESC' )
+               );
+
+               return $dbr->resultObject( $res );
        }
 
        /**
         * Return a Revision object containing data for the deleted revision.
         * Note that the result *may* or *may not* have a null page ID.
         *
-        * @param $timestamp String
-        * @return Revision
+        * @param string $timestamp
+        * @return Revision|null
         */
        function getRevision( $timestamp ) {
                global $wgContentHandlerUseDB;
@@ -203,14 +204,15 @@ class PageArchive {
                $row = $dbr->selectRow( 'archive',
                        $fields,
                        array( 'ar_namespace' => $this->title->getNamespace(),
-                                       'ar_title' => $this->title->getDBkey(),
-                                       'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
                        __METHOD__ );
-               if( $row ) {
+
+               if ( $row ) {
                        return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 
        /**
@@ -220,8 +222,8 @@ class PageArchive {
         * May produce unexpected results in case of history merges or other
         * unusual time issues.
         *
-        * @param $timestamp String
-        * @return Revision or null
+        * @param string $timestamp
+        * @return Revision|null Null when there is no previous revision
         */
        function getPreviousRevision( $timestamp ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -246,7 +248,7 @@ class PageArchive {
                                'page_title' => $this->title->getDBkey(),
                                'page_id = rev_page',
                                'rev_timestamp < ' .
-                                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
                        __METHOD__,
                        array(
                                'ORDER BY' => 'rev_timestamp DESC',
@@ -254,38 +256,39 @@ class PageArchive {
                $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
                $prevLiveId = $row ? intval( $row->rev_id ) : null;
 
-               if( $prevLive && $prevLive > $prevDeleted ) {
+               if ( $prevLive && $prevLive > $prevDeleted ) {
                        // Most prior revision was live
                        return Revision::newFromId( $prevLiveId );
-               } elseif( $prevDeleted ) {
+               } elseif ( $prevDeleted ) {
                        // Most prior revision was deleted
                        return $this->getRevision( $prevDeleted );
-               } else {
-                       // No prior revision on this page.
-                       return null;
                }
+
+               // No prior revision on this page.
+               return null;
        }
 
        /**
         * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
         *
-        * @param $row Object: database row
-        * @return Revision
+        * @param Object $row Database row
+        * @return string
         */
        function getTextFromRow( $row ) {
-               if( is_null( $row->ar_text_id ) ) {
+               if ( is_null( $row->ar_text_id ) ) {
                        // An old row from MediaWiki 1.4 or previous.
                        // Text is embedded in this row in classic compression format.
                        return Revision::getRevisionText( $row, 'ar_' );
-               } else {
-                       // New-style: keyed to the text storage backend.
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $text = $dbr->selectRow( 'text',
-                               array( 'old_text', 'old_flags' ),
-                               array( 'old_id' => $row->ar_text_id ),
-                               __METHOD__ );
-                       return Revision::getRevisionText( $text );
                }
+
+               // New-style: keyed to the text storage backend.
+               $dbr = wfGetDB( DB_SLAVE );
+               $text = $dbr->selectRow( 'text',
+                       array( 'old_text', 'old_flags' ),
+                       array( 'old_id' => $row->ar_text_id ),
+                       __METHOD__ );
+
+               return Revision::getRevisionText( $text );
        }
 
        /**
@@ -294,7 +297,7 @@ class PageArchive {
         *
         * If there are no archived revisions for the page, returns NULL.
         *
-        * @return String
+        * @return string|null
         */
        function getLastRevisionText() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -304,17 +307,18 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__,
                        array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-               if( $row ) {
+
+               if ( $row ) {
                        return $this->getTextFromRow( $row );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 
        /**
         * Quick check if any archived revisions are present for the page.
         *
-        * @return Boolean
+        * @return boolean
         */
        function isDeleted() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -323,6 +327,7 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__
                );
+
                return ( $n > 0 );
        }
 
@@ -331,11 +336,11 @@ class PageArchive {
         * Once restored, the items will be removed from the archive tables.
         * The deletion log will be updated with an undeletion notice.
         *
-        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-        * @param $comment String
-        * @param $fileVersions Array
-        * @param $unsuppress Boolean
-        * @param $user User doing the action, or null to use $wgUser
+        * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param string $comment
+        * @param array $fileVersions
+        * @param bool $unsuppress
+        * @param User $user User performing the action, or null to use $wgUser
         *
         * @return array(number of file revisions restored, number of image revisions restored, log message)
         * on success, false on failure
@@ -348,7 +353,7 @@ class PageArchive {
                $restoreText = $restoreAll || !empty( $timestamps );
                $restoreFiles = $restoreAll || !empty( $fileVersions );
 
-               if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
                        $img = wfLocalFile( $this->title );
                        $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
                        if ( !$this->fileStatus->isOK() ) {
@@ -359,9 +364,9 @@ class PageArchive {
                        $filesRestored = 0;
                }
 
-               if( $restoreText ) {
+               if ( $restoreText ) {
                        $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if( !$this->revisionStatus->isOK() ) {
+                       if ( !$this->revisionStatus->isOK() ) {
                                return false;
                        }
 
@@ -372,13 +377,13 @@ class PageArchive {
 
                // Touch the log!
 
-               if( $textRestored && $filesRestored ) {
+               if ( $textRestored && $filesRestored ) {
                        $reason = wfMessage( 'undeletedrevisions-files' )
                                ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-               } elseif( $textRestored ) {
+               } elseif ( $textRestored ) {
                        $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
                                ->inContentLanguage()->text();
-               } elseif( $filesRestored ) {
+               } elseif ( $filesRestored ) {
                        $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
                                ->inContentLanguage()->text();
                } else {
@@ -386,7 +391,7 @@ class PageArchive {
                        return false;
                }
 
-               if( trim( $comment ) != '' ) {
+               if ( trim( $comment ) != '' ) {
                        $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
                }
 
@@ -413,12 +418,11 @@ class PageArchive {
         * to the cur/old tables. If the page currently exists, all revisions will
         * be stuffed into old, otherwise the most recent will go into cur.
         *
-        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-        * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
-        *
-        * @param $comment String
+        * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+        * @param string $comment
         * @throws ReadOnlyError
-        * @return Status, containing the number of revisions restored on success
+        * @return Status Object containing the number of revisions restored on success
         */
        private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
                global $wgContentHandlerUseDB;
@@ -426,8 +430,8 @@ class PageArchive {
                if ( wfReadOnly() ) {
                        throw new ReadOnlyError();
                }
-               $restoreAll = empty( $timestamps );
 
+               $restoreAll = empty( $timestamps );
                $dbw = wfGetDB( DB_MASTER );
 
                # Does this page already exist? We'll have to update it...
@@ -443,7 +447,8 @@ class PageArchive {
                        __METHOD__,
                        array( 'FOR UPDATE' ) // lock page
                );
-               if( $page ) {
+
+               if ( $page ) {
                        $makepage = false;
                        # Page already exists. Import the history, and if necessary
                        # we'll update the latest revision field in the record.
@@ -455,7 +460,7 @@ class PageArchive {
                                array( 'rev_id' => $previousRevId ),
                                __METHOD__ );
 
-                       if( $previousTimestamp === false ) {
+                       if ( $previousTimestamp === false ) {
                                wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
 
                                $status = Status::newGood( 0 );
@@ -470,7 +475,7 @@ class PageArchive {
                        $previousTimestamp = 0;
                }
 
-               if( $restoreAll ) {
+               if ( $restoreAll ) {
                        $oldones = '1 = 1'; # All revisions...
                } else {
                        $oldts = implode( ',',
@@ -509,14 +514,15 @@ class PageArchive {
                        $fields,
                        /* WHERE */ array(
                                'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title'     => $this->title->getDBkey(),
+                               'ar_title' => $this->title->getDBkey(),
                                $oldones ),
                        __METHOD__,
                        /* options */ array( 'ORDER BY' => 'ar_timestamp' )
                );
                $ret = $dbw->resultObject( $result );
                $rev_count = $dbw->numRows( $result );
-               if( !$rev_count ) {
+
+               if ( !$rev_count ) {
                        wfDebug( __METHOD__ . ": no revisions to restore\n" );
 
                        $status = Status::newGood( 0 );
@@ -544,9 +550,9 @@ class PageArchive {
                        return $status;
                }
 
-               if( $makepage ) {
+               if ( $makepage ) {
                        // Check the state of the newest to-be version...
-                       if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+                       if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
                                return Status::newFatal( "undeleterevdel" );
                        }
                        // Safe to insert now...
@@ -554,9 +560,9 @@ class PageArchive {
                        $pageId = $newid;
                } else {
                        // Check if a deleted revision will become the current revision...
-                       if( $row->ar_timestamp > $previousTimestamp ) {
+                       if ( $row->ar_timestamp > $previousTimestamp ) {
                                // Check the state of the newest to-be version...
-                               if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+                               if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
                                        return Status::newFatal( "undeleterevdel" );
                                }
                        }
@@ -570,10 +576,10 @@ class PageArchive {
 
                foreach ( $ret as $row ) {
                        // Check for key dupes due to shitty archive integrity.
-                       if( $row->ar_rev_id ) {
+                       if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
                                        array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
-                               if( $exists ) {
+                               if ( $exists ) {
                                        continue; // don't throw DB errors
                                }
                        }
@@ -616,7 +622,7 @@ class PageArchive {
 
                wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment ) );
 
-               if( $this->title->getNamespace() == NS_FILE ) {
+               if ( $this->title->getNamespace() == NS_FILE ) {
                        $update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
                        $update->doUpdate();
                }
@@ -627,12 +633,16 @@ class PageArchive {
        /**
         * @return Status
         */
-       function getFileStatus() { return $this->fileStatus; }
+       function getFileStatus() {
+               return $this->fileStatus;
+       }
 
        /**
         * @return Status
         */
-       function getRevisionStatus() { return $this->revisionStatus; }
+       function getRevisionStatus() {
+               return $this->revisionStatus;
+       }
 }
 
 /**
@@ -664,10 +674,13 @@ class SpecialUndelete extends SpecialPage {
                } else {
                        $this->mTarget = $request->getVal( 'target' );
                }
+
                $this->mTargetObj = null;
+
                if ( $this->mTarget !== null && $this->mTarget !== '' ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
                }
+
                $this->mSearchPrefix = $request->getText( 'prefix' );
                $time = $request->getVal( 'timestamp' );
                $this->mTimestamp = $time ? wfTimestamp( TS_MW, $time ) : '';
@@ -698,16 +711,16 @@ class SpecialUndelete extends SpecialPage {
                        $this->mRestore = false;
                }
 
-               if( $this->mRestore || $this->mInvert ) {
+               if ( $this->mRestore || $this->mInvert ) {
                        $timestamps = array();
                        $this->mFileVersions = array();
-                       foreach( $request->getValues() as $key => $val ) {
+                       foreach ( $request->getValues() as $key => $val ) {
                                $matches = array();
-                               if( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
+                               if ( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
                                        array_push( $timestamps, $matches[1] );
                                }
 
-                               if( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
+                               if ( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
                                        $this->mFileVersions[] = intval( $matches[1] );
                                }
                        }
@@ -753,7 +766,7 @@ class SpecialUndelete extends SpecialPage {
                        if ( !$file->exists() ) {
                                $out->addWikiMsg( 'filedelete-nofile', $this->mFilename );
                        } elseif ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-                               if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
+                               if ( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                } else {
                                        throw new PermissionsError( 'deletedtext' );
@@ -776,22 +789,23 @@ class SpecialUndelete extends SpecialPage {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'undelete-search-title' ) );
                $out->addHTML(
-                       Xml::openElement( 'form', array(
-                               'method' => 'get',
-                               'action' => $wgScript ) ) .
-                       Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
-                       Html::hidden( 'title',
-                               $this->getTitle()->getPrefixedDBkey() ) .
-                       Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
-                               'prefix', 'prefix', 20,
-                               $this->mSearchPrefix ) . ' ' .
-                       Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' )
+                       Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
+                               Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
+                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+                               Xml::inputLabel(
+                                       $this->msg( 'undelete-search-prefix' )->text(),
+                                       'prefix',
+                                       'prefix',
+                                       20,
+                                       $this->mSearchPrefix
+                               ) . ' ' .
+                               Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+                               Xml::closeElement( 'fieldset' ) .
+                               Xml::closeElement( 'form' )
                );
 
                # List undeletable articles
-               if( $this->mSearchPrefix ) {
+               if ( $this->mSearchPrefix ) {
                        $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
                        $this->showList( $result );
                }
@@ -800,13 +814,13 @@ class SpecialUndelete extends SpecialPage {
        /**
         * Generic list of deleted pages
         *
-        * @param $result ResultWrapper
+        * @param ResultWrapper $result
         * @return bool
         */
        private function showList( $result ) {
                $out = $this->getOutput();
 
-               if( $result->numRows() == 0 ) {
+               if ( $result->numRows() == 0 ) {
                        $out->addWikiMsg( 'undelete-no-results' );
                        return false;
                }
@@ -826,8 +840,15 @@ class SpecialUndelete extends SpecialPage {
                                );
                        } else {
                                // The title is no longer valid, show as text
-                               $item = Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                                       Linker::getInvalidTitleDescription( $this->getContext(), $row->ar_namespace, $row->ar_title ) );
+                               $item = Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription(
+                                               $this->getContext(),
+                                               $row->ar_namespace,
+                                               $row->ar_title
+                                       )
+                               );
                        }
                        $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
                        $out->addHTML( "<li>{$item} ({$revs})</li>\n" );
@@ -839,7 +860,7 @@ class SpecialUndelete extends SpecialPage {
        }
 
        private function showRevision( $timestamp ) {
-               if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
+               if ( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
                        return;
                }
 
@@ -852,31 +873,37 @@ class SpecialUndelete extends SpecialPage {
                $out = $this->getOutput();
                $user = $this->getUser();
 
-               if( !$rev ) {
+               if ( !$rev ) {
                        $out->addWikiMsg( 'undeleterevision-missing' );
                        return;
                }
 
-               if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                               $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+                               $out->wrapWikiMsg(
+                                       "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                                       'rev-deleted-text-permission'
+                               );
                                return;
-                       } else {
-                               $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
-                               $out->addHTML( '<br />' );
-                               // and we are allowed to see...
                        }
+
+                       $out->wrapWikiMsg(
+                               "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'rev-deleted-text-view'
+                       );
+                       $out->addHTML( '<br />' );
+                       // and we are allowed to see...
                }
 
-               if( $this->mDiff ) {
+               if ( $this->mDiff ) {
                        $previousRev = $archive->getPreviousRevision( $timestamp );
-                       if( $previousRev ) {
+                       if ( $previousRev ) {
                                $this->showDiff( $previousRev, $rev );
-                               if( $this->mDiffOnly ) {
+                               if ( $this->mDiffOnly ) {
                                        return;
-                               } else {
-                                       $out->addHTML( '<hr />' );
                                }
+
+                               $out->addHTML( '<hr />' );
                        } else {
                                $out->addWikiMsg( 'undelete-nodiff' );
                        }
@@ -900,7 +927,7 @@ class SpecialUndelete extends SpecialPage {
 
                $isText = ( $content instanceof TextContent );
 
-               if( $this->mPreview || $isText ) {
+               if ( $this->mPreview || $isText ) {
                        $openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
                } else {
                        $openDiv = '<div id="mw-undelete-revision">';
@@ -922,7 +949,7 @@ class SpecialUndelete extends SpecialPage {
                        return;
                }
 
-               if( $this->mPreview || !$isText ) {
+               if ( $this->mPreview || !$isText ) {
                        // NOTE: non-text content has no source view, so always use rendered preview
 
                        // Hide [edit]s
@@ -935,16 +962,21 @@ class SpecialUndelete extends SpecialPage {
 
                if ( $isText ) {
                        // source view for textual content
-                       $sourceView = Xml::element( 'textarea', array(
-                               'readonly' => 'readonly',
-                               'cols' => $user->getIntOption( 'cols' ),
-                               'rows' => $user->getIntOption( 'rows' ) ),
-                               $content->getNativeData() . "\n" );
+                       $sourceView = Xml::element(
+                               'textarea',
+                               array(
+                                       'readonly' => 'readonly',
+                                       'cols' => $user->getIntOption( 'cols' ),
+                                       'rows' => $user->getIntOption( 'rows' )
+                               ),
+                               $content->getNativeData() . "\n"
+                       );
 
                        $previewButton = Xml::element( 'input', array(
                                'type' => 'submit',
                                'name' => 'preview',
-                               'value' => $this->msg( 'showpreview' )->text() ) );
+                               'value' => $this->msg( 'showpreview' )->text()
+                       ) );
                } else {
                        $sourceView = '';
                        $previewButton = '';
@@ -957,36 +989,37 @@ class SpecialUndelete extends SpecialPage {
 
                $out->addHTML(
                        $sourceView .
-                       Xml::openElement( 'div', array(
-                               'style' => 'clear: both' ) ) .
-                       Xml::openElement( 'form', array(
-                               'method' => 'post',
-                               'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'target',
-                               'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'timestamp',
-                               'value' => $timestamp ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'wpEditToken',
-                               'value' => $user->getEditToken() ) ) .
-                       $previewButton .
-                       $diffButton .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'div' ) );
+                               Xml::openElement( 'div', array(
+                                       'style' => 'clear: both' ) ) .
+                               Xml::openElement( 'form', array(
+                                       'method' => 'post',
+                                       'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'target',
+                                       'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'timestamp',
+                                       'value' => $timestamp ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'wpEditToken',
+                                       'value' => $user->getEditToken() ) ) .
+                               $previewButton .
+                               $diffButton .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'div' )
+               );
        }
 
        /**
         * Build a diff display between this and the previous either deleted
         * or non-deleted edit.
         *
-        * @param $previousRev Revision
-        * @param $currentRev Revision
-        * @return String: HTML
+        * @param Revision $previousRev
+        * @param Revision $currentRev
+        * @return string HTML
         */
        function showDiff( $previousRev, $currentRev ) {
                $diffContext = clone $this->getContext();
@@ -995,20 +1028,19 @@ class SpecialUndelete extends SpecialPage {
 
                $diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
                $diffEngine->showDiffStyle();
-               $this->getOutput()->addHTML(
-                       "<div>" .
+               $this->getOutput()->addHTML( "<div>" .
                        "<table style='width: 98%;' cellpadding='0' cellspacing='4' class='diff'>" .
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<tr>" .
-                               "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
-                               $this->diffHeader( $previousRev, 'o' ) .
-                               "</td>\n" .
-                               "<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
-                               $this->diffHeader( $currentRev, 'n' ) .
-                               "</td>\n" .
+                       "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
+                       $this->diffHeader( $previousRev, 'o' ) .
+                       "</td>\n" .
+                       "<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
+                       $this->diffHeader( $currentRev, 'n' ) .
+                       "</td>\n" .
                        "</tr>" .
                        $diffEngine->generateContentDiffBody(
                                $previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
@@ -1019,13 +1051,13 @@ class SpecialUndelete extends SpecialPage {
        }
 
        /**
-        * @param $rev Revision
-        * @param $prefix
+        * @param Revision $rev
+        * @param string $prefix
         * @return string
         */
        private function diffHeader( $rev, $prefix ) {
                $isDeleted = !( $rev->getId() && $rev->getTitle() );
-               if( $isDeleted ) {
+               if ( $isDeleted ) {
                        /// @todo FIXME: $rev->getTitle() is null for deleted revs...?
                        $targetPage = $this->getTitle();
                        $targetQuery = array(
@@ -1037,30 +1069,34 @@ class SpecialUndelete extends SpecialPage {
                        $targetPage = $rev->getTitle();
                        $targetQuery = array( 'oldid' => $rev->getId() );
                }
+
                // Add show/hide deletion links if available
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $rdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
-               if ( $rdel ) $rdel = " $rdel";
-               return
-                       '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
-                               Linker::link(
-                                       $targetPage,
-                                       $this->msg(
-                                               'revisionasof',
-                                               $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
-                                               $lang->userDate( $rev->getTimestamp(), $user ),
-                                               $lang->userTime( $rev->getTimestamp(), $user )
-                                       )->escaped(),
-                                       array(),
-                                       $targetQuery
-                               ) .
+
+               if ( $rdel ) {
+                       $rdel = " $rdel";
+               }
+
+               return '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
+                       Linker::link(
+                               $targetPage,
+                               $this->msg(
+                                       'revisionasof',
+                                       $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
+                                       $lang->userDate( $rev->getTimestamp(), $user ),
+                                       $lang->userTime( $rev->getTimestamp(), $user )
+                               )->escaped(),
+                               array(),
+                               $targetQuery
+                       ) .
                        '</strong></div>' .
                        '<div id="mw-diff-' . $prefix . 'title2">' .
-                               Linker::revUserTools( $rev ) . '<br />' .
+                       Linker::revUserTools( $rev ) . '<br />' .
                        '</div>' .
                        '<div id="mw-diff-' . $prefix . 'title3">' .
-                               Linker::revComment( $rev ) . $rdel . '<br />' .
+                       Linker::revComment( $rev ) . $rdel . '<br />' .
                        '</div>';
        }
 
@@ -1078,15 +1114,15 @@ class SpecialUndelete extends SpecialPage {
                        $lang->userTime( $file->getTimestamp(), $user ) );
                $out->addHTML(
                        Xml::openElement( 'form', array(
-                               'method' => 'POST',
-                               'action' => $this->getTitle()->getLocalURL(
-                                       'target=' . urlencode( $this->mTarget ) .
-                                       '&file=' . urlencode( $key ) .
-                                       '&token=' . urlencode( $user->getEditToken( $key ) ) )
+                                       'method' => 'POST',
+                                       'action' => $this->getTitle()->getLocalURL(
+                                               'target=' . urlencode( $this->mTarget ) .
+                                                       '&file=' . urlencode( $key ) .
+                                                       '&token=' . urlencode( $user->getEditToken( $key ) ) )
                                )
                        ) .
-                       Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
-                       '</form>'
+                               Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
+                               '</form>'
                );
        }
 
@@ -1112,7 +1148,7 @@ class SpecialUndelete extends SpecialPage {
 
        private function showHistory() {
                $out = $this->getOutput();
-               if( $this->mAllowed ) {
+               if ( $this->mAllowed ) {
                        $out->addModules( 'mediawiki.special.undelete' );
                }
                $out->wrapWikiMsg(
@@ -1146,7 +1182,7 @@ class SpecialUndelete extends SpecialPage {
                $haveFiles = $files && $files->numRows() > 0;
 
                # Batch existence check on user and talk pages
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        $batch = new LinkBatch();
                        foreach ( $revisions as $row ) {
                                $batch->addObj( Title::makeTitleSafe( NS_USER, $row->ar_user_text ) );
@@ -1155,7 +1191,7 @@ class SpecialUndelete extends SpecialPage {
                        $batch->execute();
                        $revisions->seek( 0 );
                }
-               if( $haveFiles ) {
+               if ( $haveFiles ) {
                        $batch = new LinkBatch();
                        foreach ( $files as $row ) {
                                $batch->addObj( Title::makeTitleSafe( NS_USER, $row->fa_user_text ) );
@@ -1168,7 +1204,10 @@ class SpecialUndelete extends SpecialPage {
                if ( $this->mAllowed ) {
                        $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
                        # Start the form here
-                       $top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
+                       $top = Xml::openElement(
+                               'form',
+                               array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' )
+                       );
                        $out->addHTML( $top );
                }
 
@@ -1178,59 +1217,60 @@ class SpecialUndelete extends SpecialPage {
                LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
                # Show relevant lines from the suppression log:
                $suppressLogPage = new LogPage( 'suppress' );
-               if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+               if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
                        $out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
                        LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
                }
 
-               if( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
+               if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
                        # Format the user-visible controls (comment field, submission button)
                        # in a nice little table
-                       if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                       if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                                $unsuppressBox =
                                        "<tr>
                                                <td>&#160;</td>
                                                <td class='mw-input'>" .
-                                                       Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
-                                                               'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ).
+                                               Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
+                                                       'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ) .
                                                "</td>
                                        </tr>";
                        } else {
                                $unsuppressBox = '';
                        }
+
                        $table =
                                Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
-                               Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
+                                       Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
                                        "<tr>
                                                <td colspan='2' class='mw-undelete-extrahelp'>" .
-                                                       $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
-                                               "</td>
-                                       </tr>
-                                       <tr>
-                                               <td class='mw-label'>" .
-                                                       Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
-                                               "</td>
-                                               <td class='mw-input'>" .
-                                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
-                                               "</td>
-                                       </tr>
-                                       <tr>
-                                               <td>&#160;</td>
-                                               <td class='mw-submit'>" .
-                                                       Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
-                                                       Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
-                                               "</td>
-                                       </tr>" .
+                                       $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td class='mw-label'>" .
+                                       Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
+                                       "</td>
+                                       <td class='mw-input'>" .
+                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td>&#160;</td>
+                                       <td class='mw-submit'>" .
+                                       Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
+                                       Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+                                       "</td>
+                               </tr>" .
                                        $unsuppressBox .
-                               Xml::closeElement( 'table' ) .
-                               Xml::closeElement( 'fieldset' );
+                                       Xml::closeElement( 'table' ) .
+                                       Xml::closeElement( 'fieldset' );
 
                        $out->addHTML( $table );
                }
 
                $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
 
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        # The page's stored (deleted) history:
                        $out->addHTML( '<ul>' );
                        $remaining = $revisions->numRows();
@@ -1246,7 +1286,7 @@ class SpecialUndelete extends SpecialPage {
                        $out->addWikiMsg( 'nohistory' );
                }
 
-               if( $haveFiles ) {
+               if ( $haveFiles ) {
                        $out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" );
                        $out->addHTML( '<ul>' );
                        foreach ( $files as $row ) {
@@ -1276,9 +1316,9 @@ class SpecialUndelete extends SpecialPage {
                $revTextSize = '';
                $ts = wfTimestamp( TS_MW, $row->ar_timestamp );
                // Build checkboxen...
-               if( $this->mAllowed ) {
-                       if( $this->mInvert ) {
-                               if( in_array( $ts, $this->mTargetTimestamp ) ) {
+               if ( $this->mAllowed ) {
+                       if ( $this->mInvert ) {
+                               if ( in_array( $ts, $this->mTargetTimestamp ) ) {
                                        $checkBox = Xml::check( "ts$ts" );
                                } else {
                                        $checkBox = Xml::check( "ts$ts", true );
@@ -1289,15 +1329,16 @@ class SpecialUndelete extends SpecialPage {
                } else {
                        $checkBox = '';
                }
-               $user = $this->getUser();
+
                // Build page & diff links...
-               if( $this->mCanView ) {
+               $user = $this->getUser();
+               if ( $this->mCanView ) {
                        $titleObj = $this->getTitle();
                        # Last link
-                       if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                                $last = $this->msg( 'diff' )->escaped();
-                       } elseif( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
+                       } elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
                                $pageLink = $this->getPageLink( $rev, $titleObj, $ts );
                                $last = Linker::linkKnown(
                                        $titleObj,
@@ -1317,28 +1358,35 @@ class SpecialUndelete extends SpecialPage {
                        $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                        $last = $this->msg( 'diff' )->escaped();
                }
+
                // User links
                $userLink = Linker::revUserTools( $rev );
+
                // Revision text size
                $size = $row->ar_len;
-               if( !is_null( $size ) ) {
+               if ( !is_null( $size ) ) {
                        $revTextSize = Linker::formatRevisionSize( $size );
                }
+
                // Edit summary
                $comment = Linker::revComment( $rev );
+
                // Revision delete links
                $revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
 
-               $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )->escaped();
+               $revisionRow = $this->msg( 'undelete-revisionrow' )
+                       ->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )
+                       ->escaped();
+
                return "<li>$revisionRow</li>";
        }
 
        private function formatFileRow( $row ) {
                $file = ArchivedFile::newFromRow( $row );
-
                $ts = wfTimestamp( TS_MW, $row->fa_timestamp );
                $user = $this->getUser();
-               if( $this->mAllowed && $row->fa_storage_key ) {
+
+               if ( $this->mAllowed && $row->fa_storage_key ) {
                        $checkBox = Xml::check( 'fileid' . $row->fa_id );
                        $key = urlencode( $row->fa_storage_key );
                        $pageLink = $this->getFileLink( $file, $this->getTitle(), $ts, $key );
@@ -1348,15 +1396,18 @@ class SpecialUndelete extends SpecialPage {
                }
                $userLink = $this->getFileUser( $file );
                $data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text();
-               $bytes = $this->msg( 'parentheses' )->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )->plain();
+               $bytes = $this->msg( 'parentheses' )
+                       ->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )
+                       ->plain();
                $data = htmlspecialchars( $data . ' ' . $bytes );
                $comment = $this->getFileComment( $file );
 
                // Add show/hide deletion links if available
                $canHide = $user->isAllowed( 'deleterevision' );
-               if( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
-                       if( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
-                               $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+               if ( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+                       if ( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+                               // Revision was hidden from sysops
+                               $revdlink = Linker::revDeleteLinkDisabled( $canHide );
                        } else {
                                $query = array(
                                        'type' => 'filearchive',
@@ -1376,8 +1427,8 @@ class SpecialUndelete extends SpecialPage {
        /**
         * Fetch revision text link if it's available to all users
         *
-        * @param $rev Revision
-        * @param $titleObj Title
+        * @param Revision $rev
+        * @param Title $titleObj
         * @param string $ts Timestamp
         * @return string
         */
@@ -1385,95 +1436,105 @@ class SpecialUndelete extends SpecialPage {
                $user = $this->getUser();
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-               if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
-               } else {
-                       $link = Linker::linkKnown(
-                               $titleObj,
-                               htmlspecialchars( $time ),
-                               array(),
-                               array(
-                                       'target' => $this->mTargetObj->getPrefixedText(),
-                                       'timestamp' => $ts
-                               )
-                       );
-                       if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::linkKnown(
+                       $titleObj,
+                       htmlspecialchars( $time ),
+                       array(),
+                       array(
+                               'target' => $this->mTargetObj->getPrefixedText(),
+                               'timestamp' => $ts
+                       )
+               );
+
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch image view link if it's available to all users
         *
-        * @param $file File
-        * @param $titleObj Title
+        * @param File|ArchivedFile $file
+        * @param Title $titleObj
         * @param string $ts A timestamp
         * @param string $key a storage key
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getFileLink( $file, $titleObj, $ts, $key ) {
                $user = $this->getUser();
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-               if( !$file->userCan( File::DELETED_FILE, $user ) ) {
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
-               } else {
-                       $link = Linker::linkKnown(
-                               $titleObj,
-                               htmlspecialchars( $time ),
-                               array(),
-                               array(
-                                       'target' => $this->mTargetObj->getPrefixedText(),
-                                       'file' => $key,
-                                       'token' => $user->getEditToken( $key )
-                               )
-                       );
-                       if( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::linkKnown(
+                       $titleObj,
+                       htmlspecialchars( $time ),
+                       array(),
+                       array(
+                               'target' => $this->mTargetObj->getPrefixedText(),
+                               'file' => $key,
+                               'token' => $user->getEditToken( $key )
+                       )
+               );
+
+               if ( $file->isDeleted( File::DELETED_FILE ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch file's user id if it's available to this user
         *
-        * @param $file File
-        * @return String: HTML fragment
+        * @param File|ArchivedFile $file
+        * @return string HTML fragment
         */
        function getFileUser( $file ) {
-               if( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
-                       return '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
-                               Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
-                       if( $file->isDeleted( File::DELETED_USER ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
+               if ( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
+                       return '<span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-user' )->escaped() .
+                               '</span>';
                }
+
+               $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
+                       Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
+
+               if ( $file->isDeleted( File::DELETED_USER ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch file upload comment if it's available to this user
         *
-        * @param $file File
-        * @return String: HTML fragment
+        * @param File|ArchivedFile $file
+        * @return string HTML fragment
         */
        function getFileComment( $file ) {
-               if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
+               if ( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
                        return '<span class="history-deleted"><span class="comment">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span></span>';
-               } else {
-                       $link = Linker::commentBlock( $file->getRawDescription() );
-                       if( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::commentBlock( $file->getRawDescription() );
+
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        function undelete() {
@@ -1498,7 +1559,7 @@ class SpecialUndelete extends SpecialPage {
                        $this->getUser()
                );
 
-               if( is_array( $ok ) ) {
+               if ( is_array( $ok ) ) {
                        if ( $ok[1] ) { // Undeleted file count
                                wfRunHooks( 'FileUndeleteComplete', array(
                                        $this->mTargetObj, $this->mFileVersions,
@@ -1513,13 +1574,13 @@ class SpecialUndelete extends SpecialPage {
 
                // Show revision undeletion warnings and errors
                $status = $archive->getRevisionStatus();
-               if( $status && !$status->isGood() ) {
+               if ( $status && !$status->isGood() ) {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
                }
 
                // Show file undeletion warnings and errors
                $status = $archive->getFileStatus();
-               if( $status && !$status->isGood() ) {
+               if ( $status && !$status->isGood() ) {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
                }
        }
index 89c06b2..b665c4b 100644 (file)
@@ -843,10 +843,13 @@ class UploadForm extends HTMLForm {
                        'upload-type' => 'File',
                        'radio' => &$radio,
                        'help' => $this->msg( 'upload-maxfilesize',
-                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-                               )->parse() . ' ' . $this->msg( 'upload_source_file' )->escaped(),
+                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] ) )
+                               ->parse() .
+                               $this->msg( 'word-separator' )->escaped() .
+                               $this->msg( 'upload_source_file' )->escaped(),
                        'checked' => $selectedSourceType == 'file',
                );
+
                if ( $canUploadByUrl ) {
                        $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
                        $descriptor['UploadFileURL'] = array(
@@ -857,8 +860,10 @@ class UploadForm extends HTMLForm {
                                'upload-type' => 'url',
                                'radio' => &$radio,
                                'help' => $this->msg( 'upload-maxfilesize',
-                                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
-                                       )->parse() . ' ' . $this->msg( 'upload_source_url' )->escaped(),
+                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] ) )
+                                       ->parse() .
+                                       $this->msg( 'word-separator' )->escaped() .
+                                       $this->msg( 'upload_source_url' )->escaped(),
                                'checked' => $selectedSourceType == 'url',
                        );
                }
index eef6691..a86c356 100644 (file)
@@ -50,16 +50,22 @@ class LoginForm extends SpecialPage {
        var $mType, $mReason, $mRealName;
        var $mAbortLoginErrorMsg = 'login-abort-generic';
        private $mLoaded = false;
+       private $mSecureLoginUrl;
+       // TODO Remove old forms and mShowVForm gating after all WMF wikis have
+       // adapted messages and help links to new versions.
+       private $mShowVForm;
 
        /**
-        * @var ExternalUser
+        * @ var WebRequest
         */
-       private $mExtUser = null;
+       private $mOverrideRequest = null;
 
        /**
-        * @ var WebRequest
+        * Effective request; set at the beginning of load
+        *
+        * @var WebRequest $mRequest
         */
-       private $mOverrideRequest = null;
+       private $mRequest = null;
 
        /**
         * @param WebRequest $request
@@ -86,6 +92,7 @@ class LoginForm extends SpecialPage {
                } else {
                        $request = $this->mOverrideRequest;
                }
+               $this->mRequest = $request;
 
                $this->mType = $request->getText( 'type' );
                $this->mUsername = $request->getText( 'wpName' );
@@ -134,11 +141,23 @@ class LoginForm extends SpecialPage {
                        $this->mReturnTo = '';
                        $this->mReturnToQuery = '';
                }
+
+               $this->mShowVForm = $this->shouldShowVForm();
        }
 
        function getDescription() {
-               return $this->msg( $this->getUser()->isAllowed( 'createaccount' ) ?
-                       'userlogin' : 'userloginnocreate' )->text();
+               if ( !$this->getUser()->isAllowed( 'createaccount' ) ) {
+                       return $this->msg( 'userloginnocreate' )->text();
+               }
+               if ( $this->mShowVForm ) {
+                       if ( $this->mType === 'signup' ) {
+                               return $this->msg( 'createaccount' )->text();
+                       } else {
+                               return $this->msg( 'login' )->text();
+                       }
+               } else {
+                       return $this->msg( 'userlogin' )->text();
+               }
        }
 
        public function execute( $par ) {
@@ -149,10 +168,14 @@ class LoginForm extends SpecialPage {
                $this->load();
                $this->setHeaders();
 
+               if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
+                       $this->mType = 'signup';
+               }
+
+               // If logging in and not on HTTPS, either redirect to it or offer a link.
                global $wgSecureLogin;
                if (
                        $this->mType !== 'signup' &&
-                       $wgSecureLogin &&
                        WebRequest::detectProtocol() !== 'https'
                ) {
                        $title = $this->getFullTitle();
@@ -162,12 +185,17 @@ class LoginForm extends SpecialPage {
                                'wpStickHTTPS' => $this->mStickHTTPS
                        );
                        $url = $title->getFullURL( $query, false, PROTO_HTTPS );
-                       $this->getOutput()->redirect( $url );
-                       return;
-               }
-
-               if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
-                       $this->mType = 'signup';
+                       if ( $wgSecureLogin ) {
+                               $this->getOutput()->redirect( $url );
+                               return;
+                       } else {
+                               // A wiki without HTTPS login support should set $wgServer to
+                               // http://somehost, in which case the secure URL generated
+                               // above won't actually start with https://
+                               if ( substr( $url, 0, 8 ) === 'https://' ) {
+                                       $this->mSecureLoginUrl = $url;
+                               }
+                       }
                }
 
                if ( !is_null( $this->mCookieCheck ) ) {
@@ -480,14 +508,6 @@ class LoginForm extends SpecialPage {
 
                $wgAuth->initUser( $u, $autocreate );
 
-               if ( $this->mExtUser ) {
-                       $this->mExtUser->linkToLocal( $u->getId() );
-                       $email = $this->mExtUser->getPref( 'emailaddress' );
-                       if ( $email && !$this->mEmail ) {
-                               $u->setEmail( $email );
-                       }
-               }
-
                $u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
                $u->saveSettings();
 
@@ -550,10 +570,6 @@ class LoginForm extends SpecialPage {
                        return self::SUCCESS;
                }
 
-               $this->mExtUser = ExternalUser::newFromName( $this->mUsername );
-
-               # TODO: Allow some magic here for invalid external names, e.g., let the
-               # user choose a different wiki name.
                $u = User::newFromName( $this->mUsername );
                if( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
                        return self::ILLEGAL;
@@ -568,16 +584,6 @@ class LoginForm extends SpecialPage {
                                $isAutoCreated = true;
                        }
                } else {
-                       global $wgExternalAuthType, $wgAutocreatePolicy;
-                       if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
-                               && is_object( $this->mExtUser )
-                               && $this->mExtUser->authenticate( $this->mPassword )
-                       ) {
-                               # The external user and local user have the same name and
-                               # password, so we assume they're the same.
-                               $this->mExtUser->linkToLocal( $u->getID() );
-                       }
-
                        $u->load();
                }
 
@@ -696,40 +702,22 @@ class LoginForm extends SpecialPage {
         * @return integer Status code
         */
        function attemptAutoCreate( $user ) {
-               global $wgAuth, $wgAutocreatePolicy;
+               global $wgAuth;
 
                if ( $this->getUser()->isBlockedFromCreateAccount() ) {
                        wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
                        return self::CREATE_BLOCKED;
                }
-
-               /**
-                * If the external authentication plugin allows it, automatically cre-
-                * ate a new account for users that are externally defined but have not
-                * yet logged in.
-                */
-               if ( $this->mExtUser ) {
-                       # mExtUser is neither null nor false, so use the new ExternalAuth
-                       # system.
-                       if ( $wgAutocreatePolicy == 'never' ) {
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$this->mExtUser->authenticate( $this->mPassword ) ) {
-                               return self::WRONG_PLUGIN_PASS;
-                       }
-               } else {
-                       # Old AuthPlugin.
-                       if ( !$wgAuth->autoCreate() ) {
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$wgAuth->userExists( $user->getName() ) ) {
-                               wfDebug( __METHOD__ . ": user does not exist\n" );
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
-                               wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
-                               return self::WRONG_PLUGIN_PASS;
-                       }
+               if ( !$wgAuth->autoCreate() ) {
+                       return self::NOT_EXISTS;
+               }
+               if ( !$wgAuth->userExists( $user->getName() ) ) {
+                       wfDebug( __METHOD__ . ": user does not exist\n" );
+                       return self::NOT_EXISTS;
+               }
+               if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
+                       wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
+                       return self::WRONG_PLUGIN_PASS;
                }
 
                $abortError = '';
@@ -1023,6 +1011,22 @@ class LoginForm extends SpecialPage {
                }
        }
 
+       /**
+        * Whether to show new vertically laid out login form.
+        * ?useNew=1 forces new style, ?useNew=0 forces old style,
+        * otherwise consult $wgUseVFormUserLogin.
+        * @return Boolean
+        */
+       private function shouldShowVForm() {
+               global $wgUseVFormUserLogin;
+
+               if ( $this->mType == 'signup' ) {
+                       return false;
+               } else {
+                       return $this->mRequest->getBool( 'useNew', $wgUseVFormUserLogin );
+               }
+       }
+
        /**
         * @private
         */
@@ -1034,6 +1038,7 @@ class LoginForm extends SpecialPage {
 
                $titleObj = $this->getTitle();
                $user = $this->getUser();
+               $out = $this->getOutput();
 
                if ( $this->mType == 'signup' ) {
                        // Block signup here if in readonly. Keeps user from
@@ -1064,9 +1069,17 @@ class LoginForm extends SpecialPage {
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
                        $linkmsg = 'gotaccount';
-                       $this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
+                       $out->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
-                       $template = new UserloginTemplate();
+                       if ( $this->mShowVForm ) {
+                               $template = new UserloginTemplateVForm();
+                               $out->addModuleStyles( array(
+                                       'mediawiki.ui',
+                                       'mediawiki.special.userlogin.vform'
+                               ) );
+                       } else {
+                               $template = new UserloginTemplate();
+                       }
                        $q = 'action=submitlogin&type=login';
                        $linkq = 'type=signup';
                        $linkmsg = 'nologin';
@@ -1082,16 +1095,23 @@ class LoginForm extends SpecialPage {
                        $linkq .= $returnto;
                }
 
-               # Don't show a "create account" link if the user can't
+               # Don't show a "create account" link if the user can't.
                if( $this->showCreateOrLoginLink( $user ) ) {
                        # Pass any language selection on to the mode switch link
                        if( $wgLoginLanguageSelector && $this->mLanguage ) {
                                $linkq .= '&uselang=' . $this->mLanguage;
                        }
-                       $link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
-                               $this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
+                       if ( !$this->mShowVForm ) {
+                               $link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
+                                       $this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
+
+                                       $template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
 
-                       $template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
+                       } else {
+                               // Supply URL, login template creates the button.
+                               // (The template 'link' key, passed above, is obsolete in the VForm design.)
+                               $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
+                       }
                } else {
                        $template->set( 'link', '' );
                }
@@ -1151,8 +1171,9 @@ class LoginForm extends SpecialPage {
                        }
                }
 
+               $template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
                // Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
-               // Ditto for signupend
+               // Ditto for signupend.  New forms use neither.
                $usingHTTPS = WebRequest::detectProtocol() == 'https';
                $loginendHTTPS = $this->msg( 'loginend-https' );
                $signupendHTTPS = $this->msg( 'signupend-https' );
@@ -1175,7 +1196,6 @@ class LoginForm extends SpecialPage {
                        wfRunHooks( 'UserLoginForm', array( &$template ) );
                }
 
-               $out = $this->getOutput();
                $out->disallowUserJs(); // just in case...
                $out->addTemplate( $template );
        }
index 81d1781..8dd38d4 100644 (file)
@@ -69,9 +69,7 @@ class SpecialVersion extends SpecialPage {
                        $out->addHTML( $this->IPInfo() );
 
                        if ( $this->getRequest()->getVal( 'easteregg' ) ) {
-                               if ( $this->showEasterEgg() ) {
-                                       // TODO: put something interesting here
-                               }
+                               // TODO: put something interesting here
                        }
                } else {
                        // Credits sub page
@@ -831,108 +829,4 @@ class SpecialVersion extends SpecialPage {
                return 'wiki';
        }
 
-       function showEasterEgg() {
-               $rx = $rp = $xe = '';
-               $alpha = array( "", "kbQW", "\$\n()" );
-               $beta = implode( "', '", $alpha);
-               $juliet = 'echo $delta + strrev( $foxtrot ) - $alfa + $wgVersion . base64_decode( $bravo ) * $charlie';
-               for ( $i = 1; $i <= 4; $i++ ) {
-                       $rx .= '([^j]*)J';
-                       $rp .= "+(\\$i)";
-               }
-
-               $rx = "/$rx/Sei";
-               $O = substr( "$alpha')", 1 );
-               for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) {
-                       $rx[$i-1] = strtolower( $rx[$i-1] );
-               }
-               $ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*";
-               $ry = "/$ry/Sei";
-               $O = substr( "$beta')", 1 );
-               preg_match_all( '/(?<=\$)[[:alnum:]]*/', substr( $juliet, 0, $i<<1 ), $charlie );
-               foreach( $charlie[0] as $bravo ) {
-                       $$bravo =& $xe;
-               }
-               $xe = 'xe=<<<mo/./hfromowoxv=<<<m
-쵍潅旅𞗎왎캎𐺆ߨ趥䲀쫥𒯡𚦄𚬀Ꝍ螃䤎꤯溃𔱢櫅褡䞠⽬✡栠迤⾏𐵥쾃𜜧줏袏浣।궇䬃꼁꿤𘐧
-𞛁윥桯䦎䵎Ꞅ𚠣涁쭀讀撠蝠讄伣𞫡枮ⵇ𚥣𐡃𐭏沢𞜄𞴏𞻧⠤쳯蒣䮎𒵬컡豣ۅ𐯥⦇𐫁漅蛁꼤从楆
-⥀䡦𚭅沢⠬輁䲯좡梇䟇伄육较촅䥃要𞝄迯쟠꺃ⶥ栆궀撠満ꐣ𞦇좧𐠅𞫠𐠧𚮣讇輤亀➏欣첡쮧⽬
-氀쮧跧𐫥䪀⬬⾅𞼀ⵏ괬ত櫤䭀楦𚫃𐣂괥챣𐥇楀귧읠죯쒡ۅ𐾤䳄䤄𞽀괬躏譇䮄搥𚬁䯄津䶮⾅𐫅
-𐴂௧쮯궣輥ߡ亀𞪀氀诤𐯢⿅諃⫤𞦁䮣⦬죄椎貧𞛄ඇ쿇亏跤⦌术থۏ仆䛇枡䪄𐵇곁謠𞿯ⶏⶃ䞣
-궥螏蝁ꤣ⟬极涇𞴧伢𞼯ଅ𚣡즡⡌浣䯇쿃ⳇ궏ས⢃曦⦥蛧갠컡楧𘬧袏⦏⢠䳠챤⽧𚠧⬣⼀潧⭅椤
-𞟯軁종쵃䬆𞮀𞮅꤇𞣅溎楯곡⢡꾥첥쫧Ⱨ균檏辀䭮⡄𐞯쿁䱤𐠠柅迠웏𚟯⾅豠𐡀𐡅䱀轡⾯쥃⥁溆
-䢣䞮柄ꠌⶡ𞒯𐳣𞳅蛤椏𞯀✠귬ຄ𐷡𞜠䶃𞭀毥𞡯桥ꐥ❣쳀𞾧⡧𖥢꽧죄ത𖴧ޥ歠ແ위䯎撯쬁䮣浅
-쾇泮𐢁켄𞧧𞦏䦯꾯迡𞐯曎䢦쿣杦궯⡀䤦䷢𐭢쟁쯯⧤蟯䡏氇𒭯𔜧𞢣𞱏蝤𒬧궧ߢ𐭆䛃찃쭣沠𚬀𞿏
-䴃𐣣䣎𐺃ꥅ轃⣄蟧⦡𒛧蟃毣洇䞎Ҡ潄仆𐲃𞧥철䢤俎譯泠쮄␥栏쾯ⳏ짡𞾯⥡𚠬߂𚥯ކ澥䲀ⵀ𞻃
-ⵡ𚦣𒯣✬𐟯𞥥輄䱀굡榏❡첄⦄ꡥⶣ𞡤⺁𞞡ݣ𐢅𒷤⤡꿄蝡𞱁ⴄ贁𒛬氃𞞇𞶡ޅ짣߁𞱃𐫄ۥ𞰣𐱅欤
-梢蝡柧䥏仏撣𐳣𞠅좇𞐣蒣䰤྅𚪏࿂ಇ濤䞦쮅𚬁𚭧𚬬𒴯𐵣𚥌沮潁좤澅𐻯杣棦ꤤ洯𐳃𚭀콅궧쭠𔥢
-𞱠桎䝆겡쭄𞵁겯䥂ⶀ𐥂𚧬⽬䠇쳄❬Ⰼ𞵀䐦⿌웃𒿠첏𐛡浣涆𒯌⢤অ䭎𚜧갣𞾏䴮⡃꤯죠䰀쬯༄䫏
-𐱂ꢅ䬦賧𐯡유辇➥佃仮귣젏𒴯⭅ꢡ각컄⒤⻠讁涅䠃跥袏佄𞝄𐳇泄껧𚮡𞱏棇满གྷ𐻯輤괅𚠬❥겠
-𒐧䣂ꤏ襃𞼧𜰧伎襡웅𞳧걯䳣𚟡켁쭄洠컥❅⿏亂𚯧𚯯쯅𞮅⢁𐠦𒮠𚯣𞞥诤꣏辀𖥢椯겇毣濢𞝣𚢀➠
-䮮浥겁沣졣䜦泇歏𐾄搯曯柆ۇۇ䞀泆𐾧武𚭠況꽌𐧢ꝅ軀⬠쾣𞡀榧𞣏𚦤Ⱡ䠦Ⲥ𞰯𞻥쿇䬄貃柅涢
-갏⼁𐿧ݏౠ𐿣褀涡𘼧𞮏༅𞵡𐥆䮄𐮥➇ꝣݥ䡏䯎梢𚟇輇ꤠ䫣䵀ण漂𞬯⢡軀𚭅𐯆௦𚠤襁쫇⾡濧沤
-䜇伢ۇ汧첏䤎잤䛯Ⰱ俇𞵃ꢧ殂궏榮ޣ𞼧涂氏𞬇滦즤蜀⠥𐺏쐣⾏껬콇漯Ꝡ柦櫇읁梠仇장滦⟠꿯
-쮁搥櫢𐫣ꠏ𒮬椥𐛤誅栮朥迣⺄ඇ𞣣⿏䬂쾏⫠⒧✏궇襤⡁𞯇濃𚣠Ⱐ𚫤歯䛠𒛥𞫇쮠𞟤컃𞢯⬣濡䦣
-衏貣柂𞳁森챏ಇ고𚫠蟄䤏젯𒮡⫯楀䞄䳣쮅궤轧껯𞥤𐪃𞶡潇ބ𚥣𐵇浣𐬀蝤⽧쐣쾇➣𞝀𐡦䮠䤣𐠄
-Ꝡ𐾁蠤𞛡𞵀䬦覯搦⥯쥏梂걯𐾧ⵁ೦챁𚣌躄轡𐯣𞻥䢦𐝂財䲧𐦁䬎첁棏␣౦잧棆젥襁젃䤏⢏榀ⵁ
-螅赡𒿯ⶣ赧꾤𚬅濁𒛏涆𐴂ॡ䳦ߢ赁䯇䢃ꠌ泄柠泡찇𐛢𞰏䪂𐝢櫇𚰧漥𐣄𞜤𐥁⟤淣ഡ䳮த谀ཡ𞾧
-➁血꽧蟧辧게⻣𚣣쳏ഡ䠄杮𞣠죃汦諤య毠蝅𐦄謄殯𞱄䳀ⳏ𞶁쟇ආ𐻢잏𐿡䳃ۂ𞭥䝇䦇⥌켏쥯춏
-𖽢𐳃𒷡𚫥𚟇𐿧𚦧𐝢䥦𚯀棇潡⥄歡찁朆⻠䤆𖤧漢𜐧ꡅ⽄쾠𐥣衏𚥠𐥆䤣অ𞛇䤣𐡡𐢏䞦𖐧ߣ裏𚫁𐵤
-ཅۄ춁䲃欆귬𐺀诀滁𞫇𐯇䝃𞧡챃첥𞭤꺏쫅𞫡䱮𞼤અ𒭤견Ф𐫁𐾧佣𖱢澢쿏𞛧⽅侮榅𐾄य쥏蜏䣣
-𚥌𐫏쵥𚥡➤跡殃䰣䯤𞳥읤ⴏ굄𚬧⥇줡걬০켃𜼧𚧯첣䜂𞵇𚟀찃궀谀Ɽ伎䢮𒛄𚦀ꤥ⾣𐭁沅䬇䧠𐱇
-沀濡ठ𞰄쟠𐺅ꐣ𐴂躄佇⦇毄计賀䢎澡𒮌䲄𒠧캀䟣𐷧褀𞻅蠤൯棏蜃𞮤澄❧⾥撦⽬ⶥ𐪄ய𔼧ބ躄
-䬎챯𚫇⽯𐾠𞛠𚛧䬎Ꞅ굥𐢂𚠣⠥䝧朄𞧥࿏웥꽬གྷ浅⦁❬𐺆侢栦⧠𞛯궠ඦ𚭧趤谥此𐲂𐬃軠𚪅𐞦𞷤
-蛄俧袥补榏읠⤁⠀豇俢쮯꤇➏𐴁ⶤ涮찣𒮇읁榠跣𜤧⦅ໃಆ𞛯䵣谠𞰅ꢯ⡧淯柤궡✠䮎괯𒮣❅朎
-⥅웣䯮첀𚫣꒤𐣠쭏洀蛡楆𚮣ൡ䮮ү氠𐜏濆䜢䷯潣歃䷯𞣡웁쭄椥䟂➅𒯣𒯤ૡༀ䭧ܣ죅𐯠ए軯䧣
-Ⱔ䐢⬥檂䠮⫤䛠꜡䛆讠𚭄✠꿏欣蠡𐵆켏豣譄𞣇춣𒭯𐻢䠃䰠撦朅䮄榦溃貀𒯅䶇⾁𞬧澡𐻦䲮榀𞯧
-𐪄䢆侄𞾏朦꜇𐮢ཏ𐯣췧꺁𞱃枠櫧桠괬枇ꜯ곇𐰂𘜧𐦄컡濦汥줠𞲡輀𞫃𐠣쥇⣃𞴏䳂⟤漇쯣껃𐾀衃
-𚮄쯇𒼧𐝄浥洄楠৯춥蒧⾯𐫆༂ꤌ毮䤆⺄༠०袀䢂죃ⴣ𐿯梇溄毦𞼄螄櫤쳃栅満걌毠𞞏ⱌ𚮡꒧䢆
-ꥁ泎𞭅仧궀辯諯웅𞳇津趃অ꿏伏𐵤캁⠃𐦂𐶀ꝣ䛂贤济杧𐝁撠䱤殥歡躇楄꒧꽧𞽧䡣쵧𒯃𐱆ꜯ위
-ཀ谠諃𐬃軅␥𞰇贠撣߅꽤⠥ಡ𐝀궥윁𞳁Ⰴܯ즡歎𞷥ⵅഏ蝁𞟇구ꝧ܅䱦껡䛦߅蒯俧콣𚭅梧䛠ꡇ
-ݧ𚮏웥Т⬠䬦榀𐢂貤𞰅𚭠謣䱦⒡췧𐥀濇⧣⤀좯殧𞬣줤⣀楏楎굏ݤ滁ۇ𘐧𚯯䒯Ⰰ𞼤ҡ䰦𚣠椯❏
-趯𐣯豀쵅춀⳥䷠읡ۯ⺄ۅ䶏춤枂櫅ۅ𞥅䱃䭣𒳯汮澃𞢃谥ⵤ구𚣄콡曤𞣏ই߂읅蠠𜰧䞦ꞇⲏ𚮌諧
-趯첏䬎𐡏李겠⥇𞻥曢汥𞳡浆欠躅𐦁𞲯谡𞦏袧襃棧𚦁𞡡蟀侠𒛏찇챠쪇洠܀쯤䝇螏𞿣蜏俄𞦡⼀ལ
-谥촯䲦⥁ඤ𞛡𐐧⤃궅༡褡䭏毆濆⧡蛣Ф𞵇蠏ݤ賯꜁溅⡡ߡ𞥧䮄榆䵄求謥𐐧Ꞁ쯏⧡貇䛇䐢撦袥
-쮇䫀𞜄দ굯𞦁⻤襇줅⬅ہఠ⻀𔠧쒠䫆𐡅梄梯輤䥣읏⤄ⶡ诃䮢譡𞻠ߤ枤櫥𐢥伦袠ꢃ쳀裣𞼅䰄𞻡
-𒯇槥淠䯃ඏ⒯𚫣𚠯𞠣𚛄椦泮汣赃潥𚫇ദ𞛤𞿣䰏쮡𖭢蝏毁䶂䦧档䪂𞾃쟀𚪄𞞃𞳥𞼀𐿯졇웄䳎汀𐫣
-漠𚫄ꐡଥ认꽡𐱏𐭏𚼧⦄梎આ枀䠦楇쒤ꞃꤡⴅꞅ𞯁අҡ𞞤氣즤裀𞜅𐵥櫁𐵀༦𐳃쳣𐡯桧𞿠权굁죁
-짤𖤧蟃澀𒭏𞲯ߏ⣣⬁Ⱔ졥𚦌潆ꐡ⽤웁浥𞞃𐫄棆갤濧⼣겅쬄൧젣此潆⻯䜃꤯궠쮥𘬧曀⿅譅槣䞂
-䝎ꡏ𚟣䰀梥⾬ܡ𞿇𞠥𐮠𞺃䢮આ䧮쮃誅櫆𚪃죯诠䵀䯀跥𐾣⻥䤆Ⰰ꜄棧枃⻇థ誃𚛁࿇贄𞡣欎⽡𞱁
-𞲄⬏杇𐠅𐱃𞢤➁𐵤𐢄꒥즏亀쭁𚭡漆𞮇첁𐢦殎쮁滠𐠥榯𐮧𒵬⡀䮆䣠준讥𞼃䶇⪅껃泃𖱢楀갠複撮
-✡𐭢ແ𞮧𞛥쫃⽤規䥇沁轁𐡅ಢ䧮椁⬇𐤁𞡯杅武楥歎䟄溇䯢𒵬𐢣迃䪎䳤满ଅⱇ쭀ಥ𞥄䥆⧥𚞧좃
-유栤༡𐰃俇Ⰵ殇蠄⽏⾠܇𒮄澄𚦅⡤䪎榮Я견濂賣쮠仠䝮䶢𞦏𐫆ݏ襅褥찯𞤤ݥ象侯쵇궥𞠃윀웧
-𖰧殀蛡⫥亃觯潥蠀补ⴄ觧𐡇𐾆ꐯ䡣췡潏⻯⾁諏య꿧䱠𚭯찥ꞅ⪃콄즯쳣覧𞰄Ⲅ𞿣𚬧𞵤쐯⬃ඤ겤
-ⵃ蟥𞟧谣轇䛂𐮄佀߁氣𒯧榡𒷬桇䷯觠椄챥ꠌ蒯꜌䭤➡侦䣤𚦬䲀쥁⒤𐦄Ꝭ䢮𐣅ꡌ歡䝯䢣괯𚮣⥀
-줣०𚭀殣𚬥𒮇⟄趥좠洦ꢬ装䠆𒝠曧➁𒿧椃䠀𞡅𖼧䳇ງ줄ধ𞳁Ⱜ覠ꝃ殣𚯤涡䳠귥𐯁⫤覯𞲡𞼄༦
-䢦쥥줤ꡤড젃ಧꢥ諤𔭢ඥ𒛌枅𖜧줄躀ఏ䦎𞯄졯譄➇仄䰏蛏촡䞣춅涧⡄滀ଢ䮇每𘠧𚯧侇澀ꐡ杣
-𒷧槧߅䶠윥귡귧⤯𚪃𐷢ཆ裁毧𐥣𐯥⬤蝧첀⭁𞻡潤𞟃䝎池𞦀殤Ҡ𞵏䝯ཁ쟧𒰧氢귡𚛧𒿯ꥄ⭌䜇ۥ
-ꝡ𞯯棄⣏ꤥ০𐯠𒷤𞦣쮁𞰠𚧡桧𐐧ⴤꠡ軅𞟃衄䠦ߤ܅ⲃଢ蛄溎椀𞠀䛃𞡣𞟣澅𚭬䧤⡇贤⫌쪄ށ朣
-⻏켅𐽢⼡𐲀잠௧𞬥𞥀౧䦤ས誇漎譠迄䦂䳇𞣡正𐵤계楧ޅ✬𞿯棅𞳧𞛤𞜀쭯𞮀诠𐥀枢䥮䭆楆컧ଆ
-𞶇➬అ䤦誃𐠅𐿤䟀洀⡤𚟣滤𞥇𞾣즀𐠁⼃䰎溄꽅웇✡𐾥䲀⡏ܣ讣𞿥⼤覄𚯇䡇అ蝀⥌侧껄Ꝭ流贀
-漁쒤첧죏곡⣃趃賄撠।읠ⶌ𚣅⾥춧𞞠쒡쿀𞦠䵯毁涠𞫀⣡ꡄ䢀満棃䡯𐛣୯䳯ⵡୡ䥃❇⠅䣆杧𐳃
-귧覀𞼠漎𞴁𞤡ཇ䰦𞲣❃歆콣꿇朏𞢄𞵠Ꝍ𞡅賡𞧠曏꼃𞻯꼬ಇ𞴯资榎쮯輤ॡ䜎⦌𞶅𐠏𚧧⡃쳁𐵅࿀
-𞒧𞝤쯣껧쪃𞣠椃쐡⟤߇웅䱧䛣𞷧𐳤𚬠쮀䠏𞭇꽣𞿇⠣쟣𞢅ദ洅촥컇𚦁쵡ꞅ䠆𐥇⒥涯䐢ⴅ𒭡쮤꺅
-𞥇컠ⳁ漃𐲃윇诤겣𞥄伣䜠⻇𞡀修꜡𞻣䳎❄켇꽡𘼧쭄洂𞟏꜠𐮦Ⰳ쵅𐬂梀櫯䜯꜡䛣༏杇⪀캄𞰠⼌
-条𐳄没ⳅ➏𒮀첡❬侯캅检𞡧棡𞬄𞥧𞒠𞶄䥧𐳃𞻧𐝁ཧ謏𐫇𚯅讄枥𚞬첡쾀欎육웠𐭤୯濧譁챤䶢껤
-𞯤쒤𐾂辧𞮡𚭏褡⼣𞼃䳃␠𞝁豁ߡ櫦𒮬极𞱥ⶠઇꝠ𐭤𞝇沣棁柄𐳂䠯楅곅⼣⥃ༀ螡ߥ柤褣曠沧꒬
-𐴃䵂䲇蠀𐿧䲇ඦ𒯇⺁커謁𚣣𚫃컁漢䠀调ⲃ䢢ބ辅毡갯𚮁䤣椦𞲯१𞞠輯𘜧𐯣𐳅⽄𞽤𚧤𚬡䴆𞷠ଦ
-䱠䒮諃ఏ𐠡桦𞟇𚭧谁𞻤𐡁쥡浣𞼇譀⫌쮥ꢅ컁曅ꥅ𞟅ଏ찀汅𐷦ೡ谠𞦥䬀𞴡䢠쳀⡏𐵃ߠߠඅ겧淤
-쥣每譄꼠𒮣쫁쭥讥ॡ쿇𐾡ஆ伃⫠汇䜢衯楥济俏极𚣣撮쬅蜏⧤蛥쮁⥃𚯣것ஃ줠䣇迅泆𞟯𞰥⤯𐧣
-𚥯萠泎ଡ蠄涣త⾏⻌䝧ༀ榮ү𐳃歂浅𞬄ꡥ첤⬇유𐶃讏欤俤잧⡌𞭥ⱁ춥氤𐠧修流쫤䵆𞠃܀웣𞶏
-곧萡ꠀ걁𞟠认쮀𐽢谥잡𞼣佮𞺏軡⾁쮯ߡ⧯쟡䰆⽀굇촤认䵄輥𞦤𞲇䡮侢朆쬣搢⽃濃𞾄⣧𞶥柁༢
-⼅𞦀ॠ軀浯ܡ𒯡컡谤ඤ曢⧠짠컠𚠯꿡𐺀𒬧곌濂ণ웧⾡栅䞠괬ܤ䦄伏曀了ཡ榧䭦𒭯⛃衧濠𚐧읥
-쵁𐛣⪅蜤𞤁装고𒯬쳅⻁ݣ䳆ৠ䐦𐮡ऄ⫏𐶁쿧䜎𐿣젡귧棥櫁쿣泯俣佦⾥朦潏ꢤ𞫣ꙧ𞂎𐺆ڦՈ췥
-췧䙭䶍澥𞜅쨯쵥Ⱕ쵥䗌쵍潅旅暬Ոⵤ旆𞗎줭젠ৡ쮠┢𚴧𐵣潧𞾥𜔧𞑢贮𞽅跣쓄䔭𞷥⽇𞾅𞴥ꔥ䓭
-₎챍澥엇𞗎곭贇Ԇ쬡쩯䘠䯃𐯤湁𚚭Ո꽤엇𞗎ꔭ₎谥𐗇䗌쳭䙭䟍◎쳭䙍侭쾇쵤蓄䕍췥췧䓭◎쳭
-䒭𞗎ߏ䓭亭è청𞻥䙭侭䷤擏䕍췤⽇䐍䕍ⵤ摆位ཧ𞗅暬è춍찤ⲥ䙭䔭𚚭è谥𐗇䗌첍䙭䟍◎䕍𐗄
-엎ߏ◎첍⒬䓭亭è效𐱅궤◄虬䶭侄䗌꾄쓅䕍췥췧╂旄◌첍𞗂旌藂꾄쓅䕍ⵤ檦첍𞗂旌暬è𞂆效
-꽤엇虬䕍𐱅궤⚤è챍澥엇𞗎춍찤ⲥ₎𞂆찭𞽇䙭侭쾇൧蓇䕍꽤엇暬೨藅䗌ⳇ查䗌찭𞽇䓭䙭𞙮䔭
-枅ද𞝅➥赏𒶯ⵯඏ춥쟅ⵅ쟥𐵥螥ⴅ춯䟏췯淯䴏ꗍ旌₆效ꡁ𚦀桁⪣꼭𚠥𞽇𚩭𞘌ⱅ𞷥𐣇졣쓀暬è
-줭젠ৡ쮠┢𚴧꽠𜔧𞑢跮쵅䭀𞡀䗌è斈쳮𞴤侭ට𞩎𐵍潅暅汤津𞐥࿄𞴥ⶎ澥𞜅쑏𐗍肌惨澈漥𞾇쵤
-趤굄𞓅䶍澥𞜅쨯𞰅Ⱕ쵥䗌찭𞽇䓭䓭䐍è惨𐩍Э薎è擨₎𞗆
-mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo';
-
-               $haystack = preg_replace( $ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet );
-               return preg_replace( $rx, $rp, $haystack );
-       }
 }
index c7f122b..543c91e 100644 (file)
@@ -87,7 +87,7 @@ class SpecialWatchlist extends SpecialPage {
                                        $mode = null;
                        }
                        $title = SpecialPage::getTitleFor( 'EditWatchlist', $mode );
-                       $output->redirect( $title->getLocalUrl() );
+                       $output->redirect( $title->getLocalURL() );
                        return;
                }
 
@@ -181,7 +181,7 @@ class SpecialWatchlist extends SpecialPage {
                        $request->wasPosted() )
                {
                        $user->clearAllNotifications();
-                       $output->redirect( $this->getTitle()->getFullUrl( $nondefaults ) );
+                       $output->redirect( $this->getTitle()->getFullURL( $nondefaults ) );
                        return;
                }
 
@@ -246,12 +246,12 @@ class SpecialWatchlist extends SpecialPage {
                # Show watchlist header
                $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
 
-               if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
+               if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist ) {
                        $form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
                }
                if( $wgShowUpdatedMarker ) {
                        $form .= Xml::openElement( 'form', array( 'method' => 'post',
-                                               'action' => $this->getTitle()->getLocalUrl(),
+                                               'action' => $this->getTitle()->getLocalURL(),
                                                'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
                                        $this->msg( 'wlheader-showupdated' )->parse() .
                                        Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
@@ -341,7 +341,7 @@ class SpecialWatchlist extends SpecialPage {
                $form .= $wlInfo;
                $form .= $cutofflinks;
                $form .= $lang->pipeList( $links ) . "\n";
-               $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
+               $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
                $form .= "<hr />\n<p>";
                $form .= Html::namespaceSelector(
                        array(
@@ -491,7 +491,7 @@ class SpecialWatchlist extends SpecialPage {
        /**
         * Count the number of items on a user's watchlist
         *
-        * @param $dbr A database connection
+        * @param DatabaseBase $dbr A database connection
         * @return Integer
         */
        protected function countItems( $dbr ) {
index cb3e985..8841af8 100644 (file)
@@ -170,21 +170,24 @@ class SpecialWhatLinksHere extends SpecialPage {
                        $options['ORDER BY'] = 'pl_from';
                        $plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
                                $plConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
                if( !$hidetrans ) {
                        $options['ORDER BY'] = 'tl_from';
                        $tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
                                $tlConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
                if( !$hideimages ) {
                        $options['ORDER BY'] = 'il_from';
                        $ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
                                $ilConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
                if( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
index 3723740..329b1ad 100644 (file)
@@ -51,14 +51,14 @@ class WithoutInterwikiPage extends PageQueryPage {
                $prefix = $this->prefix;
                $t = $this->getTitle();
 
-               return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) .
-                       Html::hidden( 'title', $t->getPrefixedText() ) .
-                       Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . ' ' .
-                       Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+               return Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+                       Html::openElement( 'fieldset' ) . "\n" .
+                       Html::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) . "\n" .
+                       Html::hidden( 'title', $t->getPrefixedText() ) . "\n" .
+                       Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . "\n" .
+                       Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) . "\n" .
+                       Html::closeElement( 'fieldset' ) . "\n" .
+                       Html::closeElement( 'form' );
        }
 
        function sortDescending() {
index 2483e58..b0ec8b5 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-        die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+       die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
 }
 
 if ( !isset( $wgVersion ) ) {
index 541d9e4..dff9ada 100644 (file)
@@ -25,7 +25,9 @@
  * @defgroup Templates Templates
  */
 
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( -1 );
+}
 
 /**
  * @ingroup Templates
@@ -42,16 +44,20 @@ class UsercreateTemplate extends QuickTemplate {
        }
 
        function execute() {
-               if( $this->data['message'] ) {
+               if ( $this->data['message'] ) {
 ?>
        <div class="<?php $this->text('messagetype') ?>box">
-               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
-                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
-               <?php } ?>
-               <?php $this->html('message') ?>
+<?php
+                       if ( $this->data['messagetype'] == 'error' ) {
+                               ?><strong><?php $this->msg( 'loginerror' ) ?></strong><br /><?php
+                       }
+                       $this->html('message');
+?>
        </div>
        <div class="visualClear"></div>
-<?php } ?>
+<?php
+               }
+?>
 
 <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
 <div id="userlogin">
@@ -60,7 +66,11 @@ class UsercreateTemplate extends QuickTemplate {
        <h2><?php $this->msg('createaccount') ?></h2>
        <p id="userloginlink"><?php $this->html('link') ?></p>
        <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
-       <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
+<?php
+       if ( $this->haveData( 'languages' ) ) {
+               ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
+       }
+?>
        <table>
                <tr>
                        <td class="mw-label"><label for='wpName2'><?php $this->msg('yourname') ?></label></td>
@@ -79,7 +89,8 @@ class UsercreateTemplate extends QuickTemplate {
                <tr>
                        <td></td>
                        <td class="mw-input">
-                               <?php if( $this->data['createemail'] ) {
+<?php
+                               if ( $this->data['createemail'] ) {
                                        echo Xml::checkLabel(
                                                wfMessage( 'createaccountmail' )->text(),
                                                'wpCreateaccountMail',
@@ -87,7 +98,8 @@ class UsercreateTemplate extends QuickTemplate {
                                                $this->data['createemailset'],
                                                array( 'tabindex' => '2' )
                                        );
-                               } ?>
+                               }
+?>
                        </td>
                </tr>
                <tr class="mw-row-password">
@@ -102,12 +114,13 @@ class UsercreateTemplate extends QuickTemplate {
                        ) + User::passwordChangeInputAttribs() ); ?>
                        </td>
                </tr>
-       <?php if( $this->data['usedomain'] ) {
+<?php
+               if ( $this->data['usedomain'] ) {
                $doms = "";
-               foreach( $this->data['domainnames'] as $dom ) {
+               foreach ( $this->data['domainnames'] as $dom ) {
                        $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
                }
-       ?>
+?>
                <tr id="mw-user-domain-section">
                        <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
                        <td class="mw-input">
@@ -117,7 +130,9 @@ class UsercreateTemplate extends QuickTemplate {
                                </select>
                        </td>
                </tr>
-       <?php } ?>
+<?php
+               }
+?>
                <tr class="mw-row-password">
                        <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
                        <td class="mw-input">
@@ -131,7 +146,9 @@ class UsercreateTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr>
-                       <?php if( $this->data['useemail'] ) { ?>
+<?php
+               if ( $this->data['useemail'] ) {
+?>
                                <td class="mw-label"><label for='wpEmail'><?php $this->msg('youremail') ?></label></td>
                                <td class="mw-input">
                                        <?php
@@ -153,8 +170,11 @@ class UsercreateTemplate extends QuickTemplate {
                                                        } ?>
                                        </div>
                                </td>
-                       <?php } ?>
-                       <?php if( $this->data['userealname'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['userealname'] ) {
+?>
                                </tr>
                                <tr>
                                        <td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
@@ -166,8 +186,11 @@ class UsercreateTemplate extends QuickTemplate {
                                                        <?php $this->msgWiki('prefs-help-realname'); ?>
                                                </div>
                                        </td>
-                       <?php } ?>
-                       <?php if( $this->data['usereason'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['usereason'] ) {
+?>
                                </tr>
                                <tr>
                                        <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
@@ -176,9 +199,13 @@ class UsercreateTemplate extends QuickTemplate {
                                                        tabindex="8"
                                                        value="<?php $this->text('reason') ?>" size='20' />
                                        </td>
-                       <?php } ?>
+<?php
+               }
+?>
                </tr>
-               <?php if( $this->data['canremember'] ) { ?>
+<?php
+               if ( $this->data['canremember'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -195,7 +222,8 @@ class UsercreateTemplate extends QuickTemplate {
                                ?>
                        </td>
                </tr>
-<?php   }
+<?php
+               }
 
                $tabIndex = 10;
                if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
@@ -230,12 +258,13 @@ class UsercreateTemplate extends QuickTemplate {
                                <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
                                        $this->msgHtml( $inputItem['msg'] ) ?></label><?php
                                        }
-                               if( $inputItem['helptext'] !== false ) {
+                               if ( $inputItem['helptext'] !== false ) {
                                ?>
                                <div class="prefsectiontip">
                                        <?php $this->msgWiki( $inputItem['helptext'] ); ?>
-                               </div>
-                               <?php } ?>
+                               </div><?php
+                               }
+                               ?>
                        </td>
                </tr>
 <?php
@@ -251,8 +280,14 @@ class UsercreateTemplate extends QuickTemplate {
                        </td>
                </tr>
        </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+<?php
+       if ( $this->haveData( 'uselang' ) ) {
+               ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php
+       }
+       if ( $this->haveData( 'token' ) ) {
+               ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php
+       }
+?>
 </form>
 </div>
 <div id="signupend"><?php $this->html( 'signupend' ); ?></div>
index 7bc0241..0b4b8e5 100644 (file)
  */
 class UserloginTemplate extends QuickTemplate {
        function execute() {
-               if( $this->data['message'] ) {
+               if ( $this->data['message'] ) {
 ?>
        <div class="<?php $this->text('messagetype') ?>box">
-               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
-                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
-               <?php } ?>
+               <?php
+               if ( $this->data['messagetype'] == 'error' ) {
+                       ?><strong><?php $this->msg( 'loginerror' ) ?></strong><br /><?php
+               }
+               ?>
                <?php $this->html('message') ?>
        </div>
-       <div class="visualClear"></div>
-<?php } ?>
+       <div class="visualClear"></div><?php
 
+               }
+?>
 <div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
 <div id="userloginForm">
 <form name="userlogin" method="post" action="<?php $this->text('action') ?>">
@@ -49,7 +52,11 @@ class UserloginTemplate extends QuickTemplate {
        <p id="userloginlink"><?php $this->html('link') ?></p>
        <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
        <div id="userloginprompt"><?php  $this->msgWiki('loginprompt') ?></div>
-       <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
+<?php
+               if ( $this->haveData( 'languages' ) ) {
+                       ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
+               }
+?>
        <table>
                <tr>
                        <td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
@@ -80,12 +87,13 @@ class UserloginTemplate extends QuickTemplate {
 
                        </td>
                </tr>
-       <?php if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+<?php
+               if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
                $doms = "";
-               foreach( $this->data['domainnames'] as $dom ) {
+               foreach ( $this->data['domainnames'] as $dom ) {
                        $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
                }
-       ?>
+?>
                <tr id="mw-user-domain-section">
                        <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
                        <td class="mw-input">
@@ -95,13 +103,15 @@ class UserloginTemplate extends QuickTemplate {
                                </select>
                        </td>
                </tr>
-       <?php }
+<?php
+               }
 
-       if( $this->haveData( 'extrafields' ) ) {
-               echo $this->data['extrafields'];
-       }
+               if ( $this->haveData( 'extrafields' ) ) {
+                       echo $this->data['extrafields'];
+               }
 
-       if( $this->data['canremember'] ) { ?>
+               if ( $this->data['canremember'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -118,8 +128,11 @@ class UserloginTemplate extends QuickTemplate {
                                ?>
                        </td>
                </tr>
-<?php } ?>
-<?php if( $this->data['cansecurelogin'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['cansecurelogin'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -131,26 +144,28 @@ class UserloginTemplate extends QuickTemplate {
                                $this->data['stickHTTPS'],
                                array( 'tabindex' => '9' )
                        );
-               ?>
+?>
                        </td>
                </tr>
-<?php } ?>
+<?php
+               }
+?>
                <tr>
                        <td></td>
                        <td class="mw-submit">
-                               <?php
-               echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
-                       'id' => 'wpLoginAttempt',
-                       'tabindex' => '9'
-               ) );
+                       <?php
+                       echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
+                               'id' => 'wpLoginAttempt',
+                               'tabindex' => '9'
+                       ) );
                if ( $this->data['useemail'] && $this->data['canreset'] ) {
-                       if( $this->data['resetlink'] === true ) {
+                       if ( $this->data['resetlink'] === true ) {
                                echo '&#160;';
                                echo Linker::link(
                                        SpecialPage::getTitleFor( 'PasswordReset' ),
                                        wfMessage( 'userlogin-resetlink' )
                                );
-                       } elseif( $this->data['resetlink'] === null ) {
+                       } elseif ( $this->data['resetlink'] === null ) {
                                echo '&#160;';
                                echo Html::input(
                                        'wpMailmypassword',
@@ -161,13 +176,20 @@ class UserloginTemplate extends QuickTemplate {
                                        )
                                );
                        }
-               } ?>
-
+               }
+?>
                        </td>
                </tr>
        </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+<?php
+       if ( $this->haveData( 'uselang' ) ) {
+               ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php
+       }
+
+       if ( $this->haveData( 'token' ) ) {
+               ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php
+       }
+?>
 </form>
 </div>
 <div id="loginend"><?php $this->html( 'loginend' ); ?></div>
diff --git a/includes/templates/UserloginVForm.php b/includes/templates/UserloginVForm.php
new file mode 100644 (file)
index 0000000..132a7c1
--- /dev/null
@@ -0,0 +1,206 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Templates
+ */
+
+
+/**
+ * Html form for user login with new VForm appearance.
+ */
+class UserloginTemplateVForm extends BaseTemplate {
+
+       /**
+        * Get the Skin object related to this object, so that BaseTemplate msg 31
+        * methods work.
+        *
+        * @return Skin object
+        */
+       public function getSkin() {
+               global $wgOut;
+               return $wgOut->getSkin();
+       }
+
+       function execute() {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
+?>
+<div class="mw-ui-container">
+       <?php
+       // Some extensions including CAPTCHAs add content to header on UserLoginForm hook.
+       $this->html('header');
+       if( $this->haveData( 'languages' ) ) {
+       ?>
+               <div id="languagelinks">
+                       <p><?php $this->html('languages' ); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+<div id="userloginForm">
+<form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text('action') ?>">
+       <?php
+
+       if( $this->data['message'] ) {
+       ?>
+               <div class="<?php $this->text('messagetype') ?>box">
+               <?php
+               if ( $this->data['messagetype'] == 'error' ) {
+               ?>
+                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
+               <?php
+               }
+               $this->html('message')
+               ?>
+               </div>
+       <?php
+       }
+       ?>
+               <div>
+                       <label for='wpName1'>
+                               <?php
+                               $this->msg( 'userlogin-yourname' );
+                               if ( $this->data['secureLoginUrl'] ) {
+                                       echo Html::element( 'a', array(
+                                                       'href' => $this->data['secureLoginUrl'],
+                                                       'class' => 'mw-ui-flush-right mw-secure',
+                                               ), $this->getMsg( 'userlogin-signwithsecure' )->text() );
+                               } ?>
+                       </label>
+                       <?php
+                       $extraAttrs = array();
+                       // Set focus to this field if its blank.
+                       if ( !$this->data['name'] ) {
+                               $extraAttrs['autofocus'] = '';
+                       }
+                       echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               'class' => 'loginText',
+                               'id' => 'wpName1',
+                               'tabindex' => '1',
+                               'size' => '20',
+                               // 'required' is blacklisted for now in Html.php due to browser issues.
+                               // Keeping here in case that changes
+                               'required',
+                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
+                       ) + $extraAttrs );
+                       ?>
+               </div>
+               <div>
+                       <label for='wpPassword1'>
+                       <?php
+                       $this->msg('userlogin-yourpassword');
+
+                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+                               echo Linker::link(
+                                       SpecialPage::getTitleFor( 'PasswordReset' ),
+                                       $this->getMsg( 'userlogin-resetlink' )->parse(),
+                                       array( 'class' => 'mw-ui-flush-right' )
+                                       );
+                               // TODO: remove the wpMailmypassword code branch from
+                               // templates/Userlogin.php as well; it is never executed and
+                               // doesn't work.
+                       }
+                       ?>
+                       </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',
+                               'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
+                       ) + $extraAttrs );
+                       ?>
+               </div>
+       <?php
+       if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+               $doms = "";
+               foreach( $this->data['domainnames'] as $dom ) {
+                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+               }
+       ?>
+               <div id="mw-user-domain-section">
+                       <label for='wpDomain' class="pos-above"><?php $this->msg( 'yourdomain' ) ?></label>
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
+                                       tabindex="3">
+                                       <?php echo $doms ?>
+                               </select>
+               </div>
+       <?php }
+
+       if( $this->haveData( 'extrafields' ) ) {
+               echo $this->data['extrafields'];
+       } ?>
+
+               <div>
+
+       <?php if( $this->data['canremember'] ) { ?>
+               <label class="mw-ui-checkbox-label">
+                       <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
+                               <?php if ( $this->data['remember'] ) {
+                                       echo 'checked="checked"';
+                               } ?>
+                       >
+                       <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
+               </label>
+       <?php } ?>
+               </div>
+
+       <?php if( $this->data['cansecurelogin'] ) { ?>
+               <div>
+                       <label class="mw-ui-checkbox-label">
+                               <input name="wpStickHTTPS" type="checkbox" value="1" id="wpStickHTTPS" tabindex="5"
+                                       <?php if ( $this->data['stickHTTPS'] ) {
+                                               echo 'checked="checked"';
+                                       } ?>
+                               >
+                               <?php $this->msg( 'securelogin-stick-https' ); ?>
+                       </label>
+               </div>
+       <?php } ?>
+               <div>
+                       <?php
+                       echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
+                               'id' => 'wpLoginAttempt',
+                               'tabindex' => '6',
+                               'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+                       ) );
+                       ?>
+               </div>
+               <div id="mw-userlogin-help">
+                       <?php echo $this->getMsg( 'userlogin-helplink' )->parse() ?>
+               </div>
+               <?php if( $this->haveData( 'createOrLoginHref' ) ) { ?>
+                       <div id="mw-createaccount-cta">
+                               <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ) ?><a href="<?php $this->text( 'createOrLoginHref' ) ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ) ?></a></h3>
+                       </div>
+               <?php } ?>
+       <input type="hidden" id="mw-useNew" name="useNew" value="1" />
+<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+</form>
+</div>
+</div>
+<?php
+       }
+}
index 8381b4c..bf809a1 100644 (file)
@@ -70,17 +70,18 @@ abstract class UploadBase {
         * @return string
         */
        public function getVerificationErrorCode( $error ) {
-               $code_to_status = array(self::EMPTY_FILE => 'empty-file',
-                                                               self::FILE_TOO_LARGE => 'file-too-large',
-                                                               self::FILETYPE_MISSING => 'filetype-missing',
-                                                               self::FILETYPE_BADTYPE => 'filetype-banned',
-                                                               self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
-                                                               self::ILLEGAL_FILENAME => 'illegal-filename',
-                                                               self::OVERWRITE_EXISTING_FILE => 'overwrite',
-                                                               self::VERIFICATION_ERROR => 'verification-error',
-                                                               self::HOOK_ABORTED => 'hookaborted',
-                                                               self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
-                                                               self::FILENAME_TOO_LONG => 'filename-toolong',
+               $code_to_status = array(
+                       self::EMPTY_FILE => 'empty-file',
+                       self::FILE_TOO_LARGE => 'file-too-large',
+                       self::FILETYPE_MISSING => 'filetype-missing',
+                       self::FILETYPE_BADTYPE => 'filetype-banned',
+                       self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
+                       self::ILLEGAL_FILENAME => 'illegal-filename',
+                       self::OVERWRITE_EXISTING_FILE => 'overwrite',
+                       self::VERIFICATION_ERROR => 'verification-error',
+                       self::HOOK_ABORTED => 'hookaborted',
+                       self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
+                       self::FILENAME_TOO_LONG => 'filename-toolong',
                );
                if( isset( $code_to_status[$error] ) ) {
                        return $code_to_status[$error];
@@ -186,7 +187,9 @@ abstract class UploadBase {
         * @since 1.18
         * @return string
         */
-       public function getSourceType() { return null; }
+       public function getSourceType() {
+               return null;
+       }
 
        /**
         * Initialize the path information
@@ -330,7 +333,7 @@ abstract class UploadBase {
         * @return mixed true if valid, otherwise and array with 'status'
         * and other keys
         **/
-       protected function validateName() {
+       public function validateName() {
                $nt = $this->getTitle();
                if( is_null( $nt ) ) {
                        $result = array( 'status' => $this->mTitleError );
@@ -360,7 +363,7 @@ abstract class UploadBase {
                global $wgVerifyMimeType;
                wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
-                       wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
+                       wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
index e784e51..7e07516 100644 (file)
@@ -31,7 +31,7 @@ class UploadFromChunks extends UploadFromFile {
        protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
 
        /**
-        * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
+        * Setup local pointers to stash, repo and user (similar to UploadFromStash)
         *
         * @param $user User
         * @param $stash UploadStash
@@ -72,7 +72,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mOffset = 0;
                // Create a local stash target
                $this->mLocalFile = parent::stashFile();
-               // Update the initial file offset ( based on file size )
+               // Update the initial file offset (based on file size)
                $this->mOffset = $this->mLocalFile->getSize();
                $this->mFileKey = $this->mLocalFile->getFileKey();
 
@@ -132,7 +132,7 @@ class UploadFromChunks extends UploadFromFile {
                }
                wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
                // Update the mTempPath and mLocalFile
-               // ( for FileUpload or normal Stash to take over )
+               // (for FileUpload or normal Stash to take over)
                $this->mTempPath = $tmpPath; // file system path
                $tStart = microtime( true );
                $this->mLocalFile = parent::stashFile( $this->user );
@@ -182,7 +182,7 @@ class UploadFromChunks extends UploadFromFile {
                // Get the offset before we add the chunk to the file system
                $preAppendOffset = $this->getOffset();
 
-               if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize()) {
+               if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize() ) {
                        $status = Status::newFatal( 'file-too-large' );
                } else {
                        // Make sure the client is uploading the correct chunk with a matching offset.
index 70b6903..150e516 100644 (file)
@@ -160,7 +160,9 @@ class UploadFromUrl extends UploadBase {
        /**
         * @return string
         */
-       public function getSourceType() { return 'url'; }
+       public function getSourceType() {
+               return 'url';
+       }
 
        /**
         * @return Status
index 42883b5..b653f99 100644 (file)
@@ -357,7 +357,7 @@ class Language {
                        throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
                }
 
-               return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
+               return (bool)preg_match( '/^[a-z0-9-]{2,}$/i', $code );
        }
 
        /**
@@ -742,20 +742,6 @@ class Language {
                return $this->getNsText( NS_SPECIAL ) . ':' . $name;
        }
 
-       /**
-        * @return array
-        */
-       function getQuickbarSettings() {
-               return array(
-                       $this->getMessage( 'qbsettings-none' ),
-                       $this->getMessage( 'qbsettings-fixedleft' ),
-                       $this->getMessage( 'qbsettings-fixedright' ),
-                       $this->getMessage( 'qbsettings-floatingleft' ),
-                       $this->getMessage( 'qbsettings-floatingright' ),
-                       $this->getMessage( 'qbsettings-directionality' )
-               );
-       }
-
        /**
         * @return array
         */
@@ -1032,8 +1018,8 @@ class Language {
         * internationalisation, a reduced set of format characters, and a better
         * escaping format.
         *
-        * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
-        * PHP manual for definitions. There are a number of extensions, which
+        * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrUeIOPTZ. See
+        * the PHP manual for definitions. There are a number of extensions, which
         * start with "x":
         *
         *    xn   Do not translate digits of the next numeric format character
@@ -1079,22 +1065,24 @@ class Language {
         * Backslash escaping is also supported.
         *
         * Input timestamp is assumed to be pre-normalized to the desired local
-        * time zone, if any.
+        * time zone, if any. Note that the format characters crUeIOPTZ will assume
+        * $ts is UTC if $zone is not given.
         *
         * @param $format String
         * @param $ts String: 14-character timestamp
         *      YYYYMMDDHHMMSS
         *      01234567890123
+        * @param $zone DateTimeZone: Timezone of $ts
         * @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
         *
         * @return string
         */
-       function sprintfDate( $format, $ts ) {
+       function sprintfDate( $format, $ts, DateTimeZone $zone = null ) {
                $s = '';
                $raw = false;
                $roman = false;
                $hebrewNum = false;
-               $unix = false;
+               $dateTimeObj = false;
                $rawToggle = false;
                $iranian = false;
                $hebrew = false;
@@ -1140,8 +1128,12 @@ class Language {
                                        $num = substr( $ts, 6, 2 );
                                        break;
                                case 'D':
-                                       if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
-                                       $s .= $this->getWeekdayAbbreviation( gmdate( 'w', $unix ) + 1 );
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
+                                       }
+                                       $s .= $this->getWeekdayAbbreviation( $dateTimeObj->format( 'w' ) + 1 );
                                        break;
                                case 'j':
                                        $num = intval( substr( $ts, 6, 2 ) );
@@ -1165,35 +1157,12 @@ class Language {
                                        $num = $hebrew[2];
                                        break;
                                case 'l':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 );
-                                       break;
-                               case 'N':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $w = gmdate( 'w', $unix );
-                                       $num = $w ? $w : 7;
-                                       break;
-                               case 'w':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'w', $unix );
-                                       break;
-                               case 'z':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'z', $unix );
-                                       break;
-                               case 'W':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'W', $unix );
+                                       $s .= $this->getWeekdayName( $dateTimeObj->format( 'w' ) + 1 );
                                        break;
                                case 'F':
                                        $s .= $this->getMonthName( substr( $ts, 4, 2 ) );
@@ -1243,30 +1212,12 @@ class Language {
                                        }
                                        $num = $hebrew[1];
                                        break;
-                               case 't':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 't', $unix );
-                                       break;
                                case 'xjt':
                                        if ( !$hebrew ) {
                                                $hebrew = self::tsToHebrew( $ts );
                                        }
                                        $num = $hebrew[3];
                                        break;
-                               case 'L':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'L', $unix );
-                                       break;
-                               case 'o':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'o', $unix );
-                                       break;
                                case 'Y':
                                        $num = substr( $ts, 0, 4 );
                                        break;
@@ -1342,22 +1293,36 @@ class Language {
                                        $num = substr( $ts, 12, 2 );
                                        break;
                                case 'c':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $s .= gmdate( 'c', $unix );
-                                       break;
                                case 'r':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                               case 'e':
+                               case 'O':
+                               case 'P':
+                               case 'T':
+                                       // Pass through string from $dateTimeObj->format()
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $s .= gmdate( 'r', $unix );
+                                       $s .= $dateTimeObj->format( $code );
                                        break;
+                               case 'w':
+                               case 'N':
+                               case 'z':
+                               case 'W':
+                               case 't':
+                               case 'L':
+                               case 'o':
                                case 'U':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                               case 'I':
+                               case 'Z':
+                                       // Pass through number from $dateTimeObj->format()
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $num = $unix;
+                                       $num = $dateTimeObj->format( $code );
                                        break;
                                case '\\':
                                        # Backslash escaping
@@ -3983,45 +3948,6 @@ class Language {
                }
        }
 
-       /**
-        * Get the ordered list of fallback languages, ending with the fallback
-        * language chain for the site language.
-        *
-        * @since 1.21
-        * @param $code string Language code
-        * @return array
-        */
-       public static function getFallbacksIncludingSiteLanguage( $code ) {
-               global $wgLanguageCode;
-
-               // Usually, we will only store a tiny number of fallback chains, so we
-               // keep them in static memory.
-               static $fallbackLanguageCache = array();
-               $cacheKey = "{$code}-{$wgLanguageCode}";
-
-               if ( !array_key_exists( $cacheKey, $fallbackLanguageCache ) ) {
-                       $fallbacks = self::getFallbacksFor( $code );
-
-                       // Take the final 'en' off of the array before splicing
-                       if ( end( $fallbacks ) === 'en' ) {
-                               array_pop( $fallbacks );
-                       }
-                       // Append the site's fallback chain
-                       $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
-
-                       // Eliminate any languages already included in the chain
-                       $siteFallbacks = array_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
-                       if ( $siteFallbacks ) {
-                               $fallbacks = array_merge( $fallbacks, $siteFallbacks );
-                       }
-                       if ( end( $fallbacks ) !== 'en' ) {
-                               $fallbacks[] = 'en';
-                       }
-                       $fallbackLanguageCache[$cacheKey] = $fallbacks;
-               }
-               return $fallbackLanguageCache[$cacheKey];
-       }
-
        /**
         * Get all messages for a given language
         * WARNING: this may take a long time. If you just need all message *keys*
index 43afe65..e36c085 100644 (file)
@@ -941,7 +941,7 @@ class LanguageConverter {
                $parsed[$key] = true;
 
                if ( $subpage === '' ) {
-                       $txt = MessageCache::singleton()->get( 'conversiontable', true, $code );
+                       $txt = MessageCache::singleton()->getMsgFromNamespace( $key, $code );
                } else {
                        $txt = false;
                        $title = Title::makeTitleSafe( NS_MEDIAWIKI, $key );
index bce1663..89eff30 100644 (file)
@@ -54,7 +54,7 @@
        'arn' => 'mapudungun',  # Mapuche, Mapudungu, Araucanian (Araucano)
        'ary' => 'Maġribi',    # Moroccan Spoken Arabic
        'arz' => 'مصرى',    # Egyptian Spoken Arabic
-       'as' => 'à¦\85সমà§\80à§\9fা',   # Assamese
+       'as' => 'à¦\85সমà§\80য়া',        # Assamese
        'ast' => 'asturianu',   # Asturian
        'av' => 'авар',     # Avar
        'avk' => 'Kotava', # Kotava
        'ny' => 'Chi-Chewa',    # Chichewa
        'oc' => 'occitan',              # Occitan
        'om' => 'Oromoo',               # Oromo
-       'or' => 'à¬\93à­\9cିà¬\86',         # Oriya
+       'or' => 'à¬\93ଡ଼ିà¬\86',              # Oriya
        'os' => 'Ирон', # Ossetic -- fixed per bug 29091
        'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
        'pag' => 'Pangasinan',  # Pangasinan
index 0d652d4..3cc1f29 100644 (file)
@@ -105,28 +105,6 @@ class LanguageGan extends LanguageZh {
                $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
-       /**
-        * this should give much better diff info
-        *
-        * @param $text string
-        * @return string
-        */
-       function segmentForDiff( $text ) {
-               return preg_replace(
-                       "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "' ' .\"$1\"", $text );
-       }
-
-       /**
-        * @param $text string
-        * @return string
-        */
-       function unsegmentForDiff( $text ) {
-               return preg_replace(
-                       "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "\"$1\"", $text );
-       }
-
        /**
         * word segmentation
         *
@@ -139,15 +117,4 @@ class LanguageGan extends LanguageZh {
                return parent::normalizeForSearch( $string, $autoVariant );
        }
 
-       /**
-        * @param $termsArray array
-        * @return array
-        */
-       function convertForSearchResult( $termsArray ) {
-               $terms = implode( '|', $termsArray );
-               $terms = self::convertDoubleWidth( $terms );
-               $terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
-               $ret = array_unique( explode( '|', $terms ) );
-               return $ret;
-       }
 }
index fe5cdf8..14a5641 100644 (file)
@@ -168,7 +168,7 @@ class IuConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
                        if ( preg_match( "/^$imagename:/", $text ) ) return $text;
                }
index f6bbae7..d8a7e2c 100644 (file)
@@ -280,7 +280,7 @@ class KkConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
                        if ( preg_match( "/^$imagename:/", $text ) ) return $text;
                }
index 56a52cc..ef1b065 100644 (file)
@@ -188,7 +188,7 @@ class KuConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
                        if ( preg_match( "/^$imagename:/", $text ) ) return $text;
                }
index 5ddcfde..001ad08 100644 (file)
@@ -147,7 +147,7 @@ class ShiConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
                        if ( preg_match( "/^$imagename:/", $text ) ) return $text;
                }
index 55aec32..b29cfb8 100644 (file)
@@ -139,7 +139,7 @@ class SrConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
                        if ( preg_match( "/^$imagename:/", $text ) ) return $text;
                }
index 04767f2..ac386c5 100644 (file)
@@ -142,9 +142,7 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function segmentForDiff( $text ) {
-               return preg_replace(
-                       "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "' ' .\"$1\"", $text );
+               return preg_replace( '/[\xc0-\xff][\x80-\xbf]*/', ' $0', $text );
        }
 
        /**
@@ -152,9 +150,7 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function unsegmentForDiff( $text ) {
-               return preg_replace(
-                       "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "\"$1\"", $text );
+               return preg_replace( '/ ([\xc0-\xff][\x80-\xbf]*)/', '$1', $text );
        }
 
        /**
index 5ad6717..70d45a3 100644 (file)
@@ -2,10 +2,16 @@
 <!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
 <supplementalData>
        <plurals>
-               <!-- What is this override for Hebrew based on? Is there a CLDR ticket for this? -Ryan Kaldari 2013-01-28 -->
+               <!--
+               The "one" and "two" rules are copied directly from CLDR.
+               The "many" rule overrides CLDR, because CLDR seems to have a mistake:
+               it's sometimes needed for multiples of 10, but not for 10 itself.
+               When the CLDR is fixed, this should be removed.
+               -->
                <pluralRules locales="he">
                        <pluralRule count="one">n is 1</pluralRule>
                        <pluralRule count="two">n is 2</pluralRule>
+                       <pluralRule count="many">n is not 0 AND n is not 10 AND n mod 10 is 0</pluralRule>
                </pluralRules>
                <pluralRules locales="dsb hsb">
                        <pluralRule count="one">n mod 100 is 1</pluralRule>
index 5536ded..e48f858 100644 (file)
@@ -232,13 +232,11 @@ $messages = array(
 'tog-nocache' => 'Deaktiveer blaaier se bladsykas',
 'tog-enotifwatchlistpages' => "Stuur my e-pos as 'n bladsye of lêer op my dophoulys verander",
 'tog-enotifusertalkpages' => 'Stuur vir my e-pos as my eie besprekingsblad verander word',
-'tog-enotifminoredits' => 'Stuur my ook e-pos vir klein wysigings aan bladsye en lêers',
+'tog-enotifminoredits' => 'Stuur ook e-pos vir klein wysigings aan bladsye en lêers',
 'tog-enotifrevealaddr' => 'Stel my e-posadres bloot in kennisgewingspos',
 'tog-shownumberswatching' => 'Wys die aantal gebruikers wat dophou',
 'tog-oldsig' => 'Bestaande handtekening:',
-'tog-fancysig' => 'Hanteer handtekening as wikiteks (sonder outomatiese skakels)',
-'tog-externaleditor' => "Gebruik outomaties 'n eksterne redigeringsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar. [//www.mediawiki.org/wiki/Manual:External_editors Meer inligting.])",
-'tog-externaldiff' => "Gebruik outomaties 'n eksterne vergelykingsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar)",
+'tog-fancysig' => 'Doodgewone handtekening (sonder outomatiese skakel)',
 'tog-showjumplinks' => 'Wys "spring na"-skakels vir toeganklikheid',
 'tog-uselivepreview' => 'Gebruik lewendige voorskou (JavaScript) (eksperimenteel)',
 'tog-forceeditsummary' => "Let my daarop as ek nie 'n opsomming van my wysiging gee nie",
@@ -252,6 +250,7 @@ $messages = array(
 'tog-diffonly' => "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
 'tog-showhiddencats' => 'Wys versteekte kategorië',
 'tog-norollbackdiff' => 'Laat verskille weg na terugrol',
+'tog-useeditwarning' => "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
 
 'underline-always' => 'Altyd',
 'underline-never' => 'Nooit',
@@ -377,7 +376,7 @@ $messages = array(
 'navigation-heading' => 'Navigasie-keuseskerm',
 'errorpagetitle' => 'Fout',
 'returnto' => 'Keer terug na $1.',
-'tagline' => 'Vanuit {{SITENAME}}',
+'tagline' => 'in {{SITENAME}}',
 'help' => 'Hulp',
 'search' => 'Soek',
 'searchbutton' => 'Soek',
@@ -402,7 +401,7 @@ $messages = array(
 'protect_change' => 'wysig',
 'protectthispage' => 'Beskerm hierdie bladsy',
 'unprotect' => 'Wysig beskerming',
-'unprotectthispage' => 'Verander beskerming vir die bladsy',
+'unprotectthispage' => 'Wysig beskerming vir die bladsy',
 'newpage' => 'Nuwe bladsy',
 'talkpage' => 'Bespreek hierdie bladsy',
 'talkpagelinktext' => 'Besprekings',
@@ -424,7 +423,7 @@ $messages = array(
 'otherlanguages' => 'Ander tale',
 'redirectedfrom' => '(Aangestuur vanaf $1)',
 'redirectpagesub' => 'Aanstuurblad',
-'lastmodifiedat' => 'Laaste wysiging op $2, $1.',
+'lastmodifiedat' => 'Die bladsy is laas op $1 om $1 bygewerk.',
 'viewcount' => 'Hierdie bladsy is al {{PLURAL:$1|keer|$1 kere}} aangevra.',
 'protectedpage' => 'Beskermde bladsy',
 'jumpto' => 'Spring na:',
@@ -580,7 +579,7 @@ Geen verduideliking is verskaf nie.",
 'wrong_wfQuery_params' => 'Foutiewe parameters na wfQuery()<br />
 Funksie: $1<br />
 Navraag: $2',
-'viewsource' => 'Bekyk bronteks',
+'viewsource' => 'Wys bronteks',
 'viewsource-title' => 'Wys bron van $1',
 'actionthrottled' => 'Outo-rem op aksie uitgevoer',
 'actionthrottledtext' => "As 'n teen-strooi aksie, word u beperk om hierdie aksie te veel keer in 'n kort tyd uit te voer, en u het hierdie limiet oorskry.
@@ -627,25 +626,25 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
 'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
 'yourdomainname' => 'U domein:',
 'password-change-forbidden' => 'U kan nie wagwoorde op hierdie wiki verander nie.',
-'externaldberror' => "'n Databasisfout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
+'externaldberror' => "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
 'login' => 'Teken in',
 'nav-login-createaccount' => 'Teken in',
-'loginprompt' => 'U blaaier moet koekies toelaat om by {{SITENAME}} te kan aanteken.',
+'loginprompt' => 'U blaaier moet koekies toelaat om op {{SITENAME}} te kan aanteken.',
 'userlogin' => 'Teken in / registreer',
 'userloginnocreate' => 'Teken in',
 'logout' => 'Teken uit',
 'userlogout' => 'Teken uit',
 'notloggedin' => 'Nie ingeteken nie',
-'nologin' => "Nog nie geregistreer nie? '''$1'''.",
+'nologin' => 'Nog nie geregistreer nie? $1.',
 'nologinlink' => "Skep gerus 'n rekening",
 'createaccount' => 'Skep nuwe rekening',
-'gotaccount' => "Het u reeds 'n rekening? '''$1'''.",
-'gotaccountlink' => 'Teken in',
+'gotaccount' => "Het u reeds 'n rekening? $1.",
+'gotaccountlink' => 'Meld aan',
 'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
 'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
 'createaccountreason' => 'Rede:',
 'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
-'userexists' => "Die gebruikersnaam wat u gekies het is reeds geneem.
+'userexists' => "Die gebruikersnaam wat u gekies het is beset.
 Kies asseblief 'n ander naam.",
 'loginerror' => 'Intekenfout',
 'createaccounterror' => "Kon nie 'n rekening skep nie: $1",
@@ -671,7 +670,7 @@ Intekening word verbied.',
 'passwordtooshort' => 'Wagwoorde moet ten minste {{PLURAL:$1|1 karakter|$1 karakters}} lank wees.',
 'password-name-match' => 'U wagwoord mag nie dieselfde as u gebruikersnaam wees nie.',
 'password-login-forbidden' => 'Die gebruik van hierdie gebruikersnaam en wagwoord is geweier.',
-'mailmypassword' => "E-pos my 'n nuwe wagwoord",
+'mailmypassword' => 'E-pos nuwe wagwoord',
 'passwordremindertitle' => 'Wagwoordwenk van {{SITENAME}}',
 'passwordremindertext' => 'Iemand (waarskynlik u vanaf IP-adres $1) het \'n nuwe wagwoord vir {{SITENAME}} ($4) gevra. \'n Tydelike wagwoord is vir gebruiker "$2" geskep. Die nuwe wagwoord is "$3". U kan met die tydelike wagwoord aanteken en \'n nuwe wagwoord stel. Die tydelike wagwoord sal na {{PLURAL:$5|een dag|$5 dae}} verval.
 
@@ -685,12 +684,12 @@ Teken asseblief in na u dit ontvang het.',
 Voordat ander pos na die adres gestuur word,
 moet die instruksies in bogenoemde pos gevolg word om te bevestig dat die adres werklik u adres is.",
 'throttled-mailpassword' => "Daar is reeds 'n wagwoordwenk in die laaste {{PLURAL:$1|uur|$1 ure}} gestuur.
-Om misbruik te voorkom, word slegs een wagwoordwenk per {{PLURAL:$1|uur|$1 ure}} gestuur.",
+Om misbruik te voorkom, word slegs een E-pos per {{PLURAL:$1|uur|$1 ure}} gestuur.",
 'mailerror' => 'Fout tydens e-pos versending: $1',
 'acct_creation_throttle_hit' => "Besoekers aan hierdie wiki wat u IP-adres gebruik het reeds {{PLURAL:$1|'n rekening|$1 rekeninge}} in die laaste dag geskep, wat die maksimum toelaatbaar is vir die periode. Dus kan besoekers wat hierdie IP-adres gebruik tans nie meer nuwe gebruikers registreer nie.",
 'emailauthenticated' => 'U e-posadres is op $2 om $3 bevestig.',
 'emailnotauthenticated' => 'U e-poasadres is <strong>nog nie bevestig nie</strong>. Geen e-pos sal gestuur word vir die volgende funksies nie.',
-'noemailprefs' => "Spesifiseer 'n eposadres vir hierdie funksies om te werk.",
+'noemailprefs' => "Spesifiseer 'n e-posadres vir hierdie funksies om te werk.",
 'emailconfirmlink' => 'Bevestig u e-posadres',
 'invalidemailaddress' => "Die e-posadres is nie aanvaar nie, aangesien dit 'n ongeldige formaat blyk te hê.
 Voer asseblief 'n geldige e-posadres in, of laat die veld leeg.",
@@ -736,7 +735,7 @@ U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
 
 # Special:PasswordReset
 'passwordreset' => 'Wagwoord herstel',
-'passwordreset-text' => "Voltooi hierdie vorm om 'n e-pos herinnering van jou rekening besonderhede te ontvang.",
+'passwordreset-text' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
 'passwordreset-legend' => 'Kry nuwe wagwoord',
 'passwordreset-disabled' => 'Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1| | Voer een van die onderstaande velde in}}',
@@ -763,8 +762,8 @@ Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of
 'passwordreset-emailelement' => 'Gebruikersnaam: $1
 Tydelike wagwoord: $2',
 'passwordreset-emailsent' => "'n E-pos is gestuur om u wagwoord te herstel.",
-'passwordreset-emailsent-capture' => "'n E-pos ter herinnering is gestuur en word hieronder vertoon.",
-'passwordreset-emailerror-capture' => "'n E-pos ter herinnering is geskep en word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+'passwordreset-emailsent-capture' => "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
+'passwordreset-emailerror-capture' => "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Wysig E-posadres',
@@ -785,7 +784,7 @@ Tydelike wagwoord: $2',
 'italic_tip' => 'Skuinsdruk',
 'link_sample' => 'Skakelnaam',
 'link_tip' => 'Interne skakel',
-'extlink_sample' => 'http://www.example.com skakel se titel',
+'extlink_sample' => 'http://www.voorbeeld.org skakel se titel',
 'extlink_tip' => 'Eksterne skakel (onthou http:// vooraan)',
 'headline_sample' => 'Opskrif',
 'headline_tip' => 'Vlak 2-opskrif',
@@ -811,11 +810,11 @@ Tydelike wagwoord: $2',
 'anoneditwarning' => "'''Waarskuwing:''' Aangesien u nie aangeteken is nie, sal u IP-adres in dié blad se wysigingsgeskiedenis gestoor word.",
 'anonpreviewwarning' => "''U is nie aangeteken nie.''
 ''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
-'missingsummary' => "'''Onthou:''' Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer geklik word, word die wysiging sonder opsomming gestoor.",
+'missingsummary' => "'''Neem kennis''': Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer gekliek word, word die wysiging sonder 'n opsomming gestoor.",
 'missingcommenttext' => 'Tik die opsomming onder.',
 'missingcommentheader' => "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"{{int:savearticle}}\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
 'summary-preview' => 'Opsomming nakijken:',
-'subject-preview' => 'Onderwerp/ opskrif voorskou:',
+'subject-preview' => 'Onderwerp/opskrif voorskou:',
 'blockedtitle' => 'Gebruiker is geblokkeer',
 'blockedtext' => "'''U gebruikersnaam of IP-adres is geblokkeer.'''
 
@@ -878,7 +877,7 @@ Meer gegewens kan moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'userpage-userdoesnotexist-view' => 'Die gebruiker "$1" is nie geregistreer nie.',
 'blocked-notice-logextract' => 'Hierdie gebruiker is tans geblokkeer.
 Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
-'clearyourcache' => "'''Let wel''': Na die voorkeure gestoor is, moet u blaaier se kasgeheue verfris word om die veranderinge te sien:
+'clearyourcache' => "'''Neem kennis''': Na die wysiging is dit dalk nodig om u blaaier se kasgeheue verfris voordat u die veranderinge sal sien:
 * '''Firefox / Safari:''' hou ''Shift'' en kliek ''Reload'', of druk ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-R'' op 'n Mac)
 * '''Google Chrome:''' druk ''Ctrl-Shift-R'' (''⌘-Shift-R'' op 'n Mac)
 * '''Internet Explorer:''' hou ''Ctrl'' en kliek ''Refresh'', of druk ''Ctrl-F5''
@@ -901,7 +900,7 @@ U teks is nog nie gestoor nie!",
 'continue-editing' => 'Wysig verder',
 'previewconflict' => 'Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk indien u die bladsy stoor.',
 'session_fail_preview' => "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.
-Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
+Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te meld.'''",
 'session_fail_preview_html' => "'''Jammer! U wysigings is nie verwerk nie omdat sessie-data verlore gegaan het.'''
 
 ''Omrede rou HTML hier by {{SITENAME}} ingevoer kan word, kan die voorskou nie gesien word nie ter beskerming teen aanvalle met JavaScript.''
@@ -937,15 +936,16 @@ Deur enigiets hier te plaas, beloof u dat u dit self geskryf het, of dat dit gek
 '''MOENIE WERK WAT DEUR KOPIEREG BESKERM WORD HIER PLAAS SONDER TOESTEMMING NIE!'''",
 'longpageerror' => "'''Fout: die teks wat u bygevoeg het is {{PLURAL:$1|een kilogreep|$1 kilogrepe}} groot, wat groter is as die maksimum van {{PLURAL:$2|een kilogreep|$2 kilogrepe}}.'''
 Die bladsy kan nie gestoor word nie.",
-'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks in 'n lêer plak en stoor vir later.'''
+'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie.'''
+Dit is miskien verstandig om die teks tydelik in 'n lêer plak en te stoor vir later wanneer die databasis weer oop is.
 
 Die administrateur wat dit gesluit het se verduideliking: $1",
 'protectedpagewarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig sodat slegs administrateurs die inhoud sal kan verander.''' Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'semiprotectedpagewarning' => "'''Let wel:''' Hierdie artikel is beveilig sodat slegs ingetekende gebruikers dit sal kan wysig. Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
+'semiprotectedpagewarning' => "'''Let wel:''' Hierdie artikel is beskerm sodat slegs ingetekende gebruikers dit sal kan wysig. Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
 'cascadeprotectedwarning' => "'''Waarskuwing:''' Die bladsy was beveilig sodat dit slegs deur administrateurs gewysig kan word, omrede dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat kaskade-beskerming geniet:",
 'titleprotectedwarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig. Slegs gebruikers met [[Special:ListGroupRights|spesiale regte]] sal dit kan skep.'''
 Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik op hierdie blad:',
+'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} wat op hierdie bladsy gebruik word:',
 'templatesusedpreview' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik in hierdie voorskou:',
 'templatesusedsection' => 'Die volgende {{PLURAL:$1|sjabloon|sjablone}} word in hierdie afdeling gebruik:',
 'template-protected' => '(beskermd)',
@@ -965,7 +965,7 @@ U kan slegs bestaande bladsye wysig, of u kan [[Special:UserLogin|aanteken of re
 U moet besluit of dit wys is om voort te gaan om aan hierdie bladsy te werk.
 Die skrap- en skuiflogboeke vir die bladsy word vir u gerief hier onder vertoon:",
 'moveddeleted-notice' => 'Hierdie bladsy is verwyder.
-Die skrap- en skuif-logboeke word hieronder ter inligting weergegee.',
+Die skrap- en skuiflogboeke word hieronder ter inligting weergegee.',
 'log-fulllog' => 'Wys volledige logboek',
 'edit-hook-aborted' => "Die wysiging is deur 'n hoek gekanselleer.
 Geen verduideliking is verskaf nie.",
@@ -979,6 +979,8 @@ Dit bestaan alreeds.',
 'content-failed-to-parse' => 'Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.',
 'invalid-content-data' => 'Ongeldige inhoud',
 'content-not-allowed-here' => '"$1" word nie op bladsy [[$2]] toegelaat nie.',
+'editwarning-warning' => 'As u hierdie bladsy verlaat, verloor u moontlik al die wysigings wat u aangebring het.
+Indien u aangemeld is, kan u hierdie waarskuwing in die "{{int:prefs-editing}}"-afdeling van u voorkeure afskakel.',
 
 # Content models
 'content-model-wikitext' => 'Wikiteks',
@@ -1201,9 +1203,9 @@ Dit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n blad
 Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
 
 # Search results
-'searchresults' => 'soekresultate',
+'searchresults' => 'Soekresultate',
 'searchresults-title' => 'Soekresultate vir "$1"',
-'searchresulttext' => 'Vir meer inligting oor {{SITENAME}} soekresultate, lees [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresulttext' => 'Vir meer inligting oor {{SITENAME}}-soekresultate, sien [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'U soek vir \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|alle bladsye wat met "$1" begin]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle bladsye wat aan "$1" skakel]])',
 'searchsubtitleinvalid' => 'Vir navraag "$1"',
 'toomanymatches' => "Te veel resultate. Probeer asseblief 'n ander soektog.",
@@ -1216,7 +1218,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'prevn-title' => 'Vorige {{PLURAL:$1|resultaat|$1 resultate}}',
 'nextn-title' => 'Volgende {{PLURAL:$1|resultaat|$1 resultate}}',
 'shown-title' => '$1 {{PLURAL:$1|resultaat|resultate}} per bladsy',
-'viewprevnext' => 'Kyk na ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'Wys ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Soekopsies',
 'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
 'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
@@ -1238,7 +1240,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'search-redirect' => '(aanstuur $1)',
 'search-section' => '(afdeling $1)',
 'search-suggest' => 'Het u $1 bedoel?',
-'search-interwiki-caption' => 'Suster projekte',
+'search-interwiki-caption' => 'Susterprojekte',
 'search-interwiki-default' => '$1 resultate:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwante',
@@ -1258,21 +1260,12 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'powersearch-ns' => 'Soek in naamruimtes:',
 'powersearch-redir' => 'Wys aanstuurbladsye',
 'powersearch-field' => 'Soek vir',
-'powersearch-togglelabel' => 'Kies',
-'powersearch-toggleall' => 'Alles',
+'powersearch-togglelabel' => 'Kies:',
+'powersearch-toggleall' => 'Alle',
 'powersearch-togglenone' => 'Geen',
 'search-external' => 'Eksterne soektog',
 'searchdisabled' => '{{SITENAME}} se soekfunksie is tans afgeskakel ter wille van werkverrigting. Gebruik gerus intussen Google of Yahoo! Let daarop dat hulle indekse van die {{SITENAME}}-inhoud verouderd mag wees.',
 
-# Quickbar
-'qbsettings' => 'Snelbalkvoorkeure',
-'qbsettings-none' => 'Geen',
-'qbsettings-fixedleft' => 'Links vas.',
-'qbsettings-fixedright' => 'Regs vas.',
-'qbsettings-floatingleft' => 'Dryf links.',
-'qbsettings-floatingright' => 'Dryf regs.',
-'qbsettings-directionality' => 'Vas, afhanklik van die skryfrigting van u taal',
-
 # Preferences page
 'preferences' => 'Voorkeure',
 'mypreferences' => 'Voorkeure',
@@ -1340,7 +1333,7 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 'allowemail' => 'Laat e-pos van ander toe',
 'prefs-searchoptions' => 'Soek',
 'prefs-namespaces' => 'Naamruimtes',
-'defaultns' => 'Anders soek in hierdie naamruimtes:',
+'defaultns' => 'Anders, soek in hierdie naamruimtes:',
 'default' => 'verstek',
 'prefs-files' => 'Lêers',
 'prefs-custom-css' => 'Persoonlike CSS',
@@ -1410,7 +1403,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 * 'n Ongeselekteerde boks beteken dat die gebruiker nie 'n lid van die groep is nie.
 * 'n Ster (*) beteken dat u nie die gebruiker uit 'n groep kan verwyder as hy eers daaraan behoort nie, of vice versa.",
 'userrights-reason' => 'Rede:',
-'userrights-no-interwiki' => 'U het nie toestemming om gebruikersregte op ander wikis te verander nie.',
+'userrights-no-interwiki' => "U het nie toestemming om gebruikersregte op ander wiki's te verander nie.",
 'userrights-nodatabase' => 'Databasis $1 bestaan nie of is nie hier beskikbaar nie.',
 'userrights-nologin' => "U moet [[Special:UserLogin|aanteken]] as 'n administrateur om gebruikersregte te mag toeken.",
 'userrights-notallowed' => 'U het nie magtiging om gebruikersregte by te sit of weg te neem nie.',
@@ -1553,19 +1546,19 @@ Die inligting is vir ander gebruikers sigbaar.',
 'recentchanges' => 'Onlangse wysigings',
 'recentchanges-legend' => 'Opsies vir onlangse wysigings',
 'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
-'recentchanges-feed-description' => 'Spoor die mees onlangse wysigings op die wiki na in die voer.',
+'recentchanges-feed-description' => 'Hierdie voer laat u toe om die mees onlangse wysigings aan die wiki te volg.',
 'recentchanges-label-newpage' => "Met die wysiging is 'n nuwe bladsy geskep",
 'recentchanges-label-minor' => "Hierdie is 'n klein wysiging",
 'recentchanges-label-bot' => "Hierdie wysiging was deur 'n bot uitgevoer",
 'recentchanges-label-unpatrolled' => 'Die wysiging is nog nie gekontroleer nie',
-'rcnote' => "Hier volg die laaste {{PLURAL:$1|'''$1''' wysiging|'''$1''' wysigings}} vir die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4, $5.",
+'rcnote' => "Hier volg die laaste {{PLURAL:$1|'''$1''' wysiging|'''$1''' wysigings}} gedurende die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4 om $5.",
 'rcnotefrom' => 'Hier onder is die wysigings sedert <b>$2</b> (tot by <b>$1</b> word gewys).',
 'rclistfrom' => 'Vertoon wysigings vanaf $1',
 'rcshowhideminor' => '$1 klein wysigings',
 'rcshowhidebots' => '$1 robotte',
 'rcshowhideliu' => '$1 aangetekende gebruikers',
 'rcshowhideanons' => '$1 anonieme gebruikers',
-'rcshowhidepatr' => '$1 gepatrolleerde wysigings',
+'rcshowhidepatr' => '$1 gekontroleerde wysigings',
 'rcshowhidemine' => '$1 my wysigings',
 'rclinks' => 'Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3',
 'diff' => 'verskil',
@@ -1634,7 +1627,7 @@ Om die lêer in 'n artikel te gebruik, plaas 'n skakel in een van die volgende f
 'filedesc' => 'Opsomming',
 'fileuploadsummary' => 'Opsomming:',
 'filereuploadsummary' => 'Lêerwysigings:',
-'filestatus' => 'Outeursregsituasie:',
+'filestatus' => 'Outeursregstatus:',
 'filesource' => 'Bron:',
 'uploadedfiles' => 'Gelaaide lêers',
 'ignorewarning' => 'Ignoreer waarskuwings en stoor die lêer',
@@ -1698,8 +1691,8 @@ Dit word aanbeveel dat u die lêer se skrapgeskiedenis besigtig voor u poog om d
 'uploadwarning-text' => 'Verander die onderstaande lêerbeskrywing en probeer dan weer.',
 'savefile' => 'Stoor lêer',
 'uploadedimage' => 'het "[[$1]]" gelaai',
-'overwroteimage' => 'het een nuwe weergawe van "[[$1]]" gelaai',
-'uploaddisabled' => 'Laai is uitgeskakel',
+'overwroteimage' => 'het \'n nuwe weergawe van "[[$1]]" opgelaai',
+'uploaddisabled' => 'Die oplaai van lêers is afgeskakel.',
 'copyuploaddisabled' => 'Die oplaai van lêers per URL is afgeskakel.',
 'uploadfromurl-queued' => 'U oplaai is in die wagtou geplaas.',
 'uploaddisabledtext' => 'Die oplaai van lêers is afgeskakel.',
@@ -1710,7 +1703,7 @@ Kyk na die "file_uploads"-instelling.',
 'uploadjava' => "Die lêer is 'n ZIP wat 'n Java .class-lêer bevat.
 Die oplaai van Java-lêers word nie toegelaat nie, omdat dit sekuriteit kan omseil.",
 'upload-source' => 'Bronlêer',
-'sourcefilename' => 'Bronlêernaam:',
+'sourcefilename' => 'Oorspronklike lêernaam:',
 'sourceurl' => 'Bron-URL:',
 'destfilename' => 'Teikenlêernaam:',
 'upload-maxfilesize' => 'Maksimum lêer grootte: $1',
@@ -1832,7 +1825,6 @@ Vir veiligheidsredes is img_auth.php gedeaktiveer.",
 'http-read-error' => 'Fout met die lees van HTTP.',
 'http-timed-out' => 'HTTP-versoek se tyd is verstreke.',
 'http-curl-error' => 'Fout met die ophaal van URL: $1',
-'http-host-unreachable' => 'Die URL is nie bereikbaar nie.',
 'http-bad-status' => "Daar was 'n probleem tydens die HTTP-versoek: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1846,7 +1838,7 @@ U kan miskien selfs tydens 'n minder besige tyd weer probeer.",
 
 'license' => 'Lisensiëring:',
 'license-header' => 'Lisensiëring',
-'nolicense' => 'Niks gekies',
+'nolicense' => 'Niks gekies nie',
 'license-nopreview' => '(Voorskou nie beskikbaar)',
 'upload_source_url' => " ('n geldige, publiek toeganklike URL)",
 'upload_source_file' => " ('n lêer op u rekenaar)",
@@ -1965,8 +1957,8 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 
 # Statistics
 'statistics' => 'Statistieke',
-'statistics-header-pages' => 'Bladsy statistieke',
-'statistics-header-edits' => 'Wysig statistieke',
+'statistics-header-pages' => 'Bladsystatistiek',
+'statistics-header-edits' => 'Wysigingstatistiek',
 'statistics-header-views' => 'Wys statistieke',
 'statistics-header-users' => 'Gebruikerstatistiek',
 'statistics-header-hooks' => 'Ander statistieke',
@@ -1980,7 +1972,7 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'statistics-views-total-desc' => 'Die wys van nie-bestaande bladsye en spesiale bladsye is nie ingesluit nie',
 'statistics-views-peredit' => 'Bladsye besigtig per wysiging',
 'statistics-users' => 'Geregistreerde [[Special:ListUsers|gebruikers]]',
-'statistics-users-active' => 'Aktiewe grbruikers',
+'statistics-users-active' => 'Aktiewe gebruikers',
 'statistics-users-active-desc' => "Gebruikers wat in die afgelope {{PLURAL:$1|dag|$1 dae}} 'n handeling uitgevoer het",
 'statistics-mostpopular' => 'Mees bekykte bladsye',
 
@@ -2036,8 +2028,8 @@ Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste re
 'unusedcategories' => 'Ongebruikte kategorieë',
 'unusedimages' => 'Ongebruikte lêers',
 'popularpages' => 'Gewilde bladsye',
-'wantedcategories' => 'Begeerde kategorieë',
-'wantedpages' => 'Begeerde bladsye',
+'wantedcategories' => 'Gesoekte kategorieë',
+'wantedpages' => 'Gesoekte bladsye',
 'wantedpages-badtitle' => 'Ongeldige bladsynaam in resultate: $1',
 'wantedfiles' => 'Begeerde lêers',
 'wantedfiletext-cat' => 'Die volgende lêers word gebruik, maar bestaan nie. Lêers van eksterne biblioteke kan, ondanks die feit dat hulle wel bestaan, ook hier gelys wees. Hierdie vals positiewes word as <del>deurgehaal aangedui</del>. Bladsye met lêers wat nie bestaan nie word aangegee by [[:$1]].',
@@ -2132,8 +2124,8 @@ Dit is moontlik dat die naam karakters bevat wat nie in titels gebruik mag word
 # Special:Categories
 'categories' => 'Kategorieë',
 'categoriespagetext' => 'Die volgende {{PLURAL:$1|kategorie|kategorieë}} bevat bladsye of media.
-[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie hier weergegee nie.
-Sie ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
+[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie gewys nie.
+Sien ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
 'categoriesfrom' => 'Wys kategorieë vanaf:',
 'special-categories-sort-count' => 'sorteer volgens getal',
 'special-categories-sort-abc' => 'sorteer alfabeties',
@@ -2157,18 +2149,9 @@ Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
 # Special:ListUsers
 'listusersfrom' => 'Wys gebruikers, beginnende by:',
 'listusers-submit' => 'Wys',
-'listusers-noresult' => 'Geen gebruiker gevind.',
+'listusers-noresult' => 'Geen gebruikers gevind nie.',
 'listusers-blocked' => '(geblokkeer)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktiewe gebruikers',
-'activeusers-intro' => "Hierdie is 'n lys van gebruikers wat die laaste {{PLURAL:$1|dag|$1 dae}} enige aktiwiteit getoon het.",
-'activeusers-count' => '$1 onlangse {{PLURAL:$1|wysiging|wysigings}} in die {{PLURAL:$3|afgelope dag|laatste $3 dae}}',
-'activeusers-from' => 'Wys gebruikers, beginnende by:',
-'activeusers-hidebots' => 'Versteek bots',
-'activeusers-hidesysops' => 'Versteek administrateurs',
-'activeusers-noresult' => 'Geen gebruikers gevind nie.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Gebruikersgroepregte',
 'listgrouprights-summary' => "Hier volg 'n lys van gebruikersgroepe met hulle ooreenstemmende regte wat op die wiki gedefinieer is.
@@ -2217,7 +2200,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'emailccme' => "E-pos vir my 'n kopie van my boodskap.",
 'emailccsubject' => 'Kopie van u boodskap aan $1: $2',
 'emailsent' => 'E-pos gestuur',
-'emailsenttext' => 'U e-pos is gestuur.',
+'emailsenttext' => 'Die e-pos is gestuur.',
 'emailuserfooter' => 'Hierdie e-pos is gestuur deur $1 aan $2 met behulp van die "Stuur e-pos aan die gebruiker"-funksie van {{SITENAME}}.',
 
 # User Messenger
@@ -2231,8 +2214,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'nowatchlist' => 'U het geen items in u dophoulys nie.',
 'watchlistanontext' => '$1 is noodsaaklik om u dophoulys te sien of te wysig.',
 'watchnologin' => 'Nie ingeteken nie',
-'watchnologintext' => 'U moet [[Special:UserLogin|ingeteken]]
-wees om u dophoulys te verander.',
+'watchnologintext' => 'U moet [[Special:UserLogin|aangemeld]] wees om u dophoulys te verander.',
 'addwatch' => 'Voeg by dophoulys',
 'addedwatchtext' => 'Die bladsy "[[:$1]]" is by u [[Special:Watchlist|dophoulys]] bygevoeg.
 Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.',
@@ -2250,7 +2232,7 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
 'wlheader-showupdated' => "* Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys",
 'watchmethod-recent' => 'Kontroleer onlangse wysigings aan bladsye op dophoulys',
 'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
-'watchlistcontains' => 'U dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
+'watchlistcontains' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
 'iteminvalidname' => "Probleem met item '$1', ongeldige naam...",
 'wlnote' => "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
 'wlshowlast' => 'Wys afgelope $1 ure, $2 dae of $3',
@@ -2310,19 +2292,19 @@ Terugvoer en verdere bystand:
 # Delete
 'deletepage' => 'Skrap bladsy',
 'confirm' => 'Bevestig',
-'excontent' => "inhoud was: '$1'",
-'excontentauthor' => "Inhoud was: '$1' ('[[Special:Contributions/$2|$2]]' was die enigste bydraer)",
+'excontent' => 'inhoud was: "$1"',
+'excontentauthor' => 'Inhoud was: "$1" (en die enigste bydraer was [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => "Inhoud voor uitwissing was: '$1'",
 'exblank' => 'bladsy was leeg',
 'delete-confirm' => 'Skrap "$1"',
 'delete-legend' => 'Skrap',
 'historywarning' => "'''Waarskuwing:''' Die bladsy wat u wil verwyder het 'n geskiedenis met ongeveer $1 {{PLURAL:$1|weergawe|weergawes}}:",
-'confirmdeletetext' => "U staan op die punt om 'n bladsy of prent asook al hulle geskiedenis uit die databasis te skrap.
-Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}]].",
+'confirmdeletetext' => "U staan op die punt om 'n bladsy of prent, insluitende hul geskiedenis, uit die databasis te skrap.
+Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]].",
 'actioncomplete' => 'Aksie uitgevoer',
 'actionfailed' => 'Aksie het gefaal',
 'deletedtext' => '"$1" is geskrap.
-Kyk na $2 vir \'n rekord van onlangse skrappings.',
+Sien die $2 vir \'n rekord van onlangse skrappings.',
 'dellogpage' => 'Skraplogboek',
 'dellogpagetext' => "Hier onder is 'n lys van die mees onlangse skrappings. Alle tye is bedienertyd (UGT).",
 'deletionlog' => 'skraplogboek',
@@ -2395,14 +2377,14 @@ Hier is die huidige verstellings vir bladsy '''$1''':",
 'protect-cascadeon' => 'Die bladsy word beskerm want dit is ingesluit by die volgende {{PLURAL:$1|blad|blaaie}} wat kaskade-beskerming geniet. U kan die veiligheidsvlak van die bladsy verander, maar dit sal nie die ander kaskade blaaie beïnvloed nie.',
 'protect-default' => 'Laat alle gebruikers toe',
 'protect-fallback' => 'Laat slegs gebruikers met "$1" regte toe',
-'protect-level-autoconfirmed' => 'Laat slegs "autoconfirmed" gebruikers toe',
+'protect-level-autoconfirmed' => 'Laat slegs outomaties bevestigde gebruikers toe',
 'protect-level-sysop' => 'Laat slegs administrateurs toe',
 'protect-summary-cascade' => 'kaskade',
 'protect-expiring' => 'verval op $2 om $3 (UTC)',
 'protect-expiring-local' => 'verval op $1',
 'protect-expiry-indefinite' => 'verval nie',
 'protect-cascade' => 'Beveilig bladsye insluitend die bladsy (kaskade effek)',
-'protect-cantedit' => 'U kan nie die veiligheidsvlak van die blad verander nie, want u het nie regte om dit te wysig nie.',
+'protect-cantedit' => 'U kan nie die veiligheidsvlak van die bladsy verander nie, want u het nie regte om dit te wysig nie.',
 'protect-othertime' => 'Ander tyd:',
 'protect-othertime-op' => 'ander tyd',
 'protect-existing-expiry' => 'Bestaande vervaldatum: $2 om $3',
@@ -2434,7 +2416,7 @@ Hier is die huidige verstellings vir bladsy '''$1''':",
 
 # Undelete
 'undelete' => 'Besigtig geskrapte bladsye',
-'undeletepage' => 'Kyk na en herstel geskrapte bladsye',
+'undeletepage' => 'Wys en herstel geskrapte bladsye',
 'undeletepagetitle' => "'''Hier onder is die verwyderde weergawes van [[:$1]]'''.",
 'viewdeletedpage' => 'Bekyk geskrapte bladsye',
 'undeletepagetext' => 'Die volgende {{PLURAL:$1|bladsy|$1 bladsye}} is geskrap, maar is nog in die argief en kan teruggeplaas word. Die argief van geskrapte blaaie kan periodiek skoongemaak word.',
@@ -2449,7 +2431,7 @@ In sulke gevalle, verwyder die mees onlangs verwyderde weergawe uit die seleksie
 'undeletehistorynoadmin' => 'Die bladsy is geskrap.
 Die rede hiervoor word onder in die opsomming aangedui, saam met besonderhede van die gebruikers wat die bladsy gewysig het voordat dit verwyder is.
 Die verwyderde inhoud is slegs vir administrateurs sigbaar.',
-'undelete-revision' => 'Verwyder weergawe van $1 (per $4 om $5) deur $3:',
+'undelete-revision' => 'Verwyderde weergawe van $1 (soos op $4 om $5) deur $3:',
 'undeleterevision-missing' => "Ongeldige of vermiste weergawe.
 U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit die argief verwyder.",
 'undelete-nodiff' => 'Geen vorige wysigings gevind.',
@@ -2523,7 +2505,7 @@ Die laaste inskrywing uit die blokkeerlogboek word hier ter inligting weergegee:
 
 # What links here
 'whatlinkshere' => 'Skakels hierheen',
-'whatlinkshere-title' => 'Bladsye wat verwys na "$1"',
+'whatlinkshere-title' => 'Bladsye wat na "$1" skakel',
 'whatlinkshere-page' => 'Bladsy:',
 'linkshere' => "Die volgende bladsye skakel na '''[[:$1]]''':",
 'nolinkshere' => "Geen bladsye skakel na '''[[:$1]]'''.",
@@ -2916,13 +2898,13 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-pt-watchlist' => 'Die lys bladsye wat u vir veranderinge dophou',
 'tooltip-pt-mycontris' => 'Lys van my bydraes',
 'tooltip-pt-login' => 'U word aangemoedig om in te teken. Dit is egter nie verpligtend nie.',
-'tooltip-pt-anonlogin' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
+'tooltip-pt-anonlogin' => 'U word aangemoedig om in te teken. Dit is egter nie verpligtend nie.',
 'tooltip-pt-logout' => 'Teken uit',
-'tooltip-ca-talk' => 'Bespreking oor die inhoudsbladsy',
-'tooltip-ca-edit' => 'U kan hierdie bladsy redigeer. Gebruik asseblief die voorskouknop vóór u dit stoor.',
-'tooltip-ca-addsection' => 'Nuwe afdeling',
+'tooltip-ca-talk' => 'Bespreking oor die inhoudbladsy',
+'tooltip-ca-edit' => 'U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.',
+'tooltip-ca-addsection' => "Begin 'n nuwe bespreking",
 'tooltip-ca-viewsource' => 'Hierdie bladsy is beskerm. U kan die bronteks besigtig.',
-'tooltip-ca-history' => 'Ouer weergawes van hierdie bladsy.',
+'tooltip-ca-history' => 'Ouer weergawes van hierdie bladsy',
 'tooltip-ca-protect' => 'Beskerm hierdie bladsy',
 'tooltip-ca-unprotect' => 'Wysig beskerming van die bladsy',
 'tooltip-ca-delete' => 'Skrap hierdie bladsy',
@@ -2936,7 +2918,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-p-logo' => 'Besoek die tuisblad',
 'tooltip-n-mainpage' => 'Besoek die Tuisblad',
 'tooltip-n-mainpage-description' => 'Gaan na die tuisblad',
-'tooltip-n-portal' => 'Meer oor die projek, wat u kan doen, nuttige skakels',
+'tooltip-n-portal' => 'Meer oor die projek, wat jy kan doen, nuttige skakels',
 'tooltip-n-currentevents' => "'n Plek waar almal gesellig kan verkeer",
 'tooltip-n-recentchanges' => "'n Lys van onlangse wysigings",
 'tooltip-n-randompage' => "Laai 'n lukrake bladsye",
@@ -2947,7 +2929,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-feed-atom' => 'Atom-voed vir hierdie bladsy',
 'tooltip-t-contributions' => "Bekyk 'n lys van bydraes deur hierdie gebruiker",
 'tooltip-t-emailuser' => "Stuur 'n e-pos aan hierdie gebruiker",
-'tooltip-t-upload' => 'Laai lêers op',
+'tooltip-t-upload' => 'Laai beelde of ander medialêers op',
 'tooltip-t-specialpages' => "'n Lys van al die spesiale bladsye",
 'tooltip-t-print' => 'Drukbare weergawe van hierdie bladsy',
 'tooltip-t-permalink' => "'n Permanente skakel na hierdie weergawe van die bladsy",
@@ -2961,9 +2943,9 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-ca-nstab-template' => 'Bekyk die sjabloon',
 'tooltip-ca-nstab-help' => 'Bekyk die hulpbladsy',
 'tooltip-ca-nstab-category' => 'Bekyk die kategoriebladsy',
-'tooltip-minoredit' => "Dui aan hierdie is 'n klein wysiging",
+'tooltip-minoredit' => "Dui aan dat hierdie 'n klein wysiging is",
 'tooltip-save' => 'Stoor u wysigings',
-'tooltip-preview' => "Sien 'n voorskou van u wysigings, gebruik dit voor u die blad stoor!",
+'tooltip-preview' => "Sien 'n voorskou van u wysigings. Gebruik hierdie funksie vóór u die bladsy stoor!",
 'tooltip-diff' => 'Wys watter veranderinge u aan die teks gemaak het.',
 'tooltip-compareselectedversions' => 'Vergelyk die twee gekose weergawes van hierdie blad.',
 'tooltip-watch' => 'Voeg hierdie blad by u dophoulys',
@@ -2985,12 +2967,12 @@ U kan daar \'n wysigingsopsomming byvoeg.',
 
 # Attribution
 'anonymous' => 'Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}',
-'siteuser' => '{{SITENAME}} gebruiker $1',
+'siteuser' => '{{SITENAME}}-gebruiker $1',
 'anonuser' => 'Anonieme {{SITENAME}}-gebruiker $1',
 'lastmodifiedatby' => 'Hierdie bladsy is laas op $1 om $2 deur $3 gewysig.',
 'othercontribs' => 'Gebaseer op werk van $1.',
 'others' => 'ander',
-'siteusers' => '{{SITENAME}}-{{PLURAL:$2|gebruikers|gebruikers}} $1',
+'siteusers' => '{{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1',
 'anonusers' => 'Anonieme {{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1',
 'creditspage' => 'Outeursblad',
 'nocredits' => 'Geen outeursinligting is vir hierdie bladsy nie beskikbaar nie.',
@@ -3052,8 +3034,6 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-category-files' => 'Aantal lêers',
 
 # Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keulen blou',
 
 # Patrolling
@@ -3114,7 +3094,7 @@ $1',
 'file-no-thumb-animation-gif' => "'''Let op: vanweë tegniese beperkinge, kan duimnaels met hoë resolusie GIF-lêers nie geanimeerd gewys word nie.'''",
 
 # Special:NewFiles
-'newimages' => 'Gallery van nuwe beelde',
+'newimages' => 'Galery van nuwe beelde',
 'imagelisttext' => "Hier onder is a lys van '''$1''' {{PLURAL:$1|lêer|lêers}}, $2 gesorteer.",
 'newimages-summary' => 'Die spesiale bladsy wys die nuutste lêers wat na die wiki opgelaai is.',
 'newimages-legend' => 'Filter',
@@ -3630,14 +3610,15 @@ Die bevestigingskode sal om $4 verval.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Let op''': die bladsy is verwyder terwyl u besig was om dit te wysig!",
-'confirmrecreate' => "Gebruiker [[User:$1|$1]] ([[User talk:$1|bespreek]]) het hierdie blad uitgevee ná u begin redigeer het met rede: : ''$2''
-Bevestig asseblief dat u regtig hierdie blad oor wil skep.",
+'confirmrecreate' => "Gebruiker [[User:$1|$1]] ([[User talk:$1|kontak]]) het hierdie bladsy uitgevee nádat u begin redigeer het met rede:
+:''$2''
+Bevestig asseblief dat u hierdie blad weer wil skep.",
 'confirmrecreate-noreason' => 'Gebruiker [[User:$1|$1]] ([[User talk:$1|bespreking]]) het die bladsy geskrap nadat u dit begin wysig het.
 Bevestig dat u die bladsy wil herskep.',
 'recreate' => 'Herskep',
 
 # action=purge
-'confirm_purge_button' => 'OK',
+'confirm_purge_button' => 'Regso',
 'confirm-purge-top' => 'Verwyder die kas van hierdie blad?',
 'confirm-purge-bottom' => "Die opruiming van die kas sorg daarvoor dat die mees onlangse weergawe van 'n bladsy vertoon word.",
 
@@ -3717,7 +3698,7 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
 'watchlisttools-raw' => 'Wysig bronkode',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bespreek]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kontak]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Onbekende etiket "$1"',
@@ -3858,17 +3839,17 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
 
 # New logging system
-'logentry-delete-delete' => '$1 het bladsy $3 verwyder',
-'logentry-delete-restore' => '$1 het bladsy $3 teruggeplaas',
-'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
-'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-delete-revision-legacy' => '$1 het die sigbaarheid van weergawes van die bladsy $3 gewysig.',
-'logentry-suppress-delete' => '$1 het die bladsy $3 onderdruk',
-'logentry-suppress-event' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-suppress-revision' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
-'logentry-suppress-event-legacy' => '$1 het in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-suppress-revision-legacy' => '$1 het in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
+'logentry-delete-delete' => '$1 {{GENDER:$2|het}} bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 {{GENDER:$2|het}} bladsy $3 teruggeplaas',
+'logentry-delete-event' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van weergawes van bladsy $3 gewysig.',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|het}} die bladsy $3 onderdruk',
+'logentry-suppress-event' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
 'revdelete-content-hid' => 'inhoud versteek',
 'revdelete-summary-hid' => 'wysigingsopsomming versteek',
 'revdelete-uname-hid' => 'gebruikersnaam versteek',
@@ -3877,20 +3858,20 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'revdelete-uname-unhid' => 'gebruikersnaam sigbaar gemaak',
 'revdelete-restricted' => 'beperkings is aan administrateurs opgelê',
 'revdelete-unrestricted' => 'beperkings vir administrateurs is opgehef',
-'logentry-move-move' => '$1 het bladsy $3 na $4 geskuif',
-'logentry-move-move-noredirect' => "$1 het bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
-'logentry-move-move_redir' => "$1 het bladsy $3 na $4 oor 'n aanstuur geskuif",
-'logentry-move-move_redir-noredirect' => "$1 het bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
-'logentry-patrol-patrol' => '$1 het weergawe $4 van bladsy $3 as gekontroleerd gemerk',
-'logentry-patrol-patrol-auto' => '$1 het weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
-'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
-'logentry-newusers-byemail' => 'Gebruiker $3 is deur $1 geskep en die wagwoord is per e-pos aangestuur',
-'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
-'logentry-rights-rights' => '$1 het groepslidmaatskap vir $3 van $4 na $5 gewysig',
-'logentry-rights-rights-legacy' => '$1 het groepslidmaatskap vir $3 gewysig',
-'logentry-rights-autopromote' => '$1 is outomaties gepromoveerd van $4 na $5',
+'logentry-move-move' => '$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif',
+'logentry-move-move-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
+'logentry-move-move_redir' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n aanstuur geskuif",
+'logentry-move-move_redir-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 as gekontroleerd gemerk',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
+'logentry-newusers-newusers' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create2' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep',
+'logentry-newusers-byemail' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep en die wagwoord is per e-pos aangestuur',
+'logentry-newusers-autocreate' => 'Die gebruiker $1 {{GENDER:$2|is}} outomaties geskep',
+'logentry-rights-rights' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 van $4 na $5 gewysig',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 gewysig',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|is}} outomaties van $4 na $5 gepromoveerd',
 'rightsnone' => '(geen)',
 
 # Feedback
index 92ad4ae..cbd5c61 100644 (file)
@@ -500,8 +500,6 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبِين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررًا خارجيًا مبدئيا (للخبراء فقط، يتطلب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم مستعرض فروقات خارجيًا مبدئيا (للخبراء فقط، يتطلّب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تحرير فارغ',
@@ -516,6 +514,7 @@ $messages = array(
 'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
 'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
 'tog-norollbackdiff' => 'أزل الفرق بعد القيام باسترجاع',
+'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة ذات تغييرات غير محفوظة',
 
 'underline-always' => 'دائما',
 'underline-never' => 'أبدا',
@@ -660,8 +659,8 @@ $messages = array(
 'create-this-page' => 'أنشئ هذه الصفحة',
 'delete' => 'حذف',
 'deletethispage' => 'احذف هذه الصفحة',
-'undelete_short' => 'استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
-'viewdeleted_short' => 'استعرض {{PLURAL:$1|تعديل محذوف|$1 تعديلات محذوفة}}',
+'undelete_short' => 'استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
+'viewdeleted_short' => 'استعرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'protect' => 'احم',
 'protect_change' => 'غير',
 'protectthispage' => 'احم هذه الصفحة',
@@ -1268,6 +1267,8 @@ $2
 'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
 'invalid-content-data' => 'بيانات المحتوى غير صالحة',
 'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
+'editwarning-warning' => 'قد تتسبب مغادرة هذه الصفحة بخسارتك لأي تغييرات قمت بها.
+يمكنك تعطيل هذا التحذير إذا كنت والجلًا في قسم "{{int:prefs-editing}}" في تفضيلاتك.',
 
 # Content models
 'content-model-wikitext' => 'نص ويكي',
@@ -1557,15 +1558,6 @@ $1",
 يمكنك البحث من خلال جوجل في الوقت الحالي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
 
-# Quickbar
-'qbsettings' => 'لوح سريع',
-'qbsettings-none' => 'بلا تحديد',
-'qbsettings-fixedleft' => 'مثبت لليسار',
-'qbsettings-fixedright' => 'مثبت لليمين',
-'qbsettings-floatingleft' => 'حر لليسار',
-'qbsettings-floatingright' => 'حر لليمين',
-'qbsettings-directionality' => 'ثابت، بناءً على اتجاه كتابة لغتك',
-
 # Preferences page
 'preferences' => 'تفضيلات',
 'mypreferences' => 'تفضيلاتي',
@@ -2126,7 +2118,6 @@ $1',
 'http-read-error' => 'خطأ قراءة HTTP.',
 'http-timed-out' => 'انتهت مهلة طلب HTTP.',
 'http-curl-error' => 'فشل جلب المسار: $1',
-'http-host-unreachable' => 'تعذر الوصول إلى المسار.',
 'http-bad-status' => 'ثمة مشكلة أثناء طلب HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2458,15 +2449,6 @@ $1',
 'listusers-noresult' => 'لم يتم إيجاد مستخدم.',
 'listusers-blocked' => '(ممنوع)',
 
-# Special:ActiveUsers
-'activeusers' => 'قائمة المستخدمين النشطين',
-'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.',
-'activeusers-count' => '{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلاً|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوماً|$1 يوم}}',
-'activeusers-from' => 'اعرض المستخدمين بدءاً من:',
-'activeusers-hidebots' => 'أخف البوتات',
-'activeusers-hidesysops' => 'أخف الإداريين',
-'activeusers-noresult' => 'لم يعثر على أي مستخدمين',
-
 # Special:ListGroupRights
 'listgrouprights' => 'صلاحيات مجموعات المستخدمين',
 'listgrouprights-summary' => 'التالي قائمة بمجموعات المستخدمين المعرفة في هذا الويكي، بصلاحياتهم المصاحبة.
@@ -2643,8 +2625,8 @@ $UNWATCHURL
 'rollback' => 'استرجاع التعديلات',
 'rollback_short' => 'استرجع',
 'rollbacklink' => 'استرجع',
-'rollbacklinkcount' => 'استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديل}}',
-'rollbacklinkcount-morethan' => 'استرجاع أكثر من $1 {{PLURAL:$1|تعديل|تعديلات}}',
+'rollbacklinkcount' => 'استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}',
+'rollbacklinkcount-morethan' => 'استرجاع أكثر من {{PLURAL:$1||تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'rollbackfailed' => 'لم ينجح الاسترجاع',
 'cantrollback' => 'لم يمكن استرجاع التعديل؛
 آخر مساهم هو المؤلف الوحيد لهذه الصفحة.',
@@ -2761,7 +2743,7 @@ $UNWATCHURL
 'undeletereset' => 'أعد الضبط',
 'undeleteinvert' => 'اعكس الاختيار',
 'undeletecomment' => 'السبب:',
-'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
+'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}',
 'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}',
 'undeletedfiles' => 'أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}',
 'cannotundelete' => 'فشل الاسترجاع؛
@@ -3286,13 +3268,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة نوستالشيا */',
 'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */',
 'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ماي سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة سيمبل */',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */',
 'vector.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
@@ -3305,13 +3282,8 @@ $1',
 
 # Scripts
 'common.js' => '/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */',
-'standard.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ستاندرد */',
-'nostalgia.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة نوستالشيا */',
 'cologneblue.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */',
 'monobook.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */',
-'myskin.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ماي سكين */',
-'chick.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة تشيك */',
-'simple.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة سيمبل */',
 'modern.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */',
 'vector.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */',
 'group-autoconfirmed.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */',
@@ -3391,13 +3363,8 @@ $1',
 'pageinfo-category-files' => 'عدد الملفات',
 
 # Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
 'skinname-cologneblue' => 'كولون بلو',
 'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماي سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
 'skinname-modern' => 'مودرن',
 'skinname-vector' => 'فكتور',
 
@@ -4333,15 +4300,15 @@ $5
 'sqlite-no-fts' => '$1 بدون دعم البحث في كامل النص',
 
 # New logging system
-'logentry-delete-delete' => '$1 حذف الصفحة $3',
+'logentry-delete-delete' => 'حذف{{GENDER:$2|ت}} $1 الصفحة $3',
 'logentry-delete-restore' => 'استعاد $1 صفحة $3',
 'logentry-delete-event' => '$1 غير خاصية العرض لـ {{PLURAL:$5|مدخل السجل|$5 مدخلات السجل}} في $3: $4',
-'logentry-delete-revision' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
+'logentry-delete-revision' => 'غيّر{{GENDER:$2|ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
 'logentry-delete-event-legacy' => 'غيّر $1 إمكانية رؤية أحداث سجل $3',
 'logentry-delete-revision-legacy' => 'غيّر $1 إمكانية رؤية مراجعات صفحة $3',
 'logentry-suppress-delete' => '$1 suppressed صفحة $3',
-'logentry-suppress-event' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
-'logentry-suppress-revision' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
+'logentry-suppress-event' => 'غيّر{{GENDER:$2|ت}} $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
+'logentry-suppress-revision' => 'غيّر{{GENDER:$2|ت}} $1 سراً إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
 'logentry-suppress-event-legacy' => 'غيّر $1 بسرية إمكانية رؤية أحداث سجل $3',
 'logentry-suppress-revision-legacy' => 'غيّر $1 بسرية إمكانية رؤية مراجعات صفحة $3',
 'revdelete-content-hid' => 'محتوى مخفي',
index 987385e..89eb33c 100644 (file)
@@ -432,6 +432,7 @@ $1',
 ܡܨܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܬ ܕ<span class='plainlinks'>[$1 ܬܥܘܠ]</span> ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܐܝܬܝܟ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ.",
+'welcomeuser' => 'ܒܫܝܢܐ $1!',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
@@ -873,6 +874,7 @@ $1',
 'recentchanges-label-newpage' => 'ܫܘܚܠܦܐ ܗܢܐ ܐܬܬܣܝܡ ܦܐܬܐ ܚܕܬܐ',
 'recentchanges-label-minor' => 'ܗܢܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ',
+'recentchanges-label-unpatrolled' => 'ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ',
 'rcnotefrom' => "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
 'rclistfrom' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1',
 'rcshowhideminor' => '$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ',
@@ -889,6 +891,8 @@ $1',
 'minoreditletter' => 'ܙ',
 'newpageletter' => 'ܚ',
 'boteditletter' => 'ܒ',
+'rc_categories_any' => 'ܐܝܢܐ ܕܗܘ',
+'rc-change-size-new' => '$1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܒܬܪ ܫܘܚܠܦܐ',
 'newsectionsummary' => '/* $1 */ ܡܢܬܐ ܚܕܬܐ',
 'rc-enhanced-expand' => 'ܚܘܝ ܐܪ̈ܝܟܬܐ (ܒܥܐ ܠܟ JavaScript)',
 'rc-enhanced-hide' => 'ܛܫܝ ܐܪ̈ܝܟܬܐ',
@@ -951,6 +955,8 @@ $1',
 'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
 
 # Special:ListFiles
+'listfiles-summary' => 'ܦܐܬܐ ܕܝܠܢܝܬܐ ܗܕܐ ܬܓܠܚ ܟܠ ܠܦܦ̈ܐ ܡܣܩ̈ܐ.
+ܐܡܬܝ ܕܬܨܦܐ ܒܝܕ ܡܦܠܚܢܐ ܬܓܠܚ ܨܚܚܐ ܐܚܪܝܐ ܒܠܚܘܕ ܕܠܦܦ̈ܐ ܡܣܩ̈ܐ ܒܝܕ ܗܢܐ ܡܦܠܚܢܐ.',
 'listfiles_search_for' => 'ܒܨܝ ܥܠ ܫܡܐ ܕܡܝܕܝܐ:',
 'imgfile' => 'ܠܦܦܐ',
 'listfiles' => 'ܡܟܬܒܘܬܐ ܕܠܦܦ̈ܐ',
@@ -1039,6 +1045,11 @@ $1',
 'disambiguations' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܒܦܐܬܬ̈ܐ ܕܬܘܚܡܐ ܐܚܪܢܐ',
 'disambiguationspage' => 'Template:ܬܘܚܡܐ ܐܚܪܢܐ',
 
+'pageswithprop' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
+'pageswithprop-legend' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
+'pageswithprop-prop' => 'ܫܡܐ ܕܕܝܠܝܬܐ',
+'pageswithprop-submit' => 'ܙܠ',
+
 'doubleredirects' => 'ܨܘܝܒ̈ܐ ܥܦܝܦ̈ܐ',
 'double-redirect-fixed-move' => '[[$1]] ܐܫܬܢܝܬ.
 ܗܫܐ ܐܝܬܝܗܝ  ܨܘܝܒܐ ܠ [[$2]].',
@@ -1168,14 +1179,6 @@ $1',
 'listusers-noresult' => 'ܠܐ ܐܫܬܟܚ ܡܦܠܚܢܐ ܚܕ.',
 'listusers-blocked' => '(ܚܪܝܡܐ)',
 
-# Special:ActiveUsers
-'activeusers' => 'ܡܟܬܒܘܬܐ ܕܗܕ̈ܡܐ ܙܪ̄ܝܙܐ',
-'activeusers-count' => '$1 {{PLURAL:$1|ܥܒܕܐ|ܥܒܕ̈ܐ}} ܒ {{PLURAL:$3|ܝܘܡܐ ܐܚܪܝܐ|$3 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ}}',
-'activeusers-from' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܐ ܥܡ:',
-'activeusers-hidebots' => 'ܛܫܝ ܒܘܬ̈ܐ (bots)',
-'activeusers-hidesysops' => 'ܛܫܝ ܡܕܒܪ̈ܢܐ',
-'activeusers-noresult' => 'ܠܐ ܐܫܬܟܚ ܡܦܠܚܢ̈ܐ ܐܢܫ̈ܝܢ.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'ܙܕ̈ܩܐ ܕܟܢܘܫܬܐ ܕܡܦܠܚܢ̈ܐ',
 'listgrouprights-group' => 'ܟܢܘܫܬܐ',
@@ -1426,6 +1429,9 @@ $1',
 'contribslink' => 'ܫܘܬܦܘ̈ܬܐ',
 'blocklogpage' => 'ܣܓܠܐ ܕܚܪܡܐ',
 'blocklogentry' => 'ܚܪܡ [[$1]] ܠܡܬܚܐ ܕ $2 $3',
+'blocklogtext' => 'ܗܢܘ ܣܓܠܐ ܕܥܡܠܝܬ̈ܐ ܕܚܪܡܐ ܘܫܩܠ ܚܪܡܐ.
+ܡܘܢܥ̈ܐ ܕܐܝ ܦܝ (IP) ܚܪ̈ܝܡܐ ܝܬܐܝܬ ܠܐ ܓܠܝܚܝܢ ܐܢܘܢ.
+ܚܙܝ [[Special:BlockList|ܡܟܬܒܘܬܐ ܕܚܪܡܐ ܕܐܝ ܦܝ (IP)]]ܠܚܙܝܐ ܕܥܡܠܝܬ̈ܐ ܕܚܪܡܐ ܬܘܦܥܠ̈ܐ ܗܫܐܝܬ.',
 'unblocklogentry' => 'ܫܩܠ ܚܪܡܐ ܡܢ $1',
 'block-log-flags-anononly' => 'ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܒܠܚܘܕ',
 'block-log-flags-nocreate' => 'ܒܪܝܬܐ ܕܚܘ̈ܫܒܢܐ ܠܐ ܐܝܬܝܗ ܡܬܩܒܠܢܐ',
@@ -1796,7 +1802,11 @@ $1',
 'tag-filter' => 'ܡܨܦܝܢܝܬܐ ܕ[[Special:Tags|ܪܘܫܡܐ]]:',
 'tag-filter-submit' => 'ܡܨܦܝܢܝܬܐ',
 'tags-title' => 'ܪ̈ܘܫܡܐ',
+'tags-intro' => 'ܦܐܬܐ ܗܕܐ ܬܓܠܚ ܪ̈ܘܫܡܐ ܕܬܚܪܙܬܐ ܪܒܬ ܫܘܕܥ ܫܘܚܠܦܐ ܒܗ، ܘܣܘܟܠܝܗܝܢ.',
 'tags-tag' => 'ܫܡܐ ܕܪܘܫܡܐ',
+'tags-display-header' => 'ܡܬܓܠܝܢܘܬܐ ܒܡܟܬܒܘܬ̈ܐ ܕܫܘܚܠܦܐ',
+'tags-description-header' => 'ܫܘܡܗܐ ܓܡܝܪܐ ܕܣܘܟܠܐ',
+'tags-hitcount-header' => 'ܫܘܚܠܦ̈ܐ ܪ̈ܫܝܡܐ',
 'tags-edit' => 'ܫܚܠܦ',
 'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
 
@@ -1815,17 +1825,17 @@ $1',
 'htmlform-selectorother-other' => 'ܐܚܪܢܐ',
 
 # New logging system
-'logentry-delete-delete' => '$1 ܫܦ ܦܐܬܐ ܕ $3',
-'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 ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-newusers-newusers' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܬܟܝܢ',
-'logentry-newusers-create' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܬܟܝܢ',
-'logentry-newusers-create2' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 ܐܬܬܟܝܢ ܒܝܕ $1',
-'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ܫܦ}} ܦܐܬܐ ܕ $3',
+'logentry-move-move' => '$1 {{GENDER:$2|ܫܢܐ}} ܦܐܬܐ ܕ $3 ܠ $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|ܫܢܐ}} ܦܐܬܐ ܕ $3 ܠ $4 ܘܠܐ ܫܒܩ ܦܐܬܐ ܕܨܘܝܒܐ',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|ܫܢܐ}} ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ܫܢܐ}} ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ ܘܠܐ ܫܒܩ ܦܐܬܐ ܕܨܘܝܒܐ',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ܫܘܕܥ}} ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
+'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ {{GENDER:$2|ܫܘܕܥ}} ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
+'logentry-newusers-newusers' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܟܝܢ}}',
+'logentry-newusers-create' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܟܝܢ}}',
+'logentry-newusers-create2' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 {{GENDER:$2|ܐܬܬܟܝܢ}} ܒܝܕ $1',
+'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܣܝܡ}} ܝܬܐܝܬ',
 'rightsnone' => '(ܠܐ ܡܕܡ)',
 
 # Feedback
index f66fa66..6ce634b 100644 (file)
@@ -1142,15 +1142,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'search-external' => 'Busca esterna',
 'searchdisabled' => "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google. Has fixate en que'l conteníu de los sos índices de {{SITENAME}} pue tar desfasáu.",
 
-# Quickbar
-'qbsettings' => 'Barra rápida',
-'qbsettings-none' => 'Nenguna',
-'qbsettings-fixedleft' => 'Fixa a manzorga',
-'qbsettings-fixedright' => 'Fixa a mandrecha',
-'qbsettings-floatingleft' => 'Flotante a manzorga',
-'qbsettings-floatingright' => 'Flotante a mandrecha',
-'qbsettings-directionality' => "Fixa, según la direición d'escritura de la to llingua",
-
 # Preferences page
 'preferences' => 'Preferencies',
 'mypreferences' => 'Preferencies',
@@ -1715,7 +1706,6 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
 'http-read-error' => 'Error de llectura HTTP.',
 'http-timed-out' => "La llamada HTTP escosó'l tiempu.",
 'http-curl-error' => 'Error al baxar la URL: $1',
-'http-host-unreachable' => 'Nun se pudo acceder a la URL.',
 'http-bad-status' => 'Hebo un problema demientres la llamada HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2038,15 +2028,6 @@ Necesita polo menos un dominiu de primer nivel, como "*.org".<br />
 'listusers-noresult' => "Nun s'atoparon usuarios.",
 'listusers-blocked' => '(bloquiau)',
 
-# Special:ActiveUsers
-'activeusers' => "Llista d'usuarios activos",
-'activeusers-intro' => "Esta ye una llista d'usuarios que tuvieron alguna mena d'actividá hai menos de $1 {{PLURAL:$1|día|díes}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|edición|ediciones}} {{PLURAL:$3|nel caberu día|nos caberos $3 díes}}',
-'activeusers-from' => 'Amosar usuarios principiando dende:',
-'activeusers-hidebots' => 'Anubrir bots',
-'activeusers-hidesysops' => 'Anubrir alministradores',
-'activeusers-noresult' => "Nun s'alcontraron usuarios.",
-
 # Special:ListGroupRights
 'listgrouprights' => "Drechos de los grupos d'usuariu",
 'listgrouprights-summary' => "La siguiente ye una llista de grupos d'usuariu definíos nesta wiki, colos sos drechos d'accesu asociaos.
@@ -2537,6 +2518,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 '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",
 'cant-block-while-blocked' => 'Nun pues bloquiar a otros usuarios mentes tu teas bloquiáu.',
 'cant-see-hidden-user' => "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.
 Como nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
@@ -2849,13 +2831,8 @@ Pues ver el so códigu fonte.',
 
 # Stylesheets
 'common.css' => "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
-'standard.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Standard */',
-'nostalgia.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Nostalgia */',
 'cologneblue.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */',
 'monobook.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */',
-'myskin.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu MySkin */',
-'chick.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Chick */',
-'simple.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Simple */',
 'modern.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */',
 'vector.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */',
 'print.css' => '/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */',
@@ -2868,13 +2845,8 @@ Pues ver el so códigu fonte.',
 
 # Scripts
 'common.js' => '/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */',
-'standard.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Standard */',
-'nostalgia.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Nostalgia */',
 'cologneblue.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */',
 'monobook.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */',
-'myskin.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MySkin */',
-'chick.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Chick */',
-'simple.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Simple */',
 'modern.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */',
 'vector.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */',
 'group-autoconfirmed.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */',
@@ -2954,10 +2926,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'pageinfo-category-files' => 'Númberu de ficheros',
 
 # Skin names
-'skinname-standard' => 'Clásicu',
-'skinname-nostalgia' => 'Señardá',
 'skinname-cologneblue' => 'Azul Colonia',
-'skinname-myskin' => 'MySkin',
 'skinname-modern' => 'Modernu',
 
 # Patrolling
index 4a5a91d..f6b0ea9 100644 (file)
@@ -130,6 +130,7 @@ $messages = array(
 'tog-diffonly' => 'موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه',
 'tog-showhiddencats' => 'گیزلی بؤلمه‌لری گؤستر',
 'tog-norollbackdiff' => 'قایتاراندان سونرا موقاییسه گؤسترمه',
+'tog-useeditwarning' => 'دَییشدیرمه صحیفه‌سینده چیخیش زامانی، آچیق و قئید اولمایان دَییشدیرمه صحیفه وارسا منه هشدار وئریلسین',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هئچ واخت',
@@ -567,8 +568,8 @@ $2',
 'blocked-mailpassword' => 'سیزین آی‌پی آدرسینیز دَییشیک وئرمه‌یه باغلانیب و سوءاستفاده قاباغی آلماق اوچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوخدور.',
 'eauthentsent' => 'سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.
 هر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.',
-'throttled-mailpassword' => 'سÙ\88Ù\86 {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Ø³Û\8cزÙ\87 Ø¨Û\8cر Ø±Ù\85ز Û\8cادا Ø³Ø§Ù\84Ù\85ا گؤندریلیب‌دیر.
-سÙ\88ءاستÙ\81ادÙ\87 Ù\82اباغÛ\8cÙ\86 Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c Ù\87ر {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Û\8cاÙ\84Ù\86Û\8cز Ø¨Û\8cر Ø±Ù\85ز Û\8cادا Ø³Ø§Ù\84Ù\85ا گؤندریلر.',
+'throttled-mailpassword' => 'سÙ\88Ù\86 {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Ø³Û\8cزÙ\87 Ø¨Û\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85Û\8cÙ\84Û\8c گؤندریلیب‌دیر.
+سÙ\88ءاستÙ\81ادÙ\87 Ù\82اباغÛ\8cÙ\86 Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c Ù\87ر {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Û\8cاÙ\84Ù\86Û\8cز Ø¨Û\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85Û\8cÙ\84Û\8c گؤندریلر.',
 'mailerror' => 'ایمیل گؤندرمه خطاسی: $1',
 'acct_creation_throttle_hit' => 'سیزین آی‌پی آدرسینیزی ایشلدن زیارتچیلر، سون گون‌ده {{PLURAL:$1|بیر حساب|$1 حساب}} یارادیبلار کی ان چون ایجازه وئریلن‌دیر.
 اونا باخاراق، بو آی‌پی آدرسی ایشلدن زیارتچیلر، بو زامان‌دا، داها آرتیق حساب یارادابیلمزلر.',
@@ -619,7 +620,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'رمزی یئنی‌له',
-'passwordreset-text' => 'حسابÛ\8cÙ\86Û\8cزا Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84رÛ\8cÙ\86Ù\87 Ú¯Ø¤Ø±Ù\87 Û\8cادا Ø³Ø§Ù\84Ù\85ا Ø§Û\8cÙ\85Û\8cÙ\84Û\8c Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c بو فورمو دولدورون.',
+'passwordreset-text' => 'رÙ\85زÛ\8cÙ\86Û\8cزÛ\8c Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 بو فورمو دولدورون.',
 'passwordreset-legend' => 'رمزی یئنی‌له',
 'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
 'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
@@ -629,13 +630,13 @@ $2',
 'passwordreset-capture-help' => 'بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیفاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.',
 'passwordreset-email' => 'ایمیل آدرسی:',
 'passwordreset-emailtitle' => '{{SITENAME}}-ده حساب بیلگیلری',
-'passwordreset-emailtext-ip' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون یادا سالما بیلگیلری ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:
+'passwordreset-emailtext-ip' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:
 
 $2
 
 بو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.
 سیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
-'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیز بیلگیلری اوچون بیر یادا سالما ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:
+'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:
 
 $2
 
@@ -643,9 +644,9 @@ $2
 سیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
 'passwordreset-emailelement' => 'ایستیفاده‌چی آدی: $1
 گئچیجی رمز: $2',
-'passwordreset-emailsent' => 'بیر یادا سالما ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیل یارادیلیب‌دیر، اما ایستیفاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
+'passwordreset-emailsent' => 'بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما ایستیفاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ایمیل آدرسینی دَییشدیر',
@@ -1138,15 +1139,6 @@ $1",
 ایندی گوگل ایله آختارا بیلرسینیز.
 دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
 
-# Quickbar
-'qbsettings' => 'سورعت پانئلی',
-'qbsettings-none' => 'هئچ بیری',
-'qbsettings-fixedleft' => 'سولا ثابیت',
-'qbsettings-fixedright' => 'ساغا ثابیت',
-'qbsettings-floatingleft' => 'سولا اوزن',
-'qbsettings-floatingright' => 'ساغا اوزن',
-'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
-
 # Preferences page
 'preferences' => 'ترجیحلر',
 'mypreferences' => 'ترجیحلر',
@@ -1697,7 +1689,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'http-read-error' => 'اچ‌تی‌تی‌پی اوخوما ختاسی',
 'http-timed-out' => 'اچ‌تی‌تی‌پی ایستیی‌نین واختی بیتدی.',
 'http-curl-error' => 'مراجعت نشانی ده یانلیش : $1',
-'http-host-unreachable' => 'آدرسه چاتماق اولمادی (خطا).',
 'http-bad-status' => 'اچ‌تی‌تی‌پی مراجعتین یوخلانماسی زامانی پروبلئم آشکارلانمیش‌دیر: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2030,15 +2021,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'listusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
 'listusers-blocked' => '(باغلانیب)',
 
-# Special:ActiveUsers
-'activeusers' => 'چالیشان ایستیفاده‌چیلرین لیستی',
-'activeusers-intro' => 'بوردا سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایشلر گؤرن ایستیفاده‌چیلرین لیستی گؤستریلیر.',
-'activeusers-count' => 'سون {{PLURAL:$3|گون|$3 گون}}‌ده، {{PLURAL:$1|$1}} چالیشما',
-'activeusers-from' => 'بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:',
-'activeusers-hidebots' => 'بوتلاری گیزلت',
-'activeusers-hidesysops' => 'ایداره‌چیلری گیزلت',
-'activeusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'ایستیفاده‌چی قروپ حاقلاری',
 'listgrouprights-summary' => 'آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.
@@ -2525,6 +2507,7 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'sorbsreason' => 'ای پی عنوانینیز، {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
 'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
 حساب میدانا گتیره بیلمز',
+'xffblockreason' => 'X-Forwarded-For باشلیغیندا، سیزین یا بیر ایشلتدیگینیز پروکسی خیدمتچی‌نین بلوکلانمیش آی‌پی آدرسی وار. ایلکین بلوکلاما سببی: $1',
 'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیفاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
 'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیفاده‌چی اونسوز دا مانعه تؤره‌دیلمیش و گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیفاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
 'ipbblocked' => 'دیگر ایستیفاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
@@ -2875,7 +2858,7 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'pageinfo-robot-noindex' => 'ایندِکسله‌نه بیلمز',
 'pageinfo-views' => 'گؤسترمه صحیفه‌سی',
 'pageinfo-watchers' => 'صحیفه‌نین تاماشا‌چی سایی',
-'pageinfo-few-watchers' => '$1-دن آز {{PLURAL:$1|ایزله‌ین|ایزله‌ین}}',
+'pageinfo-few-watchers' => '$1-دن آز {{PLURAL:$1|ایزله‌ین}}',
 'pageinfo-redirects-name' => 'بو صحیفه‌یه یول‌لاندیرمالار',
 'pageinfo-subpages-name' => 'بو صحیفه‌نین آلت‌صحیفه‌لری',
 'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} قِیری-یول‌لاندیرما)',
@@ -2904,9 +2887,6 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'pageinfo-category-subcats' => 'آلت‌بؤلمه‌لرین سایی',
 'pageinfo-category-files' => 'فایل‌لارین سایی',
 
-# Skin names
-'skinname-myskin' => 'منیم قابیغیم',
-
 # Patrolling
 'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
 'markaspatrolledtext' => 'صحیفنی پاتروللانمیش کیمی ایشاره‌له',
@@ -3706,17 +3686,17 @@ $5
 'sqlite-no-fts' => '$1 بوتون یازی آختارماماق‌لا',
 
 # New logging system
-'logentry-delete-delete' => '$1، $3 صحیفه‌سینی سیلدی',
-'logentry-delete-restore' => '$1، $3 صحیفه‌سینی قایتاردی',
-'logentry-delete-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
-'logentry-delete-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
-'logentry-delete-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی دَییشدیردی',
-'logentry-delete-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی دَییشدیردی',
-'logentry-suppress-delete' => '$1، $3 صحیفه‌سینی یاتیردی',
-'logentry-suppress-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $4',
-'logentry-suppress-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $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، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-delete-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'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، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
+'logentry-suppress-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
 'revdelete-content-hid' => 'ایچینده‌کیلر گیزلی‌دیر',
 'revdelete-summary-hid' => 'دَییشیکلیک قیساسی گیزلی‌دیر',
 'revdelete-uname-hid' => 'ایستیفاده‌چی آدی گیزلی‌دیر',
@@ -3725,20 +3705,20 @@ $5
 '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' => 'بیر ایستیفاده‌چی $1 حسابی $3 یاراتدی',
-'logentry-newusers-byemail' => '$3 ایستیفاده‌چی حسابی، $1 ایله یارادیلیب و رمز، ایمیل ایله گؤندریلیب‌دیر',
-'logentry-newusers-autocreate' => '$1 Ø­Ø³Ø§Ø¨Û\8c Ø§Ù\88تÙ\88Ù\85اتÛ\8cÚ© Û\8cارادÛ\8cÙ\84دÛ\8c',
-'logentry-rights-rights' => '$1 $3-ین قروپ عوضولوگونو $4-دن $5-ه دَییشدیردی',
-'logentry-rights-rights-legacy' => '$1، $3-ین قروپ عوضولوگونو دَییشدیردی',
-'logentry-rights-autopromote' => '$1-ین مقامی اوتوماتیک $4-دن $5-ه آرتیریلدی',
+'logentry-move-move' => '$1، $3 صحیفه‌سینی $4-ه {{GENDER:$2|آپاردی}}',
+'logentry-move-move-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir' => '$1، $3 صحیفه‌سینی، $4-ده یول‌لاندیرما اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، یول‌لاندیرما اولان $4 اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-patrol-patrol' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-patrol-patrol-auto' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-newusers-newusers' => ' بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create' => 'بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create2' => '$1 ایستیفاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-byemail' => '$3 ایستیفاده‌چی حسابی، $1 ایله {{GENDER:$2|یارادیلیب}} و رمز، ایمیل ایله گؤندریلیب‌دیر',
+'logentry-newusers-autocreate' => '$1 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø³Ø§Ø¨Û\8c Ø§Ù\88تÙ\88Ù\85اتÛ\8cÚ© {{GENDER:$2|Û\8cارادÛ\8cÙ\84دÛ\8c}}',
+'logentry-rights-rights' => '$1، $3-ین قروپ عوضولوگونو $4-دن $5-ه {{GENDER:$2|دَییشدیردی}}',
+'logentry-rights-rights-legacy' => '$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}',
+'logentry-rights-autopromote' => '$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}',
 'rightsnone' => '(هئچ)',
 
 # Feedback
index 85246aa..03952be 100644 (file)
@@ -11,6 +11,7 @@
  * @author Comp1089
  * @author Haqmar
  * @author Kaganer
+ * @author Matma Rex
  * @author Reedy
  * @author Roustammr
  * @author Sagan
@@ -958,7 +959,7 @@ $3 белдергән сәбәп: ''$2''",
 'currentrev' => 'Ағымдағы версия',
 'currentrev-asof' => '$1, ағымдағы версия',
 'revisionasof' => '$1 версияһы',
-'revision-info' => '<div id="viewingold-warning" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 1em 0 .5em; padding: .5em 1em; vertical-align: middle; font-weight: bold; font-family: Palatino Linotype, Microsoft Sans Serif, Arial Unicode MS, Droid Sans; clear: both;">Хәҙер һеҙ был биттең иҫке, <span id="mw-revision-name">$2</span> тарафынан <span id="mw-revision-date">$1</span> һаҡланған версияһын ҡарайһығыҙ. Уның <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}}} ағымдағы версиянан] айырмаһы булыуы мөмкин</span>.</div>',
+'revision-info' => 'Версия: $1; $2',
 'previousrevision' => '← Алдағы',
 'nextrevision' => 'Киләһе →',
 'currentrevisionlink' => 'Ағымдағы версия',
@@ -2075,15 +2076,6 @@ $1',
 'listusers-noresult' => 'Ҡатнашыусылар табылманы',
 'listusers-blocked' => '(бикләнгән)',
 
-# Special:ActiveUsers
-'activeusers' => 'Әүҙем ҡатнашыусылар исемлеге',
-'activeusers-intro' => 'Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.',
-'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендә $1 {{PLURAL:$1|үҙгәртеү}}',
-'activeusers-from' => 'Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:',
-'activeusers-hidebots' => 'Боттарҙы йәшерергә',
-'activeusers-hidesysops' => 'Хәкимдәрҙе йәшерергә',
-'activeusers-noresult' => 'Ҡатнашыусылар табылманы',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Ҡатнашыусылар төркөмө хоҡуҡтары',
 'listgrouprights-summary' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.
index b80f1b7..1e743c3 100644 (file)
@@ -1317,15 +1317,6 @@ $1",
 'searchdisabled' => 'Функцыя пошуку ў {{GRAMMAR:месны|{{SITENAME}}}} адключаная.
 Вы можаце пашукаць з дапамогай Google, але заўважце, што там інфармацыя пра старонкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць састарэлай.',
 
-# Quickbar
-'qbsettings' => 'Панэль хуткага доступу',
-'qbsettings-none' => 'Не паказваць',
-'qbsettings-fixedleft' => 'Замацаваная зьлева',
-'qbsettings-fixedright' => 'Замацаваная справа',
-'qbsettings-floatingleft' => 'Плавае зьлева',
-'qbsettings-floatingright' => 'Плавае справа',
-'qbsettings-directionality' => 'Замацаваная, у залежнасьці ад накірунку напісаньня ў Вашай мове',
-
 # Preferences page
 'preferences' => 'Налады',
 'mypreferences' => 'Налады',
@@ -1867,7 +1858,6 @@ $1',
 'http-read-error' => 'Памылка чытаньня HTTP.',
 'http-timed-out' => 'Скончыўся час чаканьня HTTP-запыту.',
 'http-curl-error' => 'Памылка выбаркі URL-адрасу: $1',
-'http-host-unreachable' => 'Немагчыма дасягнуць URL-адрас',
 'http-bad-status' => 'Адбылася памылка пад час выкананьня HTTP-запыту: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2195,15 +2185,6 @@ $1',
 'listusers-noresult' => 'Удзельнікі ня знойдзеныя.',
 'listusers-blocked' => '({{GENDER:$1|заблякаваны|заблякаваная}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Сьпіс актыўных удзельнікаў',
-'activeusers-intro' => 'Гэта сьпіс удзельнікаў, якія былі актыўнымі на працягу $1 {{PLURAL:$1|апошняга дня|апошніх дзён|апошніх дзён}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|дзеяньне|дзеяньні|дзеяньняў}} за $3 {{PLURAL:$3|апошні дзень|апошнія дні|апошніх дзён}}',
-'activeusers-from' => 'Паказваць ўдзельнікаў, пачынаючы з:',
-'activeusers-hidebots' => 'Схаваць робатаў',
-'activeusers-hidesysops' => 'Схаваць адміністратараў',
-'activeusers-noresult' => 'Удзельнікі ня знойдзеныя.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Правы групаў удзельнікаў',
 'listgrouprights-summary' => 'Ніжэй пададзены сьпіс групаў удзельнікаў {{GRAMMAR:родны|{{SITENAME}}}}, разам зь іх правамі.
@@ -2695,6 +2676,7 @@ $1',
 'sorbsreason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.
 Вы ня зможаце стварыць рахунак',
+'xffblockreason' => 'IP-адрас, прыведзены ў загалоўку X-Forwarded-For, які належыць або вам, або проксі-сэрвэру, быў заблякаваны. Прычынай блякаваньня было: $1',
 'cant-block-while-blocked' => 'Вы ня можаце блякаваць іншых удзельнікаў, пакуль Вы самі заблякаваныя.',
 'cant-see-hidden-user' => 'Удзельнік, якога Вы спрабуеце заблякаваць, ужо заблякаваны і схаваны. З-за таго, што Вы ня маеце правоў хаваньня ўдзельнікаў, Вы ня можаце бачыць альбо зьмяняць блякаваньне удзельніка.',
 'ipbblocked' => 'Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі',
@@ -3081,13 +3063,8 @@ $1',
 'pageinfo-category-files' => 'Колькасьць файлаў',
 
 # Skin names
-'skinname-standard' => 'Клясычнае',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Кёльнскі смутак',
 'skinname-monobook' => 'Монакніга',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простае',
 'skinname-modern' => 'Сучаснае',
 'skinname-vector' => 'Вэктар',
 
index 7eb9d06..594eafe 100644 (file)
@@ -1272,15 +1272,6 @@ $1",
 'search-external' => 'Външно търсене',
 'searchdisabled' => 'Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.',
 
-# Quickbar
-'qbsettings' => 'Лента за бърз избор',
-'qbsettings-none' => 'Без меню',
-'qbsettings-fixedleft' => 'Неподвижно вляво',
-'qbsettings-fixedright' => 'Неподвижно вдясно',
-'qbsettings-floatingleft' => 'Плаващо вляво',
-'qbsettings-floatingright' => 'Плаващо вдясно',
-'qbsettings-directionality' => 'Фиксирана, в зависимост от посоката на писане на вашия език',
-
 # Preferences page
 'preferences' => 'Настройки',
 'mypreferences' => 'Настройки',
@@ -1780,7 +1771,6 @@ $1',
 'http-read-error' => 'HTTP грешка при четене.',
 'http-timed-out' => 'Пресрочено време за HTTP заявка.',
 'http-curl-error' => 'Грешка при извличането на URL: $1',
-'http-host-unreachable' => 'Недостъпен URL.',
 'http-bad-status' => 'Настъпи проблем по време на HTTP заявката: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2082,15 +2072,6 @@ $1',
 'listusers-noresult' => 'Няма намерени потребители.',
 'listusers-blocked' => '(блокиран)',
 
-# Special:ActiveUsers
-'activeusers' => 'Списък на активните потребители',
-'activeusers-intro' => 'Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
-'activeusers-from' => 'Показване на потребителите, започвайки от:',
-'activeusers-hidebots' => 'Скриване на ботовете',
-'activeusers-hidesysops' => 'Скриване на администраторите',
-'activeusers-noresult' => 'Няма намерени потребители.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права по потребителски групи',
 'listgrouprights-summary' => 'По-долу на тази страница е показан списък на групите потребители в това уики с асоциираните им права за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].',
@@ -2183,6 +2164,11 @@ $1',
 'enotif_mailer' => 'Известяване по пощата на {{SITENAME}}',
 'enotif_reset' => 'Отбелязване на всички страници като посетени',
 'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
+'enotif_subject_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2',
+'enotif_subject_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} от $2',
+'enotif_subject_moved' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|преместена}} от $2',
+'enotif_subject_restored' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|възстановена}} от $2',
+'enotif_subject_changed' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|променена}} от $2',
 'enotif_body_intro_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} на $PAGEEDITDATE от $2. Вижте $3.',
 'enotif_body_intro_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} на $PAGEEDITDATE от $2. За текущата версия, вижте $3',
 'enotif_lastvisited' => 'Преглед на всички промени след последното ви посещение: $1.',
@@ -2910,13 +2896,8 @@ $1',
 'pageinfo-category-files' => 'Брой файлове',
 
 # Skin names
-'skinname-standard' => 'Класика',
-'skinname-nostalgia' => 'Носталгия',
 'skinname-cologneblue' => 'Кьолнско синьо',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моят облик',
-'skinname-chick' => 'Пиленце',
-'skinname-simple' => 'Семпъл',
 'skinname-modern' => 'Модерен',
 
 # Patrolling
index 91a73c4..ae393f0 100644 (file)
@@ -119,7 +119,7 @@ $messages = array(
 'article' => 'सामग्री पन्ना',
 'newwindow' => '(नया विंडो में खोलीं)',
 'cancel' => 'निरस्त',
-'mytalk' => 'हमार बात',
+'mytalk' => 'राà¤\89र बात',
 'navigation' => 'परिभ्रमण',
 
 # Cologne Blue skin
@@ -215,7 +215,7 @@ $1',
 'disclaimerpage' => 'Project:सामान्य अस्विकरण',
 'edithelp' => 'मदद सम्पादन',
 'edithelppage' => 'Help:सम्पादन',
-'helppage' => 'मदद:सामग्री',
+'helppage' => 'Help:सामग्री',
 'mainpage' => 'मुख्य पन्ना',
 'mainpage-description' => 'पहिलका पन्ना',
 'portal' => 'सामुदायिक पन्ना',
@@ -430,7 +430,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'compareselectedversions' => 'चुनल गईल संशोधन में अन्तर देखीं',
 'showhideselectedversions' => 'चुनल गईल संशोधन दिखाईं/छुपाईं',
 'editundo' => 'पूर्ववत',
-'diff-multi' => '({{PLURAL:$1|एगो मध्यम संशोधन|$1 गो मध्यम संशोधन}} नईखे दिखावल)',
+'diff-multi' => '({{PLURAL:$2|एगो योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|कियल गईल बीच के एगो|कियल गईल बीच के $1}} अवतरण नईखे दर्शावल बा।)',
 
 # Search results
 'searchresults' => 'खोज परिणाम',
@@ -489,12 +489,9 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'powersearch-togglenone' => 'कउनो ना',
 'search-external' => 'बाहरी खोज',
 
-# Quickbar
-'qbsettings-none' => 'कउनो ना',
-
 # Preferences page
 'preferences' => 'वरीयता',
-'mypreferences' => 'हमार पसन्द',
+'mypreferences' => 'राà¤\89र पसन्द',
 'prefs-edits' => 'सम्पादन संख्या',
 'prefsnologin' => 'खाता में प्रवेश नईखीं कईले',
 'changepassword' => 'गुप्त शब्द बदलीं',
@@ -538,7 +535,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'filehist-filesize' => 'फाईल के आकार',
 'filehist-comment' => 'टिप्पणी',
 'filehist-missing' => 'गायब फाईल',
-'imagelinks' => 'फाà¤\88ल à¤²à¤¿à¤\82à¤\95',
+'imagelinks' => 'फाà¤\88ल à¤\95à¥\87 à¤\89पयà¥\8bà¤\97',
 'nolinkstoimage' => 'इ फाईल जोड़े कौनो फाइल लिंक नईखे।',
 'morelinkstoimage' => 'इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।',
 'sharedupload' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।',
@@ -585,8 +582,8 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
 
 # Watchlist
-'watchlist' => 'हमार à¤§à¥\8dयानसूची',
-'mywatchlist' => 'हमार à¤§à¥\8dयानसूची',
+'watchlist' => 'राà¤\89र à¤§à¥\8dयान à¤¦à¤¿à¤¯à¤² à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची',
+'mywatchlist' => 'राà¤\89र à¤§à¥\8dयान à¤¦à¤¿à¤¯à¤² à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची',
 'watch' => 'ध्यानसूची में डालीं',
 'watchthispage' => 'ई पन्ना ध्यानसूची में डालीं',
 'unwatch' => 'ध्यानसूची से हटाईं',
@@ -609,9 +606,9 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'blanknamespace' => '(मुख्य)',
 
 # Contributions
-'contributions' => 'प्रयोगकर्ता योगदान',
+'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => ' $1 खातिर प्रयोगकर्ता योगदान',
-'mycontris' => 'हमार à¤¯à¥\8bà¤\97दान',
+'mycontris' => 'राà¤\89र à¤¯à¥\8bà¤\97दान à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80',
 'nocontribs' => 'ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।',
 'uctop' => '(शीर्ष)',
 'month' => 'महिना से (आ उ से पहिले):',
@@ -636,17 +633,18 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'nolinkshere' => "'''[[:$1]]''' से कौनो पन्ना नईखे जुड़ल।",
 'nolinkshere-ns' => "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
 'isredirect' => 'पुन: निर्दिष्ट पन्ना',
-'isimage' => 'तसà¥\8dवà¥\80र लिंक',
+'isimage' => 'फाà¤\88ल लिंक',
 'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछला $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगला $1}}',
 'whatlinkshere-links' => '← लिंक',
 'whatlinkshere-hideredirs' => '$1 पुन: निर्देशित',
 'whatlinkshere-hidelinks' => '$1 लिंक',
-'whatlinkshere-hideimages' => '$1 à¤¤à¤¸à¥\8dवà¥\80र लिंक',
+'whatlinkshere-hideimages' => '$1 à¤«à¤¼à¤¾à¤\87ल लिंक',
 'whatlinkshere-filters' => 'फिल्टर',
 
 # Block/unblock
 'blockip' => 'प्रतिबंधित प्रयोगकर्ता',
+'ipboptions' => '२ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite',
 'blocklink' => 'निष्क्रिय',
 'unblocklink' => 'ताला खोलीं',
 'change-blocklink' => 'ब्लॉक बदलीं',
index 23ea245..bcb5714 100644 (file)
@@ -146,11 +146,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisi di bawah tautan',
 'tog-justify' => 'Ratakan paragraf',
-'tog-hideminor' => 'Sungkupakan babakan sapalih dalam parubahan tahanyar',
-'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam parubahan tahanyar',
+'tog-hideminor' => 'Sungkupakan babakan sapalih dalam paubahan pahanyarnya',
+'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam paubahan pahanyarnya',
 'tog-newpageshidepatrolled' => 'Sungkupakan tungkaran nang diitihi matan daptar tungkaran hanyar',
-'tog-extendwatchlist' => 'Singkaiakan daptar itihan hagan manampaiakan samunyaan parubahan, kada nang hanyar haja.',
-'tog-usenewrc' => 'Purukakan panampaian parubahan tahanyar tingkat tinggi (parlu ada JavaScript)',
+'tog-extendwatchlist' => 'Singkaiakan daptar itihan hagan manampaiakan samunyaan paubahan, kada nang hanyar haja.',
+'tog-usenewrc' => 'Purukakan panampaian paubahan pahanyarnya tingkat tinggi (parlu ada JavaScript)',
 'tog-numberheadings' => 'Bari numur judul utumatis',
 'tog-showtoolbar' => 'Tampaiakan bilah-pakakas babak (parlu ada JavaScript)',
 'tog-editondblclick' => 'Babak tutungkaran wan klik ganda (parlu ada JavaScript)',
@@ -173,11 +173,9 @@ $messages = array(
 'tog-shownumberswatching' => 'Tampaiakan barapa pamakai nang maitihi',
 'tog-oldsig' => 'Tandateken nang sudah ada:',
 'tog-fancysig' => 'Tapsirakan tandatangan sawagai naskah wiki (kada batautan utumatis)',
-'tog-externaleditor' => 'Puruk pambabak luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian.[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Puruk palainan luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Kawa\'akan "lacung ka" tautan kakawaan-masuk',
 'tog-uselivepreview' => 'Puruk titilikan langsung (parlu ada JavaScript) (cacubaan)',
-'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuah kasimpulan babakan kusung',
+'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuting kasimpulan babakan puang',
 'tog-watchlisthideown' => 'Sungkupakan babakan ulun di daptar itihan',
 'tog-watchlisthidebots' => 'Sungkupakan babakan bot di daptar itihan',
 'tog-watchlisthideminor' => 'Sungkupakan babakan sapalih di daptar itihan',
@@ -188,6 +186,7 @@ $messages = array(
 'tog-diffonly' => 'Kada usah manampaiakan isi tungkaran di bawah balain',
 'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
 'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
+'tog-useeditwarning' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
 
 'underline-always' => 'Tarus',
 'underline-never' => 'Kada suah',
@@ -264,8 +263,8 @@ $messages = array(
 'category-subcat-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.',
 'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
 'category-article-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.',
-'category-file-count' => '{{PLURAL:$2|Tumbung ngini hanya baisi asa barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
-'category-file-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
+'category-file-count' => '{{PLURAL:$2|Tumbung ngini wastu baisi satu barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
+'category-file-count-limited' => 'Tumbung ngini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Tungkaran tasusun bapadalakan kata',
 'noindex-category' => 'Tungkaran kada tasusun bapadalakan kata',
@@ -276,6 +275,7 @@ $messages = array(
 'newwindow' => '(buka di lalungkang hanyar)',
 'cancel' => 'Walangi',
 'moredotdotdot' => 'Lainnya...',
+'morenotlisted' => 'Salanjutnya...',
 'mypage' => 'Tungkaran ulun',
 'mytalk' => 'Pamandiran ulun',
 'anontalk' => 'Pamandiran hagan alamat IP ini',
@@ -309,6 +309,7 @@ $messages = array(
 'namespaces' => 'Ngarankamar',
 'variants' => 'Macam',
 
+'navigation-heading' => 'Menu napigasi',
 'errorpagetitle' => 'Kasalahan',
 'returnto' => 'Bulik ka $1.',
 'tagline' => 'Matan {{SITENAME}}',
@@ -355,10 +356,10 @@ $messages = array(
 'viewhelppage' => 'Tiringi tungkaran patulung',
 'categorypage' => 'Tiringi tungkaran tumbung',
 'viewtalkpage' => 'Tiringi tungkaran pamandiran',
-'otherlanguages' => 'Dalam bahasa lain',
+'otherlanguages' => 'Dalam basa lain',
 'redirectedfrom' => '(Diugahakan matan $1)',
 'redirectpagesub' => 'Tungkaran paugahan',
-'lastmodifiedat' => 'Tungkaran ngini tauncit diubah pada $1, $2.',
+'lastmodifiedat' => 'Tungkaran ngini pauncitnya diubah pada $1, $2.',
 'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
 'protectedpage' => 'Tungkaran nang dilindungi',
 'jumpto' => 'Malacung ka',
@@ -378,8 +379,8 @@ $1",
 'aboutpage' => 'Project:Pasal',
 'copyright' => 'Isi tasadia sasuai lawan $1.',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
-'currentevents' => 'Paristiwa damini',
-'currentevents-url' => 'Project:Paristiwa damini',
+'currentevents' => 'Kajadian wayahini',
+'currentevents-url' => 'Project:Kajadian wayahini',
 'disclaimers' => 'Panyangkalan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Patulung mambabak',
@@ -405,7 +406,11 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 'retrievedfrom' => 'Dijumput matan "$1"',
 'youhavenewmessages' => 'Pian baisi $1 ($2)',
 'newmessageslink' => 'pasan hanyar',
-'newmessagesdifflink' => 'parubahan tauncit',
+'newmessagesdifflink' => 'paubahan pauncitnya',
+'youhavenewmessagesfromusers' => 'Pian baisi $1 matan {{PLURAL:$3|$3 pamakai lain}} ($2).',
+'youhavenewmessagesmanyusers' => 'Pian baisi $1 matan pamakai lain ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|pasan hanyar}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|paubahan}} pahabisnya',
 'youhavenewmessagesmulti' => 'Pian baisi pasan hanyar dalam $1',
 'editsection' => 'babak',
 'editold' => 'babak',
@@ -446,8 +451,8 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 
 # Main script and global functions
 'nosuchaction' => 'Kadada palakuan nangkaitu',
-'nosuchactiontext' => 'Palakuan nang diminta URL kada sah.
-Pian pinanya salah katik URL, atawa maumpati sabuah tautan nang kada bujur.
+'nosuchactiontext' => 'Tindakan nang diminta URL kada sah.
+Pian tagasnya salah katik URL, atawa maumpati sabuting tautan nang kada bujur.
 Ngini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
 'nosuchspecialpage' => 'Kadada tungkaran istimiwa nangitu',
 'nospecialpagetext' => '<strong>Pian maminta tungkaran istimiwa nang kada sah.</strong>
@@ -457,7 +462,7 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan Basisdata',
 'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ngini pina manandai adanya sabuah bug dalam parangkat lunak.
+Kasalahan ngini pina manandai adanya sabuting bug dalam parangkat lunak.
 Parmintaan basisdata yang tadudi adalah:
 <blockquote><tt>$1</tt></blockquote>
 matan dalam pungsi "<tt>$2</tt>".
@@ -467,15 +472,15 @@ Parmintaan basisdata nang tadudi adalah:
 "$1"
 matan dalam pungsi "$2".
 Basisdata kasalahan  babulik "$3: $4".',
-'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini pinanya kada baisi parubahan tahanyar.",
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini tagasnya kada baisi paubahan pahanyarnya.",
 'readonly' => 'Basisdata tasunduk',
-'enterlockreason' => 'Buati sabuah alasan manyunduk, tamasuk jua wayah apa handak dibuka pulang sundukannya.',
-'readonlytext' => 'Basisdata lagi basunduk hagan masukan hanyar wan parubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, imbah ini akan babulik nangkaya biasa.
+'enterlockreason' => 'Buati sabuting alasan manyunduk, tamasuk jua wayah kapan handak dibuka pulang sundukannya.',
+'readonlytext' => 'Basisdata lagi disunduk hagan masukan hanyar wan paubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, limbah ngini akan babulik nangkaya biasa.
 
 Pambakal nang manyunduk mamadahi nangkaini: $1',
 'missing-article' => 'Basisdata kada ulihan manggagai kata matan tungkaran nang saharusnya ada, bangaran "$1" $2.
 
-Nangkaini biasanya dimargakan tautan lawas ka sabuah tungkaran nang halamnya sudah dihapus.
+Nangkaini biasanya dimargakan tautan lawas ka sabuting tungkaran nang halamnya sudah dihapus.
 
 Munnya lainan ngini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
 Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
@@ -497,9 +502,11 @@ Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah ca
 'badarticleerror' => 'Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.',
 'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
 'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
+'delete-hook-aborted' => 'Pahapusan diwalangakan ulih kait parser.
+Kadada katarangan.',
 'badtitle' => 'Judul buruk',
-'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
-Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
+'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-basa atawa antar-wiki.
+Nangini kawa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
 'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
 'perfcachedts' => 'Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
@@ -509,15 +516,15 @@ Parmintaan: $2',
 'viewsource' => 'Tiringi asal mulanya',
 'viewsource-title' => 'Tiringi asalmula matan $1',
 'actionthrottled' => 'Kalakuan dikiripi',
-'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
+'actionthrottledtext' => 'Sawagai sabuting takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
 Muhun cubai pulang dalam babarapa minit.',
 'protectedpagetext' => 'Tungkaran ngini sudah dilindungi hagan mancagah babakan.',
 'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ngini:',
 'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
 'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
-'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
-Parubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
-Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
+'editinginterface' => "'''Paringatan:''' Pian mambabak sabuting tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
+Paubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
+Gasan tarjamahan, muhun pakai [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
 'sqlhidden' => '(Parmintaan SQL disungkupakan)',
 'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
 'namespaceprotected' => "Pian kada baisi ijin hagan mambabak tutungkaran dalam ngaran kamar '''$1'''.",
@@ -529,6 +536,10 @@ Alasan nang dibariakan adalah ''$2''.",
 'filereadonlyerror' => 'Kada kawa mamudipikasi data "$1" marga repositori data "$2" ada di modus read-only.
 
 Administrator nang takunci nintu manawarakan panjalasan: "$3".',
+'invalidtitle-knownnamespace' => 'Judul nang kada sah lawan ruang-ngaran "$2" wan teks "$3"',
+'invalidtitle-unknownnamespace' => 'Judul nang kada sah lawan numur ruang ngaran kada dikatahui $1 wan teks "$2"',
+'exception-nologin' => 'Balum babuat log',
+'exception-nologin-text' => 'Tungkaran atawa tindakan ngini maharusakan Pian babuat log di wiki ngini.',
 
 # Virus scanner
 'virus-badscanner' => "Konpigurasi buruk: pamindai virus kada dipinandui: ''$1''",
@@ -540,12 +551,17 @@ Administrator nang takunci nintu manawarakan panjalasan: "$3".',
 
 Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa <span class='plainlinks'>[$1 babuat log pulang]</span> sawagai pamakai nang sama atawa sawagai pamakai balain.
 Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
+'welcomeuser' => 'Salamat datang,  $1 !',
+'welcomecreation-msg' => '==Salamat datang, $1!==
+Akun Pian sudah diulah.
+Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] Pian.',
 'yourname' => 'Ngaran pamakai:',
 'yourpassword' => 'Katasunduk:',
 'yourpasswordagain' => 'Katik pulang katasunduk:',
 'remembermypassword' => 'Ingatakan log babuat ulun dalam komputer naya (salawas $1 {{PLURAL:$1|hari|hari}})',
 'securelogin-stick-https' => 'Tatap tasambung awan HTTPS imbah babuat-log',
 'yourdomainname' => 'Domain Pian:',
+'password-change-forbidden' => 'Pian kada kawa ma-ubah kata sunduk pada wiki ngini.',
 'externaldberror' => 'Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.',
 'login' => 'Babuat',
 'nav-login-createaccount' => 'Babuat log / ulah akun',
@@ -555,7 +571,7 @@ Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masi
 'logout' => 'Kaluar',
 'userlogout' => 'Kaluar',
 'notloggedin' => 'Balum babuat log',
-'nologin' => 'Kada baisi sabuah akun? $1.',
+'nologin' => "Balum baisi akun? '''$1'''.",
 'nologinlink' => 'Ulah sabuting akun',
 'createaccount' => 'Ulah akun',
 'gotaccount' => 'Hudah baisi sabuting akun? $1.',
@@ -600,13 +616,13 @@ Muhun cubai pulang.',
 
 Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamakai katasunduk lawas Pian.',
 'noemail' => 'Kadada alamat suril tarakam gasan pamakai "$1".',
-'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
+'noemailcreate' => 'Pian parlu manyadiakan sabuting alamat suril nang sah',
 'passwordsent' => 'Sabuting kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
 Muhun babuat log pulang habis Pian manarima nangini.',
 'blocked-mailpassword' => 'Alamat IP Pian diblukir hagan mambabak, wan kada dibulihakan mamakai pungsi pamulihan kata sunduk hagan mancagah salah puruk.',
 'eauthentsent' => 'Sabuting suril payakinan hudah dikirim ka alamat suril.
 Sabalum ada suril lain nang takirim ka akun, Pian akan parlu maumpati anjuran dalam suril nangitu, hagan mayakinakan bahwasanya akun nangitu bujur-bujur ampun Pian.',
-'throttled-mailpassword' => 'Sabuting pangingat kata sunduk hudah takirim, dalam {{PLURAL:$1|jam|$1 jam}} tauncit. Hagan mancagah salah puruk, asa pangingat kata sunduk haja nang dikirim saban {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Sabuting pangingat kata sunduk hudah takirim, dalam {{PLURAL:$1|jam|$1 jam}} pauncitnya. Hagan mancagah salah puruk, asa pangingat kata sunduk haja nang dikirim saban {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan pangiriman suril: $1',
 'acct_creation_throttle_hit' => "Pa'ilang wiki nangini mamuruk alamat IP Pian hudah maulah {{PLURAL:$1|1 akun|$1 akun}} dalam asa harian ini, dimana nangitu jumlah paling banyak nang diijinakan. Sawagai hasilnya, pa'ilang awan alamat IP nangini kada kawa maulah akun pulang gasan pahadangan.",
 'emailauthenticated' => 'Alamat suril Pian rasuk pada  $2, $3',
@@ -629,17 +645,18 @@ Pian kawa kada mahual pasan ngini, amun paulahan akun ini adalah kasalahan.',
 'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
 Muhun hadangi dahulu sapandang hanyar cubai pulang.',
 'login-abort-generic' => 'Pian kada ruhui babuat  log - Diwalangi',
-'loginlanguagelabel' => 'Bahasa: $1',
-'suspicious-userlogout' => 'Parmintaan Pian hagan kaluar log kada ditarima karana nangkaya dikirim matan panjalajah web rakai atawa tatangkap proxy.',
+'loginlanguagelabel' => 'Basa: $1',
+'suspicious-userlogout' => 'Pamintaan Pian hagan kaluar log kada ditarima marga nangkaya dikirim matan panjalajah web rakai atawa tatangkap proxy.',
 
 # Email sending
 'php-mail-error-unknown' => 'Kasalahan kada dipinandui dalam pungsi surat () PHP',
 'user-mail-no-addy' => 'Mancuba mangirim suril kada baalamat suril.',
+'user-mail-no-body' => 'Manarai hagan mangirim suril puang atawa talalu handap.',
 
 # Change password dialog
 'resetpass' => 'Ubah katasunduk',
-'resetpass_announce' => 'Pian babuat log awan sabuah kudi samantara nang disurili.
-Hagan manuntungakan babuat log, Pian musti manyetel sabuah katasunduk hanyar di sia:',
+'resetpass_announce' => 'Pian babuat log awan sabuting kode samantara nang disurili.
+Hagan manuntungakan babuat log, Pian musti manyetel sabuting katasunduk hanyar di sia:',
 'resetpass_header' => 'Ubah katasunduk akun',
 'oldpassword' => 'Katasunduk lawas:',
 'newpassword' => 'Katasunduk hanyar:',
@@ -652,12 +669,12 @@ Wayah ni Pian sudah babuat log...',
 'resetpass-submit-loggedin' => 'Ubah katasunduk',
 'resetpass-submit-cancel' => 'Walangi',
 'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ni kada sah.
-Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
+Pian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasunduk samantara hanyar.',
 'resetpass-temp-password' => 'Katasunduk samantara:',
 
 # Special:PasswordReset
 'passwordreset' => 'Bulikakan setelan katasunduk',
-'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
+'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuting suril pangingat rarincian akun Pian.',
 'passwordreset-legend' => 'Bulikakan setelan katasunduk',
 'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
@@ -667,7 +684,7 @@ Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasundu
 'passwordreset-capture-help' => 'Amun Pian cintang kutak ngini, suril (awan katasunduk pahadangan) akan ditampaiakan ka Pian bahwasa lagi dikirim ka pamakai.',
 'passwordreset-email' => 'Alamat suril:',
 'passwordreset-emailtitle' => 'Rarincian akun pada {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). pPamakai barikut {{PLURAL:$3|akun|akun}}
+'passwordreset-emailtext-ip' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}
 tarait awan suril:
 
 $2
@@ -683,18 +700,19 @@ $2
 Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
 'passwordreset-emailelement' => 'Ngaran pamakai: $1
 Katasunduk pahadangan: $2',
-'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
-'passwordreset-emailsent-capture' => 'Sabuah suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.',
+'passwordreset-emailsent' => 'Sabuting suril pangingat sudah takirim.',
+'passwordreset-emailsent-capture' => 'Sabuting suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.',
 'passwordreset-emailerror-capture' => 'Suril paugingat, nang ditampaikan di bawah, hudah dihasilakan, tagal gagal mangirimakannya ka pamakai: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat suril',
 'changeemail-header' => 'Ganti akun alamat suril',
-'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
+'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan paubahan ngini.',
 'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ngini langsung.',
 'changeemail-oldemail' => 'Alamat suril wayah ni:',
 'changeemail-newemail' => 'Alamat suril puga:',
 'changeemail-none' => '(kadada)',
+'changeemail-password' => 'Sandi {{SITENAME}} Pian:',
 'changeemail-submit' => 'Ganti suril',
 'changeemail-cancel' => 'Walangi',
 
@@ -725,14 +743,14 @@ Katasunduk pahadangan: $2',
 'preview' => 'Tilik',
 'showpreview' => 'Tampaiakan titilikan',
 'showlivepreview' => 'Titilikan langsung',
-'showdiff' => 'Tampaiakan parubahan',
+'showdiff' => 'Tampaiakan paubahan',
 'anoneditwarning' => "'''Paringatan:''' Pian baluman babuat log.
 Alamat IP Pian akan dirakam dalam tungkaran babakan halam",
 'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
-'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuah kasimpulan babakan.
+'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuting kasimpulan babakan.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
-'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ngini.',
-'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ngini.
+'missingcommenttext' => 'Muhun buati sabuting kumintar di bawah ngini.',
+'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuting subjek/judul gasan kumin ngini.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
 'summary-preview' => 'Tilikan kasimpulan:',
 'subject-preview' => 'Titilikan subyek/judul:',
@@ -773,7 +791,7 @@ Pinanya ini sudah diugahakan atawa dihapus parhatan Pian maniringi tungkaran nan
 'loginreqlink' => 'Babuat log',
 'loginreqpagetext' => 'Pian musti $1 hagan maniringi rungkaran-tungkaran lain.',
 'accmailtitle' => 'Katasunduk takirim.',
-'accmailtext' => "Sabuah katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.
+'accmailtext' => "Sabuting katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.
 
 Katasunduk gasan pamakai hanyar nangini kawa diubah pintang tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' wayah babuat log.",
 'newarticle' => '(Hanyar)',
@@ -788,16 +806,16 @@ atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ngini]</span>
 'noarticletext-nopermission' => 'Parhatan ni kadada naskah di tungkaran ngini.
 Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
-'userpage-userdoesnotexist' => 'Akun pamuruk "<nowiki>$1</nowiki>" kada tadaptar.
-Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
-'userpage-userdoesnotexist-view' => 'Akun pamuruk "$1" kada tadaptar.',
-'blocked-notice-logextract' => 'Pamuruk nangini parhatan ini diblukir.
-Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
-'clearyourcache' => "'''Catatan: Habis manyimpan, Pian harus malingarakan cache panjalajah web Pian hagan malihat parubahan.'''
-*'''Firefox/Safari:''' tahan ''Shift'' parhatan klik ''Reload'', atawa picik ''Ctrl-F5'' atawa ''Ctrl-R'' (''Command-R'' pada sabuah Mac);
-* '''Google Chrome:''' picik ''Ctrl-Shift-R'' (''Command-Shift-R''  pada sabuah Mac)
+'userpage-userdoesnotexist' => 'Akun pamakai "<nowiki>$1</nowiki>" kada tadaptar.
+Muhun pariksa/ditukui amun Pian handak maulah/mambabak tungkaran ngini.',
+'userpage-userdoesnotexist-view' => 'Akun pamakai "$1" kada tadaptar.',
+'blocked-notice-logextract' => 'Pamakai nangini parhatan diblukir.
+Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
+'clearyourcache' => "x'''Catatan: Habis manyimpan, Pian harus malingarakan cache panjalajah web Pian hagan malihat paubahan.'''
+*'''Firefox/Safari:''' tahan ''Shift'' parhatan klik ''Reload'', atawa picik ''Ctrl-F5'' atawa ''Ctrl-R'' (''Command-R'' pada sabuting Mac);
+* '''Google Chrome:''' picik ''Ctrl-Shift-R'' (''Command-Shift-R''  pada sabuting Mac)
 *'''Internet Explorer:''' tahan ''Ctrl'' parhatan klik ''Refresh,'' atawa picik ''Ctrl-F5''
-* '''Konqueror:''' klik ''Reload'' atawa picik ''F5''
+* '''Konqueror:''' kalik ''Reload'' atawa picik ''F5''
 *'''Opera:''' barasihakan cache pada ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis CSS hanyar Pian sabalum manyimpan.",
 'userjsyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis JavaScript hanyar Pian sabalum manyimpan.",
@@ -813,38 +831,38 @@ Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
 Inatakan bahwasa saragam  tungkaran-tungkaran .css wan .js mamuruk aksara halus, cuntuh {{ns:user}}:Foo/vector.css sawagai tandingan {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dihanyarakan)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Parubahan Pian nang baluman disimpan!",
+'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Paubahan Pian baluman disimpan!",
 'continue-editing' => 'Lanjutakan mambabak',
 'previewconflict' => 'Titilikan ini mancarminakan naskah dalam naskah wilayah atas babakan sawagai mana ini akan mancungul amun disimpan.',
 'session_fail_preview' => "'''Ampun! Kami kada kawa manarusakan babakan Pian karana kahilangan sési data.'''
 Cubai pang sa'asa pulang.
 Amun magun kada kulihan, cubai [[Special:UserLogout|kaluar log]] wan imbah itu babuat log pulang.",
-'session_fail_preview_html' => "'''Kami kada kawa manarusakan babakan Pian karana kahilangan wayah data.'''
+'session_fail_preview_html' => "'''Kami kada kawa manarusakan babakan Pian marga kahilangan wayah data.'''
 
-''Marga {{SITENAME}} mangkawa'akan HTML mantah, titilikan disungkupakan sawagai pancahagahan sarangan Javascript.''
+''Marga {{SITENAME}} mangkawa'akan HTML mantah, titilikan disungkupakan sawagai pancagahan sarangan Javascript.''
 
-'''Amun nangini adalah sabuah parcubaan babakan nang sabujurnya, muhun cubai lagi.'''
-Amun ini masih haja kada bagawi, cubai [[Special:UserLogout|kaluar log]] wan babuat log pulang.",
-'token_suffix_mismatch' => "'''Babakan Pian sudah kada ditarima karana aplikasi Pian mahancuri tanda baca pada babakan token.'''
+'''Amun nangini adalah sabuting parcubaan babakan nang sabujurnya, muhun cubai lagi.'''
+Amun ngini masih haja kada bagawi, cubai [[Special:UserLogout|kaluar log]] wan babuat log pulang.",
+'token_suffix_mismatch' => "'''Babakan Pian sudah kada ditarima marga aplikasi Pian mahancuri tanda baca pada babakan token.'''
 Babakan ini kada ditarima hagan mancagah kasalahan pada naskah tungkaran.
-Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
+Nangini bahanu tajadi amun Pian mamuruk sabuting layanan proxy buggy bapandal web kada bangaran.",
 'edit_form_incomplete' => "'''Babarapa hagian matan purmulir babakan kada sampai server; pariksa pulang apakah babakan Pian tatap utuh wan cubai lagi.'''",
 'editing' => 'Mambabak $1',
 'creating' => 'Ma-ulah $1',
 'editingsection' => 'Mambabak $1 (hagian)',
 'editingcomment' => 'Mambabak $1 (hagian hanyar)',
 'editconflict' => 'Babakan bacakut: $1',
-'explainconflict' => "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian mula mambabak ini.
-Naskah atas baisi naskah tungkaran sawagai dimapa ini ada hahanyaran ini.
-Parubahan Pian ditampaiakan pada naskah di bawah.
-Pian pinanya harus manggabungakan parubahan Pian ka dalam naskah nang ada.
-Naskah nang di atas '''haja''' nang akan tasimpan amung Pian manikin \"{{int:savearticle}}\".",
+'explainconflict' => "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian bamula mambabak ngini.
+Naskah atas baisi naskah tungkaran wayah ini.
+Paubahan Pian ditampaiakan pada naskah di bawah.
+Pinanya Pian harus manggabungakan paubahan Pian ka dalam naskah nang ada.
+Naskah nang di atas '''haja''' nang akan tasimpan lamun Pian manikin \"{{int:savearticle}}\".",
 'yourtext' => 'Naskah Pian',
 'storedversion' => 'Ralatan tasimpan',
 'nonunicodebrowser' => "'''Paringatan: Panjalajah web Pian kada manyukung unicode.'''
 Sabuah pambulatan gawian di wadah ini mambulihakan Pian aman mambabak tutungkaran: karaktir non-ASCII akan cungul pada kutak babakan sawagai kudi hiksadisimal.",
 'editingold' => "'''Paringatan: Pian lagi mambabak ralatan lawas matan tungkaran ini.'''
-Amun Pian manyimpan ini, babarapa paparubahan dulah imbah ralatan nangini akan tanggal.",
+Amun Pian manyimpan ini, babarapa paubahan diulah limbah ralatan nangini akan tanggal.",
 'yourdiff' => 'Nang balain',
 'copyrightwarning' => "Muhun dicatat bahwasanya samunyaan sumbangan ka {{SITENAME}} adalah sudah dipartimbangkan disabarakan di bawah $2 (lihati $1 gasan rincian). Amun Pian kada handak tulisan Pian dibabak wan disabarakan, kada usah mangirim ini ka sia. <br />
 Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa asal mula lainnya nang samacam.
@@ -859,15 +877,15 @@ Nangini kada kawa disimpan.",
 Pian kawa amun handak cut-n-paste naskah ka sabuah barakas naskah wan simpan ini gasan kaina.
 
 Pambakal nang manyunduk manjalasakan kaini: $1",
-'protectedpagewarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal nang kawa mambabak ini.'''
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'semiprotectedpagewarning' => "'''Catatan:''' Tungkaran ini sudah dilindungi laluai pamuruk tadaptar haja nang kawa mambabak.
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'cascadeprotectedwarning' => "'''Paringatan:''' Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal haja nang kawa mambabak, karana ini tamasuk dalam baumpat parlindungan barénténg {{PLURAL: $1|tungkaran|tutungkaran}}:",
-'titleprotectedwarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ini.'''
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'templatesused' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di tungkaran ini:',
-'templatesusedpreview' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di titilikan ini:',
+'protectedpagewarning' => "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya pamakai awan hak istimiwa pambakal nang kawa mambabak ini.'''
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'semiprotectedpagewarning' => "'''Catatan:''' Tungkaran ngini sudah dilindungi nang akibatnya pamakai tadaptar haja nang kawa mambabak.
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'cascadeprotectedwarning' => "'''Paringatan:''' Tungkaran ngini sudah dilindungi nang akibatnya pamakai awan hak istimiwa pambakal haja nang kawa mambabak, sualnya ngini tamasuk dalam baumpat parlindungan barénténg {{PLURAL: $1|tungkaran|tutungkaran}}:",
+'titleprotectedwarning' => "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ngini.'''
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'templatesused' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di tungkaran ngini:',
+'templatesusedpreview' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di titilikan ngini:',
 'templatesusedsection' => "{{PLURAL:$1|Citakan|Cicitakan}} nang diguna'akan di hagian ini:",
 'template-protected' => '(dilindungi)',
 'template-semiprotected' => '(semi-dilindungi)',
@@ -892,10 +910,19 @@ Ini kadada panjalasan.',
 'edit-gone-missing' => 'Kada kawa mamutakhirakan tungkaran ini.
 Ini cungul pinanya sudah tahapus.',
 'edit-conflict' => 'Babakan bacakut.',
-'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada parubahan diulah ka naskah ini.',
-'edit-already-exists' => 'Kada kawa maulah sabuah tungkaran hanyar.
+'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada paubahan diulah ka naskah ngini.',
+'edit-already-exists' => 'Kada kawa maulah sabuting tungkaran hanyar.
 Nangini sudah ada.',
 'defaultmessagetext' => 'Naskah baku pasan',
+'content-failed-to-parse' => 'Gagal manjabarakan isi $2 gasan model $1: $3',
+'invalid-content-data' => 'Data isi kada sah',
+'content-not-allowed-here' => 'Isi "$1" kada diijinakan di tungkaran [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
@@ -905,11 +932,11 @@ Nangini harusnya takurang matan $2 {{PLURAL:$2|kiauan|kiauan-kiauan}}, ada {{PLU
 'post-expand-template-inclusion-warning' => "'''Paringatan:''' Citakan nang diumpatakan takarannya kaganalan.
 Babarapa citakan akan kada taumpatakan.",
 'post-expand-template-inclusion-category' => 'Tungkaran-tungkaran nang citakan baumpat limpuar',
-'post-expand-template-argument-warning' => "'''Paringatan:''' Tungkaran ini mangandung paling kada sabuah kalimat citakan wan ukuran panyingkaiannya kaganalan. Kalimat-kalimat nangitu sudah diabaiakan.",
+'post-expand-template-argument-warning' => "'''Paringatan:''' Tungkaran ngini mangandung paling kada sabuting kalimat citakan wan ukuran panyingkaiannya kaganalan. Kalimat-kalimat nangitu sudah diabaiakan.",
 'post-expand-template-argument-category' => 'Tungkaran-tungkaran nang mangandung kalimat-kalimat citakan diabaiakan',
 'parser-template-loop-warning' => 'Citakan baulang takantup: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Citakan batas kadalaman recursi limpuar ($1)',
-'language-converter-depth-warning' => 'Batas kadalaman pakonversi bahasa limpuar ($1)',
+'language-converter-depth-warning' => 'Batas kadalaman pangonversi basa limpuar ($1)',
 'node-count-exceeded-category' => 'Tungkaran di mana node-count tarlalui',
 'node-count-exceeded-warning' => 'Tungkaran malabihi node-count',
 'expansion-depth-exceeded-category' => 'Tungkaran dimana kadalaman ikspansi talalui',
@@ -918,7 +945,7 @@ Babarapa citakan akan kada taumpatakan.",
 
 # "Undo" feature
 'undo-success' => 'Babakan kawa diwalangi.
-Muhun pariksa panandingan di bawah hagan mayakinakan ini apa nang Pian handak gawi, wan imbah itu simpan parubahan di bawah hagan manuntungakan pawalangan babakan.',
+Tulung dipariksa panandingan di bawah hagan mayakinakan ngini apa nang Pian handak gawi, wan limbah itu simpan paubahan di bawah hagan manuntungakan pawalangan babakan.',
 'undo-failure' => 'Babakan ini kada kawa diwalangi karana ada cakutan di tangah babakan-babakan.',
 'undo-norev' => 'Babakan kada kawa diwalangi karana ini kadada atawa tahapus.',
 'undo-summary' => '←Mawalangakan ralatan $1 ulih [[Special:Contributions/$2|$2]] ([[User talk:$2|Pandir]])',
@@ -1036,7 +1063,7 @@ $1",
 'revdel-restore-visible' => 'Ralatan-ralatan kalihatan',
 'pagehist' => 'Sajarah tungkaran',
 'deletedhist' => 'Halam tahapus',
-'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ini adalah ralatan tahanyar.
+'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ngini adalah ralatan pahanyarnya.
 Ini kada kawa disungkupakan.',
 'revdelete-show-no-access' => 'Tasalah manampaiakan nang batanggal $1, $2: nangini sudah ditandai "tabatas".
 Pian kada kawa malihati ini.',
@@ -1058,12 +1085,12 @@ Muhun pariksa lolog.',
 
 # Suppression log
 'suppressionlog' => 'Log panikinan',
-'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blukir.',
+'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi pahanyarnya tatangatan wan blukir.',
 
 # History merging
 'mergehistory' => 'Gabungakan hahalam tungkaran',
-'mergehistory-header' => 'Tungkaran ngini mambulihakan Pian manggabungakan raralatan matan asa tungkaran asal mula ka sabuah tungkaran tahanyar.
-Yakini bahwasa parubahan ngini masih maharagu tarus halam lawas tungkaran.',
+'mergehistory-header' => 'Tungkaran ngini mambulihakan Pian manggabungakan raralatan matan asa tungkaran asal mula ka sabuting tungkaran pahanyarnya.
+Yakini bahwasa paubahan ngini masih maharagu tarus halam lawas tungkaran.',
 'mergehistory-box' => 'Gabungakan raralatan matan dua tungkaran:',
 'mergehistory-from' => 'Tungkaran asal mula:',
 'mergehistory-into' => 'Tungkaran tatuju:',
@@ -1166,15 +1193,6 @@ Tarai pamintaan Pian lawan ''all:'' gasan manggagai samunyaan isi (tamasuk tungk
 Pian kawa manggagai lung Google parhatan ini.
 Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 
-# Quickbar
-'qbsettings' => 'Bilahhancap',
-'qbsettings-none' => 'Kadada',
-'qbsettings-fixedleft' => 'Tatap di kiwa',
-'qbsettings-fixedright' => 'Tatap di kanan',
-'qbsettings-floatingleft' => 'Mangambang sabalah kiwa',
-'qbsettings-floatingright' => 'Mangambang sabalah kanan',
-'qbsettings-directionality' => 'Tatap, tagantung pada ampah skrip matan bahasa Pian',
-
 # Preferences page
 'preferences' => 'Kakatujuan',
 'mypreferences' => 'Nang ulun katuju',
@@ -1189,11 +1207,11 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'prefs-datetime' => 'Tanggal wan waktu',
 'prefs-labs' => 'Fitur Labs',
 'prefs-personal' => 'Data awak',
-'prefs-rc' => 'Parubahan tahanyar',
+'prefs-rc' => 'Paubahan pahanyarnya',
 'prefs-watchlist' => 'Paitihan',
 'prefs-watchlist-days' => 'Rikinan hari-hari ditampaiakan di daptar itihan:',
 'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari|hahari}}',
-'prefs-watchlist-edits' => 'Rikinan paningginya matan parubahan hagan ditampaiakan pada singkaian daptar itihan:',
+'prefs-watchlist-edits' => 'Rikinan paningginya matan paubahan hagan ditampaiakan pada singkaian daptar itihan:',
 'prefs-watchlist-edits-max' => 'Rikinan paningginya:1000',
 'prefs-watchlist-token' => 'Token itihan:',
 'prefs-misc' => 'Balalain',
@@ -1203,7 +1221,7 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'prefs-email' => 'Pipilihan suril',
 'prefs-rendering' => 'Pancungulan',
 'saveprefs' => 'Simpan',
-'resetprefs' => 'Kusungakan paparubahan kada tasimpan',
+'resetprefs' => 'Walangakan paubahan',
 'restoreprefs' => 'Bulikakan samunyaan sesetélan default',
 'prefs-editing' => 'Pambabakan',
 'prefs-edit-boxsize' => 'Ukuran lalungkang babakan',
@@ -1213,10 +1231,10 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'resultsperpage' => 'Hantukan par tungkaran:',
 'stub-threshold' => 'Ambang watas gasan pormat <a href="#" class="stub">taautan rintisan</a>:',
 'stub-threshold-disabled' => 'Kada kawa-akan',
-'recentchangesdays' => 'Hahari nang manampaiakan parubahan tahanyar:',
+'recentchangesdays' => 'Jumlah hari nang manampaiakan paubahan pahanyarnya:',
 'recentchangesdays-max' => 'Paling lawas $1 {{PLURAL:$1|hari|hahari}}',
 'recentchangescount' => 'Rikinan babakan nang ditampaiakan default:',
-'prefs-help-recentchangescount' => 'Ini tamasuk parubahan tahanyar, halam-halam tungkaran, wan log-log.',
+'prefs-help-recentchangescount' => 'Ngini tamasuk paubahan pahanyarnya, sajarah halam tungkaran, wan log-log.',
 'prefs-help-watchlist-token' => 'Maisi kutak ngini lawan kunci rahasia (PIN) akan mahasilakan sindikasi RSS hagan daptar pantauan Anda. Siapa gin nang tahu kunci ngini kawa mambaca daptar itihan Pian, jadi pilihi nilainya bahati-hati
 Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
 'savedprefs' => 'Kakatujuan Pian sudah ham disimpan.',
@@ -1345,7 +1363,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-edit' => 'Mambaiki tungkaran',
 'right-createpage' => 'Ulah tutungkaran (nang lainan tutungkaran pamandiran)',
 'right-createtalk' => 'Maulah tutungkaran pamandiran',
-'right-createaccount' => 'Ulah akun pamuruk hanyar',
+'right-createaccount' => 'Ulah akun pamakai hanyar',
 'right-minoredit' => 'Tandai bababakan sawagai sapalih',
 'right-move' => 'Mamindahakan tungkaran',
 'right-move-subpages' => 'Ugahakan tutungkaran awan subtumgkaran-nya',
@@ -1357,7 +1375,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-reupload-own' => 'Manulistindih barakas nang ada unggahan ulih urang nang sama',
 'right-reupload-shared' => 'Manulak babarakas pada panyimpanan media lokal basamaan',
 'right-upload_by_url' => 'Hunggahakan babarakas matan sabuah URL',
-'right-purge' => 'Limpuarakan timbuluk situs gasan asa tungkaran kada pambaritahuan',
+'right-purge' => 'Limpuarakan timbuluk situs gasan asa tungkaran kada pamadahan',
 'right-autoconfirmed' => 'Mambabak tutungkaran sami-dilindungi',
 'right-bot' => 'Ditindak sawagai sabuah proses utumatis',
 'right-nominornewtalk' => 'Kadada babakan sapalih di tutungkaran pamandiran nang mancungulakan tampaian pasan puga',
@@ -1365,9 +1383,10 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-writeapi' => 'Puruk panulisan API',
 'right-delete' => 'Mahapus tungkaran',
 'right-bigdelete' => 'Hapus tutungkaran awan hahalam ganal',
+'right-deletelogentry' => 'Hapus wan walangakan pahapusan masukan log tartantu',
 'right-deleterevision' => 'Mahapus wan mawalangi hapus raralatan tatantu matan tutungkaran',
 'right-deletedhistory' => 'Tiringi mamasukan halam tahapus, kada banaskah tarait',
-'right-deletedtext' => 'Tiringi naskah tahapus wan parubahan antar raralatan tahapus',
+'right-deletedtext' => 'Tiringi naskah tahapus wan paubahan antar raralatan nang tahapus',
 'right-browsearchive' => 'Manggagai tungkaran nang sudah dihapus',
 'right-undelete' => 'Mambulikakan sabuah tungkaran tahapus',
 'right-suppressrevision' => 'Maniring pulang wan mambulikakan raralatan matan papambakal',
@@ -1391,7 +1410,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-importupload' => 'Iimpur tutungkaran matan sabuah barakas hunggahan',
 'right-patrol' => "Tandai bababakan nang lain sawagai ta'awasi",
 'right-autopatrol' => "Babakan ampun surang utumatis ditandai sawagai ta'awasi",
-'right-patrolmarks' => 'Tiringi tanda parubahan tahanyar',
+'right-patrolmarks' => 'Tiringi tanda paubahan pahanyarnya',
 'right-unwatchedpages' => 'Tiringi sabuah daptar tutungkaran nang kada diitihi',
 'right-mergehistory' => 'Gabungakan halam matan tutungkaran',
 'right-userrights' => 'Babak sabarataan hak pamuruk',
@@ -1406,8 +1425,8 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
 
 # User rights log
-'rightslog' => 'Log parubahan hak masuk',
-'rightslogtext' => 'Nangini adalah sabuah log paparubahan ka hahak pamuruk.',
+'rightslog' => 'Log paubahan hak masuk',
+'rightslogtext' => 'Nangini sabuting log paubahan ka hak pamakai.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'baca tungkaran ini',
@@ -1447,17 +1466,17 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'action-sendemail' => 'Kirim suril',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
+'nchanges' => '$1 {{PLURAL:$1|paubahan|paubahan}}',
 'recentchanges' => 'Paubahan pahanyarnya',
 'recentchanges-legend' => 'Pilihan paubahan pahanyarnya',
-'recentchanges-summary' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
-'recentchanges-feed-description' => 'Susuri parubahan pahanyarnya dalam wiki di kitihan ini',
-'recentchanges-label-newpage' => 'Babakan ngini maulah sabuah tungkaran hanyar',
-'recentchanges-label-minor' => 'Ngini adalah sabuah babakan sapalih',
+'recentchanges-summary' => 'Jajak paubahan wiki pahanyarnya pada tungkaran ngini',
+'recentchanges-feed-description' => 'Susuri paubahan pahanyarnya dalam wiki di kitihan ini',
+'recentchanges-label-newpage' => 'Babakan ngini maulah sabuting tungkaran hanyar',
+'recentchanges-label-minor' => 'Ngini sabuting babakan sapalih',
 'recentchanges-label-bot' => 'Babakan ngini digawi ulih saikung bot',
 'recentchanges-label-unpatrolled' => "Babakan ngini baluman ta'awasi",
 'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} paubahan pahanyarnya dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
-'rcnotefrom' => "Di bawah ngini parubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' parubahan)",
+'rcnotefrom' => "Di bawah ngini paubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' paubahan)",
 'rclistfrom' => 'Tampaiakan paubahan pahanyarnya matan $1',
 'rcshowhideminor' => '$1 pambabakan sapalih',
 'rcshowhidebots' => '$1 bot',
@@ -1483,15 +1502,15 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'rc-old-title' => 'aslinya diulah sawagai "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Parubahan tarait',
-'recentchangeslinked-feed' => 'Parubahan tarait',
-'recentchangeslinked-toolbox' => 'Parubahan tarait',
-'recentchangeslinked-title' => 'Parubahan nang tarait lawan "$1"',
-'recentchangeslinked-noresult' => 'Kadada parubahan pada tautan tutungkaran salawas wayah ditantuakan',
-'recentchangeslinked-summary' => "Ngini adalah sabuah daptar parubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
+'recentchangeslinked' => 'Paubahan tarait',
+'recentchangeslinked-feed' => 'Paubahan tarait',
+'recentchangeslinked-toolbox' => 'Paubahan tarait',
+'recentchangeslinked-title' => 'Paubahan nang tarait lawan "$1"',
+'recentchangeslinked-noresult' => 'Kadada paubahan pada tautan tutungkaran salawas wayah ditantuakan',
+'recentchangeslinked-summary' => "Ngini sabuting daptar paubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuting tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
 Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
 'recentchangeslinked-page' => 'Ngaran tungkaran:',
-'recentchangeslinked-to' => 'Tampaiakan parubahan matan tungkaran-tungkaran nang tataut lawan tungkaran nang disurungakan',
+'recentchangeslinked-to' => 'Tampaiakan paubahan matan tutungkaran nang bataut lawan tungkaran nang disurungakan',
 
 # Upload
 'upload' => 'Hunggahakan barakas',
@@ -1522,7 +1541,7 @@ Janaki [[Special:NewFiles|galeri babarakas hanyar]] gasan  tampaian visual.',
 'filename' => 'Ngaran barakas',
 'filedesc' => 'Kasimpulan',
 'fileuploadsummary' => 'Kasimpulan:',
-'filereuploadsummary' => 'Parubahan barakas:',
+'filereuploadsummary' => 'Paubahan barakas:',
 'filestatus' => 'Status hak-rekap:',
 'filesource' => 'Asal mula:',
 'uploadedfiles' => 'Babarakas tahunggah',
@@ -1546,7 +1565,7 @@ Nang diijinakan {{PLURAL:$3|adalah macam barakas|adalah mamacam barakas}} $2.',
 'filename-tooshort' => 'Ngaran barakas kahandapan.',
 'filetype-banned' => 'Macam barakas ini ditangati.',
 'verification-error' => 'Barakas nangini kada lulus paitihan.',
-'hookaborted' => 'Parubahan nang Pian cuba ulah sudah digagalakan ulih unjun ekstensi.',
+'hookaborted' => 'Paubahan nang Pian cuba ulah sudah digagalakan ulih unjun ekstensi.',
 'illegal-filename' => 'Ngaranbarakas kada dibulihakan.',
 'overwrite' => 'Manindih tulis sabuah barakas nang ada kada dibulihakan.',
 'unknown-error' => 'Kasalahan kada dipinandui tajadi.',
@@ -1706,11 +1725,10 @@ Gasan kaamanan baik, img_auth.php dipajahakan.',
 # HTTP errors
 'http-invalid-url' => 'URL kada sah: $1',
 'http-invalid-scheme' => 'URL lawan skema "$1" kada disukung.',
-'http-request-error' => 'Parmintaan HTTP gagal karana kasalah kada dikatahui.',
+'http-request-error' => 'Maminta HTTP gagal karana kasalah kada dikatahui.',
 'http-read-error' => 'Kasalahan baca HTTP.',
-'http-timed-out' => 'Parmintaan HTTP habis wayahnya.',
+'http-timed-out' => 'Maminta HTTP habis waktunya.',
 'http-curl-error' => 'Kasalahan pas maambil URL: $1',
-'http-host-unreachable' => 'Kada kawa mancapai URL.',
 'http-bad-status' => 'Ada sabuah masalah pas maminta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1883,11 +1901,12 @@ Ngini wayah ini sudah diugahakan ka [[$2]].',
 'withoutinterwiki-legend' => 'Mulaan',
 'withoutinterwiki-submit' => 'Tampaiakan',
 
-'fewestrevisions' => 'Tutungkaran lawan parubahan paling sadikit',
+'fewestrevisions' => 'Tutungkaran lawan paubahan panyadikitnya',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bit|bit}}',
 'ncategories' => '{{PLURAL:$1|tumbung|tutumbung}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|tautan|tautan}}',
 'nmembers' => '$1 {{PLURAL:$1|angguta|angguta}}',
 'nrevisions' => '$1 {{PLURAL:$1|ralatan|raralatan}}',
@@ -1916,15 +1935,16 @@ File-file berikut digunakan tapi tidak ada. File dari repositori asing dapat ter
 'mostlinkedtemplates' => 'Cicitakan tatuju tautan pambanyaknya',
 'mostcategories' => 'Tutungkaran lawan pambanyaknya tutumbung',
 'mostimages' => "Barakas nang rancak diguna'akan",
-'mostrevisions' => 'Tutungkaran lawan parubahan paling banyak',
+'mostinterwikis' => 'Tutungkaran lawan interwiki pambanyaknya',
+'mostrevisions' => 'Tutungkaran lawan paubahan pambanyaknya',
 'prefixindex' => 'Samunyaan tungkaran wan awalan',
-'prefixindex-namespace' => 'Samunyaan tutungkaran baawalan ($1 ngaran-kamar)',
+'prefixindex-namespace' => 'Samunyaan tutungkaran nang ba-awalan (ruang-ngaran $1)',
 'shortpages' => 'Tutungkaran handap',
 'longpages' => 'Tutungkaran panjang',
 'deadendpages' => 'Tutungkaran buntu',
 'deadendpagestext' => 'Tutungkaran barikut kada bataut ka tutungkaran lain pada {{SITENAME}}.',
 'protectedpages' => 'Tutungkaran nang dilindungi',
-'protectedpages-indef' => 'Hanya gasan palindungan lawan jangka waktu kada tabatas',
+'protectedpages-indef' => 'Wastu gasan palindungan lawan jangka waktu kada bawatas',
 'protectedpages-cascade' => 'Palindungan barénténg haja',
 'protectedpagestext' => 'Tutungkaran barikut dilindungi matan pamindahan atawa pambabakan',
 'protectedpagesempty' => 'Kadada tutungkaran nang masih dilindungi awan paramitir ngitu.',
@@ -1937,7 +1957,7 @@ File-file berikut digunakan tapi tidak ada. File dari repositori asing dapat ter
 'usereditcount' => '$1 {{PLURAL:$1|babakan|bababakan}}',
 'usercreated' => '{{GENDER:$3|Diulah}} pada $1 pukul $2',
 'newpages' => 'Tungkaran hanyar',
-'newpages-username' => 'Ngaran pamuruk:',
+'newpages-username' => 'Ngaran pamakai:',
 'ancientpages' => 'Tutungkaran panuhanya',
 'move' => 'Pindahakan',
 'movethispage' => 'Pindahakan tungkaran ini',
@@ -1948,7 +1968,7 @@ Muhun catat bahwasa situs web lain pina-ai bataut ka sabuah barakas awan sabuah
 'notargettext' => 'Pian kada maajuakan sabuah tungkaran atawa pamuruk sasaran malakuakan palakuan ini.',
 'nopagetitle' => 'Kadada tungkaran sasaran',
 'nopagetext' => 'Tungkaran sasaran nang Pian ajuakan kadada.',
-'pager-newer-n' => '{{PLURAL:$1|tahanyar 1|tahanyar $1}}',
+'pager-newer-n' => '{{PLURAL:$1|labih hanyar 1|labih hanyar $1}}',
 'pager-older-n' => '{{PLURAL:$1|talawas 1|talawas $1}}',
 'suppress' => 'Pangawasan',
 'querypage-disabled' => 'Tungkaran istimiwa ngini dikada-kawakan gasan alasan ginawi.',
@@ -1969,6 +1989,7 @@ Muhun catat bahwasa situs web lain pina-ai bataut ka sabuah barakas awan sabuah
 Pian kada mawatasi tiringan lawan mamilih sabuah macam log, ngaran-pamuruk (sansitip kapital), atawa tungkaran tapangaruh (sansitip kapital jua).',
 'logempty' => 'Kadada barang nang parsis pintang log.',
 'log-title-wildcard' => 'Gagai judul ba-awalan awan naskah ngini',
+'showhideselectedlogentries' => 'Tampaiakan/sungkupakan masukan log tapilih',
 
 # Special:AllPages
 'allpages' => 'Samunyaan tungkaran',
@@ -1979,18 +2000,18 @@ Pian kada mawatasi tiringan lawan mamilih sabuah macam log, ngaran-pamuruk (sans
 'allpagesto' => 'Manampaiakan ujung pahabisan tungkaran:',
 'allarticles' => 'Samunyaan tungkaran',
 'allinnamespace' => 'Sabarataan tutungkaran (ngaran-kamar $1)',
-'allnotinnamespace' => 'Sabarataan tutungkaran (lainan di ngaran-kamar $1)',
+'allnotinnamespace' => 'Sabarataan tutungkaran (lainan di ruang-ngaran $1)',
 'allpagesprev' => 'Sabalumnya',
 'allpagesnext' => 'Dudi',
 'allpagessubmit' => 'Tulak',
 'allpagesprefix' => 'Tampilakan tutungkaran bamula lawan:',
 'allpagesbadtitle' => 'Judul tungkaran nang dibari kada sah atawa baisi sabuah awalan antar-bahasa atawa antar-wiki.
 Nangini bisa baisi satu atawa labih karaktir nang saharusnya kadada di judul.',
-'allpages-bad-ns' => '{{SITENAME}} kada baisi ngaran-kamar "$1".',
-'allpages-hide-redirects' => 'Sambunyiakan paalihan',
+'allpages-bad-ns' => '{{SITENAME}} kada baisi ruang-ngaran "$1".',
+'allpages-hide-redirects' => 'Sungkupakan paugahan',
 
 # SpecialCachedPage
-'cachedspecial-refresh-now' => 'Itihi tahanyar.',
+'cachedspecial-refresh-now' => 'Itihi ralatan pahanyarnya.',
 
 # Special:Categories
 'categories' => 'Tutumbung',
@@ -2009,7 +2030,7 @@ Janaki jua [[Special:WantedCategories|tutumbung nang dihandaki]].',
 # Special:LinkSearch
 'linksearch' => 'Manggagai tautan luar',
 'linksearch-pat' => 'Gagai bapola:',
-'linksearch-ns' => 'Ngaran-kamar:',
+'linksearch-ns' => 'Ruang-ngaran:',
 'linksearch-ok' => 'Gagai',
 'linksearch-text' => 'Kartu liar nangkaya "*.wikipedia.org" hingkat diguna\'akan.
 Mamarlukan sadikitnya asa ranah tingkat atas, misalnya "*.org".<br />
@@ -2023,15 +2044,6 @@ Protokol nang didukung: <code>$1</code> (jangan tambahakan dalam panggagaian Pia
 'listusers-noresult' => 'Kadada pamuruk tatamu.',
 'listusers-blocked' => '(diblukir)',
 
-# Special:ActiveUsers
-'activeusers' => 'Daptar pamuruk aktip',
-'activeusers-intro' => 'Ngini adalah sabuah daptar papamuruk sabuah bantuk kagiatan dalam tauncit $1 {{PLURAL:$1|hari|hahari}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|babak|babakan}} dalam tauncit {{PLURAL:$3|hari|$3 hahari}}',
-'activeusers-from' => 'Manampaiakan papamuruk mulai matan:',
-'activeusers-hidebots' => 'Sungkupakan bot',
-'activeusers-hidesysops' => 'Sungkupakan pambakal',
-'activeusers-noresult' => 'Kadada papamuruk tatamu.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Galambang hak pamuruk',
 'listgrouprights-summary' => 'Barikut adalah sabuah daptar matan galambang pamuruk nang ada di wiki ngini, lawan hak ungkai masing-masing.
@@ -2095,22 +2107,22 @@ Alamat sril Pian pintang [[Special:Preferences|kakatujuan pamuruk Pian]] akan cu
 'watchnologin' => 'Baluman babuat log',
 'watchnologintext' => 'Pian musti [[Special:UserLogin|babuat log]] amun handak magaganti daptar itihan Pian.',
 'addwatch' => 'Tambahi ka daptar itihan',
-'addedwatchtext' => "Tungkaran \"[[:\$1]]\" sudah ditambahakan ke [[Special:Watchlist|daptar itihan]] Pian.
-Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran taraitnya akan takambit di sia, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar parubahan tahanyar]] cagar labih mudah diitihi.",
+'addedwatchtext' => "Tungkaran \"[[:\$1]]\" sudah ditambahakan ka [[Special:Watchlist|daptar itihan]] Pian.
+Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran taraitnya akan takambit di sini, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar paubahan pahanyarnya]] cagar labih mudah diitihi.",
 'removewatch' => 'Buang matan daptar itihan',
 'removedwatchtext' => 'Tungkaran "[[:$1]]" sudah dihapus matan [[Special:Watchlist|daptar itihan]] Pian.',
 'watch' => 'Itih',
 'watchthispage' => 'Itihi tungkaran ini',
 'unwatch' => 'walang maitihi',
 'unwatchthispage' => 'Mandak maitihi',
-'notanarticle' => 'Lainan sabuah tungkaran isi',
+'notanarticle' => 'Lainan sabuting tungkaran isi',
 'notvisiblerev' => 'Ralatan tauncit ulih saurang pamuruk babida sudah dihapus',
 'watchnochange' => 'Kadada nang Pian itihi dibabak parhatan jangka wayah ngitu.',
 'watchlist-details' => '{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.',
 'wlheader-enotif' => 'Suril pamadahan dipajahi.',
 'wlheader-showupdated' => "* Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
-'watchmethod-recent' => 'pariksa bababakan tahanyar gasan tungkaran nang diitihi.',
-'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan tahanyar',
+'watchmethod-recent' => 'pariksa bababakan pahanyarnya gasan tungkaran nang diitihi.',
+'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya',
 'watchlistcontains' => 'Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.',
 'iteminvalidname' => "Masalah awan barang '$1', bangaran kada sah...",
 'wlnote' => "Di bawah naya adalah {{PLURAL:$1|paubahan|'''$1''' paubahan}} tauncit dalam '''$2''' jam tauncit, par $3, $4.",
@@ -2120,14 +2132,24 @@ Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran tara
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Maitihi...',
 'unwatching' => 'Kada jadi maitihi...',
-'watcherrortext' => 'Sabuah kasalahan tajadi parhatan setelan paitihan Pian diubah gasan "$1".',
+'watcherrortext' => 'Sabuting kasalahan tajadi parhatan setelan paitihan Pian diubah gasan "$1".',
 
 'enotif_mailer' => 'Panyurili pamadahan {{SITENAME}}',
 'enotif_reset' => 'Tandai samunyaan tutungkaran sudah diilangi',
 'enotif_impersonal_salutation' => 'Pamuruk {{SITENAME}}',
-'enotif_lastvisited' => 'Janaki $1 gasan samunyaan parubahan mula Pian pauncitan tadi bailang.',
-'enotif_lastdiff' => 'Janaki $1 hagaan maniringi parubahan ngini.',
-'enotif_anon_editor' => 'pamuruk kada-bangaran $1',
+'enotif_subject_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus ulih {{gender:$2|$2}}',
+'enotif_subject_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah ulih {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan ulih {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan ulih {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah ulih {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3.',
+'enotif_body_intro_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_lastvisited' => 'Janaki $1 gasan samunyaan paubahan mula Pian pauncitan tadi bailang.',
+'enotif_lastdiff' => 'Janaki $1 hagan maniringi paubahan ngini.',
+'enotif_anon_editor' => 'pamakai kada-bangaran $1',
 'enotif_body' => 'Halo $WATCHINGUSERNAME,
 
 
@@ -2141,13 +2163,13 @@ Hubungi pambabak:
 suril: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Kami kada akan mangirim pambaritahuan lain amun ada parubahan labih lanjut sampai Pian mailangi tungkaran ngini.
-Pian kawa jua manyetel-pulang bandira pambaritahuan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.
+Kami kada akan mangirim pamadahan lain amun ada paubahan labih lanjut sampai Pian mailangi tungkaran ngini.
+Pian kawa jua manyetel-pulang bandira pamadahan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.
 
-Sistem kakawalan pambaritahuan {{SITENAME}} Pian
+Sistem kakawalan pamadahan {{SITENAME}} Pian
 
 --
-Hagan maubah setelan suril pambaritahuan Piann, ilangi
+Hagan maubah setelan suril pamadahan Piann, ilangi
 {{canonicalurl:{{#special:Preferences}}}}
 
 Hagan maubah setelan paitihan Pian, ilangi
@@ -2167,14 +2189,14 @@ kitihan-bulik wan pangganian labih jauh:
 'exblank' => 'tungkaran dikusungakan',
 'delete-confirm' => 'Hapus "$1"',
 'delete-legend' => 'Hapus',
-'historywarning' => "'''Paringatan:''' Tungkaran nang Pian pasal hagan hapus baisi sabuah halam sakitar $1 {{PLURAL:$1|ralatan|raralatan}}:",
-'confirmdeletetext' => 'Pian handak mahapus sabuah tungkaran awan samunyaan halamnya.
-Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
+'historywarning' => "'''Paringatan:''' Tungkaran nang akan Pian hapus baisi sabuting sajarah lawan $1 {{PLURAL:$1|ralatan|raralatan}}:",
+'confirmdeletetext' => 'Pian handak mahapus sabuting tungkaran awan samunyaan sajarahnya.
+Pastiakan amun Pian handak manggawi ngini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
 'actioncomplete' => 'Pa-ulahan tuntung',
 'actionfailed' => 'Palakuan luput',
-'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
+'deletedtext' => '"$1" sudah dihapus. Lihati $2 gasan log pahanyarnya tungkaran nang sudah hapus.',
 'dellogpage' => 'Log pahapusan',
-'dellogpagetext' => 'Di bawah ngini adalah sabuah daptar matan pahapusan hahanyar ni.',
+'dellogpagetext' => 'Di bawah ngini sabuting daptar matan pahapusan pahanyarnya.',
 'deletionlog' => 'log pahapusan',
 'reverted' => 'Dibulikakan ka raralatan tadamini',
 'deletecomment' => 'Alasan:',
@@ -2185,8 +2207,8 @@ Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, w
 ** Parumpakan hak rekap
 ** Vandalisma',
 'delete-edit-reasonlist' => 'Babak alasan pahapusan',
-'delete-toobig' => 'Tungkaran ngini baisi sabuah halam ganal, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
-Pahapusan tutungkaran kaini dibatasi hagan mancagah parusakan mandadak di {{SITENAME}}.',
+'delete-toobig' => 'Tungkaran ngini baisi sabuting sajarah pambabakan nang panjang, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
+Pahapusan tutungkaran kaini dibatasi hagan mancagah parakaian bakajutan di {{SITENAME}}.',
 'delete-warning-toobig' => 'Tungkaran ngini baisi halam babakan ganal, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
 Mahapus ngini kawa mangaruhi databasis oparasi {{SITENAME}};
 jalanakan awan ba-a-awas.',
@@ -2210,14 +2232,14 @@ diubah bulik ka ralatan tauncit ulih $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Sesi luput',
-'sessionfailure' => 'Pinanya ada sabuah masalah awan sesi babuat loh Pian;
-Palakuan ngini sudah diwalangi sawagai pra-awasan malawan sesi pambajakan.
+'sessionfailure' => 'Pinanya ada sabuting masalah awan sesi babuat log Pian;
+Tindakan ngini sudah diwalangi sawagai pra-awasan malawan sesi pambajakan.
 Tulak babulik ka tungkaran sabalumnya, muat-pulang tungkaran ngitu wan lalu-ai cuba pulang.',
 
 # Protect
 'protectlogpage' => 'Log palindungan',
-'protectlogtext' => 'Di bawah adalah sabuah daptar parubahan ka parlindungan tungkaran.
-Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parlindungan tungkaran tadamini.',
+'protectlogtext' => 'Di bawah adalah sabuting daptar paubahan ka palindungan tungkaran.
+Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar palindungan tungkaran tadamini.',
 'protectedarticle' => "malindungi ''[[$1]]''",
 'modifiedarticleprotection' => 'maubah tingkat perlindungan "[[$1]]"',
 'unprotectedarticle' => 'mahilangakan palindungan "[[$1]]"',
@@ -2225,8 +2247,10 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parli
 'protect-title' => 'Malindungi "$1"',
 'protect-title-notallowed' => 'Tiringi tingkat parlindungan matan "$1"',
 'prot_1movedto2' => '[[$1]] dipindahakan ka [[$2]]',
-'protect-badnamespace-title' => 'Ngaran-kamar nang kada-dilindungi',
-'protect-badnamespace-text' => 'Tutungkaran dalam ngaran-kamar ngini kada kawa dilindungi.',
+'protect-badnamespace-title' => 'Ruang-ngaran nang kada-dilindungi',
+'protect-badnamespace-text' => 'Tutungkaran dalam ruang-ngaran ngini kada kawa dilindungi.',
+'protect-norestrictiontypes-text' => 'Tungkaran ngini kada kawa dilindungi marga kadada janis pambatasan nang tasadia.',
+'protect-norestrictiontypes-title' => 'Tungkaran kada-dilindungi',
 'protect-legend' => 'Konpirmasi palindungan',
 'protectcomment' => 'Alasan:',
 'protectexpiry' => 'Kadaluwarsa:',
@@ -2236,16 +2260,16 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parli
 'protect-text' => "Pian kawa maniring atawa mangganti tingkatan palindungan gasan tungkaran '''$1''' di sia.",
 'protect-locked-blocked' => "Pian kada kawa maubah tingkat parlindungan parhatan diblukir.
 Di sia adalah setelan tadamini gasan tungkaran '''$1''':",
-'protect-locked-dblock' => "Tingkat parlindungan kada kawa diubah karana ada sabuah sunduk databasis aktip.
-Di sia adalah setelan tadamini gasan tungkaran '''$1''':",
+'protect-locked-dblock' => "Tingkat palindungan kada kawa diubah marga ada sabuting sunduk databasis aktip.
+Di sia adalah setelan pahanyarnya gasan tungkaran '''$1''':",
 'protect-locked-access' => "Akun Pian kada baisi ijin gasan maubah tingkatan palindungan tungkaran.
 Di sia adalah pangaturan wayah ini gasan tungkaran '''$1''':",
 'protect-cascadeon' => 'Tungkaran ini rahatan dilindungi lantaran diumpatakan dalam {{PLURAL:$1|tungkaran|tungkaran-tungkaran}} barikut nang sudah aktip palindungan barénténgnya.
 Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacang mangaruhi palindungan barénténg.',
 'protect-default' => 'Bulihakan samua pamuruk',
-'protect-fallback' => 'Mamarluakan ijin "$1"',
-'protect-level-autoconfirmed' => 'Blukir pamuruk hanyar wan kada tadaptar',
-'protect-level-sysop' => 'Hanya pambakal',
+'protect-fallback' => 'Wastu gasan pamakai lawan ijin "$1"',
+'protect-level-autoconfirmed' => 'Blukir pamakai hanyar wan kada tadaptar',
+'protect-level-sysop' => 'Wastu pambakal',
 'protect-summary-cascade' => 'barénténg',
 'protect-expiring' => 'kadaluwarsa $1 (UTC)',
 'protect-expiring-local' => 'kadaluwarsa $1',
@@ -2286,15 +2310,14 @@ Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacan
 'undeletepage' => 'Tiringi wan bulikakan tutungkaran tahapus',
 'undeletepagetitle' => "'''Barikut mangandung raralatan tahapus matan [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Tiringi tutungkaran tahapus',
-'undeletepagetext' => 'Barikut {{PLURAL:$1|tungkaran sudah dihapus tagal|$1 tutungkaran sudah dihapus tagal}} masih dalam arkip wan kawa disimpan-pulang.
-Arkip kawa dibarasihakan bajangka.',
+'undeletepagetext' => 'Barikut {{PLURAL:$1|tungkaran sudah dihapus tagal|$1 tutungkaran sudah dihapus tagal}} masih dalam arsip wan kawa dibulikakan.
+Arsip kawa dibarasihakan bajangka.',
 'undelete-fieldset-title' => 'Mambulikakan ralatan',
-'undeleteextrahelp' => "Hagan manyimpan-pulang sabarataan halam tungkaran, tingalakan samunyaan kutak-pariksa kada-dipilih wan klik '''''{{int:undeletebtn}}'''''.
-Hagan manggawi sabuah simpan-pulang, pariksa kukutak tahubung ka raralatan nang handak disimpan-pulang, wan klik
-'''''{{int:undeletebtn}}'''''.",
+'undeleteextrahelp' => "Hagan mambulikakan sabarataan sajarah halam tungkaran, tinggalakan samunyaan kutak-pariksa kada-dipilih wan klik '''''{{int:undeletebtn}}'''''.
+Hagan manggawi sabuting pambulikan, pariksa kukutak tahubung ka raralatan nang handak dibulikakan, wan klik '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => "$1 {{PLURAL:$1|ralatan|raralatan}} ta'arsip",
-'undeletehistory' => 'Amun Pian manyimpan-pulang tungkaran ngini, samunyaan raralatan akan tasimpan-pulang ka halamnya.
-Amun sabuah tungkaran puga awan ngaran sama diulah parhatan pahapusan, raralatan nang disimpan-pulang akan cungul dalam halam sabalumnya.',
+'undeletehistory' => 'Amun Pian mambulikakan tungkaran ngini, samunyaan raralatan akan dibulikakan ka sajarah ralatannya.
+Amun sabuting tungkaran hanyar awan ngaran sama diulah parhatan pahapusan, raralatan nang dibulikakan akan cungul dalam sajarah ralatan sabalumnya.',
 'undeleterevdel' => 'Lapas-hapusan kada akan digawi amun ngini akan kulihan di tungkaran atas atawa barakas ralatan sapalih tahapus.
 Dalam kasus kaini, Pian musti malapas-pariksa atawa lapas-sambunyi pahapusan ralatan pahanyarnya.',
 'undeletehistorynoadmin' => 'Tungkaran ngini sudah tahapus.
@@ -2302,7 +2325,7 @@ Alasan pahapusan ditampaiakan dalam kasimpulan di bawah, baimbai awan rarincian
 Naskah aktual pada raralatan pahapusan ngini ada hagan pambakal haja.',
 'undelete-revision' => 'Ralatan tahapus matan $1 (pada $4, $5) ulih $3:',
 'undeleterevision-missing' => 'Raralatan kada sah atawa hilang.
-Pian kalu-ai baisi tautan buruk, atawa ralatan sudah disimpan-pulang atau dibuang matan arkip.',
+Pian kalu-ai baisi tautan buruk, atawa ralatan sudah dibulikakan atau dibuang matan arsip.',
 'undelete-nodiff' => 'Kadada ralatan sabalumnya tatamu.',
 'undeletebtn' => 'Bulikakan',
 'undeletelink' => 'tiring/bulikakan',
@@ -2315,8 +2338,8 @@ Pian kalu-ai baisi tautan buruk, atawa ralatan sudah disimpan-pulang atau dibuan
 'undeletedfiles' => '$1 {{PLURAL:$1|barakas|babarakas}} dibulikakan',
 'cannotundelete' => 'Walang mahapus gagal;
 ada urang lain nang badahulu mawalangi pahapusan tungkaran ngini.',
-'undeletedpage' => "'''$1 sudah disimpan-pulang'''
-Janaki [[Special:Log/delete|log pahapusan]] gasan sabuah rakaman matan pahapusan wan panyimpanan-pulang.",
+'undeletedpage' => "'''$1 sudah dibulikakan'''
+Janaki [[Special:Log/delete|log pahapusan]] gasan sabuting rakaman matan pahapusan wan pambulikakan.",
 'undelete-header' => 'Janaki [[Special:Log/delete|log pahapusan]] gasan tutungkaran hanyar tahapus.',
 'undelete-search-title' => 'Gagai tutungkaran tahapus',
 'undelete-search-box' => 'Gagai tutungkaran tahapus',
@@ -2337,11 +2360,11 @@ $1',
 'undelete-show-file-submit' => 'Iya-ai',
 
 # Namespace form on various pages
-'namespace' => 'Ngaran-kamar:',
+'namespace' => 'Ruang-ngaran:',
 'invert' => 'Bulikakan pilihan',
-'tooltip-invert' => 'Pariksa kutak ngini hagan manyungkupakan parubahan tutungkaran dalam ngaran-kamar tapilih (wan ngaran-kamar tarait anub dipariksa)',
-'namespace_association' => 'Ngaran-kamat tarait',
-'tooltip-namespace_association' => 'Pariksa kutak ngini hagan maumpatakan jua ngarn-kamar pamandiran atawa judul tarait awan ngaran-kamar tapilih',
+'tooltip-invert' => 'Pariksa kutak ngini hagan manyungkupakan paubahan tutungkaran dalam ruang-ngaran tapilih (wan ruang-ngaran tarait jaka dipariksa)',
+'namespace_association' => 'Ruang-ngaran tarait',
+'tooltip-namespace_association' => 'Pariksa kutak ngini hagan maumpatakan jua ruang-ngaran pamandiran atawa judul tarait awan ruang-ngaran tapilih',
 'blanknamespace' => '(Tatambaian)',
 
 # Contributions
@@ -2349,14 +2372,14 @@ $1',
 'contributions-title' => 'Sumbangan pamakai gasan $1',
 'mycontris' => 'Sumbangan ulun',
 'contribsub2' => 'Gasan $1 ($2)',
-'nocontribs' => 'Kadada parubahan taugai parsis awan karitaria ngini.',
+'nocontribs' => 'Kadada paubahan nang rasuk lawan syarat itu.',
 'uctop' => ' (atas)',
 'month' => 'Matan bulan (wan sabalumnya):',
 'year' => 'Matan tahun (wan sabalumnya):',
 
 'sp-contributions-newbies' => 'Tampaiakan sumbangan papamakai hanyar haja',
 'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
-'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
+'sp-contributions-newbies-title' => 'Sumbangan pamakai gasan akun hanyar',
 'sp-contributions-blocklog' => 'Log blukir',
 'sp-contributions-deleted' => 'Tahapus sumbangan pamuruk',
 'sp-contributions-uploads' => 'hunggahan',
@@ -2369,7 +2392,7 @@ Log blukir pahabisannya tasadia di bawah ni gasan rujukan:',
 Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'sp-contributions-search' => 'Gagai gasan sumbangan',
 'sp-contributions-username' => 'Alamat IP atawa ngaran-pamakai:',
-'sp-contributions-toponly' => 'Tampaiakan hanya ralatan tauncit',
+'sp-contributions-toponly' => 'Tampaiakan wastu ralatan nang paling atas (pauncitnya)',
 'sp-contributions-submit' => 'Gagai',
 
 # What links here
@@ -2378,7 +2401,7 @@ Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'whatlinkshere-page' => 'Tungkaran:',
 'linkshere' => "Tungkaran-tungkaran barikut batautan ka '''[[:$1]]''':",
 'nolinkshere' => "Kadada tutungkaran tataut ka '''[[:$1]]'''.",
-'nolinkshere-ns' => "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ngaran-kamar nang dipilih.",
+'nolinkshere-ns' => "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ruang-ngaran nang dipilih.",
 'isredirect' => 'tungkaran paugahan',
 'istemplate' => 'transklusi',
 'isimage' => 'tautan barakas',
@@ -2547,21 +2570,21 @@ Hagan manyunduk atawa malapas-sunduk data basis, parlu dkawa-akan manulis ulih w
 # Move page
 'move-page' => 'Pindahakan $1',
 'move-page-legend' => 'Pindahakan tungkaran',
-'movepagetext' => "Mamuruk purmulir di bawah akan mangganti ngaran sabuah tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuah tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.
+'movepagetext' => "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.
 
-Catatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.
+Catatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuting paugahan wan kadada halam babakan.
 
 '''Paringatan!'''
-Ini kawa maakibatakan parubahan kada taduga wan drastis gasan sabuah tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
-'movepagetext-noredirectfixer' => "Mamuruk purmulir di bawah akan mangganti ngaran sabuah tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.
-Judul lawas akan jadi sabuah tungkaran paugahan ka judul hanyar.
+Ini kawa maakibatakan paubahan kada taduga wan drastis gasan sabuting tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
+'movepagetext-noredirectfixer' => "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.
+Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar.
 Pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]].
 Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.
 
 Catatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.
 
 '''Paringatan!'''
-Ini kawa maakibatakan parubahan kada taduga wan drastis gasan sabuah tungkaran rami; 
+Ini kawa maakibatakan paubahan kada taduga wan drastis gasan sabuah tungkaran rami; 
 muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
 'movepagetalktext' => "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''
 *Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa
@@ -2577,7 +2600,7 @@ muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
 'newtitle' => 'Ka judul hanyar:',
 'move-watch' => 'Itihi tungkaran asal mula wan tungkaran tujuan',
 'movepagebtn' => 'Pindahakan tungkaran',
-'pagemovedsub' => 'Pamindahan ruhui',
+'pagemovedsub' => 'Sudah dipindah',
 'movepage-moved' => '\'\'\'"$1" sudah dipindahakan ka "$2"\'\'\'',
 'movepage-moved-redirect' => 'Tungkaran paugahan sudah diulah.',
 'movepage-moved-noredirect' => 'Paulahan sabuah paugahan ditikin.',
@@ -2612,6 +2635,7 @@ kada kawa mamindah sabuah tungkaran ka tungkaran ngitu jua.',
 'immobile-target-namespace-iw' => 'Tautan interwiki adalah lainan sabuah tujuan sah gasan mamindahakan tungkaran.',
 'immobile-source-page' => 'Tungkaran ngini kada kawa dipindahakan.',
 'immobile-target-page' => 'Kada kawa mamindahakan ka judul tujuan ngitu.',
+'bad-target-model' => "Tujuan nang dihandaki mengguna'akan model konten nang babida. Kada kawa mamindah matan $1 gasan $2 .",
 'imagenocrossnamespace' => 'Kada kawa mamindahakan barakas ka ngaran-kamar lainan-barakas.',
 'nonfile-cannot-move-to-file' => 'Kada kawa mamindahakan lainan-barakas ka ngaran-kamar barakas',
 'imagetypemismatch' => 'Ekstensi barakas hanyar kada cucuk lawa macamnya.',
@@ -2634,7 +2658,7 @@ Ngini kawa di-impur dalam wiki lain mamuruk MediaWiki lung [[Special:Import|tung
 
 Hagan ma-ikspur tutungkaran, buati judul dalam kutak naskah di bawah, asa judul par garis, wan pilihi nang mana Pian handak ralatan tadamini nangkaitu jua samunyaan raralatan lawas, awan garis tungkaran halam, atawa ralatan tadamini awan panjalasan pasal babakan ta-uncit.
 
-Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] gasan tungkaran "[[{{MediaWiki:Mainpage}}]]".',
+Dalam kasus pahanyarnya Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] gasan tungkaran "[[{{MediaWiki:Mainpage}}]]".',
 'exportall' => 'Ekspor samunyaan tungkaran.',
 'exportcuronly' => 'Tamasuk ralatan tadamini haja, kada sahibakan halam',
 'exportnohistory' => "----
@@ -2643,7 +2667,7 @@ Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Spec
 'export-submit' => 'Pangaluar',
 'export-addcattext' => 'Tambahi tutungkaran matan tumbung:',
 'export-addcat' => 'Tambahi',
-'export-addnstext' => 'Tambahi tutungkaran matan ngaran-kamar:',
+'export-addnstext' => 'Tambahi tutungkaran matan ruang-ngaran:',
 'export-addns' => 'Tambahi',
 'export-download' => 'Simpan sawagai barakas',
 'export-templates' => 'Tamasuk cicitakan',
@@ -2654,8 +2678,8 @@ Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Spec
 'allmessagesname' => 'Ngaran',
 'allmessagesdefault' => 'Naskah baku pasan',
 'allmessagescurrent' => 'Naskah pasan wayahini.',
-'allmessagestext' => 'Ngini adalah sabuah daptar pasan sistem tasadia dalam ngaran-kamar MediaWiki.
-Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan ganarik MediaWiki.',
+'allmessagestext' => 'Ngini adalah sabuah daptar pasan sistem tasadia dalam ruang-ngaran MediaWiki.
+Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan umum MediaWiki.',
 'allmessagesnotsupportedDB' => "Tungkaran ngini kada kawa dipuruk karana '''\$wgUseDatabaseMessages''' sudah dipajahakan.",
 'allmessages-filter-legend' => 'Saringan',
 'allmessages-filter' => 'Saringan lawan kaadaan kustom:',
@@ -2683,14 +2707,15 @@ Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan
 # Special:Import
 'import' => 'Pamasuk tungkaran',
 'importinterwiki' => 'Impur transwiki',
-'import-interwiki-text' => 'Pilihi sabuah wiki wan judul tungkaran hagan di-impur.
+'import-interwiki-text' => 'Pilihi sabuting wiki wan judul tungkaran hagan di-impor.
 Tanggal raralatan wan ngaran pambabak akan di partahanakan.
 Samunyaan gawi impur transwiki akan dicatat pada [[Special:Log/import|log impur]].',
 'import-interwiki-source' => 'Wiki/tungkaran asal mula:',
 'import-interwiki-history' => 'Salin sabarataan halam raralatan gasan tungkaran ngini',
 'import-interwiki-templates' => 'Tamasuk samunyaan cicitakan',
 'import-interwiki-submit' => 'Impur',
-'import-interwiki-namespace' => 'Ngaran-kamar tujuan:',
+'import-interwiki-namespace' => 'Ruang-ngaran tujuan:',
+'import-interwiki-rootpage' => 'Tungkaran turunan tujuan (opsional):',
 'import-upload-filename' => 'Ngaran barakas:',
 'import-comment' => 'Kumintar:',
 'importtext' => 'Muhun ma-ikspur tungkaran matan asal mula wiki mamuruk [[Special:Export|sarana ikspur]].
@@ -2743,7 +2768,7 @@ Muhun cubai pulang.',
 'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
 'tooltip-pt-anontalk' => 'Pamandiran pasal bababakan matan alamat IP ngini',
 'tooltip-pt-preferences' => 'Nang Pian katuju',
-'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi parubahannya',
+'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi paubahannya',
 'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
 'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
 'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
@@ -2792,11 +2817,13 @@ Muhun cubai pulang.',
 'tooltip-ca-nstab-help' => 'Tiringi tungkaran patulung',
 'tooltip-ca-nstab-category' => 'Lihati tungkaran tumbung',
 'tooltip-minoredit' => 'Tandai ini sabagai sabuah pambabakan sapalih',
-'tooltip-save' => 'Simpan parubahan Pian',
-'tooltip-preview' => 'Tilik parubahan Pian, muhun pakai ngini sabalum manyimpan!',
-'tooltip-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
+'tooltip-save' => 'Simpan paubahan Pian',
+'tooltip-preview' => 'Tilik paubahan Pian, muhun pakai ngini sabalum manyimpan!',
+'tooltip-diff' => 'Tampaiakan nang apa paubahan nang Pian ulah',
 'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ngini',
 'tooltip-watch' => 'Tambahakan tungkaran ini ka daptar itihan Pian',
+'tooltip-watchlistedit-normal-submit' => 'Hapus judul',
+'tooltip-watchlistedit-raw-submit' => 'Hanyari daptar itihan',
 'tooltip-recreate' => 'Ulah pulang tungkaran biar gin suah dihapus',
 'tooltip-upload' => 'Mulai pangunggahan',
 'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.',
@@ -2827,25 +2854,66 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
 'spambot_username' => 'Pambarasihan spam MediaWiki',
 'spam_reverting' => 'Mambulikakan ka ralatan tauncit nang kada mangandung tatautan ka $1',
 'spam_blanking' => 'Samunyaan raralatan mangandung tatautan ka $1, dikusungakan',
+'spam_deleting' => 'Samunyaan raralatan nang isinya tatautan ka $1, dipuangakan',
 
 # Info page
 'pageinfo-title' => "Panjalasan gasan ''$1''",
-'pageinfo-header-edits' => 'Babakan',
+'pageinfo-not-current' => 'Maaf, kada mungkin mambariakan maklumat ngini ka ralatan lawas.',
+'pageinfo-header-basic' => 'Maklumat pandal',
+'pageinfo-header-edits' => 'Sajarah babakan',
+'pageinfo-header-restrictions' => 'Palindungan tungkaran',
+'pageinfo-header-properties' => 'Properti tungkaran',
+'pageinfo-display-title' => 'Judul tampilan',
+'pageinfo-default-sort' => 'Kunci urut baku',
+'pageinfo-length' => 'Panjang tungkaran (dalam bita)',
+'pageinfo-article-id' => 'ID Tungkaran',
+'pageinfo-language' => 'Bahasa isi tungkaran',
+'pageinfo-robot-policy' => 'Status masin panggagai',
+'pageinfo-robot-index' => 'Kawa diindeks',
+'pageinfo-robot-noindex' => 'Kada kawa diindeks',
 'pageinfo-views' => 'Rikinan titiringan',
-'pageinfo-watchers' => 'Jumlah papaitih',
+'pageinfo-watchers' => 'Jumlah pa-itih tungkaran',
+'pageinfo-few-watchers' => 'Kurang matan $1 {{PLURAL:$1|pa-ilang}}',
+'pageinfo-redirects-name' => 'Paugahan ka tungkaran ngini',
+'pageinfo-subpages-name' => 'Subtungkaran tungkaran ngini',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|paugahan|paugahan}}; $3 {{PLURAL:$3|non-paugahan|non-paugahan}})',
+'pageinfo-firstuser' => 'Pa-ulah tungkaran',
+'pageinfo-firsttime' => 'Tanggal paulahan tungkaran',
+'pageinfo-lastuser' => 'Pambabak pauncitnya',
+'pageinfo-lasttime' => 'Tanggal babakan pauncitnya',
 'pageinfo-edits' => 'Rikinan babakan',
-'pageinfo-authors' => 'Rikinan panulis balain',
+'pageinfo-authors' => 'Rikinan panulis nang balain',
+'pageinfo-recent-edits' => 'Jumlah babakan damini (dalam $1 pauncitnya)',
+'pageinfo-recent-authors' => 'Jumlah panulis nang babida damini',
+'pageinfo-magic-words' => '{{PLURAL:$1|Kata|Kata}} ajaib ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|tumbung|tutumbung}}',
+'pageinfo-templates' => '{{PLURAL:$1|Citakan|Citakan}} nang ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Tungkaran|Tutungkaran}} ditransklusikan pada ( $1 )',
+'pageinfo-toolboxlink' => 'Maklumat tungkaran',
+'pageinfo-redirectsto' => 'Ba-ugah ka',
+'pageinfo-redirectsto-info' => 'Maklumat',
+'pageinfo-contentpage' => 'Dirikin sabagai tungkaran isi',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Palindungan baurutan matan sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Palindungan mulai matan',
+'pageinfo-category-info' => 'Tumbung maklumat',
+'pageinfo-category-pages' => 'Jumlah tungkaran',
+'pageinfo-category-subcats' => 'Jumlah subtumbung',
+'pageinfo-category-files' => 'Jumlah babarakas',
 
 # Patrolling
 'markaspatrolleddiff' => 'Ciri-i sawagai ta-awasi',
 'markaspatrolledtext' => 'Ciri-i tungkaran ngini sawagai ta-awasi',
 'markedaspatrolled' => 'taciri-i sawagai ta-awasi',
 'markedaspatrolledtext' => 'Ralatan tapilih matan [[:$1]] sudah diciri-i sawagai ta-awasi.',
-'rcpatroldisabled' => 'Parubahan pangawasan tadamini dipajahakan.',
-'rcpatroldisabledtext' => 'Pitur parubahan pangawasan tadamini parhatan ni dipajahakan.',
+'rcpatroldisabled' => 'Pangawasan paubahan pahanyarnya dipajahakan.',
+'rcpatroldisabledtext' => 'Fitur paubahan pangawasan pahanyarnya parhatan ni dipajahakan.',
 'markedaspatrollederror' => 'Kada kawa diciri-i sawagai ta-awasi',
 'markedaspatrollederrortext' => 'Pian parlu manantuakan sabuah ralatan hagan diciri-i sawagai ta-awasi.',
-'markedaspatrollederror-noautopatrol' => 'Pian kada dibulihakan manyiri-i parubahan Pian surang sawagai ta-awasi.',
+'markedaspatrollederror-noautopatrol' => 'Pian kada dibulihakan manyiri-i paubahan Pian surang sawagai ta-awasi.',
+'markedaspatrollednotify' => 'Paubahan ngini gasan $1 hudah ditandai ta-itihi.',
+'markedaspatrollederrornotify' => 'Manandai sabagai paitihan nang gagal.',
 
 # Patrol log
 'patrol-log-page' => 'Log pa-awasan',
@@ -2865,7 +2933,7 @@ $1',
 
 # Browsing diffs
 'previousdiff' => '← Ralatan talawas',
-'nextdiff' => 'Ralatan tahanyar →',
+'nextdiff' => 'Ralatan labih hanyar →',
 
 # Media information
 'mediawarning' => "'''Paringatan''': Barakas ngini pinanya mangandung kudi babahaya.
@@ -2956,7 +3024,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-primarychromaticities' => 'Krumatisitas matan warna primar',
 'exif-ycbcrcoefficients' => 'Kuipisian kamar kelir transpurmasi matriks',
 'exif-referenceblackwhite' => 'Nilai rujukan sapasang hirang wan putih',
-'exif-datetime' => 'Tanggal wan wayah parubahan barakas',
+'exif-datetime' => 'Tanggal wan wayah paubahan barakas',
 'exif-imagedescription' => 'Judul gambar',
 'exif-make' => 'Pabrikan kudakan',
 'exif-model' => 'Mudil kudakan',
@@ -3460,8 +3528,8 @@ Cubai titilikan nurmal.',
 Cubai titilikan nurmal.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Parubahan tahanyar pada $1 {{PLURAL:$1|ditik|diditik}} pinanya kada cungul di daptar ngini.',
-'lag-warn-high' => 'Karana pancaunya kalambatan sarvar databasis, parubahan tahanyar pada {{PLURAL:$1|datik|dadatik}} pina kada ditampaiakan dalam daptar ngini.',
+'lag-warn-normal' => 'Paubahan pahanyarnya pada $1 {{PLURAL:$1|ditik|diditik}} pinanya kada cungul di daptar ngini.',
+'lag-warn-high' => 'Marga pancaunya kalambatan server databasis, paubahan pahanyarnya pada {{PLURAL:$1|datik|dadatik}} pina kada ditampaiakan dalam daptar ngini.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Daptar itihan Pian baisi {{PLURAL:$1|1 judul|$1 judul}}, kada tabuat tutungkaran pamandiran.',
@@ -3486,7 +3554,7 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 judul|$1 jujudul}} dibuangi:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Tampaiakan parubahan tarait',
+'watchlisttools-view' => 'Tampaiakan paubahan tarait',
 'watchlisttools-edit' => 'Tiringi wan babak daptar itihan',
 'watchlisttools-raw' => 'Babak daptar itihan mantah',
 
@@ -3517,11 +3585,12 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
 'version-license' => 'Lisansi',
 'version-poweredby-credits' => "Wiki ngini disukung ulih '''[//www.mediawiki.org/ MediaWiki]''', hak salin © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnya',
-'version-license-info' => 'MediaWiki adalah parangkat lunak bibas; Pian kawa manyabarakan wan/atawa maubahi ngini di bawah syarat Lisansi Publik Umum sawagai tarbitan ulih Free Software Foundation; apakah Lisansi virsi 2, atawa (pilihan Pian) tahanyar.
+'version-credits-summary' => 'Kami ingin ma-akui urang-urang ini atas sumbangan pikiran-tanaga kapada [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki adalah parangkat lunak bibas; Pian kawa manyabarakan wan/atawa maubahi ngini di bawah syarat Lisansi Publik Umum sawagai tarbitan ulih Free Software Foundation; apakah Lisansi virsi 2, atawa (pilihan Pian) pahanyarnya.
 
 MediaWiki disabarakan awan harapan akan baguna, tagal KADA BAJAMINAN; kada jaminan PANIAGAAN atawa KATAPATAN HAGAN TUJUAN TARTANTU. Janaki Lisansi Publik Umum GNU gasan panjalasan rinci.
 
-Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuah salinan Lisansi Publik Umum GNU] baimbai awan prugram ngini; amun kada, tulis ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atawa [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baca ngini daring].',
+Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuting salinan Lisansi Publik Umum GNU] baimbai awan prugram ngini; amun kada, tulis ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atawa [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baca ngini daring].',
 'version-software' => 'Parangkat lunak tapasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Virsi',
@@ -3554,7 +3623,7 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
 'specialpages-group-maintenance' => 'Lapuran pamaliharaan',
 'specialpages-group-other' => 'Tungkaran istimiwa lainnya',
 'specialpages-group-login' => 'Babuat log / mandaptar',
-'specialpages-group-changes' => 'Parubahan tahanyar wan log',
+'specialpages-group-changes' => 'Paubahan pahanyarnya wan log',
 'specialpages-group-media' => 'Lapuran wan pamuatan barakas',
 'specialpages-group-users' => 'Pamuruk wan hak pamuruk',
 'specialpages-group-highuse' => 'Tungkaran pamakaian tinggi',
@@ -3579,17 +3648,17 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
 #Handak samunyaan fragmen regex di atas baris ngini. Tinggalakan baris ngini parsis kaya ngini haja </pre>',
 
 # Special:Tags
-'tags' => 'Tag parubahan sah',
+'tags' => 'Tag paubahan sah',
 'tag-filter' => 'Saringan [[Special:Tags|Tag]]:',
 'tag-filter-submit' => 'Saringan',
 'tags-title' => 'Gantungan',
 'tags-intro' => 'Tungkaran ngini mandaptar gantungan nang diciri-i parangkat lunak sabuah babakan, wan artinya.',
 'tags-tag' => 'Gantungan ngaran',
-'tags-display-header' => 'Pancungulan pada daptar parubahan.',
+'tags-display-header' => 'Pancungulan pada daptar paubahan.',
 'tags-description-header' => 'Diskripsi hibak matan arti',
 'tags-hitcount-header' => 'Gantungan diganti',
 'tags-edit' => 'babak',
-'tags-hitcount' => '$1 {{PLURAL:$1|parubahan|paparubahan}}',
+'tags-hitcount' => '$1 {{PLURAL:$1|paubahan|paubahan}}',
 
 # Special:ComparePages
 'comparepages' => 'Bandingakan tutungkaran',
@@ -3622,7 +3691,7 @@ Situs ngini mangalami kangalihan teknik.',
 'htmlform-int-toohigh' => 'Nilai nang Pian ajuakan kapancauan pada maksimal $1',
 'htmlform-required' => 'Nilai ngini nang diparluakan',
 'htmlform-submit' => 'Kirim',
-'htmlform-reset' => 'Walangi parubahan',
+'htmlform-reset' => 'Walangi paubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
 
 # SQLite database support
index 001d6bf..aa27579 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Aftab1995
  * @author Ali Haidar Khan
  * @author Bellayet
  * @author Ehsanulhb
@@ -100,8 +101,6 @@ $messages = array(
 'tog-shownumberswatching' => 'নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক',
 'tog-oldsig' => 'বর্তমান স্বাক্ষর:',
 'tog-fancysig' => 'স্বাক্ষরকে উইকিটেক্সট হিসেবে মনে করুন (কোন সয়ংক্রিয় লিঙ্ক ছাড়া)',
-'tog-externaleditor' => 'শুরুতেই বহিঃস্থ সম্পাদক ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
-'tog-externaldiff' => 'শুরুতেই বহিঃস্থ পার্থক্য ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
 'tog-showjumplinks' => '"ঝাঁপ দিন" বৈশিষ্ট্যের সংযোগ চালু করা হোক',
 'tog-uselivepreview' => 'তাৎক্ষণিক প্রাকদর্শনের ক্ষমতা চালু করা হোক (জাভাস্ক্রিপ্ট) (পরীক্ষামূলক)',
 'tog-forceeditsummary' => 'খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক',
@@ -115,6 +114,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক',
 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও',
 'tog-norollbackdiff' => 'রোলব্যাকের পরে পার্থক্য দেখিও না',
+'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তন সহ কোনো পাতা ত্যাগের সময় সাবধান করো',
 
 'underline-always' => 'সব সময়',
 'underline-never' => 'কখনো নয়',
@@ -232,7 +232,7 @@ $messages = array(
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস',
 'vector-view-view' => 'পড়ুন',
-'vector-view-viewsource' => 'সà§\8bরà§\8dস দেখুন',
+'vector-view-viewsource' => 'à¦\89à§\8eস দেখুন',
 'actions' => 'কার্যক্রম',
 'namespaces' => 'নামস্থান',
 'variants' => 'বিকল্পসমূহ',
@@ -331,13 +331,13 @@ $1',
 
 'ok' => 'ঠিক আছে',
 'retrievedfrom' => "'$1' থেকে আনীত",
-'youhavenewmessages' => 'আপনার $1 ($2) এসেছে৷',
+'youhavenewmessages' => 'আপনার $1 এসেছে ($2)৷',
 'newmessageslink' => 'নতুন বার্তা',
 'newmessagesdifflink' => 'সর্বশেষ পরিবর্তন',
-'youhavenewmessagesfromusers' => 'আপনি  {{PLURAL:$3|অন্য ব্যবহারকারী|$3 ব্যবহারকারী}} ($2) থেকে $1পেয়েছেন।',
-'youhavenewmessagesmanyusers' => 'আপনি অনেক ব্যবহারকারী ($2) থেকে $1 পেয়েছেন।',
+'youhavenewmessagesfromusers' => 'আপনি {{PLURAL:$3|অন্য ব্যবহারকারীর|$3 ব্যবহারকারীর}} কাছ থেকে $1 পেয়েছেন ($2)।',
+'youhavenewmessagesmanyusers' => 'আপনি অনেক ব্যবহারকারীর কাছ থেকে $1 পেয়েছেন ($2)।',
 'newmessageslinkplural' => '{{PLURAL:$1|একটি নতুন বার্তা|নতুন বার্তা}}',
-'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
+'newmessagesdifflinkplural' => 'সর্বশেষ {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 'youhavenewmessagesmulti' => 'আপনার $1টি নতুন বার্তা এসেছে',
 'editsection' => 'সম্পাদনা',
 'editold' => 'সম্পাদনা',
@@ -465,8 +465,8 @@ $2',
 'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
 
 একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
-'invalidtitle-knownnamespace' => 'অবৈধ শিরনাম, যেখানে নামস্থান "$2" এবং লেখা হয়েছে "$3"',
-'invalidtitle-unknownnamespace' => 'অবৈধ শিরনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে "$2"',
+'invalidtitle-knownnamespace' => 'à¦\85বà§\88ধ à¦¶à¦¿à¦°à§\8bনাম, à¦¯à§\87à¦\96ানà§\87 à¦¨à¦¾à¦®à¦¸à§\8dথান "$2" à¦\8fবà¦\82 à¦²à§\87à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 "$3"',
+'invalidtitle-unknownnamespace' => 'à¦\85বà§\88ধ à¦¶à¦¿à¦°à§\8bনাম, à¦¯à§\87à¦\96ানà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\85পরিà¦\9aিত à¦¨à¦¾à¦®à¦¸à§\8dথান à¦¸à¦\82à¦\96à§\8dযা $1 à¦\8fবà¦\82 à¦²à§\87à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 "$2"',
 'exception-nologin' => 'লগইন করা হয়নি',
 'exception-nologin-text' => 'এই কাজটি করার জন্য উইকিতে লগইন করা প্রয়োজন।',
 
@@ -670,7 +670,7 @@ $2
 'anoneditwarning' => 'আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।',
 'anonpreviewwarning' => 'আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।',
 'missingsummary' => "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
-'missingcommenttext' => 'দয়াকরে নিচে মন্তব্য যোগ করুন।',
+'missingcommenttext' => 'দয়া করে নিচে মন্তব্য যোগ করুন।',
 'missingcommentheader' => "'''খেয়াল করুন:''' আপনি এই মন্তব্যের জন্য কোন বিষয়/শিরোনাম দেননি। সংরক্ষণ বোতামে ক্লিক করলে, আপনার এই সম্পাদনা কোন বিষয়/শিরোনাম ছাড়াই সংরক্ষিত হবে।",
 'summary-preview' => 'সারাংশ প্রাকদর্শন:',
 'subject-preview' => 'বিষয়/শিরোনাম প্রাকদর্শন:',
@@ -706,7 +706,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 আপনার বর্তমান IP ঠিকানা হচ্ছে $3, এবং যা বাধা দানের আইডি হল $5।
 যেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।',
 'blockednoreason' => 'কোন কারণ দেওয়া হয়নি',
-'whitelistedittext' => 'পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86পশ্যই $1 করতে হবে।',
+'whitelistedittext' => 'পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86বশ্যই $1 করতে হবে।',
 'confirmedittext' => 'কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।',
 'nosuchsectiontitle' => 'অনুচ্ছেদ পাওয়া যায়নি',
 'nosuchsectiontext' => 'আপনি এমন একটি অনুচ্ছেদ সম্পাদনার চেষ্টা করেছেন, যার কোন অস্তিত্ব নেই।
@@ -833,6 +833,8 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
 'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
 'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+'editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
+আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "{{int:prefs-editing}}" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
 
 # Content models
 'content-model-wikitext' => 'উইকিটেক্সট',
@@ -851,9 +853,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'post-expand-template-argument-warning' => "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।
 তাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
 'post-expand-template-argument-category' => 'বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা',
-'parser-template-loop-warning' => 'à¦\9fà§\87মà§\8dপলেট লুপ সনাক্ত হয়েছে: [[$1]]',
-'parser-template-recursion-depth-warning' => 'টেমপ্লেট  পুনরাবৃত্তি (রিকার্শন)  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
-'language-converter-depth-warning' => 'ভাষা পরিবর্তন  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'parser-template-loop-warning' => 'à¦\9fà§\87মপà§\8dলেট লুপ সনাক্ত হয়েছে: [[$1]]',
+'parser-template-recursion-depth-warning' => 'টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'language-converter-depth-warning' => 'ভাষা পরিবর্তন ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
 'node-count-exceeded-category' => 'যে সকল পাতার নোড কাউন্ট সীমানা পার হয়েছে',
 'node-count-exceeded-warning' => 'পাতাটি নোড কাউন্ট সীমানা পার করেছে',
 'expansion-depth-exceeded-category' => 'যে সকল পাতার এক্সেপশন সীমানা অতিক্রম করেছে',
@@ -889,7 +891,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'last' => 'পূর্ববর্তী',
 'page_first' => 'প্রথম',
 'page_last' => 'শেষ',
-'histlegend' => 'পার্থক্য (Diff) নির্বাচন: যে সংস্করণগুলো তুলনা করতে চান, সেগুলো চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />
+'histlegend' => 'পার্থক্য নির্বাচন: যে সংস্করণগুলো তুলনা করতে চান, সেগুলো চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />
 নির্দেশিকা: (বর্তমান) = বর্তমান সংস্করণের সাথে পার্থক্য, (পূর্ববর্তী) =  পূর্বের সংস্করণের সাথে পার্থক্য, অ = অনুল্লেখ্য সম্পাদনা।',
 'history-fieldset-title' => 'ব্রাউজ ইতিহাস',
 'history-show-deleted' => 'শুধুমাত্র অপসারণ',
@@ -1117,15 +1119,6 @@ $1",
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
 
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিছুই না',
-'qbsettings-fixedleft' => 'স্থায়ী বাম',
-'qbsettings-fixedright' => 'স্থায়ী ডান',
-'qbsettings-floatingleft' => 'ভাসমান বাম',
-'qbsettings-floatingright' => 'ভাসমান ডান',
-'qbsettings-directionality' => 'ফিক্সড, আপনার ভাষার লেখা শুরুর দিকের উপর ভিত্তি করে',
-
 # Preferences page
 'preferences' => 'আমার পছন্দ',
 'mypreferences' => 'পছন্দসমূহ',
@@ -1665,7 +1658,6 @@ $1',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
 'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
-'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
 'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1819,6 +1811,10 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />
 যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
+'pageswithprop' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-legend' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-text' => 'একটি নির্দিষ্ট পাতার বৈশিষ্ট রয়েছে এমন পাতাসমূহের তালিকা।',
+'pageswithprop-prop' => 'বৈশিষ্টের নাম:',
 'pageswithprop-submit' => 'চলো',
 
 'doubleredirects' => 'দুইবার করা পুনর্নির্দেশনাগুলি',
@@ -1984,15 +1980,6 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'listusers-noresult' => 'কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।',
 'listusers-blocked' => '(ব্লককৃত)',
 
-# Special:ActiveUsers
-'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা',
-'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।',
-'activeusers-count' => 'গত {{PLURAL:$3|দিনে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মকাণ্ডের|কর্মকাণ্ডের}} সংখ্যা $1',
-'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
-'activeusers-hidebots' => 'বট লুকাও',
-'activeusers-hidesysops' => 'প্রশাসক লুকাও',
-'activeusers-noresult' => 'কোনো ব্যবহারকারী পাওয়া যায়নি।',
-
 # Special:ListGroupRights
 'listgrouprights' => 'দলগত ব্যবহারকারী অধিকার',
 'listgrouprights-summary' => 'এই উইকির ব্যবহারকারীদের একটি গ্রুপগুলোর তালিকা দেখানো হচ্ছে, সাথে গ্রুপের কার্যপরিধিও উল্লেখ করা হয়েছে।
@@ -2200,6 +2187,7 @@ $UNWATCHURL
 'prot_1movedto2' => '[[$1]]-কে [[$2]]-এ সরিয়ে নেওয়া হয়েছে',
 'protect-badnamespace-title' => 'নামস্থানটি সুরক্ষিত করা সম্ভব নয়',
 'protect-badnamespace-text' => 'এই নামস্থানের পাতাগুলো সুরক্ষিত করা সম্ভব নয়।',
+'protect-norestrictiontypes-text' => 'এই পাতাটি সুরক্ষিত করা যাচ্ছে না কারণ এখানে সুরক্ষার কোনো বেশিষ্ট নেই।',
 'protect-norestrictiontypes-title' => 'সুরক্ষা প্রযোজ্য নয় এমন পাতা',
 'protect-legend' => 'সুরক্ষা নিশ্চিত করুন',
 'protectcomment' => 'কারণ:',
@@ -2833,7 +2821,7 @@ $1',
 'pageinfo-category-files' => 'ফাইলের সংখ্যা',
 
 # Skin names
-'skinname-standard' => 'ক্লাসিক',
+'skinname-vector' => 'ভেক্টর',
 
 # Patrolling
 'markaspatrolleddiff' => 'পরীক্ষিত বলে চিহ্নিত করুন',
@@ -3594,14 +3582,15 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # New logging system
 'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
 'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
-'logentry-delete-event' => '$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-delete-revision' => '$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেন্টসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-delete-revision-legacy' => '$1 $3টায় সংস্করণসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-suppress-event' => '$1 গোপনে {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেন্টসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংস্করণসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
+'logentry-delete-event' => '$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-delete-revision' => '$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'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 লগ ইভেন্টসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেন্টসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
+'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংস্করণসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
 'revdelete-content-hid' => 'বিষয়বস্তু লুকায়িত',
 'revdelete-summary-hid' => 'সম্পাদনা সারাংশ লুকায়িত',
 'revdelete-uname-hid' => 'ব্যবহারকারী নাম লুকায়িত',
@@ -3610,17 +3599,18 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 '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 à¦¬à§\8dযবহারà¦\95ারà§\80 $3 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 $4 à¦¶à¦¿à¦°à§\8bনামà§\87 à¦ªà§\81নিরà§\8dনিরà§\8dদà§\87শনার à¦\93পর à¦¦à¦¿à¦¯à¦¼à§\87 à¦¸à§\8dথানানà§\8dতর করেছেন',
-'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-move-move_redir' => '$1 à¦¬à§\8dযবহারà¦\95ারà§\80 $3 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 $4 à¦¶à¦¿à¦°à§\8bনামà§\87 à¦ªà§\81নিরà§\8dনিরà§\8dদà§\87শনার à¦®à¦¾à¦§à§\8dযমà§\87 {{GENDER:$2|সà§\8dথানানà§\8dতর}} করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন',
 'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন',
-'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {GENDER:$2|চিহ্নিত}} করেছেন',
-'logentry-newusers-newusers' => '$1 ব্যবহারকারী অ্যাকাউন্টটি {GENDER:$2|তৈরি করা}} হয়েছে',
-'logentry-newusers-create' => '$1 অ্যাকাউন্টটি তৈরী করা হয়েছে',
-'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি তৈরী করেছেন',
-'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
-'logentry-rights-rights' => '$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ পরিবর্তন করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন',
+'logentry-newusers-newusers' => '$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে',
+'logentry-newusers-create' => '$1 অ্যাকাউন্টটি {{GENDER:$2|তৈরী করা}} হয়েছে',
+'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন',
+'logentry-newusers-byemail' => '$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে',
+'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{GENDER:$2|তৈরি}} হয়েছে',
+'logentry-rights-rights' => '$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন',
 'logentry-rights-autopromote' => '$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ {{GENDER:$2|উন্নীত}} হয়েছে',
 'rightsnone' => '(কিছু নাই)',
 
@@ -3674,6 +3664,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 '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"',
@@ -3694,4 +3685,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্রাব্দ|সহস্রাব্দ}}',
 
+# Image rotation
+'rotate-comment' => 'ছবিটি ঘড়ির কাটার দিকে  $1 {{PLURAL:$1|ডিগ্রি}} ঘুরানো হয়েছে',
+
 );
index 60264ba..df3b608 100644 (file)
@@ -208,8 +208,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Diskouez an niver a lennerien',
 'tog-oldsig' => 'Ar sinadur zo evit poent :',
 'tog-fancysig' => 'Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)',
-'tog-externaleditor' => "Ober gant ur skridaozer diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-externaldiff' => "Ober gant ur c'heñverier diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
 'tog-showjumplinks' => 'Gweredekaat al liammoù moned "lammat da"',
 'tog-uselivepreview' => 'Implijout Rakwelet prim (JavaScript) (taol-arnod)',
 'tog-forceeditsummary' => 'Kemenn din pa ne skrivan netra er stern diverrañ',
@@ -224,6 +222,7 @@ $messages = array(
 'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
 'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
 'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
+'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
 
 'underline-always' => 'Atav',
 'underline-never' => 'Morse',
@@ -944,6 +943,8 @@ Krouet e oa bet c'hoazh.",
 'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
 'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
 'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+'editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
+Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" ho penndibaboù.",
 
 # Content models
 'content-model-wikitext' => 'wikitestenn',
@@ -1224,15 +1225,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-external' => 'Klask diavaez',
 'searchdisabled' => "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
 
-# Quickbar
-'qbsettings' => 'Personelaat ar varrenn ostilhoù',
-'qbsettings-none' => 'Hini ebet',
-'qbsettings-fixedleft' => 'Kleiz',
-'qbsettings-fixedright' => 'Dehou',
-'qbsettings-floatingleft' => 'War-neuñv a-gleiz',
-'qbsettings-floatingright' => 'War-neuñv a-zehou',
-'qbsettings-directionality' => 'Difiñv, hervez an tu ma vez skrivet ho yezh',
-
 # Preferences page
 'preferences' => 'Penndibaboù',
 'mypreferences' => 'Penndibaboù',
@@ -1787,7 +1779,6 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
 'http-read-error' => 'Fazi lenn HTTP.',
 'http-timed-out' => 'Erru eo termen ar reked HTTP.',
 'http-curl-error' => 'Fazi adtapout an URL : $1',
-'http-host-unreachable' => "N'eus ket bet gallet tizhout an URL.",
 'http-bad-status' => 'Ur gudenn a zo bet e-pad ar reked HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2108,15 +2099,6 @@ Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
 'listusers-noresult' => "N'eus bet kavet implijer ebet.",
 'listusers-blocked' => '(stanket)',
 
-# Special:ActiveUsers
-'activeusers' => 'Roll an implijerien oberiant',
-'activeusers-intro' => 'Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.',
-'activeusers-count' => '$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
-'activeusers-from' => 'Diskouez an implijerien adal :',
-'activeusers-hidebots' => 'Kuzhat ar robotoù',
-'activeusers-hidesysops' => 'Kuzhat ar verourien',
-'activeusers-noresult' => "N'eus bet kavet implijer ebet.",
-
 # Special:ListGroupRights
 'listgrouprights' => 'Gwirioù ar strolladoù implijer',
 'listgrouprights-summary' => 'Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.
@@ -2904,13 +2886,8 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Stylesheets
 'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */',
-'standard.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Standard */',
-'nostalgia.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Melkoni */',
 'cologneblue.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Glaz Kologn */',
 'monobook.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */',
-'myskin.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur MySkin */',
-'chick.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Plogig */',
-'simple.css' => '/* Talvezout a raio ar CSS lakaet amañ implijerien ar gwiskadur Eeun */',
 'modern.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Modern */',
 'vector.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */',
 'print.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */',
@@ -2923,13 +2900,8 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Scripts
 'common.js' => '/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */',
-'standard.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Standard */',
-'nostalgia.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Melkoni */',
 'cologneblue.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Glaz Kologn */',
 'monobook.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */',
-'myskin.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MySkin */',
-'chick.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Plogig */',
-'simple.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Eeun */',
 'modern.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */',
 'vector.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */',
 
@@ -2975,6 +2947,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-robot-noindex' => "Ne c'haller ket menegeriñ",
 'pageinfo-views' => 'Niver a weladennoù',
 'pageinfo-watchers' => 'Niver a dud o heuliañ',
+'pageinfo-few-watchers' => "Nebeutoc'h eget $1 {{PLURAL:$1|lenner}}",
 'pageinfo-redirects-name' => 'Adkas war-zu ar bajenn-mañ',
 'pageinfo-subpages-name' => 'Ispajennoù eus ar bajenn-mañ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|kasadur|kasadurioù}}; $3 {{PLURAL:$3|nann kasaduri|nann kasadurioù}})',
@@ -2989,6 +2962,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-magic-words' => '{{PLURAL:$1|Ger hud |Gerioù hud}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Rumm kuzh|Rummoù kuzh}} ($1)',
 'pageinfo-templates' => "{{PLURAL:$1|Patrom endalc'het|Patromoù endalc'het}} ($1)",
+'pageinfo-transclusions' => '{{PLURAL:$1|Pajenn|Pajennoù}} treuzkludet war ($1)',
 'pageinfo-toolboxlink' => 'Titouroù ar bajenn',
 'pageinfo-redirectsto' => 'Adkas a ra da',
 'pageinfo-redirectsto-info' => 'Titouroù',
@@ -3000,13 +2974,8 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-category-files' => 'Niver a restroù',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Melkoni',
 'skinname-cologneblue' => 'Glaz Kologn',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Plogig',
-'skinname-simple' => 'Eeun',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3083,8 +3052,8 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
 'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
 'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
-'months' => '{{PLURAL: $1|$1 miz|$1 miz}}',
-'years' => '{{PLURAL: $1|$1 bloaz|$1 bloaz}}',
+'months' => '{{PLURAL:$1|$1 miz|$1 miz}}',
+'years' => '{{PLURAL:$1|$1 bloaz|$1 bloaz}}',
 'ago' => '$1 zo',
 'just-now' => 'bremañ diouzhtu',
 
index 1b91967..2a4a3c2 100644 (file)
@@ -308,8 +308,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
 'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Koristi vanjski program za uređivanje po postavkama (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-externaldiff' => 'Koristi vanjski (diff) program po pretpostavljenom za prikaz razlika (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
 'tog-showjumplinks' => 'Omogući "skoči na" linkove',
 'tog-uselivepreview' => 'Koristite pregled uživo (JavaScript) (Eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
@@ -324,6 +322,7 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
 'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -430,14 +429,14 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Dodaj temu',
-'vector-action-delete' => 'Brisanje',
+'vector-action-delete' => 'Izbriši',
 'vector-action-move' => 'Pomjeri',
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati obrisano',
 'vector-action-unprotect' => 'Promijeni zaštitu',
 'vector-simplesearch-preference' => 'Omogući pojednostavljenu traku pretrage (samo vektorski izgled)',
 'vector-view-create' => 'Napravi',
-'vector-view-edit' => 'Uređivanje',
+'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Pregled historije',
 'vector-view-view' => 'Čitanje',
 'vector-view-viewsource' => 'Pogledaj izvor',
@@ -526,7 +525,7 @@ $1',
 'mainpage-description' => 'Početna strana',
 'policy-url' => 'Project:Pravila',
 'portal' => 'Portal zajednice',
-'portal-url' => 'Project:Portal_zajednice',
+'portal-url' => 'Project:Portal zajednice',
 'privacy' => 'Politika privatnosti',
 'privacypage' => 'Project:Pravila o anonimnosti',
 
@@ -537,7 +536,7 @@ $1',
 'versionrequired' => 'Potrebna je verzija $1 MediaWikija',
 'versionrequiredtext' => 'Potrebna je verzija $1 MediaWikija da bi se koristila ova strana. Pogledaj [[Special:Version|verziju]].',
 
-'ok' => 'da',
+'ok' => 'U redu',
 'retrievedfrom' => 'Dobavljeno iz "$1"',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih poruka',
@@ -545,7 +544,7 @@ $1',
 'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).',
 'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|nove poruke}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnja izmjena|zadnje izmjene}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednja izmjena|posljednje izmjene}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editsection-brackets' => '[$1]',
@@ -557,7 +556,7 @@ $1',
 'toc' => 'Sadržaj',
 'showtoc' => 'pokaži',
 'hidetoc' => 'sakrij',
-'collapsible-collapse' => 'Sakrij',
+'collapsible-collapse' => 'sklopi',
 'collapsible-expand' => 'Proširi',
 'thisisdeleted' => 'Pogledaj ili vrati $1?',
 'viewdeleted' => 'Pogledaj $1?',
@@ -1062,6 +1061,8 @@ Izgleda da je obrisana.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
+'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
+Ako ste prijavljeni, možete isključiti ovo upozorenje u "{{int:prefs-editing}}" dijelu vaših opcija.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1342,15 +1343,6 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'search-external' => 'Vanjska pretraga',
 'searchdisabled' => '<p>Izvinjavamo se!  Puno pretraga teksta je privremeno onemogućena.  U međuvremenu, možete koristiti Google za pretragu.  Indeks može biti stariji.',
 
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Pričvršćena lijevo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
-
 # Preferences page
 'preferences' => 'Podešavanja',
 'mypreferences' => 'Postavke',
@@ -1895,7 +1887,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Greška pri čitanju HTTP.',
 'http-timed-out' => 'Istekao HTTP zahtjev.',
 'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
 'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2218,15 +2209,6 @@ Podržani protokoli: <code>$1</code> (ne dodavajte bilo koji od ovih u vašu pre
 'listusers-noresult' => 'Nije pronađen korisnik.',
 'listusers-blocked' => '(blokiran)',
 
-# Special:ActiveUsers
-'activeusers' => 'Spisak aktivnih korisnika',
-'activeusers-intro' => 'Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
-'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
-'activeusers-from' => 'Prikaži korisnike koji počinju sa:',
-'activeusers-hidebots' => 'Sakrij botove',
-'activeusers-hidesysops' => 'Sakrij administratore',
-'activeusers-noresult' => 'Nije pronađen korisnik.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Prava korisničkih grupa',
 'listgrouprights-summary' => 'Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.
@@ -3035,26 +3017,16 @@ Dopušta unos razloga u sažetak.',
 
 # Stylesheets
 'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
-'standard.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Standard skin */',
-'nostalgia.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Nostalgia skin */',
 'cologneblue.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Cologne Blue skin */',
 'monobook.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */',
-'myskin.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste MySkin skin */',
-'chick.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Chick skin */',
-'simple.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Simple skin */',
 'modern.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Modern skin */',
 'print.css' => '/* CSS umetnut ovdje uticat će na izgled isprintane stranice */',
 'handheld.css' => '/* CSS umetnut ovdje uticat će na ručne sprave koji rade na skinu konfigurisanom u $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */',
-'standard.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Standard skin */',
-'nostalgia.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Nostalgia skin */',
 'cologneblue.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Cologne Blue skin */',
 'monobook.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */',
-'myskin.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MySkin skin */',
-'chick.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Chick skin */',
-'simple.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Simple skin */',
 'modern.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Modern skin */',
 
 # Metadata
@@ -3118,13 +3090,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-category-pages' => 'Broj stranica',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plavo',
 'skinname-monobook' => 'MonoKnjiga',
-'skinname-myskin' => 'MojaKoža',
-'skinname-chick' => 'Pile (chick)',
-'skinname-simple' => 'Jednostavna',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3983,8 +3950,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
-'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'logentry-delete-delete' => '$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3',
+'logentry-delete-restore' => '$1 je {{GENDER:$2|vratio|vratila}} stranicu $3',
 'logentry-delete-event' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
 'logentry-delete-revision' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici  $3: $4',
 'logentry-delete-event-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
index 020c424..eb60814 100644 (file)
@@ -26,6 +26,7 @@
  * @author Pasqual (ca)
  * @author Paucabot
  * @author PerroVerd
+ * @author Pintor Smeargle
  * @author Pitort
  * @author Pérez
  * @author Qllach
@@ -226,8 +227,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostra el nombre d'usuaris que hi vigilen",
 'tog-oldsig' => 'Signatura actual:',
 'tog-fancysig' => 'Tractar la signatura com a text wiki (sense enllaç automàtic)',
-'tog-externaleditor' => "Utilitza per defecte un editor extern (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-externaldiff' => "Utilitza per defecte un altre visualitzador de diferències (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
 'tog-showjumplinks' => "Habilita els enllaços de dreceres d'accessibilitat",
 'tog-uselivepreview' => 'Utilitza la previsualització automàtica (cal JavaScript) (experimental)',
 'tog-forceeditsummary' => "Avisa'm en deixar el resum de la modificació en blanc",
@@ -242,6 +241,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra les categories ocultes',
 'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
 'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
+'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -329,7 +329,7 @@ $messages = array(
 'about' => 'Quant a',
 'article' => 'Pàgina de contingut',
 'newwindow' => '(obre en una nova finestra)',
-'cancel' => 'Anuŀla',
+'cancel' => 'Cancel·lar',
 'moredotdotdot' => 'Més...',
 'morenotlisted' => 'Més no en la llista...',
 'mypage' => 'Pàgina',
@@ -630,7 +630,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'gotaccount' => 'Ja teniu un compte? $1.',
 'gotaccountlink' => 'Inicia una sessió',
 'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
-'createaccountmail' => 'per correu electrònic',
+'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu electrònic especificat a continuació",
 'createaccountreason' => 'Motiu:',
 'badretype' => 'Les contrasenyes que heu introduït no coincideixen.',
 'userexists' => 'El nom que heu entrat ja és en ús.
@@ -668,13 +668,14 @@ la vostra antiga contrasenya.",
 Inicieu una sessió després que la rebeu.",
 'blocked-mailpassword' => 'La vostra adreça IP ha estat blocada. Se us ha desactivat la funció de recuperació de contrasenya per a prevenir abusos.',
 'eauthentsent' => "S'ha enviat un correu electrònic a la direcció especificada. Abans no s'envïi cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
-'throttled-mailpassword' => "Ja se us ha enviat un recordatori de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}. Per a prevenir abusos, només s'envia un recordatori de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
+'throttled-mailpassword' => "Ja se us ha enviat un correu electrònic de reinicialització de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}.
+Per a prevenir abusos, només s'envia un correu electrònic de reinicialització de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
 'mailerror' => "S'ha produït un error en enviar el missatge: $1",
 'acct_creation_throttle_hit' => "Des de la vostra adreça IP ja {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en l'últim dia i aquest és el màxim permès en aquest wiki per aquest període de temps.
 Així, des d'aquesta adreça IP no es poden crear més comptes actualment.",
 'emailauthenticated' => "S'ha autenticat la vostra adreça electrònica el $2 a les $3.",
 'emailnotauthenticated' => 'La vostra adreça de correu electrònic <strong>encara no està autenticada</strong>. No rebrà cap missatge de correu electrònic per a cap de les següents funcionalitats.',
-'noemailprefs' => 'Especifiqueu una adreça electrònica per a activar aquestes característiques.',
+'noemailprefs' => 'Especifiqueu una adreça electrònica per activar aquestes característiques.',
 'emailconfirmlink' => 'Confirmeu la vostra adreça electrònica',
 'invalidemailaddress' => "No es pot acceptar l'adreça electrònica perquè sembla que té un format no vàlid.
 Introduïu una adreça amb un format adequat o bé buideu el camp.",
@@ -719,7 +720,7 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 
 # Special:PasswordReset
 'passwordreset' => 'Restablir contrasenya',
-'passwordreset-text' => 'Completeu el següent formulari per rebre un recordatori per correu electrònic amb els detalls del vostre compte.',
+'passwordreset-text' => 'Completeu el següent formulari per reinicialitzar la vostra contrasenya',
 'passwordreset-legend' => 'Restablir contrasenya',
 'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
 'passwordreset-pretext' => '{{PLURAL:$1||Introduïu un dels elements de dades següents}}',
@@ -729,23 +730,23 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 'passwordreset-capture-help' => "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
 'passwordreset-email' => 'Adreça de correu electrònic:',
 'passwordreset-emailtitle' => 'Detalls del compte a {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
+'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
 
 $2
 
 {{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
 Hauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
-'passwordreset-emailtext-user' => "L'usuari $1 de {{SITENAME}} ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
+'passwordreset-emailtext-user' => "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
 
 $2
 
 {{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
-Hauríeu d'entrar {{PLURAL:$3|al compte per a fixar-hi una nova contrasenya|als comptes per a fixar-hi noves contrasenyes}} al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
+Hauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
 'passwordreset-emailelement' => "Nom d'usuari: $1
 Contrasenya temporal: $2",
-'passwordreset-emailsent' => "S'ha enviat un correu de recordatori.",
-'passwordreset-emailsent-capture' => "S'ha enviat un recordatori per correu electrònic, tal com es mostra a continuació.",
-'passwordreset-emailerror-capture' => "S'ha generat un missatge recordatori de correu electrònic, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
+'passwordreset-emailsent' => "S'ha enviat un correu de reinicialització de contrasenya.",
+'passwordreset-emailsent-capture' => "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
+'passwordreset-emailerror-capture' => "S'ha generat un correu electrònic de reinicialització de contrasenya, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Canvi de correu electrònic',
@@ -914,11 +915,10 @@ A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o b
 '''No feu servir textos amb drets d'autor sense permís!'''",
 'longpageerror' => "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
 No es pot desar.",
-'readonlywarning' => "'''ADVERTÈNCIA: La base de dades està tancada per manteniment
-i no podeu desar les vostres contribucions en aquests moments. Podeu retallar i enganxar el codi
-en un fitxer de text i desar-lo més tard.'''
+'readonlywarning' => "'''Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.'''
+És possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.
 
-L'administrador que l'ha tancada n'ha donat aquesta justificació: $1",
+L'administrador que l'ha bloquejada ha donat la següent explicació: $1",
 'protectedpagewarning' => "'''ATENCIÓ: Aquesta pàgina està bloquejada i només els usuaris amb drets d'administrador la poden modificar.
 A continuació es mostra la darrera entrada del registre com a referència:",
 'semiprotectedpagewarning' => "'''Avís:''' Aquesta pàgina està bloquejada i només pot ser modificada per usuaris registrats.
@@ -960,6 +960,8 @@ Ja existeix.",
 'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
 'invalid-content-data' => 'Dades de contingut no vàlides',
 'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
+Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «{{int:prefs-editing}}» de les vostres preferències.",
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1222,7 +1224,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-default' => '$1 resultats:',
 'search-interwiki-more' => '(més)',
 'search-relatedarticle' => 'Relacionat',
-'mwsuggest-disable' => 'Inhabilita els suggeriments en AJAX',
+'mwsuggest-disable' => 'Desactivar suggeriments de cerca',
 'searcheverything-enable' => 'Cerca a tots els espais de noms',
 'searchrelated' => 'relacionat',
 'searchall' => 'tots',
@@ -1242,15 +1244,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-external' => 'Cerca externa',
 'searchdisabled' => 'La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Cap',
-'qbsettings-fixedleft' => "Fixa a l'esquerra",
-'qbsettings-fixedright' => 'Fixa a la dreta',
-'qbsettings-floatingleft' => "Surant a l'esquerra",
-'qbsettings-floatingright' => 'Surant a la dreta',
-'qbsettings-directionality' => "Fix, segons la direcció d'escriptura del vostre idioma",
-
 # Preferences page
 'preferences' => 'Preferències',
 'mypreferences' => 'Preferències',
@@ -1784,7 +1777,6 @@ Per seguretat, img_auth.php està desactivat.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La petició HTTP ha expirat.',
 'http-curl-error' => "Error en recuperar l'URL: $1",
-'http-host-unreachable' => "No s'ha pogut accedir a l'URL.",
 'http-bad-status' => 'Hi ha hagut un problema durant la petició HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1938,6 +1930,12 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
 Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-legend' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
+'pageswithprop-prop' => 'Nom de la propietat:',
+'pageswithprop-submit' => 'Vés',
+
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
 Cada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí "real", a la què hauria d\'apuntar la primera redirecció.
@@ -2100,15 +2098,6 @@ Es necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
 'listusers-noresult' => "No s'han trobat coincidències de noms d'usuaris. Si us plau, busqueu també amb variacions per majúscules i minúscules.",
 'listusers-blocked' => '({{GENDER:$1|blocat|blocada}})',
 
-# Special:ActiveUsers
-'activeusers' => "Llista d'usuaris actius",
-'activeusers-intro' => "Aquí hi ha una llista d'usuaris que han tingut algun tipus d'activitat en {{PLURAL:$1|el darrer dia|els darrers $1 dies}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|modificació|modificacions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}',
-'activeusers-from' => 'Mostra els usuaris començant per:',
-'activeusers-hidebots' => 'Amaga bots',
-'activeusers-hidesysops' => 'Amaga administradors',
-'activeusers-noresult' => "No s'han trobat usuaris.",
-
 # Special:ListGroupRights
 'listgrouprights' => "Drets dels grups d'usuaris",
 'listgrouprights-summary' => "A continuació hi ha una llista dels grups d'usuaris definits en aquest wiki, així com dels seus drets d'accés associats.
@@ -2333,9 +2322,9 @@ Ací hi ha els paràmetres actuals de la pàgina '''$1''':",
 Ací es troben els paràmetres actuals de la pàgina '''$1''':",
 'protect-cascadeon' => "Aquesta pàgina es troba protegida perquè està inclosa en {{PLURAL:$1|la següent pàgina que té|les següents pàgines que tenen}} activada una protecció en cascada. Podeu canviar el nivell de protecció d'aquesta pàgina però això no afectarà la protecció en cascada.",
 'protect-default' => 'Permet tots els usuaris',
-'protect-fallback' => 'Cal el permís de «$1»',
-'protect-level-autoconfirmed' => 'Bloca els usuaris novells i no registrats',
-'protect-level-sysop' => 'Bloqueja tots els usuaris excepte administradors',
+'protect-fallback' => 'Permetre només a usuaris amb permisos de "$1"',
+'protect-level-autoconfirmed' => 'Permetre només usuaris autoconfirmats',
+'protect-level-sysop' => 'Permetre només administradors',
 'protect-summary-cascade' => 'en cascada',
 'protect-expiring' => 'expira el dia $1 (UTC)',
 'protect-expiring-local' => 'caduca el $1',
@@ -2635,30 +2624,31 @@ Recordeu-vos de [[Special:UnlockDB|treure el bloqueig]] quan hàgiu acabat el ma
 'move-page' => 'Mou $1',
 'move-page-legend' => 'Reanomena la pàgina',
 'movepagetext' => "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.
-El títol anterior es convertirà en una redirecció al títol que hàgiu creat.
-Podeu actualitzar automàticament els enllaços a l'antic títol de la pàgina.
-Si no ho feu, assegureu-vos de verificar que no deixeu redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
-Serà de la vostra responsabilitat verificar que els enllaços seguirien apuntant cap a on se suposa que ho han de fer.
+El títol anterior es convertirà en una pàgina de redirecció al nou títol.
+Podeu actualitzar automàticament les redireccions que apuntin al títol original.
+Si no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
+Serà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.
 
-Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, a no ser que sigui una pàgina buida o una ''redirecció'' sense historial.
+Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció sense més historial.
 Això significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.
 
-'''ADVERTÈNCIA!'''
-Açò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; assegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
-'movepagetext-noredirectfixer' => "El títol anterior es convertirà en un redireccionament al nou títol. 
-
-Assegureu-vos de verificar els redireccionaments [[Special:DoubleRedirects|doble]]s i els [[Special:BrokenRedirects|trencat]]s.
+'''Atenció!'''
+Açò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; 
+assegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
+'movepagetext-noredirectfixer' => "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.
+El títol anterior es convertirà en una pàgina de redirecció al nou títol. 
+Assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
+És responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. 
 
-Sigueu responsable de fer que els enllaços continuen apuntant cap a on se suposa que han d'anar. 
-
-Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou proposat, tret del cas que la pàgina és buida o no n'hi ha un historial de redireccionaments. 
-
-Això significa que si reanomeneu per equivocació una pàgina amb el seu nom anterior no ho podreu fer, ja que no es pot sobreescriure una pàgina existent.
+Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. 
+Això significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.
  
-'''Avís:''' Això pot ser un canvi dràstic i inesperat per una pàgina popular; si us plau, assegureu-vos que sabeu el que feu abans de continuar.",
-'movepagetalktext' => "La pàgina de discussió associada, si existeix, serà traslladada automàticament '''tret dels següents casos''':
-* Ja hi existeix una pàgina de discussió no buida amb el nou nom, o si
-* la opció de davall es troba desactivada
+'''Atenció!''' 
+Això pot ser un canvi dràstic i inesperat per una pàgina popular; 
+assegureu-vos que sabeu el que feu abans de continuar.",
+'movepagetalktext' => "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':
+* Ja existeix una pàgina de discussió no buida amb el nou nom, o
+* Desactiveu la opció de més avall.
 
 En aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
 'movearticle' => 'Reanomena la pàgina',
@@ -2962,6 +2952,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-robot-noindex' => 'No indexable',
 'pageinfo-views' => 'Número de visites',
 'pageinfo-watchers' => "Número d'usuaris que vigilen la pàgina",
+'pageinfo-few-watchers' => 'Menys de $1 {{PLURAL:$1|observador|observadors}}',
 'pageinfo-redirects-name' => 'Redireccions a aquesta pàgina',
 'pageinfo-subpages-name' => "Subpàgines d'aquesta pàgina",
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redireció|no redireccions}})',
@@ -2976,6 +2967,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Paraula clau|Paraules clau}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categories ocultes}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|plantilla inclosa|plantilles incloses}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgina|Pàgines}} incloses en ($1)',
 'pageinfo-toolboxlink' => 'Informació de la pàgina',
 'pageinfo-redirectsto' => 'Redirigeix a',
 'pageinfo-redirectsto-info' => 'info',
@@ -2984,10 +2976,12 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-protect-cascading' => "Proteccions en cascada des d'aquí",
 'pageinfo-protect-cascading-yes' => 'Sí',
 'pageinfo-protect-cascading-from' => 'Proteccions en cascada des de',
+'pageinfo-category-info' => 'Informació de categoria',
+'pageinfo-category-pages' => 'Nombre de pàgines',
+'pageinfo-category-subcats' => 'ombre de subcategories',
+'pageinfo-category-files' => "Nombre d'arxius",
 
 # Skin names
-'skinname-standard' => 'Clàssic',
-'skinname-nostalgia' => 'Nostàlgia',
 'skinname-cologneblue' => 'Colònia blava',
 
 # Patrolling
@@ -3066,6 +3060,8 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 mesos}}',
+'years' => '{{PLURAL:$1|$1 any|$1 anys}}',
 'ago' => 'fa $1',
 'just-now' => 'ara mateix',
 
@@ -3726,7 +3722,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'specialpages-group-highuse' => "Pàgines d'alt ús",
 'specialpages-group-pages' => 'Llistes de pàgines',
 'specialpages-group-pagetools' => "Pàgines d'eines",
-'specialpages-group-wiki' => 'Eines i dades del wiki',
+'specialpages-group-wiki' => 'Dades i eines',
 'specialpages-group-redirects' => 'Pàgines especials de redirecció',
 'specialpages-group-spam' => 'Eines de spam',
 
@@ -3795,13 +3791,13 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'sqlite-no-fts' => '$1, sense supor de búsqueda de text íntegre',
 
 # New logging system
-'logentry-delete-delete' => '$1 ha esborrat la pàgina $3',
-'logentry-delete-restore' => '$1 ha restaurat la pàgina $3',
+'logentry-delete-delete' => '$1 ha esborrat $3',
+'logentry-delete-restore' => '$1 ha restaurat $3',
 'logentry-delete-event' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
 'logentry-delete-revision' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
 'logentry-delete-event-legacy' => "$1 ha canviat la visibilitat d'esdeveniments al registre de $3",
 'logentry-delete-revision-legacy' => '$1 ha canviat la visibilitat de revisions a la pàgina $3',
-'logentry-suppress-delete' => '$1 ha suprimit la pàgina $3',
+'logentry-suppress-delete' => '$1 ha suprimit $3',
 'logentry-suppress-event' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
 'logentry-suppress-revision' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
 'logentry-suppress-event-legacy' => "$1 secretament ha canviat la visibilitat d'esdeveniments al registre de $3",
@@ -3814,19 +3810,20 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'revdelete-uname-unhid' => "ha revelat un nom d'usuari que era ocult",
 'revdelete-restricted' => 'ha aplicat restriccions als administradors',
 'revdelete-unrestricted' => 'ha tret les restriccions als administradors',
-'logentry-move-move' => '$1 ha desplaçat la pàgina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 sense deixar cap redirecció',
-'logentry-move-move_redir' => '$1 ha desplaçat la pàgina $3 a $4, on hi havia una redirecció',
+'logentry-move-move' => '$1 ha mogut $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha mogut $3 a $4 sense deixar una redirecció',
+'logentry-move-move_redir' => '$1 ha mogut $3 a $4 sobre una redirecció',
 'logentry-move-move_redir-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
-'logentry-patrol-patrol' => '$1 ha marcat la versió $4 de la pàgina $3 com a patrullada',
+'logentry-patrol-patrol' => '1 $ va marcar la revisió $ 4 de "$ 3" com a supervisada',
 'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
-'logentry-newusers-newusers' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create2' => "$1 ha creat el compte d'usuari $3",
-'logentry-newusers-autocreate' => "El compte d'usuari $1 ha estat creat de manera automàtica",
-'logentry-rights-rights' => '$1 ha canviat la pertinença de grups per $3 de $4 a $5',
-'logentry-rights-rights-legacy' => '$1 ha canviat la pertinença de grups per $3',
-'logentry-rights-autopromote' => '$1 ha estat promogut automàticament de $4 a $5',
+'logentry-newusers-newusers' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create2' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
+'logentry-newusers-byemail' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
+'logentry-newusers-autocreate' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+'logentry-rights-rights' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3',
+'logentry-rights-autopromote' => '$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5',
 'rightsnone' => '(cap)',
 
 # Feedback
@@ -3881,6 +3878,7 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'api-error-ok-but-empty' => 'Error intern: no hi ha resposta del servidor.',
 'api-error-overwrite' => 'No està permès sobreescriure un fitxer existent.',
 'api-error-stashfailed' => 'Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.',
+'api-error-publishfailed' => 'Error intern: el servidor no ha pogut publicar el fitxer temporal.',
 'api-error-timeout' => 'El servidor no ha respost en el temps esperat.',
 'api-error-unclassified' => "S'ha produït un error desconegut",
 'api-error-unknown-code' => 'Error desconegut: «$1»',
index c2980ab..7833a2c 100644 (file)
@@ -150,8 +150,8 @@ $messages = array(
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
 'tog-justify' => 'پەرەگرافەکان پڕاوپر نیشان بدە',
 'tog-hideminor' => 'دەستکارییە بچووکەکان لە دوایین گۆڕانکارییەکاندا بشارەوە',
-'tog-hidepatrolled' => 'Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\95کاÙ\86Ø\8c Ø¯Û\95ستکارÛ\8cÛ\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
-'tog-newpageshidepatrolled' => 'Ù\84Û\95 Ù\84Û\8cستÛ\8c Ù\84اپÛ\95Ú\95Û\95 Ù\86Ù\88Û\8eکاÙ\86Ø\8c Ù\84اپÛ\95Ú\95Û\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
+'tog-hidepatrolled' => 'Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86دا Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
+'tog-newpageshidepatrolled' => 'Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ù¾Û\95Ú\95Û\95 Ù\86Ù\88Û\8eکاÙ\86دا Ù¾Û\95Ú\95Û\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
 'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
 'tog-usenewrc' => 'گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و لیستی چاودێریدا بە پێی پەڕە پۆلێن بکە (پێویستی بە جاڤاسکریپتە)',
 'tog-numberheadings' => 'ژمارەکردنی خۆکاری سەردێڕەکان',
@@ -169,29 +169,28 @@ $messages = array(
 'tog-previewontop' => 'پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌',
 'tog-previewonfirst' => 'لە یەکەم دەستکاری دا پێشبینین نیشان بدە',
 'tog-nocache' => 'کاشکردنی پەڕەکانی وێبگەڕەکە لەکاربخە',
-'tog-enotifwatchlistpages' => 'ئÛ\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95 Ú©Ø§ØªÛ\8eÚ© Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú© Û\8cاÙ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eÚ\95Û\8cÛ\8cÛ\95کاÙ\86Ù\85دا Ú¯Û\86Ú\95درا',
-'tog-enotifusertalkpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98ەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
+'tog-enotifwatchlistpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95 Û\8cاÙ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ú\86اÙ\88دÛ\8eÛ\8cÛ\8cÛ\8cÛ\95کاÙ\86Ù\85دا Ú¯Û\86Ú\95درا Ø¦Û\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95',
+'tog-enotifusertalkpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95Û\8c Ù\84Û\8eدÙ\88اÙ\86ەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
 'tog-enotifminoredits' => 'بۆ گۆڕانکارییە بچووکەکانی پەڕەکان و پەڕگەکانیش ئیمەیلم بۆ بنێرە',
 'tog-enotifrevealaddr' => 'ئەدرەسی ئیمەیلەکەم لە ئیمەیلە ئاگاداریدەرەکان دا نیشان بدە',
 'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
 'tog-oldsig' => 'واژووی ئێستا:',
 'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-externaleditor' => 'دەستکاریکەری دەرەکی بەکاربێنە لە حاڵەتی دیفاڵتدا (تەنھا بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-externaldiff' => 'لە پرۆگرامێکی دەرەکی بۆ بینینی جیاوازیەکان کەڵک وەرگرە لە دیفاڵتدا (تەنها بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت. [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
 'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
 'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
-'tog-forceeditsummary' => 'ئەگەر پوختەی دەستکاریم نەنووسی پێم بڵێ',
-'tog-watchlisthideown' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Ù\85 Ø¨Ø´Ø§Ø±Û\95Ù\88Û\95 Ù\84Û\95 Ù\84Û\8cستی چاودێری',
+'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
+'tog-watchlisthideown' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Ù\85 Ø¨Ø´Ø§Ø±Û\95Ù\88Û\95 Ù\84Û\95 Ù¾Û\8eرستی چاودێری',
 'tog-watchlisthidebots' => 'دەستکارییەکانی بات بشارەوە لە لیستی چاودێری',
 'tog-watchlisthideminor' => 'دەستکارییە بچووکەکان لە لیستی چاودێریدا بشارەوە',
 'tog-watchlisthideliu' => 'دەستکارییەکانی ئەو بەکارهێنەرانەی لە ژوورەوەن بشارەوە لە لیستی چاودێری',
 'tog-watchlisthideanons' => 'دەستکارییەکانی بەکارهێنەرانی نەناسراو بشارەوە لە لیستی چاودێری',
-'tog-watchlisthidepatrolled' => 'Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\95کاÙ\86Ø\8c Ø¯Û\95ستکارÛ\8cÛ\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
-'tog-ccmeonemails' => 'کۆپییەکانی ئەو ئیمەیلانە کە بۆ بەکارھێنەرانی ترم ناردووە بۆ خۆشم بنێرە',
-'tog-diffonly' => 'ناوەڕۆکی پەڕە لەژێر جیاوازییەکان نیشان مەدە',
+'tog-watchlisthidepatrolled' => 'Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95کاÙ\86دا Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
+'tog-ccmeonemails' => 'کۆپییەک لەو ئیمەیلانە کە بۆ بەکارھێنەرانی تر دەنێرم بۆ خۆشم بنێرە',
+'tog-diffonly' => 'ناوەرۆکی پەڕە لە ژێرەوەی جیاوازییەکاندا نیشان مەدە',
 'tog-showhiddencats' => 'ھاوپۆلە شاراوەکان نیشان بدە',
 'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
 'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
+'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
 
 'underline-always' => 'ھەمیشە',
 'underline-never' => 'قەت',
@@ -363,7 +362,7 @@ $messages = array(
 'categorypage' => 'په‌ڕه‌ی هاوپۆل نیشانبده‌',
 'viewtalkpage' => 'بینینی لێدوان',
 'otherlanguages' => 'بە زمانەکانی تر',
-'redirectedfrom' => '(ڕەوانەکراوە لە $1 ەوە)',
+'redirectedfrom' => '(ڕەوانەکراوە لە $1ەوە)',
 'redirectpagesub' => 'پەڕەی ڕەوانەکردن',
 'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێ کراوەتەوە.',
 'viewcount' => 'ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.',
@@ -910,6 +909,7 @@ $2
 ئەوە لەپێش‌دا هەبوو.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
+'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
 
 # Content models
 'content-model-wikitext' => 'ویکیدەق',
@@ -1003,7 +1003,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
 'rev-suppressed-diff-view' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازییە '''بەرگری لێ‌کراوە'''.
 ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]دا دەست دەکەوێت.",
-'rev-delundel' => 'نیشانبدە/بشارەوە',
+'rev-delundel' => 'نیشان بدە/بشارەوە',
 'rev-showdeleted' => 'نیشان بدە',
 'revisiondelete' => 'سڕینەوە/ھێنانەوەی پێداچوونەوەکان',
 'revdelete-nooldid-title' => 'مەبەستی پێداچوونەوەی نادیار',
@@ -1101,7 +1101,7 @@ $1",
 'mergehistory-reason' => 'هۆکار:',
 
 # Merge log
-'mergelog' => 'لۆگی یەککردن',
+'mergelog' => 'لۆگی کردنەیەک',
 'pagemerge-logentry' => '[[$1]] خرایە سەر [[$2]] (پێداچوونەوەکان تا $3)',
 'revertmerge' => 'لەیەک جیاکردنەوە',
 'mergelogpagetext' => 'لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.',
@@ -1160,7 +1160,7 @@ $1",
 'search-interwiki-more' => '(زیاتر)',
 'search-relatedarticle' => 'پەیوەست',
 'mwsuggest-disable' => 'پێشنیارەکانی گەڕان ناچالاک بکە',
-'searcheverything-enable' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕێ',
+'searcheverything-enable' => 'لە ھەموو بۆشاییی ناوەکاندا بگەڕێ',
 'searchrelated' => 'پەیوەست',
 'searchall' => 'ھەموو',
 'showingresults' => "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
@@ -1182,14 +1182,6 @@ $1",
 دەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.
 لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
 
-# Quickbar
-'qbsettings' => 'خێرا-تووڵ',
-'qbsettings-none' => 'هیچ',
-'qbsettings-fixedleft' => 'چەپ‌ سەپێندراو',
-'qbsettings-fixedright' => 'ڕاست سەپێندراو',
-'qbsettings-floatingleft' => 'سەراوی چەپ',
-'qbsettings-floatingright' => 'سەراوی ڕاست',
-
 # Preferences page
 'preferences' => 'ھەڵبەژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
@@ -1257,7 +1249,7 @@ $1",
 'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
 'prefs-searchoptions' => 'گەڕان',
 'prefs-namespaces' => 'بۆشایی‌ناوەکان',
-'defaultns' => 'ئÛ\95Ú¯Û\95رÙ\86ا Ù\84Û\95Ù\85 Ø¨Û\86شاÛ\8cÛ\8câ\80\8cناوانەدا بگەڕێ:',
+'defaultns' => 'دÛ\95Ù\86ا Ù\84Û\95Ù\85 Ø¨Û\86شاÛ\8cÛ\8cÛ\8c ناوانەدا بگەڕێ:',
 'default' => 'بنچینەیی',
 'prefs-files' => 'پەڕگەکان',
 'prefs-custom-css' => 'CSSی دڵخواز',
@@ -1320,10 +1312,11 @@ $1",
 'userrights-editusergroup' => 'دەستکاریی گرووپەکانی بەکارهێنەر',
 'saveusergroups' => 'گرووپەکانی بەکارھێنەر پاشەکەوت بکە',
 'userrights-groupsmember' => 'ئەندامە لە:',
-'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە بگۆڕیت:
-* چوارچێوەی نیشان‌کراو مانای ئەوەیە لەو گرووپەدا هەیە.
-* چوارچێوەی نیشان‌نەکراو مانای ئەوەیە لەو گرووپەدا نیە.
-* A * پێت‌دەڵێ ناتوانی ئەو گرووپی جارێکی دی زیادت کردووە لای‌بەری.',
+'userrights-groupsmember-auto' => 'ئەندامی ناڕاشکاوە لە:',
+'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:
+* چوارچێوەی نیشان‌کراو یانی بەکارھێنەر لەو گرووپەدا هەیە.
+* چوارچێوەی نیشان‌نەکراو یانی بەکارھێنەر لەو گرووپەدا نییە.
+* ئەستێرەیەک (*) نیشان دەدا ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لای‌بەری، و بە پێچەوانە.',
 'userrights-reason' => 'هۆکار:',
 'userrights-no-interwiki' => 'دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.',
 'userrights-nodatabase' => 'بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.',
@@ -1386,7 +1379,7 @@ $1",
 'right-browsearchive' => 'گەڕانی پەڕە سڕاوەکان',
 'right-undelete' => 'هاوەردنەوەی لاپەڕەیەک',
 'right-suppressrevision' => 'چاوپێداخشان و هاردنوەی ئەو لاپەڕانەی لە بەڕێوبەران داشاردرابوو.',
-'right-suppressionlog' => 'دیتنی لۆگە ئەهلیەکان',
+'right-suppressionlog' => 'دیتنی لۆگە نھێنییەکان',
 'right-block' => 'بەربەستنی بەکارھێنەرانی تر لە دەستکاری کردن',
 'right-blockemail' => 'بەرگری بەکارهێنەرێک بکە لە ناردنی ئیمەیل',
 'right-hideuser' => 'بەربەست‌کردنی ناوێکی بەکارهێنەری، داشاردنی لە بەرچاوی هەموان',
@@ -1402,17 +1395,17 @@ $1",
 'right-markbotedits' => 'نیشان‌کردنی دەستکاریە گەڕێنراوەکان وەک دەستکاریەکانی بۆت (bot)',
 'right-noratelimit' => 'کاریگەری وەرنەگرتن لە سنوورەکانی ئاست',
 'right-import' => 'هێنانەناوەی لاپەڕە لە ویکی‌یەکانی دیکە',
-'right-importupload' => 'هێنانەناوەی لاپەڕە لە پەڕگەیەکی بارکراو',
-'right-patrol' => 'Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8câ\80\8cتر',
-'right-autopatrol' => 'Ø®Û\86کار Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95سÛ\8eÚ© Ø¨Û\86Ø®Û\86Û\8c',
-'right-patrolmarks' => 'دیتنی دوایین دەستکاریەکان وا لەژێرچاودێری نیشان‌کراون',
-'right-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù\84Û\8cستÛ\8eÚ© Ù\84Û\95Ù\88 Ù\84اپÛ\95Ú\95اÙ\86Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86اکرÛ\8eن',
-'right-mergehistory' => 'سەریەک‌خستنی میژووی لاپەڕەکان',
+'right-importupload' => 'ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو',
+'right-patrol' => 'Ù\86Û\8cشاÙ\86کردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8c ØªØ± Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88',
+'right-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95سÛ\8eÚ© Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8c Ø®Û\86Ú¯Û\95Ú\95 Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88 Ù\86Û\8cشاÙ\86 Ø¨Ú©Ø±Û\8e',
+'right-patrolmarks' => 'دیتنی نیشان کراوەکان وەک پاس دراو لە دوایین گۆڕانکارییەکاندا',
+'right-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95 Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\95کراÙ\88Û\95کان',
+'right-mergehistory' => 'میژووی پەڕەکان بکە یەک',
 'right-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
 'right-userrights-interwiki' => 'دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا',
 'right-siteadmin' => 'داخستن و کردنەوەی بنکەدراو',
 'right-override-export-depth' => 'هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت',
-'right-sendemail' => 'ئەمەیل بنێرە بۆ بەکارھێنەرانی تر',
+'right-sendemail' => 'ناردنی ئیمەیل بۆ بەکارھێنەرانی تر',
 
 # Special:Log/newusers
 'newuserlogpage' => 'لۆگی دروستکردنی بەکارھێنەر',
@@ -1449,25 +1442,25 @@ $1",
 'action-protect' => 'گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە',
 'action-import' => 'هێنانەناوەی ئەم لاپەڕە لە ویکی‌یەکی دیکە',
 'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
-'action-patrol' => 'Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8câ\80\8cتر',
-'action-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\95کاÙ\86ت Ù\88Û\95Ú© Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86 Ú©Ø±Ø§Ù\88Ù\86',
-'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95اÙ\86Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86اکرÛ\8eن',
-'action-mergehistory' => 'سەریەک‌خستنی میژووی ئەم لاپەڕە',
-'action-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
+'action-patrol' => 'Ù\86Û\8cشاÙ\86کردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8c ØªØ± Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88',
+'action-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86ت Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88 Ù\86Û\8cشاÙ\86 Ø¨Ú©Ø±Û\8e',
+'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95 Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\95کراÙ\88Û\95کان',
+'action-mergehistory' => 'میژووی پەڕەکان بکە یەک',
+'action-userrights' => 'دەستکاریی مافەکانی ھەموو بەکارھێنەران',
 'action-userrights-interwiki' => 'دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا',
 'action-siteadmin' => 'داخستن یا کردنەوەی بنکەدراو',
 'action-sendemail' => 'ناردنی ئیمەیلەکان',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
+'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری}}',
 'recentchanges' => 'دوایین گۆڕانکارییەکان',
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
-'recentchanges-summary' => 'دوایین گۆڕانکارییەکانیی ویکی لەم پەڕەیەدا ببینە.',
+'recentchanges-summary' => 'لەم پەڕەیەدا شوێنی دوایین گۆڕانکارییەکانی ویکی بکەوە.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
 'recentchanges-label-newpage' => 'ئەم دەستکارییە لاپەڕەیەکی نوێی دروستکرد',
-'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
+'recentchanges-label-minor' => 'ئÛ\95Ù\85Û\95 Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\8c Ø¨Ú\86Ù\88Ù\88Ú©Û\95',
 'recentchanges-label-bot' => 'ئەم دەستکاریە لە لایەن بۆتەوە پێک هاتووە',
-'recentchanges-label-unpatrolled' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\95 Ù\87Û\8eشتا Ù\86Û\95Ú\95Û\86شتÛ\95تÛ\95 Ú\98Û\8eر Ú\86اÙ\88دÛ\8eرÛ\8c',
+'recentchanges-label-unpatrolled' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ú¾Û\8eشتا Ù¾Ø§Ø³ Ù\86Û\95دراÙ\88Û\95',
 'rcnote' => "لە خوارەوەدا {{PLURAL:$1|'''۱''' گۆڕانکاری |دوایین '''$1''' گۆڕانکارییەکان}} لە دوایین {{PLURAL:$2|ڕۆژ|'''$2''' ڕۆژەوە}} ، تا $5، $4 دەبینن.",
 'rcnotefrom' => "ئەوی‌ خوارەوە گۆڕانکارییەکانە لە '''$2'''ەوە (ھەتا '''$1''' نیشاندراو).",
 'rclistfrom' => 'گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $1',
@@ -1475,8 +1468,8 @@ $1",
 'rcshowhidebots' => 'بۆتەکان $1',
 'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'گۆرانکارییە چاودێریکراوەکان $1',
-'rcshowhidemine' => 'دەستکارییەکانی من $1',
+'rcshowhidepatr' => 'گۆرانکارییە پاس دراوەکان $1',
+'rcshowhidemine' => 'دەستکارییەکانم $1',
 'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
 'hist' => 'مێژوو',
@@ -1485,8 +1478,8 @@ $1",
 'minoreditletter' => 'ب',
 'newpageletter' => 'ن',
 'boteditletter' => '.بۆت',
-'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارهێنەر|بەکارهێنەر}}]',
-'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به "|" جودای بکەوە‌)',
+'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارھێنەر}}]',
+'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)',
 'rc_categories_any' => 'هەرکام',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری',
 'newsectionsummary' => '/* $1 */ بەشی نوێ',
@@ -1533,8 +1526,8 @@ $1",
 'uploadlogpagetext' => 'لەخوارەوە لیستی دوایین بارکراوەکان دەبینی.
 بۆ ئەوەی چاوێکیان لێ بکەی، [[Special:NewFiles|گالەری پەڕگە نوێکان]] ببینە.',
 'filename' => 'ناوی پەڕگە',
-'filedesc' => 'پوختە',
-'fileuploadsummary' => 'پوختە:',
+'filedesc' => 'کورتە',
+'fileuploadsummary' => 'کورتە:',
 'filereuploadsummary' => 'گۆرانکارییەکانی پەڕگە:',
 'filestatus' => 'بارودۆخی مافی لەبەرگرتنەوە:',
 'filesource' => 'سەرچاوە:',
@@ -1653,9 +1646,6 @@ $1',
 'img-auth-nofile' => 'فایلی "$1" بوونی نیه‌',
 'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌',
 
-# HTTP errors
-'http-host-unreachable' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
-
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
 'upload-curl-error6-text' => 'ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
@@ -1909,6 +1899,7 @@ $1',
 بینینەکە سنووردار بکەیتەوە.',
 'logempty' => 'هیچ بابەتێکی هاوتا لە لۆگەکاندا نەدۆزرایەوە.',
 'log-title-wildcard' => 'گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن',
+'showhideselectedlogentries' => 'بابەتەکانی ھەڵبژێردراوی لۆگ نیشان بدە/بشارەوە',
 
 # Special:AllPages
 'allpages' => 'ھەموو پەڕەکان',
@@ -1962,25 +1953,16 @@ $1',
 'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
 'listusers-blocked' => '(بەربەست کراوە)',
 
-# Special:ActiveUsers
-'activeusers' => 'پێرستی بەکارھێنەرە چالاکەکان',
-'activeusers-intro' => 'ئەمە لیستێکی ئەو بەکارھێنەرانەیە کە لە  $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ی ڕابردوودا بە جۆرێک چالاکییەکیان ھەبووە.',
-'activeusers-count' => '$1 {{PLURAL:$1|کردەوە}} لە دوایین {{PLURAL:$3|ڕۆژ|$3 ڕۆژ}}دا',
-'activeusers-from' => 'نیشاندانی بەکارھێنەران بە دەستپێکردن لە:',
-'activeusers-hidebots' => 'بۆتەکان بشارەوە',
-'activeusers-hidesysops' => 'بەڕێوبەران بشارەوە',
-'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
-
 # Special:ListGroupRights
 'listgrouprights' => 'مافەکانی گرووپی بەکارھێنەر',
 'listgrouprights-summary' => 'ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
 لێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە مافە تاکەکەسیەکان.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">مافی دراوە</span>
-* <span class="listgrouprights-granted">Ù\85اÙ\81Û\8c Ø³Û\95Ù\86دراÙ\88Û\95</span>',
+* <span class="listgrouprights-granted">مافی سەنراوە</span>',
 'listgrouprights-group' => 'گرووپ',
 'listgrouprights-rights' => 'مافەکان',
 'listgrouprights-helppage' => 'Help:مافەکانی گرووپ',
-'listgrouprights-members' => '(Ù\84Û\8cستی ئەندامەکان)',
+'listgrouprights-members' => '(Ù¾Û\8eرستی ئەندامەکان)',
 'listgrouprights-addgroup' => 'زیادکردنی {{PLURAL:$2|گرووپ|گرووپ}}: $1',
 'listgrouprights-removegroup' => 'لابردنی {{PLURAL:$2|گرووپ|گرووپ}}: $1',
 'listgrouprights-addgroup-all' => 'زیادکردنی هەموو گرووپەکان',
@@ -2008,13 +1990,13 @@ $1',
 'emailtarget' => 'ناوی بەکارھێنەریی وەرگر بنووسە',
 'emailusername' => 'ناوی به‌كارھێنه‌ر:',
 'emailusernamesubmit' => 'بینێرە',
-'email-legend' => 'ناردنی ئیمەیلێک بۆ بەکارهێنەرێکی دیکەی {{SITENAME}}',
+'email-legend' => 'ناردنی ئیمەیلێک بۆ بەکارھێنەرێکی تری {{SITENAME}}',
 'emailfrom' => 'لە:',
 'emailto' => 'بۆ:',
 'emailsubject' => 'بابەت:',
 'emailmessage' => 'پەیام:',
 'emailsend' => 'بینێرە',
-'emailccme' => 'Ú©Û\86Ù¾Û\8cÛ\8cÛ\95Ú© Ù\84Û\95 Ù\86امەکە بنێرە بۆ ئیمەیلەکەم.',
+'emailccme' => 'Ú©Û\86Ù¾Û\8cÛ\8cÛ\95Ú© Ù\84Û\95 Ù¾Û\95Û\8cامەکە بنێرە بۆ ئیمەیلەکەم.',
 'emailccsubject' => 'کۆپیی نامەکەت بۆ $1: $2',
 'emailsent' => 'نامەکەت ناردرا',
 'emailsenttext' => 'نامەکەت ناردرا',
@@ -2052,7 +2034,7 @@ $1',
 'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
 'iteminvalidname' => "ھەڵە لەگەڵ بابەتی '$1'، ناوی نادروست...",
 'wlnote' => "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.",
-'wlshowlast' => 'دوایین $1 کاتژمێر  $2 ڕۆژی $3 نیشانبدە',
+'wlshowlast' => 'دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە',
 'watchlist-options' => 'ھەڵبژاردەکانی لیستی چاودێری',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2151,10 +2133,10 @@ $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' => 'گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]',
 'revertpage-nouser' => 'دەستکارییەکانی (ناوی بەکارھێنەر سڕاوەتەوە) بۆ دوایین پێداچوونەوەی [[User:$1|$1]] گەڕێنراوە.',
 'rollback-success' => 'دەستکارییەکانی $1 وەرگێرایەوە؛<br />
-گۆڕدرا بۆ دوایین دەستکاریی $2.',
+گۆڕدرا بۆ دوایین پێداچوونەوەی $2.',
 
 # Edit tokens
 'sessionfailure' => 'لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.
@@ -2187,8 +2169,8 @@ $UNWATCHURL
 'protect-cascadeon' => 'ھەنووکە ئەم پەڕە پارێزراوە بۆ ئەوەی کە لە نێو ئەم {{PLURAL:$1|پەڕە کە پاراستنی تاڤگەییی|پەڕانە کە پاراستنی تاڤگەیییان}} بۆ چالاککراوە، ھێنراوە.
 دەتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، بەڵام ھیچ کاریگەرییەکی نابێت لە سەر پاراستنی تاڤگەیی',
 'protect-default' => 'بە ھەموو بەکارھێنەران ڕێگە بدە',
-'protect-fallback' => 'پێویستی بە ئیزنی «$1» ھەیە',
-'protect-level-autoconfirmed' => 'بÛ\95کارھÛ\8eÙ\86Û\95راÙ\86Û\8c Ù\86Ù\88Û\8e Ù\88 ØªÛ\86Ù\85ارÙ\86Û\95کراÙ\88 Ø¦Ø§Ø³ØªÛ\95Ù\86Ú¯ Ø¨Ú©ە',
+'protect-fallback' => 'تەنیا بە بەکارھێنەران بە مافی «$1» ڕێگە بدە',
+'protect-level-autoconfirmed' => 'تÛ\95Ù\86Û\8cا Ø¨Û\95 Ø¨Û\95کارھÛ\8eÙ\86Û\95راÙ\86Û\8c Ù¾Û\95سÙ\86دکراÙ\88 Ú\95Û\8eÚ¯Û\95 Ø¨Ø¯ە',
 'protect-level-sysop' => 'تەنیا بەڕێوەبەران',
 'protect-summary-cascade' => 'تاڤگەیی',
 'protect-expiring' => 'بەسەردەچێ لە ڕێکەوتی $1 (UTC)',
@@ -2305,7 +2287,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'ھەنووکە ئەم ناونیشانەی IPیە بەربەست کراوە.
 دوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:',
 'sp-contributions-search' => 'گەڕان بۆ بەشدارییەکان',
-'sp-contributions-username' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارھێنەری:',
+'sp-contributions-username' => 'ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:',
 'sp-contributions-toponly' => 'تەنیا ئەو دەستکارییانە نیشانبدە کە دوایین پیاچوونەوەن',
 'sp-contributions-submit' => 'بگەڕێ',
 
@@ -2337,7 +2319,7 @@ $1',
 'blockiptext' => 'لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.
 ئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].
 لە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).',
-'ipadressorusername' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارهێنەری:',
+'ipadressorusername' => 'ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:',
 'ipbexpiry' => 'بەسەرچوون:',
 'ipbreason' => 'هۆکار:',
 'ipbreasonotherlist' => 'هۆکاری تر',
@@ -2585,9 +2567,9 @@ $1',
 تکایە سەردانی [//www.mediawiki.org/wiki/Localisation ناوچەیی‌کردنی میدیاویکی] و [//translatewiki.net translatewiki.net] بکە ئەگەر دەتەوێ لە ناوچەیی‌کردنی میدیاویکی بە گشتی بەشداری بکەیت.',
 'allmessagesnotsupportedDB' => "ئەم لاپەڕە ناتوانی بەکاربێت لەبەر ئەوەی '''\$wgUseDatabaseMessages''' لەکار خستراوە.",
 'allmessages-filter-legend' => 'پاڵێو',
-'allmessages-filter-unmodified' => 'چاکسازی نەکراو',
+'allmessages-filter-unmodified' => 'نەگۆڕدراو',
 'allmessages-filter-all' => 'هەموو',
-'allmessages-filter-modified' => 'Ú\86اکسازÛ\8câ\80\8cÚ©راو',
+'allmessages-filter-modified' => 'Ú¯Û\86Ú\95دراو',
 'allmessages-prefix' => 'پاڵێو بە پێشگر:',
 'allmessages-language' => 'زمان:',
 'allmessages-filter-submit' => 'بڕۆ',
@@ -2607,9 +2589,9 @@ $1',
 # Special:Import
 'import' => 'ھاوردنی پەڕەکان',
 'importinterwiki' => 'هێنانەناوەی ترانس‌ویکی',
-'import-interwiki-text' => 'بۆ هێنانە‌ناوە ویکی‌یەک و سەردێڕێکی لاپەڕە هەڵبژێرە.
-ڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاری‌کەرەکان دەپارێزدرێت.
-هەموو کردوەکانی هێنانەناوەی ترانس‌ویکی لە [[Special:Log/import|لۆگی هێنانەناوە]] لۆگ دەکرێت.',
+'import-interwiki-text' => 'بۆ ھاوردن ویکییەک و سەردێڕێکی پەڕە ھەڵبژێرە.
+ڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاریکەرەکان دەپارێزرێت.
+هەموو کردەوەکانی ھاوردنی ترانسویکی لە [[Special:Log/import|لۆگی ھاوردن]]دا تۆمار دەکرێت.',
 'import-interwiki-source' => 'سەرچاوەی ویکی\\لاپەڕە :',
 'import-interwiki-history' => 'ڕوونووس‌کردنی هەموو مێژووی پێداچوونەوەکانی ئەم لاپەڕە',
 'import-interwiki-templates' => 'لەخۆگرتنی هەموو داڕێژەکان',
@@ -2647,7 +2629,7 @@ $1',
 'import-invalid-interwiki' => 'لە ویکی‌ دیاری‌کراوە ناهێنڕێتەوە ناوە.',
 
 # Import log
-'importlogpage' => 'Ù\87Û\8eÙ\86اÙ\86Û\95Ù\86اÙ\88Û\95Û\8c Ù\84Û\86Ú¯',
+'importlogpage' => 'Ù\84Û\86Ú¯Û\8c Ú¾Ø§Ù\88ردÙ\86',
 'importlogpagetext' => 'ھاوردنی پەڕەکان لەگەڵ مێژووی دەستکاری لە ویکییەکانی ترەوە.',
 'import-logentry-upload' => 'ھاوردنی [[$1]] بە بارکردنی پەڕگە',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}',
@@ -2722,7 +2704,7 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'نوێکردنەوەی لیستی چاودێری',
 'tooltip-recreate' => 'درووست‌کردنەوەی لاپەڕە ئەگەرچی سڕاوەتەوە',
 'tooltip-upload' => 'دەستپێکردنی بارکردن',
-'tooltip-rollback' => '«گەڕاندنەوە» بە یەک کرتە گۆڕانکاریی/گۆڕانکارییەکانی ئەم پەڕەیە دەگەڕێنێتەوە بۆ دواین بەشداربوو',
+'tooltip-rollback' => '«گەڕاندنەوە» بە یەک کرتە گۆڕانکاریی/گۆڕانکارییەکانی ئەم پەڕەیە دەگەڕێنێتەوە بۆ دوایین بەشداربوو',
 'tooltip-undo' => '«پووچەڵکردنەوە» ئەم گۆڕانکارییە دەگەڕێنێتەوە و فۆرمی دەستکاریکردن لە شێوەی پێشبینیندا دەکاتەوە. بەم جۆرە دەکرێ ھۆکارێک لە کورتەی دەستکاریدا بنووسرێ.',
 'tooltip-preferences-save' => 'هەڵبژاردنەکانت بپارێزە',
 'tooltip-summary' => 'پوختەیەکی کورتی تێبخە',
@@ -2766,7 +2748,7 @@ $1',
 'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
 'pageinfo-views' => 'ژمارەی بینینەکان',
 'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
-'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاوەدێر}}',
+'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاودێر}}',
 'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
 'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
@@ -2784,32 +2766,33 @@ $1',
 'pageinfo-contentpage' => 'ھەژمارکراو وەک پەڕەی بەناوەرۆک',
 'pageinfo-contentpage-yes' => 'بەڵێ',
 'pageinfo-protect-cascading-yes' => 'بەڵێ',
+'pageinfo-category-pages' => 'ژمارەی پەڕەکان',
+'pageinfo-category-subcats' => 'ژمارەی ژێرپەڕەکان',
+'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'غەریبی',
 'skinname-cologneblue' => 'شینی کۆلۆن',
 'skinname-monobook' => 'مۆنۆ',
-'skinname-myskin' => 'پێستی خۆم',
-'skinname-chick' => 'جووچک',
-'skinname-simple' => 'ساکار',
 'skinname-modern' => 'مۆدێڕن',
 'skinname-vector' => 'ڤێکتۆر',
 
 # Patrolling
-'markaspatrolleddiff' => 'وەک چاودێری‌کراو نیشان‌کردن',
-'markaspatrolledtext' => 'ئەم لاپەڕە وەک چاودێری‌کراو نیشان بکە',
-'markedaspatrolled' => 'وەک چاودێری‌کراو نیشان‌کرا',
-'markedaspatrolledtext' => 'پێداچوونەوەی هەڵبژێراوی [[:$1]] وەک چاودێریکراو نیشان‌کرا.',
-'rcpatroldisabled' => 'چاودێری دوایین گۆڕانکاریەکان لەکار خسترا',
-'rcpatroldisabledtext' => 'تایبەتمەندی چاودێری دوایین گۆڕانکاریەکان ئێستا لەکار خستراوە.',
-'markedaspatrollederror' => 'ناکرێ وه‌ک چاودێری‌کراو نیشان بکرێت',
-'markedaspatrollederror-noautopatrol' => 'ڕێگەت پێ‌نەدراوە گۆڕانکاریەکانی خۆت وەک چاودێری‌کراو نیشان بکەیت.',
+'markaspatrolleddiff' => 'وەک پاس دراو نشان بکە',
+'markaspatrolledtext' => 'ئەم پەڕەیە وەک پاس دراو نیشان بکە',
+'markedaspatrolled' => 'وەک پاس دراو نیشان کرا',
+'markedaspatrolledtext' => 'پێداچوونەوەی هەڵبژێردراوی [[:$1]] وەک پاس دراو نیشان کرا.',
+'rcpatroldisabled' => 'پاسدەریی دوایین گۆڕانکاریەکان ناچالاک کرا',
+'rcpatroldisabledtext' => 'تایبەتمەندیی پاسدەریی دوایین گۆڕانکارییەکان ئێستا ناچالاک کراوە.',
+'markedaspatrollederror' => 'وه‌ک پاس دراو نیشان نەکرا',
+'markedaspatrollederrortext' => 'دەبێ پێداچوونەوەیەک دەستنیشان بکەی ھەتا وەک پاس دراو نیشان بکرێ.',
+'markedaspatrollederror-noautopatrol' => 'ناتوانی گۆڕانکارییەکانی خۆت وەک پاس دراو نیشان بکەی.',
+'markedaspatrollednotify' => 'ئەم گۆڕانکارییە لەسەر $1 وەک پاس دراو نیشان کرا.',
+'markedaspatrollederrornotify' => 'نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.',
 
 # Patrol log
-'patrol-log-page' => 'لۆگی چاودێری',
-'patrol-log-header' => 'ئەمە لۆگێکی چاودێری پێداچوونەوەکانە.',
-'log-show-hide-patrol' => 'لۆگی چاودێری $1',
+'patrol-log-page' => 'لۆگی پاسدەری',
+'patrol-log-header' => 'ئەمە لۆگێکی پێداچوونەوە پاس دراوەکانە.',
+'log-show-hide-patrol' => 'لۆگی پاسدەری $1',
 
 # Image deletion
 'deletedrevision' => 'پێداچوونەوەی کۆنی سڕاوە $1',
@@ -3440,10 +3423,10 @@ $5
 'htmlform-selectorother-other' => 'دیکە',
 
 # New logging system
-'logentry-delete-delete' => '$1 پەڕەی $3ی سڕییەوە',
-'logentry-delete-restore' => '$1 پەڕەی $3ی ھێنایەوە',
-'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی گۆڕیی: $4',
-'logentry-suppress-delete' => '$1 پەڕەی $3 بەرگری کرد.',
+'logentry-delete-delete' => '$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}',
+'logentry-delete-restore' => '$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}',
+'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4',
+'logentry-suppress-delete' => '$1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}.',
 'revdelete-content-hid' => 'ناوەرۆک شاردراوە',
 'revdelete-summary-hid' => 'کورتەی دەستکاری شاردراوە',
 'revdelete-uname-hid' => 'ناوی بەکارهێنەری شاراوە',
@@ -3452,14 +3435,16 @@ $5
 '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-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 دروست کرا',
-'logentry-newusers-autocreate' => 'ھەژماری $1 بە شێوەی خۆگەڕ دروستکرا',
+'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 پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-patrol-patrol-auto' => '$1 بە شێوەی خۆگەڕ پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-autocreate' => 'ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}',
 'rightsnone' => '(ھیچ)',
 
 # Feedback
index ad088f0..2215b81 100644 (file)
@@ -129,8 +129,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Közetken qullanıcı sayısını köster',
 'tog-oldsig' => 'Şimdiki imza:',
 'tog-fancysig' => 'İmza vikimetin kibi olsun (avtomatik bağlantı olmaz)',
-'tog-externaleditor' => 'Tış türlendirgiç (redaktor) qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-externaldiff' => 'Teñeştimek içün tış bir programma qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
 'tog-showjumplinks' => '"Bar" bağlantısını faalleştir',
 'tog-uselivepreview' => 'Canlı baqıp çıquv hususiyetini qullan (JavaScript) (daa deñeme alında)',
 'tog-forceeditsummary' => 'Deñiştirmeniñ qısqa tarifini boş taşlasam meni tenbile',
@@ -889,9 +887,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'search-external' => 'Tış qıdıruv',
 'searchdisabled' => '{{SITENAME}} saytında qıdıruv yapma vaqtınca toqtatıldı. Bu arada Google qullanıp {{SITENAME}} içinde qıdıruv yapıp olasıñız. Qıdıruv saytlarında indekslemeleriniñ biraz eski qalğan ola bilecegini köz ögüne alıñız.',
 
-# Quickbar
-'qbsettings' => 'Vızlı irişim sutun sazlamaları',
-
 # Preferences page
 'preferences' => 'Sazlamalar',
 'mypreferences' => 'Sazlamalar',
@@ -1812,13 +1807,8 @@ MediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege istese
 'spam_blanking' => 'Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev',
 
 # Skin names
-'skinname-standard' => 'Standart',
-'skinname-nostalgia' => 'Nostalgiya',
 'skinname-cologneblue' => 'Köln asretligi',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Öz resimleme',
-'skinname-chick' => 'Çipçe',
-'skinname-simple' => 'Adiy',
 
 # Patrol log
 'patrol-log-page' => 'Teşkerüv jurnalı',
@@ -2100,6 +2090,11 @@ Bitirgen soñ "{{int:Watchlistedit-raw-submit}}" yazısına basıñız.
 'blankpage' => 'Bоş saife',
 'intentionallyblankpage' => 'Bu saife aselet boş qaldırılğan',
 
+# Special:ComparePages
+'comparepages' => 'Saifelerni teñeştirüv',
+'compare-selector' => 'Saifelerniñ versiyalarını teñeştirüv',
+'compare-submit' => 'Teñeştir',
+
 # HTML forms
 'htmlform-reset' => 'Deñişikliklerni keri al',
 
index d9f70ce..0cf4a7a 100644 (file)
@@ -390,8 +390,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobrazovat počet sledujících uživatelů',
 'tog-oldsig' => 'Stávající podpis:',
 'tog-fancysig' => 'Používat v podpisu wikitext (bez automatického odkazu)',
-'tog-externaleditor' => 'Implicitně používat externí editor (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-externaldiff' => 'Implicitně používat externí porovnávací program (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
 'tog-showjumplinks' => 'Používat odkazy „skočit na“ pro vyšší přístupnost',
 'tog-uselivepreview' => 'Používat rychlý náhled (JavaScript) (Experimentální)',
 'tog-forceeditsummary' => 'Upozornit, když nevyplním shrnutí editace',
@@ -406,6 +404,7 @@ $messages = array(
 'tog-showhiddencats' => 'Zobrazit skryté kategorie',
 'tog-noconvertlink' => 'Vypnout konverzi názvů',
 'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
+'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -1126,6 +1125,8 @@ Zřejmě byla smazána.',
 'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
 'invalid-content-data' => 'Obsažená data jsou chybná',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
+Pokud jste {{GENDER:|přihlášen|přihlášena|přihlášeni}}, můžete si toto varování vypnout na záložce „{{int:prefs-editing}}“ v uživatelském nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1408,15 +1409,7 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'powersearch-togglenone' => 'Nic',
 'search-external' => 'Externí hledání',
 'searchdisabled' => '<p>Omlouváme se. Plnotextové vyhledávání je dočasně nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>',
-
-# Quickbar
-'qbsettings' => 'Nastavení lišty nástrojů',
-'qbsettings-none' => 'Žádný',
-'qbsettings-fixedleft' => 'Leží vlevo',
-'qbsettings-fixedright' => 'Leží vpravo',
-'qbsettings-floatingleft' => 'Plovoucí vlevo',
-'qbsettings-floatingright' => 'Plovoucí vpravo',
-'qbsettings-directionality' => 'Pevný v závislosti na směrovosti vašeho písma',
+'search-error' => 'Při hledání došlo k chybě: $1',
 
 # Preferences page
 'preferences' => 'Nastavení',
@@ -1740,7 +1733,7 @@ $3',
 # Upload
 'upload' => 'Načíst soubor',
 'uploadbtn' => 'Načíst soubor',
-'reuploaddesc' => 'Vrátit se k načtení.',
+'reuploaddesc' => 'Zrušit načítání a vrátit se do formuláře.',
 'upload-tryagain' => 'Uložit upravený popis souboru',
 'uploadnologin' => 'Nejste přihlášen(a)',
 'uploadnologintext' => 'Pro načtení souboru se musíte [[Special:UserLogin|přihlásit]].',
@@ -1964,7 +1957,6 @@ Z bezpečnostních důvodů je img_auth.php vypnuto.',
 'http-read-error' => 'Chyba při čtení HTTP.',
 'http-timed-out' => 'Čas pro HTTP požadavek vypršel.',
 'http-curl-error' => 'Chyba při čtení z URL: $1',
-'http-host-unreachable' => 'Nepodařilo se kontaktovat URL',
 'http-bad-status' => 'Při provádění HTTP požadavku nastal problém: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2288,15 +2280,6 @@ Povinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br
 'listusers-noresult' => 'Nenalezen žádný uživatel.',
 'listusers-blocked' => '({{GENDER:$1|zablokován|zablokována|zablokován}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Seznam aktivních uživatelů',
-'activeusers-intro' => 'Toto je seznam uživatelů, kteří byli nějak aktivní v {{plural:$1|posledním dni|posledních $1 dnech}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|akce|akce|akcí}} během {{PLURAL:$3|posledního dne|posledních $3 dnů}}',
-'activeusers-from' => 'Zobrazit uživatele počínaje od:',
-'activeusers-hidebots' => 'Skrýt roboty',
-'activeusers-hidesysops' => 'Skrýt správce',
-'activeusers-noresult' => 'Nenalezen žádný uživatel.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Práva skupin uživatelů',
 'listgrouprights-summary' => 'Toto je seznam uživatelských skupin definovaných na této wiki a&nbsp;jejich přístupových práv.
@@ -2776,6 +2759,7 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 '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',
 'cant-block-while-blocked' => 'Nemůžete blokovat jiné uživatele, když jste zablokován(a).',
 'cant-see-hidden-user' => 'Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.',
 'ipbblocked' => 'Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}',
@@ -3079,13 +3063,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Stylesheets
 'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
-'standard.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Klasický“  */',
-'nostalgia.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Nostalgie“  */',
 'cologneblue.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kolínská modř“  */',
 'monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */',
-'myskin.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Můj vzhled“ */',
-'chick.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kuře“ */',
-'simple.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Jednoduchý“ */',
 'modern.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Moderní“ */',
 'vector.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */',
 'print.css' => '/* Zde uvedené CSS bude ovlivňovat tiskový výstup */',
@@ -3098,13 +3077,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Scripts
 'common.js' => '/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky.  */',
-'standard.js' => '/* JavaScript pro uživatele používající vzhled „Klasický“ */',
-'nostalgia.js' => '/* JavaScript pro uživatele používající vzhled „Nostalgie“  */',
 'cologneblue.js' => '/* JavaScript pro uživatele používající vzhled „Kolínská modř“  */',
 'monobook.js' => '/* JavaScript pro uživatele používající vzhled MonoBook */',
-'myskin.js' => '/* JavaScript pro uživatele používající vzhled „Můj vzhled“ */',
-'chick.js' => '/* JavaScript pro uživatele používající vzhled „Kuře“ */',
-'simple.js' => '/* JavaScript pro uživatele používající vzhled „Jednoduchý“ */',
 'modern.js' => '/* JavaScript pro uživatele používající vzhled „Moderní“ */',
 'vector.js' => '/* JavaScript pro uživatele používající vzhled „Vektor“ */',
 'group-autoconfirmed.js' => '/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */',
@@ -3183,12 +3157,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-category-files' => 'Počet souborů',
 
 # Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kolínská modř',
-'skinname-myskin' => 'Můj vzhled',
-'skinname-chick' => 'Kuře',
-'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderní',
 'skinname-vector' => 'Vektor',
 
@@ -4045,6 +4014,8 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'htmlform-submit' => 'Odeslat',
 'htmlform-reset' => 'Vrátit změny',
 'htmlform-selectorother-other' => 'Jiná hodnota',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Ano',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
index ab81729..58a4f9d 100644 (file)
@@ -162,6 +162,7 @@ $messages = array(
 'tog-diffonly' => "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
 'tog-showhiddencats' => 'Dangos categorïau cuddiedig',
 'tog-norollbackdiff' => 'Hepgor dangos cymhariaeth ar ôl gwrthdroi golygiad',
+'tog-useeditwarning' => "Tynnwch fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
 
 'underline-always' => 'Bob amser',
 'underline-never' => 'Byth',
@@ -874,6 +875,8 @@ Mae ar gael yn barod.',
 'content-failed-to-parse' => "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
 'invalid-content-data' => "Data annilys i'r cynnwys",
 'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
+'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
+Gallwch ddiddymu\'r rhybudd hwn yn yr adran "{{int:prefs-editing}}" yn eich dewisiadau.',
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -1158,15 +1161,6 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 Yn y cyfamser gallwch chwilio drwy Google.
 Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 
-# Quickbar
-'qbsettings' => 'Panel llywio',
-'qbsettings-none' => 'Dim',
-'qbsettings-fixedleft' => 'Sefydlog ar y chwith',
-'qbsettings-fixedright' => 'Sefydlog ar y dde',
-'qbsettings-floatingleft' => 'Yn arnofio ar y chwith',
-'qbsettings-floatingright' => 'Yn arnofio ar y dde',
-'qbsettings-directionality' => "Yn sefydlog, ar yr ochr o'r ddalen lle rydych yn dechrau ysgrifennu eich iaith",
-
 # Preferences page
 'preferences' => 'Dewisiadau',
 'mypreferences' => 'Dewisiadau',
@@ -1463,8 +1457,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'rclinks' => 'Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3',
 'diff' => 'gwahan',
 'hist' => 'hanes',
-'hide' => 'Cuddio',
-'show' => 'Dangos',
+'hide' => 'Cuddier',
+'show' => 'Dangoser',
 'minoreditletter' => 'B',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1709,7 +1703,6 @@ Er mwyn sicrhau'r diogelwch gorau posib, analluogwyd img_auth.php.",
 'http-read-error' => 'Cafwyd gwall wrth ddarllen yr HTTP.',
 'http-timed-out' => 'Goroedi wedi digwydd ar y cais HTTP.',
 'http-curl-error' => 'Cafwyd gwall wrth nôl yr URL: $1',
-'http-host-unreachable' => 'Wedi methu cyrraedd yr URL.',
 'http-bad-status' => 'Cafwyd trafferth yn ystod y cais HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2035,15 +2028,6 @@ Mae angen parth lefel-uchaf o leiaf, er enghraifft "*.org".<br />
 'listusers-noresult' => "Dim defnyddiwr i'w gael.",
 'listusers-blocked' => '(wedi ei flocio)',
 
-# Special:ActiveUsers
-'activeusers' => 'Rhestr defnyddwyr gweithgar',
-'activeusers-intro' => 'Dyma restr y defnyddwyr a fuont yn weithgar o fewn y {{PLURAL:$1|diwrnod|diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf.',
-'activeusers-count' => '$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}} yn ystod y {{PLURAL:$3|diwrnod|diwrnod|deuddydd|tridiau|$3 diwrnod}} diwethaf',
-'activeusers-from' => "Rhestru'r defnyddwyr gan ddechrau gyda:",
-'activeusers-hidebots' => 'Cuddio botiau',
-'activeusers-hidesysops' => 'Cuddio gweinyddwyr',
-'activeusers-noresult' => "Dim defnyddwyr i'w cael.",
-
 # Special:ListGroupRights
 'listgrouprights' => 'Galluoedd grwpiau defnyddwyr',
 'listgrouprights-summary' => "Dyma restr o'r grwpiau defnyddwyr sydd i'w cael ar y wici hon, ynghyd â galluoedd aelodau'r gwahanol grwpiau. Cewch wybodaeth pellach am y gwahanol alluoedd ar y [[{{MediaWiki:Listgrouprights-helppage}}|dudalen gymorth]].",
@@ -2535,6 +2519,7 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
 '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',
+'xffblockreason' => "Mae un o'r cyfeiriadau IP yn y pennyn 'X-Forwarded-For' wedi cael ei atal; naill ai eich cyfeiriad chi neu un o'r gweinyddion dirprwyol a ddefnyddiwyd gennych. Y rheswm gwreiddiol dros atal oedd: $1",
 'cant-block-while-blocked' => 'Ni allwch flocio defnyddwyr eraill tra bod rhwystr arnoch chithau.',
 'cant-see-hidden-user' => "Mae'r defnyddiwr yr ydych yn ceisio'i rwystro wedi ei rwystro a'i guddio'n barod.
 Gan nad yw'r gallu i guddio defnyddwyr gennych, ni allwch weld y rhwystr sydd ar y defnyddiwr na'i olygu.",
@@ -2755,6 +2740,7 @@ Mae ffolder dros dro yn eisiau.',
 'import-error-interwiki' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu\'n allanol (rhyngwici).',
 'import-error-special' => 'Ni fewnforiwyd y dudalen "$1" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i\'w cael.',
 'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
+'import-error-unserialize' => "Ni allwyd ddad-gyfresu'r diwygiad $2 o'r dudalen '$1'. Adroddwyd bod y diwygiad yn defnyddio'r model cynnwys $3, wedi ei gyfresu fel $4.",
 'import-options-wrong' => '{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Mae teitl y dudalen wraidd a roddir yn annilys.',
 'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y brif dudalen y mewnforir iddi, yn caniatau is-dudalennau.',
@@ -2919,8 +2905,6 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-category-files' => 'Nifer y ffeiliau',
 
 # Skin names
-'skinname-standard' => 'Safonol',
-'skinname-nostalgia' => 'Hiraeth',
 'skinname-cologneblue' => 'Glas Cwlen',
 
 # Patrolling
@@ -3718,14 +3702,14 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
 'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
 'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
-'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
-'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
-'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
-'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
+'logentry-delete-revision' => "{{GENDER:$2|Newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3',
+'logentry-delete-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3",
+'logentry-suppress-delete' => '{{GENDER:$2|Cuddiodd}} $1 y dudalen $3',
+'logentry-suppress-event' => 'Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
+'logentry-suppress-revision' => "Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3, yn y dirgel',
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
 'revdelete-content-hid' => 'cuddiwyd y cynnwys',
 'revdelete-summary-hid' => 'cuddiwyd y crynodeb golygu',
 'revdelete-uname-hid' => 'cuddiwyd yr enw defnyddiwr',
@@ -3736,18 +3720,18 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
 'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
 'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
-'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
+'logentry-move-move_redir' => '{{GENDER:$2|Symudwyd}} y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
 'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
-'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-patrol-patrol-auto' => "Rhoddodd $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-newusers-newusers' => 'Dechreuwyd y cyfrif defnyddiwr $1',
+'logentry-patrol-patrol' => "{{GENDER:$2|Rhoddodd}} $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|Rhoddodd}} $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-newusers-newusers' => '{{GENDER:$2|Dechreuwyd}} y cyfrif defnyddiwr $1',
 'logentry-newusers-create' => 'Dechreuwyd y cyfrif defnyddiwr $1',
 'logentry-newusers-create2' => 'Dechreuwyd y cyfrif defnyddiwr $3 gan $1',
-'logentry-newusers-byemail' => 'Dechreuodd $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
-'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
-'logentry-rights-rights' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
-'logentry-rights-rights-legacy' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt',
-'logentry-rights-autopromote' => 'Dyrchafwyd $1 yn awtomatig o $4 i $5',
+'logentry-newusers-byemail' => '{{GENDER:$2|Dechreuodd}} $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
+'logentry-newusers-autocreate' => '{{GENDER:$2|Crëwyd}} y cyfrif $1 yn awtomatig',
+'logentry-rights-rights' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt',
+'logentry-rights-autopromote' => '{{GENDER:$2|Dyrchafwyd}} $1 yn awtomatig o $4 i $5',
 'rightsnone' => '(dim)',
 
 # Feedback
index 88ffe6f..3094234 100644 (file)
@@ -18,6 +18,7 @@
  * @author Froztbyte
  * @author Gorbi
  * @author H92
+ * @author HenrikKbh
  * @author Hylle
  * @author Jan Friberg
  * @author Jon Harald Søby
@@ -491,7 +492,7 @@ $1',
 'nstab-special' => 'speciel',
 'nstab-project' => 'Projektside',
 'nstab-image' => 'Fil',
-'nstab-mediawiki' => 'besked',
+'nstab-mediawiki' => 'Besked',
 'nstab-template' => 'skabelon',
 'nstab-help' => 'hjælp',
 'nstab-category' => 'kategori',
@@ -667,7 +668,7 @@ Du bør logge på og ændre din adgangskode straks efter du har modtaget e-maile
 'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mail-adresse.
 
 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 et nyt password. For at forhindre misbrug af funktionen, kan der kun bestilles et nyt password en gang for hver {{PLURAL:$1|time|$1 timer}}.',
+'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.',
@@ -717,7 +718,7 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
 
 # Special:PasswordReset
 'passwordreset' => 'Nulstil adgangskode',
-'passwordreset-text' => 'Udfyld denne formular for at modtage en påmindelse om dine kontooplysninger som e-mail.',
+'passwordreset-text' => 'Udfyld denne formular for at nulstille din adgangskode.',
 'passwordreset-legend' => 'Nulstil adgangskode',
 'passwordreset-disabled' => 'Nulstilling af kodeord er slået fra på denne wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Indtast en af de nedenstående oplysninger}}',
@@ -727,23 +728,23 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
 '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-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|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-mail-adresse:
 
 $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 anmodet om denne påmindelse, 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 har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|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 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:
 
 $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 anmodet om denne påmindelse, 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 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-emailelement' => 'Brugernavn: $1
 Midlertidig adgangskode: $2',
-'passwordreset-emailsent' => 'En påmindelse er blevet sendt som e-mail.',
-'passwordreset-emailsent-capture' => 'En påmindelsesemail, som vist nedenfor, er blevet sendt.',
-'passwordreset-emailerror-capture' => 'En påmindelsesemail, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
+'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet sendt.',
+'passwordreset-emailsent-capture' => 'En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.',
+'passwordreset-emailerror-capture' => 'En e-mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ændr email-adresse',
@@ -1239,15 +1240,6 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'search-external' => 'Brug anden søgemaskine',
 'searchdisabled' => '<p>Beklager! Fuldtekstsøgningen er midlertidigt afbrudt på grund af for stor belastning på serverne. I mellemtidem kan du anvende Google- eller Yahoo!-søgefelterne herunder. Bemærk at deres kopier af {{SITENAME}}s indhold kan være forældet.</p>',
 
-# Quickbar
-'qbsettings' => 'Hurtigmenu',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast højre',
-'qbsettings-floatingleft' => 'Flydende venstre',
-'qbsettings-floatingright' => 'Flydende højre',
-'qbsettings-directionality' => 'Fast, afhængigt af dit sprogs skriveretning',
-
 # Preferences page
 'preferences' => 'Indstillinger',
 'mypreferences' => 'Indstillinger',
@@ -1798,7 +1790,6 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'http-read-error' => 'HTTP-læsefejl.',
 'http-timed-out' => 'HTTP-forespørgslen tog for lang tid.',
 'http-curl-error' => 'Fejl under hentning af URL: $1',
-'http-host-unreachable' => 'Webadresse er ikke tilgængelig.',
 'http-bad-status' => 'Der opstod et problem under HTTP-forespørgslen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2122,15 +2113,6 @@ Der skal som minimum angives et topniveau-domæne som f. eks. "*.org".<br />
 'listusers-noresult' => 'Ingen bruger fundet.',
 'listusers-blocked' => '(blokeret)',
 
-# Special:ActiveUsers
-'activeusers' => 'Liste over aktive brugere',
-'activeusers-intro' => 'Dette er en liste over brugere, som har haft en eller anden form for aktivitet inden for {{PLURAL:$1|den|de}} seneste {{PLURAL:$1|dag|$1 dage}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|handling|handlinger}} i {{PLURAL:$3|det seneste døgn|de seneste $3 dage}}',
-'activeusers-from' => 'Vis brugere som starter med:',
-'activeusers-hidebots' => 'Skjul robotter',
-'activeusers-hidesysops' => 'Skjul administratorer',
-'activeusers-noresult' => 'Ingen brugere fundet.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Brugergrupperettigheder',
 'listgrouprights-summary' => 'Denne side viser de brugergrupper der er defineret på denne wiki og de enkelte gruppers rettigheder.
@@ -2617,6 +2599,7 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
 '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',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre brugere mens du selv er blokkeret.',
 'cant-see-hidden-user' => 'Brugeren du prøver at blokerer er allerede blokeret og skjult. Siden du ikke har rettigheden til at skjule brugere, kan du ikke se eller ændre brugerens blokering.',
 'ipbblocked' => 'Du kan ikke ændre blokeringer, da du selv er blokeret',
@@ -2898,7 +2881,7 @@ Du kan se på kildeteksten.',
 'tooltip-ca-nstab-main' => 'Se indholdet',
 'tooltip-ca-nstab-user' => 'Se brugersiden',
 'tooltip-ca-nstab-media' => 'Se mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en speciel side; man kan ikke redigere sådanne sider',
+'tooltip-ca-nstab-special' => 'Dette er en specialside; man kan ikke redigere sådanne sider',
 'tooltip-ca-nstab-project' => 'Vis projektsiden',
 'tooltip-ca-nstab-image' => 'Se filsiden',
 'tooltip-ca-nstab-mediawiki' => 'Se systembeskeden',
@@ -3001,13 +2984,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Eget udseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkelt',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3803,17 +3781,17 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'sqlite-no-fts' => '$1 uden fuld-tekst søgnings support',
 
 # New logging system
-'logentry-delete-delete' => '$1 slettede siden $3',
-'logentry-delete-restore' => '$1 gendannede siden $3',
-'logentry-delete-event' => '$1 ændrede synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-delete-revision' => '$1 ændrede synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-delete-event-legacy' => '$1 ændrede synligheden af loghændelser for siden $3',
-'logentry-delete-revision-legacy' => '$1 ændrede synligheden af versioner af siden $3',
-'logentry-suppress-delete' => '$1 skjulte hændelser for siden $3',
-'logentry-suppress-event' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-suppress-revision' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-suppress-event-legacy' => '$1 ændrede hemmeligt synligheden af loghændelser for siden $3',
-'logentry-suppress-revision-legacy' => '$1 ændrede hemmeligt synligheden af versioner af siden $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettede}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gendannede}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af loghændelser for siden $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af versioner af siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} hændelser for siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af loghændelser for siden $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af versioner af siden $3',
 'revdelete-content-hid' => 'indhold skjult',
 'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
 'revdelete-uname-hid' => 'brugernavnet er skjult',
@@ -3822,20 +3800,20 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'revdelete-uname-unhid' => 'brugernavnet er ikke længere skjult',
 'revdelete-restricted' => 'tilføjede begrænsninger for administratorer',
 'revdelete-unrestricted' => 'fjernede begrænsninger for administratorer',
-'logentry-move-move' => '$1 flyttede siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttede siden $3 til $4 uden at efterlade en omdirigering',
-'logentry-move-move_redir' => '$1 flyttede siden $3 til $4 hen over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttede siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
-'logentry-patrol-patrol' => '$1 markerede version $4 af siden $3 som patruljeret',
-'logentry-patrol-patrol-auto' => '$1 markerede automatisk version $4 af siden $3 som patruljeret',
-'logentry-newusers-newusers' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create2' => 'Brugerkontoen $3 blev oprettet af $1',
-'logentry-newusers-byemail' => 'Brugerkonto  $3  blev oprettet af  $1  og adgangskode er sendt via e-mail',
-'logentry-newusers-autocreate' => 'Kontoen $1 blev automatisk oprettet',
-'logentry-rights-rights' => '$1 ændrede gruppemedlemskabet for $3 fra $4 til $5',
-'logentry-rights-rights-legacy' => '$1 ændrede gruppemedlemskabet for $3',
-'logentry-rights-autopromote' => '$1 blev automatisk forfremmet fra $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 uden at efterlade en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerede}} version $4 af siden $3 som patruljeret',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerede automatisk}} version $4 af siden $3 som patruljeret',
+'logentry-newusers-newusers' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create2' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1',
+'logentry-newusers-byemail' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1, og adgangskoden er sendt via e-mail',
+'logentry-newusers-autocreate' => 'Brugerkontoen $1 blev automatisk {{GENDER:$2|oprettet}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3',
+'logentry-rights-autopromote' => '$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5',
 'rightsnone' => '(-)',
 
 # Feedback
index 9c58c96..a3fb48f 100644 (file)
@@ -439,8 +439,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
 'tog-oldsig' => 'Vorhandene Signatur:',
 'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
 'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
@@ -455,6 +453,7 @@ $messages = array(
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
 'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
+'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
@@ -945,7 +944,7 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
-'passwordreset-capture-help' => 'Sofern Du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl dir angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-capture-help' => 'Wenn du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl dir angezeigt als auch dem Benutzer zugesandt.',
 'passwordreset-email' => 'E-Mail-Adresse:',
 'passwordreset-emailtitle' => 'Benutzerkontoinformationen auf {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines
@@ -1012,7 +1011,7 @@ Temporäres Passwort: $2',
 'showpreview' => 'Vorschau zeigen',
 'showlivepreview' => 'Sofortige Vorschau',
 'showdiff' => 'Änderungen zeigen',
-'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du sie speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du sie abspeicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
 'anonpreviewwarning' => "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
 'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
 'missingcommenttext' => 'Dein Abschnitt enthält keinen Text.',
@@ -1181,6 +1180,8 @@ Sie wurde anscheinend gelöscht.',
 'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
 'invalid-content-data' => 'Ungültige Inhaltsdaten',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im „{{int:prefs-editing}}“-Bereich deiner Einstellungen abschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1459,15 +1460,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Keine',
 'search-external' => 'Externe Suche',
 'searchdisabled' => 'Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
-
-# Quickbar
-'qbsettings' => 'Seitenleiste',
-'qbsettings-none' => 'Keine',
-'qbsettings-fixedleft' => 'Links, fest',
-'qbsettings-fixedright' => 'Rechts, fest',
-'qbsettings-floatingleft' => 'Links, schwebend',
-'qbsettings-floatingright' => 'Rechts, schwebend',
-'qbsettings-directionality' => 'Fest, abhängig von der Schreibrichtung der gewählten Sprache',
+'search-error' => 'Bei der Suche ist ein Fehler aufgetreten: $1',
 
 # Preferences page
 'preferences' => 'Einstellungen',
@@ -2025,7 +2018,6 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'http-read-error' => 'HTTP-Lesefehler.',
 'http-timed-out' => 'Zeitüberschreitung bei der HTTP-Anfrage.',
 'http-curl-error' => 'Fehler beim Abruf der URL: $1',
-'http-host-unreachable' => 'URL konnte nicht erreicht werden.',
 'http-bad-status' => 'Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2345,15 +2337,6 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
 'listusers-noresult' => 'Keinen Benutzer gefunden.',
 'listusers-blocked' => '(gesperrt)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktive Benutzer',
-'activeusers-intro' => 'Dies ist eine Liste von Benutzern, die innerhalb {{PLURAL:$1|des letzten Tages|der letzten $1 Tage}} Aktivitäten aufwiesen.',
-'activeusers-count' => '$1 {{PLURAL:$1|Aktion|Aktionen}} in den {{PLURAL:$3|letzten 24 Stunden|vergangenen $3 Tagen}}',
-'activeusers-from' => 'Zeige Benutzer ab:',
-'activeusers-hidebots' => 'Bots ausblenden',
-'activeusers-hidesysops' => 'Administratoren ausblenden',
-'activeusers-noresult' => 'Keine Benutzer gefunden.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Benutzergruppenrechte',
 'listgrouprights-summary' => 'Dies ist eine Liste der in diesem Wiki definierten Benutzergruppen und der damit verbundenen Rechte.
@@ -2739,7 +2722,7 @@ Bitte gib den Grund für die Sperre an.',
 'ipbenableautoblock' => 'Sperre die aktuell von diesem Benutzer genutzte IP-Adresse sowie automatisch alle folgenden, von denen aus er Bearbeitungen oder das Anlegen von Benutzerkonten versucht',
 'ipbsubmit' => 'IP-Adresse/Benutzer sperren',
 'ipbother' => 'Andere Dauer (englisch):',
-'ipboptions' => '2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,Unbeschränkt:infinite',
+'ipboptions' => '2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,unbeschränkt:infinite',
 'ipbotheroption' => 'Andere Dauer',
 'ipbotherreason' => 'Anderer/ergänzender Grund:',
 'ipbhidename' => 'Benutzername in Bearbeitungen und Listen verstecken',
@@ -2831,6 +2814,7 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
 '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',
 'cant-block-while-blocked' => 'Du kannst keine anderen Benutzer sperren, während du selbst gesperrt bist.',
 'cant-see-hidden-user' => 'Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.',
 'ipbblocked' => 'Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist',
@@ -2863,7 +2847,7 @@ Du kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korr
 Stelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.
 Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese eine Weiterleitung ohne Versionsgeschichte.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.
 Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.
 
 '''Warnung!'''
@@ -3140,13 +3124,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # Stylesheets
 'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
-'standard.css' => '/* Das folgende CSS wird für Benutzer der Klassik-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'nostalgia.css' => '/* Das folgende CSS wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'cologneblue.css' => '/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'monobook.css' => '/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.css' => '/* Das folgende CSS wird für Benutzer der MySkin-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'chick.css' => '/* Das folgende CSS wird für Benutzer der Küken-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'simple.css' => '/* Das folgende CSS wird für Benutzer der Einfach-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'modern.css' => '/* Das folgende CSS wird für Benutzer der Modern-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte MediaWiki:Common.css bearbeiten. */',
 'vector.css' => '/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'print.css' => '/* Das folgende CSS wird in der Druckausgabe geladen. */',
@@ -3159,13 +3138,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # Scripts
 'common.js' => '/* Das folgende JavaScript wird für alle Benutzer geladen. */',
-'standard.js' => '/* Das folgende JavaScript wird für Benutzer der Klassik-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'nostalgia.js' => '/* Das folgende JavaScript wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'cologneblue.js' => '/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.js' => '/* Das folgende JavaScript wird für Benutzer der MySkin-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'chick.js' => '/* Das folgende JavaScript wird für Benutzer der Küken-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'simple.js' => '/* Das folgende JavaScript wird für Benutzer der Einfach-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'modern.js' => '/* Das folgende JavaScript wird für Benutzer der Modern-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'vector.js' => '/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'group-autoconfirmed.js' => '/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */',
@@ -3246,13 +3220,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-category-files' => 'Anzahl der Dateien',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölnisch Blau',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Küken',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3329,10 +3298,10 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|$1 Sekunde|$1 Sekunden}}',
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
-'hours' => '{{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
-'months' => '{{PLURAL:$1|Ein Monat|$1 Monate}}',
-'years' => '{{PLURAL:$1|Ein Jahr|$1 Jahre}}',
+'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
+'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
 'ago' => 'vor $1',
 'just-now' => 'Gerade eben',
 
@@ -3798,15 +3767,15 @@ $5
 
 Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
 'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
-hat die E-Mail-Adresse des Benutzerkontos „$2“ zu dieser Adresse auf {{SITENAME}} geändert.
+hat die E-Mail-Adresse des Benutzerkontos „$2“ zu dieser Adresse bei {{SITENAME}} geändert.
 
-Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört
-und um die E-Mail-Features auf {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört,
+und um die E-Mail-Features bei {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
 
 $3
 
 Falls das Konto *nicht* dir gehört, folge diesem Link,
-um die E-Mail-Adress-Bestätigung abzubrechen:
+um die E-Mail-Bestätigung abzubrechen:
 
 $5
 
@@ -3825,7 +3794,7 @@ um die Bestätigung der E-Mail-Adresse abzubrechen:
 $5
 
 Dieser Bestätigungscode ist gültig bis $4.',
-'confirmemail_invalidated' => 'E-Mail-Adressbestätigung abbrechen',
+'confirmemail_invalidated' => 'Die E-Mail-Adressbestätigung wurde abgebrochen.',
 'invalidateemail' => 'E-Mail-Adressbestätigung abbrechen',
 
 # Scary transclusion
@@ -4072,6 +4041,8 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'htmlform-submit' => 'Speichern',
 'htmlform-reset' => 'Änderungen rückgängig machen',
 'htmlform-selectorother-other' => 'Andere',
+'htmlform-no' => 'Nein',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
index 0019ad1..bd1951a 100644 (file)
@@ -12,6 +12,7 @@
  * @author Belekvor
  * @author Erdemaslancan
  * @author George Animal
+ * @author Gorizon
  * @author Kaganer
  * @author Mirzali
  * @author Nemo bis
@@ -337,8 +338,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
 'tog-oldsig' => 'İmzaya mewcude:',
 'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
 'tog-showjumplinks' => 'Gıreyê "şo"y aktif ke',
 'tog-uselivepreview' => 'Verqayto cınde bıxebetne (JavaScript lazımo) (hewna cerrebnayış dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
@@ -353,6 +352,7 @@ $messages = array(
 'tog-showhiddencats' => 'Kategoriyanê dızdine bımocne',
 'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
+'tog-useeditwarning' => 'wexta ke ez pelo nêqeydbiyaye ra veciyaya mı hişyar bıker',
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
@@ -421,11 +421,11 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
 'category_header' => 'Pelê ke kategoriya "$1" derê',
 'subcategories' => 'Kategoriyê bınêni',
-'category-media-header' => 'Dosyeyê ke kategoriya da "$1" deyê',
+'category-media-header' => 'Dosyeyê ke kategoriya "$1" derê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
 'hidden-categories' => '{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}',
 'hidden-category-category' => 'Kategoriyê nımıtey',
-'category-subcat-count' => '{{PLURAL:$2|Na kategoriye de ena kategoriya bınêne esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê.}}, be $2 ra pêro pia.}}',
+'category-subcat-count' => '{{PLURAL:$2|Na kategoriye de ena kategoriya bınêne esta.|Na kategoriye de $2 ra pêro piya, {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê.}}, be $2 ra pêro piya.}}',
 'category-subcat-count-limited' => 'Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.',
 'category-article-count' => '{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena pele esta|enê $1 peli estê.}}, be $2 ra pêro pia}}',
 'category-article-count-limited' => '{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.',
@@ -445,7 +445,8 @@ $messages = array(
 'newwindow' => '(pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
 'moredotdotdot' => 'Vêşi...',
-'mypage' => 'Per',
+'morenotlisted' => 'Vêşêri lista nêbi...',
+'mypage' => 'Pele',
 'mytalk' => 'Werênayış',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Geyrayış',
@@ -713,7 +714,7 @@ Sebeb: "\'\'$2\'\'".',
 Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 'invalidtitle-knownnamespace' => 'Canemey "$2" u metnê "$3" xırabo',
 'invalidtitle-unknownnamespace' => 'Sernameye nêşınasiya yana amraiya canameyo  $1 u metno "$2" xırab',
-'exception-nologin' => 'Tı cı nêkewtê',
+'exception-nologin' => 'Şıma cıkewtış nêvıraşto',
 'exception-nologin-text' => 'Na pele ya zi nê karkerdışi rê nê wiki de cıkewtış icab keno.',
 
 # Virus scanner
@@ -729,7 +730,7 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'welcomeuser' => 'Xeyr ameyê $1',
 'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
-'yourname' => 'Namey karberi',
+'yourname' => 'Nameyê karberi:',
 'yourpassword' => 'Parola',
 'yourpasswordagain' => 'Parola reyna bınusne:',
 'remembermypassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})',
@@ -744,7 +745,7 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'userloginnocreate' => 'Cı kewe',
 'logout' => 'Bıveciye',
 'userlogout' => 'Bıveciye',
-'notloggedin' => 'Hesab akerde niyo',
+'notloggedin' => 'Şıma cıkewtış nêvıraşto',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
 'createaccount' => 'Hesab vıraze',
@@ -846,7 +847,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'passwordreset-legend' => 'Parola reset ke',
 'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
 'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
-'passwordreset-username' => 'Namey karberi:',
+'passwordreset-username' => 'Nameyê karberi:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
 'passwordreset-capture-help' => 'Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.',
@@ -878,6 +879,7 @@ Parola vêrdiye: $2',
 'changeemail-oldemail' => 'E-postay şımaya newki:',
 'changeemail-newemail' => 'E-posta adresiyo newe:',
 'changeemail-none' => '(Çıno)',
+'changeemail-password' => 'Parolaya şımaya {{SITENAME}}i:',
 'changeemail-submit' => 'E-postay xo bıvurne',
 'changeemail-cancel' => 'Bıtexelne',
 
@@ -1077,6 +1079,8 @@ Pel ca ra esto.',
 'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
 'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
 'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+'editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
+eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "{{int:prefs-editing}}" bıvındarnî .',
 
 # Content models
 'content-model-wikitext' => 'wikimetin',
@@ -1360,15 +1364,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
 
-# Quickbar
-'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıniyo',
-'qbsettings-fixedleft' => 'Rêcaene çhep',
-'qbsettings-fixedright' => 'Rêcaene raşt',
-'qbsettings-floatingleft' => 'rêcaene çhep',
-'qbsettings-floatingright' => 'rêcaene raşt',
-'qbsettings-directionality' => 'Sabito, hereket de dosya da zıwan de şımaya gıredayeyo',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihi',
@@ -1447,9 +1442,9 @@ Na game tepeya nêerziyena.',
 'prefs-emailconfirm-label' => 'Tesdiqiya E-posta:',
 'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
 'youremail' => 'E-Mail (mecbur niyo) *:',
-'username' => 'Namey karberi:',
-'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grube|gruban}}:',
+'username' => '{{GENDER:$1|Nameyê karberi}}:',
+'uid' => "ID'e {{GENDER:$1|Karberi}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Wextê qeydbiyayışi',
 'prefs-registration-date-time' => '$1',
@@ -1664,7 +1659,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
 'rcshowhidebots' => 'Botan $1',
 'rcshowhideliu' => 'Karberanê qeydınan $1',
-'rcshowhideanons' => 'Karberanê anoniman $1',
+'rcshowhideanons' => 'Karberê bênamey $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
 'rcshowhidemine' => 'Vurnayışanê mı $1',
 'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
@@ -1692,8 +1687,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
-'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
-[[Special:Watchlist|Lista şımawa seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
+'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.
+[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Nameyê pele:',
 'recentchangeslinked-to' => 'Pelayan ke ena pela ri gire bi, ser ayi vurnayışi bımoc',
 
@@ -1702,7 +1697,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'uploadbtn' => 'Dosya bar ke',
 'reuploaddesc' => 'Barkerdışi iptal ke u peyser şo formê barkerdışi',
 'upload-tryagain' => 'Deskripyonê dosyayî ke vurîya ey qeyd bike',
-'uploadnologin' => 'Nicikewte',
+'uploadnologin' => 'Şıma cıkewtış nêvıraşto',
 'uploadnologintext' => 'Ti gani [[Special:UserLogin|cikewte]] biyo ke dosya bar bike.',
 'upload_directory_missing' => 'Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.',
 'upload_directory_read_only' => 'Direktorê dosyayê ($1)î webserver de nieşkeno binuse.',
@@ -1903,7 +1898,7 @@ Kontrolê emeleyey oyo veş nêbeno.',
 'img-auth-accessdenied' => 'Cıresnayış vındarnayo.',
 'img-auth-nopathinfo' => 'PATH_INFO kemiyo.
 Teqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.
-Beno ke be CGI-bıngeyın bo u img_auth rê destek nêbeno.
+Beno ke be CGI-bıngeyın bo u img_auth rê desteg nêbeno.
 https://www.mediawiki.org/wiki/Manual:Image_Authorization Selahiyetê resımi bıvêne.',
 'img-auth-notindir' => 'Patikayê ke ti wazeno direktorê bar biyayişî de çin o.',
 'img-auth-badtitle' => '"$1" ra nieşkeno yew seroğê raştî virazî.',
@@ -1925,7 +1920,6 @@ qey pawıtışi, img_auth.php battal verdiyayo.",
 'http-read-error' => 'Wendişê HTTP de xeta esta.',
 'http-timed-out' => 'Waştişê HTTP qediya.',
 'http-curl-error' => 'Xetayê URLi: $1',
-'http-host-unreachable' => 'URL rê niresa.',
 'http-bad-status' => 'Waştişê tu HTTP yew problem biya: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2079,6 +2073,10 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'disambiguationspage' => 'Template:Maneo bin',
 'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
 
+'pageswithprop' => 'Pere xısusiyete peran',
+'pageswithprop-prop' => 'Xısusi name:',
+'pageswithprop-submit' => 'Şo',
+
 'doubleredirects' => 'Hetenayışê dıletıni',
 'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
 gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
@@ -2242,15 +2240,6 @@ Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke n
 'listusers-noresult' => 'karber nêdiyayo/a.',
 'listusers-blocked' => '(blok biy)',
 
-# Special:ActiveUsers
-'activeusers' => 'Listey karberan de aktivan',
-'activeusers-intro' => 'Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.',
-'activeusers-count' => 'Karberi {{PLURAL:$3|roce peyni de|$3 roca peyni de}} $1 {{PLURAL:$1|vurnayış|vurnayışi}} kerdê',
-'activeusers-from' => 'Enê karberi ra tepya bımocne:',
-'activeusers-hidebots' => 'Botan bınımne',
-'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
-'activeusers-noresult' => 'Karberi nêdiyayê.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'heqê grubê karberi',
 'listgrouprights-summary' => 'wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.
@@ -2311,12 +2300,12 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'Lista mına seyrkerdışi',
+'watchlist' => 'Listay seyrkerdışi',
 'mywatchlist' => 'Lista seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
-'watchnologin' => 'Şıma de nêkewtê',
+'watchnologin' => 'Şıma cıkewtış nêvıraşto',
 'watchnologintext' => 'qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].',
 'addwatch' => 'Listeyê seyri deke',
 'addedwatchtext' => 'Ma pele "[[:$1]]" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.
@@ -2511,7 +2500,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'restriction-edit' => 'Bıvurne',
 'restriction-move' => 'Berê',
 'restriction-create' => 'Vıraze',
-'restriction-upload' => 'Barke',
+'restriction-upload' => 'Bar ke',
 
 # Restriction levels
 'restriction-level-sysop' => 'pawıtışê tamamîye',
@@ -2591,12 +2580,12 @@ $1',
 'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
 'sp-contributions-newbies-sub' => 'Qe hesebê newe',
 'sp-contributions-newbies-title' => 'Îştîrakê karberî ser hesabê neweyî',
-'sp-contributions-blocklog' => 'Qeydê kılit-kerdışi',
-'sp-contributions-deleted' => 'vurnayîşê karberî wedariyayê',
+'sp-contributions-blocklog' => 'Qeydê kılitkerdışi',
+'sp-contributions-deleted' => 'iştırakê karberiê esterıtey',
 'sp-contributions-uploads' => 'barkerdey',
 'sp-contributions-logs' => 'qeydi',
-'sp-contributions-talk' => 'mesac',
-'sp-contributions-userrights' => 'Îdarayê heqqanê karberan',
+'sp-contributions-talk' => 'werênayış',
+'sp-contributions-userrights' => 'İdareyê heqanê karberan',
 'sp-contributions-blocked-notice' => 'verniyê no/na karber/e geriyayo/a
 qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
 'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
@@ -2702,8 +2691,8 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipblocklist-empty' => 'Lista kılitkerdışi venga.',
 'ipblocklist-no-results' => 'Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.',
 'blocklink' => 'kılit ke',
-'unblocklink' => 'bloqi hewad',
-'change-blocklink' => 'kılit-kerdışi bıvurne',
+'unblocklink' => 'a ke',
+'change-blocklink' => 'kılitkerdışi bıvurne',
 'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırışe',
 'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
@@ -2808,7 +2797,7 @@ Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 Oturse, tı gani peleyê mınaqeşeyê manually beri.",
 'movearticle' => 'Pele bere:',
 'moveuserpage-warning' => "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
-'movenologin' => 'Şıma de nêkewtê',
+'movenologin' => 'Şıma cıkewtış nêvıraşto',
 'movenologintext' => 'qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.',
 'movenotallowed' => 'desturê şıma çino, şıma pelan bıkırışi',
 'movenotallowedfile' => 'desturê şıma çino, şıma pelan bıkırışi',
@@ -2881,8 +2870,8 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 '''Not:''' pê no form teberdayişê verê (tarix) pelan battal biyo",
 'exportlistauthors' => 'zerre de qandê her pela listey iştiraxkara esto',
 'export-submit' => 'Teber de',
-'export-addcattext' => 'kategoriya cerıni ra maddeyan têare ker',
-'export-addcat' => 'têare ker',
+'export-addcattext' => 'Kategoriye ra pelan têare ke',
+'export-addcat' => 'Têare ke',
 'export-addnstext' => 'pelan cayê nameyan ra têare ker',
 'export-addns' => 'têare ker',
 'export-download' => 'yewna qaydeyi de qeydker',
@@ -2997,7 +2986,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-pt-watchlist' => 'Lista pelanê ke to gırewtê seyrkerdış',
 'tooltip-pt-mycontris' => 'Yew lista iştıraqanê şıma',
 'tooltip-pt-login' => 'Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo',
-'tooltip-pt-anonlogin' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
+'tooltip-pt-anonlogin' => 'Seba cıkewtışê şıma rê dewato; labelê, no zeruri niyo',
 'tooltip-pt-logout' => 'Bıveciye',
 'tooltip-ca-talk' => 'Zerrey pela sero werênayış',
 'tooltip-ca-edit' => 'Tı şenay na pele bıvurnê.
@@ -3104,6 +3093,7 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
 'pageinfo-watchers' => 'Amariya pela serykeran',
+'pageinfo-few-watchers' => '$1 ra tay {{PLURAL:$1|Seyrkar|seyrkari}}',
 'pageinfo-redirects-name' => 'Hetenayışê na pela',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Bınpelê na pela',
@@ -3118,7 +3108,8 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-recent-authors' => 'Amarina nuştekaran pêro',
 'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
-'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
+'pageinfo-templates' => '{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra',
 'pageinfo-toolboxlink' => 'Melumatê pele',
 'pageinfo-redirectsto' => 'Beno hetê',
 'pageinfo-redirectsto-info' => 'melumat',
@@ -3127,15 +3118,14 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
 'pageinfo-protect-cascading-yes' => 'Heya',
 'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
+'pageinfo-category-info' => 'Şınasiya kategoriye',
+'pageinfo-category-pages' => 'Amarê pelan',
+'pageinfo-category-subcats' => 'Amarê bınkategoriyan',
+'pageinfo-category-files' => 'Amarê dosyeyan',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalciya',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Şıq',
-'skinname-simple' => 'Rehat',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3341,7 +3331,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-artist' => 'Nuştoğ',
 'exif-copyright' => 'Wahirê copyrighti',
 'exif-exifversion' => 'Versiyonê Exif',
-'exif-flashpixversion' => 'Versiyonê Flashpix destek bike',
+'exif-flashpixversion' => 'Versiyonê Flashpix rê biyo desteg',
 'exif-colorspace' => 'Cayê rengi',
 'exif-componentsconfiguration' => 'manayê qisimê hemi',
 'exif-compressedbitsperpixel' => 'Modê komprasyonê resimi',
@@ -4073,7 +4063,7 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 'specialpages-group-highuse' => 'Peleyê ke vêşi karênê',
 'specialpages-group-pages' => 'listeyanê pelan',
 'specialpages-group-pagetools' => 'Haletê pelan',
-'specialpages-group-wiki' => 'Malumatê wiki u haceti',
+'specialpages-group-wiki' => 'Melumat u haceti',
 'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
 'specialpages-group-spam' => 'haletê spami',
 
@@ -4137,23 +4127,25 @@ Ena sita dı newke xırabiya teknik esta.',
 'htmlform-submit' => 'Bişirav',
 'htmlform-reset' => 'Vurnayişî reyna biyar',
 'htmlform-selectorother-other' => 'Bin',
+'htmlform-no' => 'Nê',
+'htmlform-yes' => 'E',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
 'sqlite-no-fts' => '$1 tam-metn bê destegê cı geyrayışi',
 
 # New logging system
-'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
-'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
-'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4 vurna',
-'logentry-delete-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı vurna',
-'logentry-delete-event-legacy' => '$1 Asayışê vurnayışê $3 dekerde de',
-'logentry-delete-revision-legacy' => '$1 revizyonê pela da $3 asayışê cı vurna',
-'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
-'logentry-suppress-event' => '$1 asayışê  {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}}  $3: $4 miyanıki vurna',
-'logentry-suppress-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye vurna',
-'logentry-suppress-event-legacy' => '$1 Asayışê vurnayışê ciyo xısusiyeta cı $3 dekerde de',
-'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye vurna',
+'logentry-delete-delete' => "Karber $1' pelay $3' {{GENDER:$2|besternê}}",
+'logentry-delete-restore' => "$1'i pera $3'i {{GENDER:$2|peyser grot}}",
+'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4  {{GENDER:$2|vurna}}',
+'logentry-delete-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı {{GENDER:$2|vurna}}',
+'logentry-delete-event-legacy' => '$1 Asayışê {{GENDER:$2|vurnayışê}} $3 dekerde de',
+'logentry-delete-revision-legacy' => '$1 revizyonê pela da $3 asayışê cı {{GENDER:$2|vurna}}',
+'logentry-suppress-delete' => '$1 Pela $3 {{GENDER:$2|dewosiyayiye}}',
+'logentry-suppress-event' => '$1 asayışê  {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}}  $3: $4 miyanıki {{GENDER:$2|vurna}}',
+'logentry-suppress-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye {{GENDER:$2|vurna}}',
+'logentry-suppress-event-legacy' => '$1 Asayışê {{GENDER:$2|vurnayışê}} ciyo xısusiyeta cı $3 dekerde de',
+'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye {{GENDER:$2|vurna}}',
 'revdelete-content-hid' => 'zerreko nımte',
 'revdelete-summary-hid' => 'xulusaya vurnayışa nımneyê',
 'revdelete-uname-hid' => 'namey karberi nımteyo',
@@ -4162,19 +4154,19 @@ Ena sita dı newke xırabiya teknik esta.',
 'revdelete-uname-unhid' => 'namey karberi ne nımteyo',
 'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
 'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'logentry-move-move' => "Karber $1' pelay $3' berd $4",
-'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
+'logentry-move-move' => '$1 pela $3 {{GENDER:$2|berde}} $4',
+'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u {{GENDER:$2|berd}} $4",
 'logentry-move-move_redir' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
-'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
-'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
-'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
-'logentry-newusers-newusers' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra vıraziya',
-'logentry-newusers-autocreate' => 'Hesabê $1 Otomatikmen vıraziya',
-'logentry-rights-rights' => '$1 qandê $3 rê ezayina grube $4 ra $5 vuriye',
-'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayina grube vuriye',
-'logentry-rights-autopromote' => '$1 otomatikmen $4 ra terfi bi ra $5',
+'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 {{GENDER:$2|ahulnê}} $4 sero hetenayış vıraşt',
+'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 {{GENDER:$2|ke}} kontrol',
+'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol {{GENDER:$2|ke}}",
+'logentry-newusers-newusers' => 'Hesabê karberê $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create' => 'Hesabê karberi $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra {{GENDER:$2|vıraziya}}',
+'logentry-newusers-autocreate' => 'Hesabê karberi $1 otomatikmen {{GENDER:$2|vıraşt}}',
+'logentry-rights-rights' => '$1 qandê $3 rê ezayina grube $4 ra $5 {{GENDER:$2|vuriye}}',
+'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayina grube {{GENDER:$2|vuriye}}',
+'logentry-rights-autopromote' => '$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}',
 'rightsnone' => '(çino)',
 
 # Feedback
@@ -4228,6 +4220,7 @@ Ena sita dı newke xırabiya teknik esta.',
 'api-error-ok-but-empty' => 'Xırabiya zerrek:Wastero cıwan nêdano.',
 'api-error-overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
 'api-error-stashfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
+'api-error-publishfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
 'api-error-timeout' => 'Cıwab dayışê wasteri peyra mend.',
 'api-error-unclassified' => 'Yew xeteyê nizanyeni biya.',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
index 00c9dcb..0970c5a 100644 (file)
@@ -1182,15 +1182,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje we {{SITENAME}} jo se deaktiwěrowało. Tak dłujko móžoš w googlu pytaś. Pšosym wobmysli, až móžo pytanski indeks za {{SITENAME}} njeaktualny byś.',
 
-# Quickbar
-'qbsettings' => 'Bocna lejstwa',
-'qbsettings-none' => 'Žedne',
-'qbsettings-fixedleft' => 'nalěwo fiksěrowane',
-'qbsettings-fixedright' => 'napšawo fiksěrowane',
-'qbsettings-floatingleft' => 'nalěwo se znosujuce',
-'qbsettings-floatingright' => 'napšawo se znosujuce',
-'qbsettings-directionality' => 'Kšuty, wótwisny wót pisańskego směra twójeje rěcy',
-
 # Preferences page
 'preferences' => 'Nastajenja',
 'mypreferences' => 'Nastajenja',
@@ -1739,7 +1730,6 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 'http-read-error' => 'Cytańska zmólka HTTP.',
 'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
 'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
-'http-host-unreachable' => 'URL njejo był pśistupny.',
 'http-bad-status' => 'Wob cas HTTP-napšašowanje jo problem był: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,15 +2047,6 @@ Jo nanejmjenjej głowna domena trěbna, na pśikład "*.org"<br />
 'listusers-noresult' => 'Žeden wužywaŕ njejo se namakał.',
 'listusers-blocked' => '(blokěrowany)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lisćina aktiwnych wužywarjow',
-'activeusers-intro' => 'To jo lisćina wužywarjow, kotrež su byli aktiwne za {{PLURAL:$1|slědny źeń|slědnej $1 dnja|slědne $1 dny|slědnych $1 dnjow}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|slědnem dnju|slědnyma $3 dnjoma|slědnych $3 dnjach}}',
-'activeusers-from' => 'Wužywarjow zwobrazniś, zachopinajucy z:',
-'activeusers-hidebots' => 'Boty schowaś',
-'activeusers-hidesysops' => 'Administratorow schowaś',
-'activeusers-noresult' => 'Žedne wužywarje namakane.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Pšawa wužywarskeje kupki',
 'listgrouprights-summary' => 'To jo lisćina wužywarskich kupkow definěrowanych w toś tom wikiju z jich zwězanymi pśistupnymi pšawami. Móžo [[{{MediaWiki:Listgrouprights-helppage}}|pśidatne informacije]] wó jadnotliwych pšawach daś.',
@@ -2537,6 +2518,7 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 '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',
 'cant-block-while-blocked' => 'Njesmějoš žednych drugich wužywarjow blokěrowaś, mjaztym až ty sy blokěrowany.',
 'cant-see-hidden-user' => 'Wužywaŕ, kótaregož wopytujoš blokěrowaś, jo južo zablokěrowany a schowany. Dokulaž njamaš pšawo wužywarja schowaś, njamóžoš blokěrowanje wužywarja wiźeś abo wobźěłaś.',
 'ipbblocked' => 'Njamóžoš drugich wužywarjow blokěrowaś abo wótblokěrowaś, dokulaž ty sam jo zablokěrowany',
@@ -2920,13 +2902,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-category-files' => 'Licba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgiski',
 'skinname-cologneblue' => 'Kölnski Módry',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mój šat',
-'skinname-chick' => 'Kurjetko',
-'skinname-simple' => 'Jadnorje',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
index a7dafad..999b906 100644 (file)
@@ -444,7 +444,9 @@ $1',
 'revisionasof' => '$1ގެ ނުސްހާ',
 'previousrevision' => '→ ކުރީގެ ނުސްހާ',
 'nextrevision' => 'ފަހުގެ ނުސްހާ ←',
+'cur' => 'އެންމެ ފަހުގެ',
 'next' => 'ކުރިޔަށް',
+'last' => 'ފަރަޤު',
 'histfirst' => 'އެންމެ ކުރީގެ',
 'histlast' => 'އެންމެ ފަހުގެ',
 
@@ -453,8 +455,10 @@ $1',
 'revdel-restore-visible' => 'ފާޅު ނުސްހާތައް',
 
 # Diffs
+'history-title' => '"$1"ގެ ތާރީޚް',
 'lineno' => 'ފޮޅުވަތް $1:',
 'compareselectedversions' => 'އިހުތިޔާރު ކުރެވިފައިވާ ނުސްހާތައް އަޅައިކިޔުއްވާ',
+'editundo' => 'ކުރީގެ ނުސްހާއަށް ބަދަލުކުރައްވާ',
 
 # Search results
 'searchresults' => 'ހޯދުމުގެ ނަތީޖާ',
@@ -630,15 +634,10 @@ $1',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
-# Special:ActiveUsers
-'activeusers' => 'ހަރަކާތްތެރި މެމްބަރުންގެ ލިސްޓު',
-'activeusers-hidebots' => 'ބޮޓް ފޮރުއްވާ',
-'activeusers-hidesysops' => 'އެޑްމިނިސްޓްރޭޓަރުން ފޮރުއްވާ',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(މެމްބަރުންގެ ލިސްޓު)',
 
-# E-mail user
+# Email user
 'emailuser' => 'މި މެންބަރަށް އީމޭލު ފޮނުއްވާ',
 
 # Watchlist
@@ -780,6 +779,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-preview' => 'ބަދަލުތައް ދައްކަވާ، ރައްކާކުރެއްވުމުގެ ކުރިން މި ބޭނުންކުރައްވާ!',
 'tooltip-watch' => 'މިޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
 'tooltip-rollback' => '"ކުރީގެ ނުސްހާ އަކަށް ބަދަލުކުރައްވާ" އިން މި ޞަފްޙާއަށް އެންމެ ފަހުން އުނިއިތުރު ގެންނެވި މެމްބަރުގެ އުނިއިތުރު(އުނިއިތުރުތައް) ފޮހެލެވޭނެއެވެ.',
+'tooltip-undo' => '"ކުރީގެ ނުސްހާއަށް ބަދަލުކުރައްވާ" އިން މި ނުސްހާގެ ކުރީގައި އިން ނުސްހާއަށް ބަދަލުކޮށްދޭނެއެވެ. އަދި އުނިއިތުރުގެ ޚުލާސާ ލިޔުމުގެ ފުރުސަތު ދޭނެއެވެ.',
 'tooltip-summary' => 'ކުރު ޚުލާސާއެއް ލިޔުއްވާ',
 
 # Info page
@@ -824,7 +824,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlistall2' => 'ހުރިހާ',
 'namespacesall' => 'ހުރިހާ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'އީމޭލު އެޑްރެސް ޔަގީންކުރައްވާ',
 
 # action=purge
index 52082af..a38a39a 100644 (file)
@@ -372,7 +372,6 @@ $magicWords = array(
  * hook.
  */
 $specialPageAliases = array(
-       'Activeusers'               => array( 'ActiveUsers' ),
        'Allmessages'               => array( 'AllMessages' ),
        'Allpages'                  => array( 'AllPages' ),
        'Ancientpages'              => array( 'AncientPages' ),
@@ -667,8 +666,6 @@ XHTML id names.
 'tog-shownumberswatching'     => 'Show the number of watching users',
 'tog-oldsig'                  => 'Existing signature:',
 'tog-fancysig'                => 'Treat signature as wikitext (without an automatic link)',
-'tog-externaleditor'          => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff'            => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks'           => 'Enable "jump to" accessibility links',
 'tog-uselivepreview'          => 'Use live preview (requires JavaScript) (experimental)',
 'tog-forceeditsummary'        => 'Prompt me when entering a blank edit summary',
@@ -683,6 +680,7 @@ XHTML id names.
 'tog-showhiddencats'          => 'Show hidden categories',
 'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
 'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
+'tog-useeditwarning'             => 'Warn me when I leave an edit page with unsaved changes',
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
@@ -1075,9 +1073,15 @@ Note that some pages may continue to be displayed as if you were still logged in
 'welcomecreation-msg'             => 'Your account has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname'                        => 'Username:',
+'userlogin-yourname'              => 'Username',
+'userlogin-yourname-ph'           => 'Enter your username',
 'yourpassword'                    => 'Password:',
+'userlogin-yourpassword'          => 'Password',
+'userlogin-yourpassword-ph'       => 'Enter your password',
 'yourpasswordagain'               => 'Retype password:',
 'remembermypassword'              => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword'    => 'Remember me',
+'userlogin-signwithsecure'        => 'Sign in with secure server',
 'securelogin-stick-https'         => 'Stay connected to HTTPS after login',
 'yourdomainname'                  => 'Your domain:',
 'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
@@ -1091,12 +1095,16 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'userlogout'                      => 'Log out',
 'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
 'notloggedin'                     => 'Not logged in',
+'userlogin-noaccount'             => "Don't have an account?",
+'userlogin-joinproject'           => 'Join {{SITENAME}}',
 'nologin'                         => "Don't have an account? $1.",
 'nologinlink'                     => 'Create an account',
 'createaccount'                   => 'Create account',
 'gotaccount'                      => 'Already have an account? $1.',
 'gotaccountlink'                  => 'Log in',
 'userlogin-resetlink'             => 'Forgotten your login details?',
+'helplogin-url'                   => 'Help:Logging in',
+'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
 'createaccountmail'               => 'Use a temporary random password and send it to the email address specified below',
 'createaccountreason'             => 'Reason:',
 'badretype'                       => 'The passwords you entered do not match.',
@@ -1222,6 +1230,7 @@ You may have already successfully changed your password or requested a new tempo
 'passwordreset-text'               => 'Complete this form to reset your password.',
 'passwordreset-legend'             => 'Reset password',
 'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
+'passwordreset-emaildisabled'      => 'Email features have been disabled on this wiki.',
 'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
 'passwordreset-username'           => 'Username:',
 'passwordreset-domain'             => 'Domain:',
@@ -1493,6 +1502,8 @@ It already exists.',
 'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
 'invalid-content-data'             => 'Invalid content data',
 'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
+'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
+If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
 
 # Content models
 'content-model-wikitext'   => 'wikitext',
@@ -1805,15 +1816,7 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 
 # OpenSearch description
 'opensearch-desc' => '{{SITENAME}} ({{CONTENTLANGUAGE}})', # do not translate or duplicate this message to other languages
-
-# Quickbar
-'qbsettings'                => 'Quickbar',
-'qbsettings-none'           => 'None',
-'qbsettings-fixedleft'      => 'Fixed left',
-'qbsettings-fixedright'     => 'Fixed right',
-'qbsettings-floatingleft'   => 'Floating left',
-'qbsettings-floatingright'  => 'Floating right',
-'qbsettings-directionality' => 'Fixed, depending on the script directionality of your language',
+'search-error' => 'An error has occurred while searching: $1',
 
 # Preferences page
 'preferences'                   => 'Preferences',
@@ -2398,7 +2401,6 @@ For optimal security, img_auth.php is disabled.',
 'http-read-error'       => 'HTTP read error.',
 'http-timed-out'        => 'HTTP request timed out.',
 'http-curl-error'       => 'Error fetching URL: $1',
-'http-host-unreachable' => 'Could not reach URL.',
 'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2415,8 +2417,8 @@ You may want to try at a less busy time.',
 'nolicense'          => 'None selected',
 'licenses'           => '-', # do not translate or duplicate this message to other languages
 'license-nopreview'  => '(Preview not available)',
-'upload_source_url'  => ' (a valid, publicly accessible URL)',
-'upload_source_file' => ' (a file on your computer)',
+'upload_source_url'  => '(a valid, publicly accessible URL)',
+'upload_source_file' => '(a file on your computer)',
 
 # Special:ListFiles
 'listfiles-summary'     => 'This special page shows all uploaded files.
@@ -2780,16 +2782,6 @@ Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http://
 'listusers-noresult' => 'No user found.',
 'listusers-blocked'  => '(blocked)',
 
-# Special:ActiveUsers
-'activeusers'            => 'Active users list',
-'activeusers-summary'    => '', # do not translate or duplicate this message to other languages
-'activeusers-intro'      => 'This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.',
-'activeusers-count'      => '$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}',
-'activeusers-from'       => 'Display users starting at:',
-'activeusers-hidebots'   => 'Hide bots',
-'activeusers-hidesysops' => 'Hide administrators',
-'activeusers-noresult'   => 'No users found.',
-
 # Special:ListGroupRights
 'listgrouprights'                      => 'User group rights',
 'listgrouprights-summary'              => 'The following is a list of user groups defined on this wiki, with their associated access rights.
@@ -3307,6 +3299,7 @@ Please contact your Internet service provider or technical support of your organ
 '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}}.
 You cannot create an account',
+'xffblockreason'                  => 'An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1',
 'cant-block-while-blocked'        => 'You cannot block other users while you are blocked.',
 'cant-see-hidden-user'            => "The user you are trying to block has already been blocked and hidden.
 Since you do not have the hideuser right, you cannot see or edit the user's block.",
@@ -3702,13 +3695,8 @@ You can view its source',
 
 # Stylesheets
 'common.css'              => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
-'standard.css'            => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.css'           => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.css'         => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.css'            => '/* CSS placed here will affect users of the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.css'              => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.css'               => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.css'              => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.css'              => '/* CSS placed here will affect users of the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.css'              => '/* CSS placed here will affect users of the Vector skin */', # only translate this message to other languages if you have to change it
 'print.css'               => '/* CSS placed here will affect the print output */', # only translate this message to other languages if you have to change it
@@ -3721,13 +3709,8 @@ You can view its source',
 
 # Scripts
 'common.js'              => '/* Any JavaScript here will be loaded for all users on every page load. */', # only translate this message to other languages if you have to change it
-'standard.js'            => '/* Any JavaScript here will be loaded for users using the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.js'           => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.js'         => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.js'            => '/* Any JavaScript here will be loaded for users using the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.js'              => '/* Any JavaScript here will be loaded for users using the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.js'               => '/* Any JavaScript here will be loaded for users using the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.js'              => '/* Any JavaScript here will be loaded for users using the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.js'              => '/* Any JavaScript here will be loaded for users using the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.js'              => '/* Any JavaScript here will be loaded for users using the Vector skin */', # only translate this message to other languages if you have to change it
 'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */', # only translate this message to other languages if you have to change it
@@ -3810,13 +3793,8 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-category-files'         => 'Number of files',
 
 # Skin names
-'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
-'skinname-nostalgia'   => 'Nostalgia', # only translate this message to other languages if you have to change it
 'skinname-cologneblue' => 'Cologne Blue', # only translate this message to other languages if you have to change it
 'skinname-monobook'    => 'MonoBook', # only translate this message to other languages if you have to change it
-'skinname-myskin'      => 'MySkin', # only translate this message to other languages if you have to change it
-'skinname-chick'       => 'Chick', # only translate this message to other languages if you have to change it
-'skinname-simple'      => 'Simple', # only translate this message to other languages if you have to change it
 'skinname-modern'      => 'Modern', # only translate this message to other languages if you have to change it
 'skinname-vector'      => 'Vector', # only translate this message to other languages if you have to change it
 
@@ -4863,6 +4841,8 @@ This site is experiencing technical difficulties.',
 'htmlform-submit'              => 'Submit',
 'htmlform-reset'               => 'Undo changes',
 'htmlform-selectorother-other' => 'Other',
+'htmlform-no'                  => 'No',
+'htmlform-yes'                 => 'Yes',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 with full-text search support',
index 6c4fe19..50cae1b 100644 (file)
@@ -73,6 +73,7 @@
  * @author PoLuX124
  * @author Ralgis
  * @author Remember the dot
+ * @author Remux
  * @author Richard Wolf VI
  * @author Sanbec
  * @author Savh
@@ -842,8 +843,8 @@ Por favor, identifícate de nuevo tras recibirla.',
 'blocked-mailpassword' => 'Tu dirección IP está bloqueada, y no se te permite el uso de la función de recuperación de contraseñas para prevenir abusos.',
 'eauthentsent' => 'Se ha enviado un correo electrónico de confirmación a la dirección especificada.
 Antes de que se envíe cualquier otro correo a la cuenta tienes que seguir las instrucciones enviadas en el mensaje para así confirmar que la dirección te pertenece.',
-'throttled-mailpassword' => 'Ya se ha enviado un recordatorio de password en {{PLURAL:$1|la última hora|las últimas $1 horas}}.
-Para evitar los abusos, solo se enviará un recordatorio de password cada {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.
+Para evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Error al enviar correo: $1',
 'acct_creation_throttle_hit' => 'Los visitantes a este wiki usando tu dirección IP han creado {{PLURAL:$1|una cuenta|$1 cuentas}} en el último día, lo cual es lo máximo permitido en este periodo de tiempo.
 Como resultado, los visitantes usando esta dirección IP no pueden crear más cuentas en este momento.',
@@ -896,7 +897,7 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecimiento de contraseña',
-'passwordreset-text' => 'Completa este formulario para recibir un recordatorio por correo electrónico de los detalles de tu cuenta.',
+'passwordreset-text' => 'Completa este formulario para restablecer la contraseña.',
 'passwordreset-legend' => 'Restablecer contraseña',
 'passwordreset-disabled' => 'Se ha desactivado el restablecimiento de contraseñas en este wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduce uno de los elementos de datos siguientes}}',
@@ -927,9 +928,9 @@ o recuerdas tu contraseña original, y no deseas cambiarla, puedes
 ignorar este mensaje y continuar usando tu contraseña anterior.',
 'passwordreset-emailelement' => 'Nombre de usuario: $1
 Contraseña temporal: $2',
-'passwordreset-emailsent' => 'Se ha enviado un correo electrónico de recordatorio.',
-'passwordreset-emailsent-capture' => 'Un recordatorio por correo electrónico ha sido enviado, que se muestra a continuación.',
-'passwordreset-emailerror-capture' => 'Un recordatorio por correo electrónico fue generado, que se muestra a continuación, pero el envío al usuario falló: $1',
+'passwordreset-emailsent' => 'Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.',
+'passwordreset-emailsent-capture' => 'Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.',
+'passwordreset-emailerror-capture' => 'Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío al usuario falló: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar la dirección de correo electrónico',
@@ -1989,7 +1990,6 @@ Para óptima seguridad, img_auth.php está desactivado.',
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La solicitud HTTP ha expirado.',
 'http-curl-error' => 'Error al recuperar el URL: $1',
-'http-host-unreachable' => 'No fue posible acceder a la URL.',
 'http-bad-status' => 'Ha habido un problema durante la solicitud HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2315,15 +2315,6 @@ Es necesario, por lo menos, un dominio de alto nivel, por ejemplo "*.org".<br />
 'listusers-noresult' => 'No se encontró al usuario.',
 'listusers-blocked' => '({{GENDER:$1|bloqueado|bloqueada}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista de usuarios activos',
-'activeusers-intro' => 'Esta es una lista de usuarios que han tenido alguna actividad en los últimos $1 {{PLURAL:$1|día|días}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|acción|acciones}} en los últimos {{PLURAL:$3|día|$3 días}}',
-'activeusers-from' => 'Mostrando a los usuarios empezando por:',
-'activeusers-hidebots' => 'Ocultar robots',
-'activeusers-hidesysops' => 'Ocultar administradores',
-'activeusers-noresult' => 'No se encontraron usuarios.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Permisos del grupo de usuarios',
 'listgrouprights-summary' => 'La siguiente es una lista de los grupos de usuario definidos en esta wiki y de sus privilegios de acceso asociados.
@@ -3118,13 +3109,8 @@ Permite añadir una razón al resumen de edición.',
 
 # Stylesheets
 'common.css' => '/* El CSS colocado en esta página sera aplicado a todas las pieles (skins) */',
-'standard.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Standard" */',
-'nostalgia.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Nostalgia" */',
 'cologneblue.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Cologne Blue" */',
 'monobook.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MonoBook" */',
-'myskin.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MySkin" */',
-'chick.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel ""Chick" */',
-'simple.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Simple" */',
 'modern.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Modern" */',
 'vector.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Vector" */',
 'print.css' => '/* Los estilos CSS colocados aquí afectarán la impresión */',
@@ -3137,13 +3123,8 @@ Permite añadir una razón al resumen de edición.',
 
 # Scripts
 'common.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */',
-'standard.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Estandar */',
-'nostalgia.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Nostalgia. */',
 'cologneblue.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Colonia azul */',
 'monobook.js' => '/* El código JavaScript que se ponga aquí será cargado por los usuarios de la piel MonoBook */',
-'myskin.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Mi piel */',
-'chick.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Pollito */',
-'simple.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Simple */',
 'modern.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Moderna */',
 'vector.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Vector */',
 'group-autoconfirmed.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */',
@@ -3224,13 +3205,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-category-files' => 'Número de archivos',
 
 # Skin names
-'skinname-standard' => 'Estándar',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonia azul',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi piel',
-'skinname-chick' => 'Pollito',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderna',
 'skinname-vector' => 'Vector',
 
@@ -4040,13 +4016,13 @@ Este sitio está experimentando dificultades técnicas.',
 'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
 
 # New logging system
-'logentry-delete-delete' => '$1 borró la página «$3»',
+'logentry-delete-delete' => '$1 {{GENDER:$2|borró}} la página «$3»',
 'logentry-delete-restore' => '$1 restauró la página «$3»',
-'logentry-delete-event' => '$1 modificó la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4',
 'logentry-delete-revision' => '$1 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
 'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de las ediciones en la página $3',
-'logentry-suppress-delete' => '$1 borró (restricciones para administradores aplicadas) la página $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3',
 'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
 'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
index aadb5b5..5873721 100644 (file)
@@ -761,8 +761,8 @@ Pärast parooli saamist logige palun sisse.',
 'blocked-mailpassword' => 'Sinu IP-aadressi jaoks on toimetamine blokeeritud, seetõttu ei saa sa kasutada ka parooli meeldetuletamise funktsiooni.',
 'eauthentsent' => 'Sisestatud e-posti aadressile on saadetud kinnituse e-kiri.
 Enne kui su kontole ükskõik milline muu e-kiri saadetakse, pead sa e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.',
-'throttled-mailpassword' => 'Parooli meeldetuletus lähetatud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.
-Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks meeldetuletus.',
+'throttled-mailpassword' => 'Parooli lähtestamise e-kiri saadetud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.
+Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks lähtestamise e-kiri.',
 'mailerror' => 'Viga kirja saatmisel: $1',
 'acct_creation_throttle_hit' => 'Selle viki külastajad, kes kasutavad sinu IP-aadressi, on viimase ööpäeva jooksul loonud {{PLURAL:$1|ühe konto|$1 kontot}}, mis on selles ajavahemikus ülemmääraks.
 Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
@@ -801,7 +801,8 @@ Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
 'newpassword' => 'Uus parool:',
 'retypenew' => 'Sisesta uus parool uuesti:',
 'resetpass_submit' => 'Sisesta parool ja logi sisse',
-'resetpass_success' => 'Sinu parool on edukalt muudetud! Sisselogimine...',
+'resetpass_success' => 'Sinu parool on edukalt muudetud!
+Sisselogimine...',
 'resetpass_forbidden' => 'Paroole ei saa muuta',
 'resetpass-no-info' => 'Pead olema sisselogitud, et sellele lehele pääseda.',
 'resetpass-submit-loggedin' => 'Muuda parool',
@@ -812,23 +813,23 @@ Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist sa
 
 # Special:PasswordReset
 'passwordreset' => 'Parooli lähtestamine',
-'passwordreset-text' => 'Täida see vorm, et saada e-kiri oma konto andmetega.',
+'passwordreset-text' => 'Täida see vorm, et oma parool lähtestada.',
 'passwordreset-legend' => 'Parooli lähtestamine',
 'passwordreset-disabled' => 'Selles vikis on paroolide lähtestamine keelatud.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest}}',
+'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest.}}',
 'passwordreset-username' => 'Kasutajanimi:',
 'passwordreset-domain' => 'Domeen:',
 'passwordreset-capture' => 'Näita lähetatavat e-kirja?',
 'passwordreset-capture-help' => 'Kui valid selle märkeruudu, näidatakse sulle ajutist parooli sisaldavat e-kirja, mis ühtlasi kasutajale saadetakse.',
 'passwordreset-email' => 'E-posti aadress:',
 'passwordreset-emailtitle' => '{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed',
-'passwordreset-emailtext-ip' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'passwordreset-emailtext-ip' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
 
 $2
 
 {{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.
 Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.',
-'passwordreset-emailtext-user' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'passwordreset-emailtext-user' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
 
 $2
 
@@ -836,9 +837,9 @@ $2
 Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.',
 'passwordreset-emailelement' => 'Kasutajanimi: $1
 Ajutine parool: $2',
-'passwordreset-emailsent' => 'Meeldetuletuskiri on saadetud.',
-'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav meeldetuletus.',
-'passwordreset-emailerror-capture' => 'Koostati allpool näidatav meeldetuletus, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
+'passwordreset-emailsent' => 'Parooli lähtestamise e-kiri on saadetud.',
+'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.',
+'passwordreset-emailerror-capture' => 'Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posti aadressi muutmine',
@@ -870,7 +871,7 @@ Ajutine parool: $2',
 'media_sample' => 'Näidis.ogg',
 'media_tip' => 'Link failile',
 'sig_tip' => 'Sinu allkiri ajatempliga',
-'hr_tip' => 'Horisontaalkriips (kasuta säästlikult)',
+'hr_tip' => 'Rõhtkriips (kasuta liialdamata)',
 
 # Edit pages
 'summary' => 'Resümee:',
@@ -931,7 +932,7 @@ Võimalik, et see teisaldati või kustutati, sellal kui lehekülge vaatasid.',
 'loginreqtitle' => 'Vajalik on sisselogimine',
 'loginreqlink' => 'sisse logima',
 'loginreqpagetext' => 'Lehekülgede vaatamiseks pead $1.',
-'accmailtitle' => 'Parool saadetud.',
+'accmailtitle' => 'Parool saadetud',
 'accmailtext' => "Kasutajale '$1' genereeritud juhuslik parool saadeti aadressile $2.
 
 Seda parooli on võimalik muuta ''[[Special:ChangePassword|parooli muutmise lehel]]'' peale uuele kontole sisse logimist.",
@@ -1169,7 +1170,7 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 * Sobimatu isiklik teave
 *: ''kodune aadress ja telefoninumber, sotsiaalhoolekandenumber jne''",
 'revdelete-legend' => 'Nähtavuse piirangute seadmine',
-'revdelete-hide-text' => 'Peida redigeerimise tekst',
+'revdelete-hide-text' => 'Peida redaktsiooni tekst',
 'revdelete-hide-image' => 'Peida faili sisu',
 'revdelete-hide-name' => 'Peida toiming ja sihtmärk',
 'revdelete-hide-comment' => 'Peida resümee',
@@ -1333,9 +1334,9 @@ Vahepeal saad otsimiseks Google'it kasutada.
 Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
 
 # Quickbar
-'qbsettings' => 'Kiirriba sätted',
-'qbsettings-none' => 'Ei_ole',
-'qbsettings-fixedleft' => 'Püsivalt_vasakul',
+'qbsettings' => 'Kiirriba',
+'qbsettings-none' => 'Puudub',
+'qbsettings-fixedleft' => 'Püsivalt vasakul',
 'qbsettings-fixedright' => 'Püsivalt paremal',
 'qbsettings-floatingleft' => 'Ujuvalt vasakul',
 'qbsettings-floatingright' => 'Ujuvalt paremal',
@@ -1465,7 +1466,7 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 # User rights
 'userrights' => 'Kasutaja õiguste muutmine',
 'userrights-lookup-user' => 'Kasutajarühma muutmine',
-'userrights-user-editname' => 'Sisesta kasutajatunnus:',
+'userrights-user-editname' => 'Sisesta kasutajanimi:',
 'editusergroup' => 'Muuda kasutajarühma',
 'editinguser' => "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
 'userrights-editusergroup' => 'Kasutajarühma valik',
@@ -1510,7 +1511,7 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 
 # Rights
 'right-read' => 'Lugeda lehekülgi',
-'right-edit' => 'Redigeerida lehekülje sisu',
+'right-edit' => 'Redigeerida lehekülgi',
 'right-createpage' => 'Luua lehekülgi (mis pole aruteluleheküljed)',
 'right-createtalk' => 'Luua arutelulehekülgi',
 'right-createaccount' => 'Luua uusi kasutajakontosid',
@@ -1550,9 +1551,9 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'right-protect' => 'Muuta kaitsetasemeid ja redigeerida kaitstud lehekülgi',
 'right-editprotected' => 'Muuta kaitstud lehekülgi, millel ei ole kaskaadkaitset',
 'right-editinterface' => 'Muuta kasutajaliidest',
-'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS ja JS faile',
-'right-editusercss' => 'Redigeerida teiste kasutajate CSS faile',
-'right-edituserjs' => 'Redigeerida teiste kasutajate JS faile',
+'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS- ja JS-faile',
+'right-editusercss' => 'Redigeerida teiste kasutajate CSS-faile',
+'right-edituserjs' => 'Redigeerida teiste kasutajate JS-faile',
 'right-rollback' => 'Tühistada otsekohe lehekülje viimase redigeerija muudatused',
 'right-markbotedits' => 'Märkida muudatuse tühistamine robotimuudatusena',
 'right-noratelimit' => 'Mööduda toimingumäära limiitidest',
@@ -1871,7 +1872,6 @@ Turvakaalutlustel on img_auth.php kasutus keelatud.',
 'http-read-error' => 'HTTP-lugemistõrge.',
 'http-timed-out' => 'HTTP-päring aegus.',
 'http-curl-error' => 'Tõrge URL-i $1 lugemisel',
-'http-host-unreachable' => 'Internetiaadress pole kättesaadav.',
 'http-bad-status' => 'HTTP-päringu ajal ilmnes tõrge: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2196,15 +2196,6 @@ Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata proto
 'listusers-noresult' => 'Kasutajat ei leitud.',
 'listusers-blocked' => '(blokeeritud)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktiivsete kasutajate nimekiri',
-'activeusers-intro' => 'See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.',
-'activeusers-count' => '$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul',
-'activeusers-from' => 'Näita kasutajaid alates:',
-'activeusers-hidebots' => 'Peida robotid',
-'activeusers-hidesysops' => 'Peida administraatorid',
-'activeusers-noresult' => 'Kasutajaid ei leidunud.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Kasutajarühma õigused',
 'listgrouprights-summary' => 'Siin on loetletud selle viki kasutajarühmad ja rühmaga seotud õigused.
@@ -2247,12 +2238,12 @@ Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata proto
 'email-legend' => 'Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale',
 'emailfrom' => 'Kellelt:',
 'emailto' => 'Kellele:',
-'emailsubject' => 'Pealkiri:',
+'emailsubject' => 'Teema:',
 'emailmessage' => 'Sõnum:',
 'emailsend' => 'Saada',
 'emailccme' => 'Saada mulle koopia.',
 'emailccsubject' => 'Koopia sinu sõnumist kasutajale $1: $2',
-'emailsent' => 'E-post saadetud',
+'emailsent' => 'E-kiri saadetud',
 'emailsenttext' => 'Sinu teade on e-kirjaga saadetud.',
 'emailuserfooter' => 'Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu "Saada sellele kasutajale e-kiri" abil.',
 
@@ -2357,8 +2348,7 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s
 'actionfailed' => 'Toiming ebaõnnestus',
 'deletedtext' => '"$1" on kustutatud. Kustutatud leheküljed on ära toodud eraldi loendis ($2).',
 'dellogpage' => 'Kustutamislogi',
-'dellogpagetext' => 'Allpool on esitatud nimekiri viimastest kustutamistest.
-Kõik toodud kellaajad järgivad serveriaega.',
+'dellogpagetext' => 'Allpool on viimaste kustutamiste loend.',
 'deletionlog' => 'kustutamislogi',
 'reverted' => 'Pöörduti tagasi varasemale versioonile',
 'deletecomment' => 'Põhjus:',
@@ -2366,7 +2356,7 @@ Kõik toodud kellaajad järgivad serveriaega.',
 'deletereasonotherlist' => 'Muu põhjus',
 'deletereason-dropdown' => '*Harilikud kustutamise põhjused
 ** Autori palve
-** Autoriõiguste rikkumine
+** Autoriõiguse rikkumine
 ** Vandalism',
 'delete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
 'delete-toobig' => 'See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.
@@ -2409,6 +2399,7 @@ Mine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.',
 'prot_1movedto2' => 'Lehekülg "[[$1]]" teisaldatud pealkirja "[[$2]]" alla',
 'protect-badnamespace-title' => 'Kaitstamatu nimeruum',
 'protect-badnamespace-text' => 'Selles nimeruumis olevaid lehekülgi ei saa kaitsta.',
+'protect-norestrictiontypes-title' => 'Kaitstamatu lehekülg',
 'protect-legend' => 'Kaitse kinnitamine',
 'protectcomment' => 'Põhjus:',
 'protectexpiry' => 'Aegub:',
@@ -2584,7 +2575,7 @@ Täida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.',
 'ipadressorusername' => 'IP-aadress või kasutajanimi:',
 'ipbexpiry' => 'Kehtivus:',
 'ipbreason' => 'Põhjus:',
-'ipbreasonotherlist' => 'Muul põhjusel',
+'ipbreasonotherlist' => 'Muu põhjusel',
 'ipbreason-dropdown' => '*Tavalised blokeerimise põhjused
 ** Valeandmete lisamine
 ** Lehekülgedelt sisu kustutamine
@@ -2760,7 +2751,7 @@ Neil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
 'movenotallowedfile' => 'Sul ei ole failide teisaldamise õigust.',
 'cant-move-user-page' => 'Sul ei ole õigust teisaldada kasutajalehti (erandiks on kasutajate alamlehed).',
 'cant-move-to-user-page' => 'Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).',
-'newtitle' => 'Uue pealkirja alla',
+'newtitle' => 'Uue pealkirja alla:',
 'move-watch' => 'Jälgi seda lehekülge',
 'movepagebtn' => 'Teisalda lehekülg',
 'pagemovedsub' => 'Lehekülg on teisaldatud',
@@ -3008,7 +2999,6 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
 
 # Stylesheets
 'common.css' => '/* Siin olevat CSS-i kasutavad kõik kujundused. */',
-'standard.css' => '/* Siin olev CSS puudutab Standard-kujunduse kasutajaid. */',
 
 # Scripts
 'common.js' => '/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */',
@@ -3084,13 +3074,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-category-files' => 'Failide arv',
 
 # Skin names
-'skinname-standard' => 'Algeline',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölni sinine',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Minu kujundus',
-'skinname-chick' => 'Tibu',
-'skinname-simple' => 'Lihtne',
 'skinname-modern' => 'Uudne',
 'skinname-vector' => 'Vektor',
 
@@ -3153,7 +3138,7 @@ Selle avamine võib su arvutit kahjustada.",
 'file-no-thumb-animation-gif' => "'''Märkus: Tehniliste piirangute tõttu on nii suure eraldusega GIF-piltide pisipildid animeerimata.'''",
 
 # Special:NewFiles
-'newimages' => 'Uute meediafailide galerii',
+'newimages' => 'Uute failide galerii',
 'imagelisttext' => "
 Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.",
 'newimages-summary' => 'Sellel erilehel on viimati üles laaditud failid.',
@@ -3235,7 +3220,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-model' => 'Kaamera mudel',
 'exif-software' => 'Kasutatud tarkvara',
 'exif-artist' => 'Autor',
-'exif-copyright' => 'Autoriõiguste omanik',
+'exif-copyright' => 'Autoriõiguse omanik',
 'exif-exifversion' => 'Exif-versioon',
 'exif-flashpixversion' => 'Toetatud Flashpixi versioon',
 'exif-colorspace' => 'Värviruum',
@@ -3282,13 +3267,13 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-saturation' => 'Küllastus',
 'exif-sharpness' => 'Teravus',
 'exif-devicesettingdescription' => 'Seadme seadistuste kirjeldus',
-'exif-imageuniqueid' => 'Üksiku pildi ID',
+'exif-imageuniqueid' => 'Pildi ainuline identifikaator',
 'exif-gpsversionid' => 'GPS-tähise versioon',
 'exif-gpslatituderef' => 'Põhja- või lõunalaius',
 'exif-gpslatitude' => 'Laius',
 'exif-gpslongituderef' => 'Ida- või läänepikkus',
 'exif-gpslongitude' => 'Pikkus',
-'exif-gpsaltituderef' => 'Viide kõrgusele merepinnast',
+'exif-gpsaltituderef' => 'Kõrgusreferents',
 'exif-gpsaltitude' => 'Kõrgus merepinnast',
 'exif-gpstimestamp' => 'GPS aeg (aatomikell)',
 'exif-gpssatellites' => 'Mõõtmiseks kasutatud satelliidid',
@@ -3735,11 +3720,11 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'version-skins' => 'Kujundused',
 'version-other' => 'Muu',
 'version-mediahandlers' => 'Meediatöötlejad',
-'version-hooks' => 'Redaktsioon',
+'version-hooks' => 'Haagid',
 'version-extension-functions' => 'Lisafunktsioonid',
 'version-parser-extensiontags' => 'Parseri lisamärgendid',
 'version-parser-function-hooks' => 'Parserifunktsioonid',
-'version-hook-name' => 'Redaktsiooni nimi',
+'version-hook-name' => 'Haagi nimi',
 'version-hook-subscribedby' => 'Tellijad',
 'version-version' => '(Versioon $1)',
 'version-license' => 'Litsents',
@@ -3860,17 +3845,17 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'sqlite-no-fts' => '$1 ilma täistekstiotsingu toeta',
 
 # New logging system
-'logentry-delete-delete' => '$1 kustutas lehekülje $3',
-'logentry-delete-restore' => '$1 taastas lehekülje $3',
-'logentry-delete-event' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-delete-revision' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-delete-event-legacy' => '$1 muutis leheküljel $3 logisündmuste nähtavust',
-'logentry-delete-revision-legacy' => '$1 muutis leheküljel $3 redaktsioonide nähtavust',
-'logentry-suppress-delete' => '$1 varjas lehekülje $3',
-'logentry-suppress-event' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-suppress-revision' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-suppress-event-legacy' => '$1 muutis salaja leheküljel $3 logisündmuste nähtavust',
-'logentry-suppress-revision-legacy' => '$1 muutis salaja leheküljel $3 redaktsioonide nähtavust',
+'logentry-delete-delete' => '$1 {{GENDER:$2|kustutas}} lehekülje $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|taastas}} lehekülje $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 logisündmuste nähtavust',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 redaktsioonide nähtavust',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|varjas}} lehekülje $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 logisündmuste nähtavust',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 redaktsioonide nähtavust',
 'revdelete-content-hid' => 'peideti sisu',
 'revdelete-summary-hid' => 'peideti resümee',
 'revdelete-uname-hid' => 'peideti kasutajanimi',
@@ -3879,16 +3864,16 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'revdelete-uname-unhid' => 'nähtavaks tehti kasutajanimi',
 'revdelete-restricted' => 'kehtestati piirangud administraatoritele',
 'revdelete-unrestricted' => 'eemaldati administraatoritelt piirangud',
-'logentry-move-move' => '$1 teisaldas lehekülje $3 pealkirja $4 alla',
-'logentry-move-move-noredirect' => '$1 teisaldas lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
-'logentry-move-move_redir' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele',
-'logentry-move-move_redir-noredirect' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
-'logentry-patrol-patrol' => '$1 märkis lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-patrol-patrol-auto' => '$1 märkis automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-newusers-newusers' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create2' => '$1 lõi kasutajakonto $3',
-'logentry-newusers-autocreate' => 'Konto $1 loodi automaatselt',
+'logentry-move-move' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|märkis}} lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|märkis}} automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-newusers-newusers' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|lõi}} kasutajakonto $3',
+'logentry-newusers-autocreate' => 'Konto $1 {{GENDER:$2|loodi}} automaatselt',
 'rightsnone' => '(puudub)',
 
 # Feedback
index 70329a1..efcdad2 100644 (file)
@@ -155,8 +155,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
 'tog-oldsig' => 'Egungo sinadura:',
 'tog-fancysig' => 'Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)',
-'tog-externaleditor' => 'Lehenetsi bezala kanpoko editore bat erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-externaldiff' => 'Lehenetsi bezala kanpoko diff erreminta erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
 'tog-showjumplinks' => '"Hona jo" irisgarritasun loturak gaitu',
 'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
 'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
@@ -170,6 +168,7 @@ $messages = array(
 'tog-diffonly' => "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
 'tog-showhiddencats' => 'Ikusi kategoria ezkutuak',
 'tog-norollbackdiff' => 'Rollback bat egin ondoren ezberdintasunak ez hartu aintzat',
+'tog-useeditwarning' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
 
 'underline-always' => 'Beti',
 'underline-never' => 'Inoiz ez',
@@ -244,9 +243,9 @@ $messages = array(
 'hidden-category-category' => 'Kategoria ezkutuak',
 'category-subcat-count' => '{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}',
 'category-subcat-count-limited' => 'Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.',
-'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}. Guztira $2 orri dira kategoria honetan.}}',
+'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}, eta guztira $2 orri dira kategoria honetan.}}',
 'category-article-count-limited' => 'Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago.|$1 orri hauek kategoria honetan daude.}}',
-'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}. Guztira $2 fitxategi dira kategoria honetan.}}',
+'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}, eta guztira $2 fitxategi dira kategoria honetan.}}',
 'category-file-count-limited' => 'Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago.|$1 fitxategiak kategoria honetan daude.}}',
 'listingcontinuesabbrev' => 'jarr.',
 'index-category' => 'Indexatutako orrialdeak',
@@ -852,6 +851,8 @@ Ez du azalpenik eman.',
 'edit-no-change' => 'Zure edizioa baztertu da testua aldatu ez duzulako.',
 'edit-already-exists' => 'Ezin izan da orri berria sortu.
 Jada existitzen da.',
+'editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
+Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "{{int:prefs-editing}}" atalean.',
 
 # Content models
 'content-model-wikitext' => 'wikitestua',
@@ -1122,14 +1123,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'search-external' => 'Kanpo bilaketa',
 'searchdisabled' => '{{SITENAME}}(e)n ezgaituta dago bilaketa. Dena dela, Google erabiliz ere egin dezakezu bilaketa. Kontuan izan bertan dituzten {{SITENAME}}(e)ko emaitzak zaharkituta egon daitezkeela.',
 
-# Quickbar
-'qbsettings' => 'Laster-barra',
-'qbsettings-none' => 'Ezein ere',
-'qbsettings-fixedleft' => 'Eskuinean',
-'qbsettings-fixedright' => 'Ezkerrean',
-'qbsettings-floatingleft' => 'Ezkerrean mugikor',
-'qbsettings-floatingright' => 'Eskubian flotatzen',
-
 # Preferences page
 'preferences' => 'Hobespenak',
 'mypreferences' => 'Hobespenak',
@@ -1582,7 +1575,6 @@ Fitxategien sarbidea baino ez da onartzen.',
 'http-read-error' => 'HTTP irakurketa-akatsa.',
 'http-timed-out' => 'HTTP eskaera iraungi da.',
 'http-curl-error' => 'Errorea URLa bilatzerakoan: $1',
-'http-host-unreachable' => 'Ezin da URL-a atzeman.',
 'http-bad-status' => 'Arazo bat egon da HTTP eskaera bitartean: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1875,14 +1867,6 @@ Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// h
 'listusers-noresult' => 'Ez da erabiltzailerik aurkitu.',
 'listusers-blocked' => '(blokeatua)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lankide aktiboen zerrenda',
-'activeusers-count' => '{{PLURAL:$1|Ekintza berri bat|$1 ekintza berri}} azken {{PLURAL:$3|egunean|$3 egunetan}}',
-'activeusers-from' => 'Bilatu honela hasten diren lankideak:',
-'activeusers-hidebots' => 'Ezkutatu bot-ak',
-'activeusers-hidesysops' => 'Ezkutatu administratzaileak',
-'activeusers-noresult' => 'Ez da lankiderik aurkitu.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Erabiltzaile talde eskumenak',
 'listgrouprights-summary' => 'Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.
@@ -2657,10 +2641,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'pageinfo-protect-cascading-from' => 'Serieko babesak aktibatuta. Sorburua:',
 
 # Skin names
-'skinname-standard' => 'Lehenetsia',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
-'skinname-simple' => 'Arrunta',
 'skinname-modern' => 'Modernoa',
 
 # Patrolling
index 423d9db..a3ecc82 100644 (file)
@@ -39,6 +39,7 @@
  * @author Zack90
  * @author ZxxZxxZ
  * @author לערי ריינהארט
+ * @author جواد
  * @author محک
  */
 
@@ -458,8 +459,6 @@ $messages = array(
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
-'tog-externaleditor' => 'استفاده از ویرایشگر خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-externaldiff' => 'استفاده از تفاوت‌گیر (diff) خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
 'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» فعال باشد',
 'tog-uselivepreview' => 'استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
 'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
@@ -474,6 +473,7 @@ $messages = array(
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
 'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
+'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هرگز',
@@ -1229,6 +1229,8 @@ $2
 'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
 'invalid-content-data' => 'داده محتوای نامعتبر',
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
+اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌متن',
@@ -1514,15 +1516,6 @@ $1",
 موقتاً می‌توانید از جستجوی Google استفاده کنید.
 توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.',
 
-# Quickbar
-'qbsettings' => 'نوار سریع',
-'qbsettings-none' => 'نباشد',
-'qbsettings-fixedleft' => 'ثابت چپ',
-'qbsettings-fixedright' => 'ثابت راست',
-'qbsettings-floatingleft' => 'شناور چپ',
-'qbsettings-floatingright' => 'شناور راست',
-'qbsettings-directionality' => 'ثابت، بسته به جهت نگارش زبان شما',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'ترجیحات',
@@ -2078,7 +2071,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'http-read-error' => 'خطای خواندن اچ‌تی‌تی‌پی.',
 'http-timed-out' => 'مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.',
 'http-curl-error' => 'خطا در آوردن نشانی اینترنتی: $1',
-'http-host-unreachable' => 'دسترسی به نشانی اینترنتی ممکن نشد.',
 'http-bad-status' => 'در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2407,15 +2399,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listusers-noresult' => 'هیچ کاربری یافت نشد.',
 'listusers-blocked' => '(بسته شده)',
 
-# Special:ActiveUsers
-'activeusers' => 'فهرست کاربران فعال',
-'activeusers-intro' => 'در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روز}} گذشته فعالیتی داشته‌اند.',
-'activeusers-count' => '$1 {{PLURAL:$1|فعالیت|فعالیت}} در {{PLURAL:$3|روز|$3 روز}} اخیر',
-'activeusers-from' => 'نمایش کاربران با آغاز از:',
-'activeusers-hidebots' => 'نهفتن ربات‌ها',
-'activeusers-hidesysops' => 'نهفتن مدیران',
-'activeusers-noresult' => 'کاربری پیدا نشد.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'اختیارات گروه‌های کاربری',
 'listgrouprights-summary' => 'فهرست زیر شامل گروه‌های کاربری تعریف شده در این ویکی و اختیارات داده شده به آن‌ها است.
@@ -2644,7 +2627,7 @@ $PAGEINTRO $NEWPAGE
 شما می‌توانید سطح محافظت این صفحه را تغییر بدهید اما این کار تاثیری بر محافظت آبشاری صفحه نخواهد گذاشت.',
 'protect-default' => 'همهٔ کاربرها',
 'protect-fallback' => 'فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود',
-'protect-level-autoconfirmed' => 'اجازÙ\87 Ù\81Ù\82Ø· Ø¨Ø±Ø§Û\8c Ø¨Ù\87 Ú©Ø§Ø±Ø¨Ø±Ù\87اÛ\8c تائیدشده',
+'protect-level-autoconfirmed' => 'تÙ\86Ù\87ا Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 تائیدشده',
 'protect-level-sysop' => 'فقط مدیران',
 'protect-summary-cascade' => 'آبشاری',
 'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
@@ -2750,7 +2733,7 @@ $1',
 'mycontris' => 'مشارکت‌ها',
 'contribsub2' => 'برای $1 ($2)',
 'nocontribs' => 'هیچ تغییری با این مشخصات یافت نشد.',
-'uctop' => ' (بالا)',
+'uctop' => '(بالا)',
 'month' => 'در این ماه (و پیش از آن):',
 'year' => 'در این سال (و پیش از آن):',
 
@@ -3307,13 +3290,8 @@ $1',
 'pageinfo-category-files' => 'تعداد پرونده‌ها',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالژی',
 'skinname-cologneblue' => 'آبی کلن',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'پوستهٔ من',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'مدرن',
 'skinname-vector' => 'برداری',
 
index 745aca1..4a123aa 100644 (file)
@@ -1880,7 +1880,6 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
 'http-read-error' => 'HTTP-lukuvirhe.',
 'http-timed-out' => 'HTTP-pyyntö aikakatkaistiin.',
 'http-curl-error' => 'Virhe noudettaessa verkko-osoitetta: $1',
-'http-host-unreachable' => 'Ei voitu tavoittaa verkko-osoitetta',
 'http-bad-status' => 'HTTP-pyynnön aikana oli ongelma: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2204,15 +2203,6 @@ Vaaditaan vähintään ylätason verkkotunnus, esimerkiksi "*.org".<br />
 'listusers-noresult' => 'Käyttäjiä ei löytynyt.',
 'listusers-blocked' => '(estetty)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktiivisten käyttäjien lista',
-'activeusers-intro' => 'Tämä on luettelo käyttäjistä, jotka ovat tehneet jotain viimeisen $1 {{PLURAL:$1|päivän}} sisällä.',
-'activeusers-count' => '$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana',
-'activeusers-from' => 'Näytä käyttäjät alkaen',
-'activeusers-hidebots' => 'Piilota botit',
-'activeusers-hidesysops' => 'Piilota ylläpitäjät',
-'activeusers-noresult' => 'Käyttäjiä ei löytynyt.',
-
 # Special:ListGroupRights
 '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.
@@ -2474,9 +2464,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
 'undeleterevisions' => '{{PLURAL:$1|Versio|$1 versiota}} arkistoitu.',
 'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.',
-'undeleterevdel' => "Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
-Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.<br />
-Tiedostoversioita, joihin sinulla ei ole katseluoikeutta (''häivytetyt versiot''), ei palauteta.",
+'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
+Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.',
 'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
 'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
 'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
@@ -2984,13 +2973,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Stylesheets
 'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
-'standard.css' => '/* Tämä sivu sisältää Perus-ulkoasua muuttavia tyylejä. */',
-'nostalgia.css' => '/* Tämä sivu sisältää Nostalgia-ulkoasua muuttavia tyylejä. */',
 'cologneblue.css' => '/* Tämä sivu sisältää Kölnin sininen -ulkoasua muuttavia tyylejä. */',
 'monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
-'myskin.css' => '/* Tämä sivu sisältää Oma tyylisivu -ulkoasua muuttavia tyylejä. */',
-'chick.css' => '/* Tämä sivu sisältää Chick-ulkoasua muuttavia tyylejä. */',
-'simple.css' => '/* Tämä sivu sisältää Yksinkertainen-ulkoasua muuttavia tyylejä. */',
 'modern.css' => '/* Tämä sivu sisältää Moderni-ulkoasua muuttavia tyylejä. */',
 'vector.css' => '/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */',
 'print.css' => '/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */',
@@ -3002,13 +2986,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Scripts
 'common.js' => '/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */',
-'standard.js' => '/* Tämän sivun JavaScript-koodi liitetään Perus-tyyliin */',
-'nostalgia.js' => '/* Tämän sivun JavaScript-koodi liitetään Nostalgia-tyyliin */',
 'cologneblue.js' => '/* Tämän sivun JavaScript-koodi liitetään Kölnin sininen -tyyliin */',
 'monobook.js' => '/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */',
-'myskin.js' => '/* Tämän sivun JavaScript-koodi liitetään Oma tyylisivu -tyyliin */',
-'chick.js' => '/* Tämän sivun JavaScript-koodi liitetään Chick-tyyliin */',
-'simple.js' => '/* Tämän sivun JavaScript-koodi liitetään Yksinkertaistettuun tyyliin */',
 'modern.js' => '/* Tämän sivun JavaScript-koodi liitetään Moderni-tyyliin */',
 'vector.js' => '/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */',
 'group-autoconfirmed.js' => '/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */',
@@ -3084,13 +3063,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-category-files' => 'Tiedostojen määrä',
 
 # Skin names
-'skinname-standard' => 'Perus',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölnin sininen',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Oma tyylisivu',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Yksinkertainen',
 'skinname-modern' => 'Moderni',
 
 # Patrolling
@@ -3891,17 +3865,17 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
 
 # New logging system
-'logentry-delete-delete' => '$1 poisti sivun $3',
-'logentry-delete-restore' => '$1 palautti sivun $3',
-'logentry-delete-event' => '$1 muutti {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-delete-revision' => '$1 muutti {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
-'logentry-delete-event-legacy' => '$1 muutti kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-delete-revision-legacy' => '$1 muutti sivun $3 versioiden näkyvyyttä',
-'logentry-suppress-delete' => '$1 häivytti sivun $3',
-'logentry-suppress-event' => '$1 muutti salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-suppress-revision' => '$1 muutti salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
-'logentry-suppress-event-legacy' => '$1 muutti salaa kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-suppress-revision-legacy' => '$1 muutti salaa sivun $3 versioiden näkyvyyttä',
+'logentry-delete-delete' => '$1 {{GENDER:$2|poisti}} sivun $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|palautti}} sivun $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutti}} kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutti}} sivun $3 versioiden näkyvyyttä',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|häivytti}} sivun $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutti}} salaa kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutti}} salaa sivun $3 versioiden näkyvyyttä',
 'revdelete-content-hid' => 'sisältö piilotettu',
 'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu',
 'revdelete-uname-hid' => 'käyttäjätunnus piilotettu',
@@ -3910,20 +3884,20 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin',
 'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
 'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
-'logentry-move-move' => '$1 siirsi sivun $3 uudelle nimelle $4',
-'logentry-move-move-noredirect' => '$1 siirsi sivun $3 uudelle nimelle $4 luomatta ohjausta',
-'logentry-move-move_redir' => '$1 siirsi sivun $3 ohjauksen $4 päälle',
-'logentry-move-move_redir-noredirect' => '$1 siirsi sivun $3 ohjauksen $4 päälle luomatta ohjausta',
-'logentry-patrol-patrol' => '$1 merkitsi sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-patrol-patrol-auto' => '$1 merkitsi automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-newusers-newusers' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create2' => '$1 loi käyttäjätunnuksen $3',
-'logentry-newusers-byemail' => '$1 loi käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse',
-'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 luotiin automaattisesti',
-'logentry-rights-rights' => '$1 muutti käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5',
-'logentry-rights-rights-legacy' => '$1 muutti käyttäjän $3 jäsenyyttä ryhmässä',
-'logentry-rights-autopromote' => '$1 ylennettiin automaattisesti ryhmistä $4 ryhmiin $5',
+'logentry-move-move' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle luomatta ohjausta',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkitsi}} sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkitsi}} automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-newusers-newusers' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'logentry-newusers-create' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse',
+'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}} automaattisesti',
+'logentry-rights-rights' => '$1 {{GENDER:$2|muutti}} käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|muutettiin}} automaattisesti ryhmistä $4 ryhmiin $5',
 'rightsnone' => '(ei oikeuksia)',
 
 # Feedback
index ed66796..4d334d2 100644 (file)
@@ -595,8 +595,8 @@ Vinarliga rita inn eftir at tú hevur fingið hana.',
 'blocked-mailpassword' => 'Tín IP adressa er stongd fyri at gera rættingar á síðum, og tí er tað ikki loyvt at brúka funkuna fyri endurskapan av loyniorði, hetta fyri at forða fyri misnýtslu.',
 'eauthentsent' => '↓ Ein váttanar t-postur er sendur til givna t-post bústaðin.
 Áðrenn aðrir teldupostar verða sendir til kontuna, mást tú fylgja leiðbeiningunum í t-postinum, fyri at vátta at kontoin veruliga er tín.',
-'throttled-mailpassword' => 'Ein teldupost við áminning um loyniorði er longu sendur fyri bert {{PLURAL:$1|tíma|$1 tímum}}.
-Fyri at fyribyrja misnýtslu, verður bert ein teldupostur við áminning um loyniorði sendur fyri hvønn/hvørjir {{PLURAL:$1|tíma|$1 tímar}}.',
+'throttled-mailpassword' => 'Ein teldupostur har loyniorðið verður nullstillað er longu sendur fyri bert {{PLURAL:$1|tíma|$1 tímum}} síðan.
+Fyri at fyribyrja misnýtslu, verður bert ein teldupostur við nullstillaðum loyniorði sendur fyri pr. {{PLURAL:$1|tíma|$1 tímar}}.',
 'mailerror' => 'Villa tá t-postur var sendur: $1',
 'acct_creation_throttle_hit' => 'Vitjandi á hesi wiki, sum nýta tína IP addressu, hava stovnað {{PLURAL:$1|1 kontu|$1 kontur}} seinastu dagarnar, sum er mest loyvda hetta tíðarskeið.
 Sum eitt úrslit av hesum, kunnu vitjandi sum brúka hesa IP adressuna ikki stovna fleiri kontur í løtuni.',
@@ -649,7 +649,7 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 
 # Special:PasswordReset
 'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at fáa eina áminning við t-posti við tínum konto upplýsingum.',
+'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
@@ -679,8 +679,8 @@ umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ik
 ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
 'passwordreset-emailelement' => 'Brúkaranavn: $1
 Fyribils loyniorð: $2',
-'passwordreset-emailsent' => 'Ein áminningar teldupostur er blivin sendur.',
-'passwordreset-emailsent-capture' => 'Ein áminningar teldupostur er blivin sendur, sum víst niðanfyri.',
+'passwordreset-emailsent' => 'Ein teldupostur har tú kanst nullstillað loyniorðið er blivin sendur.',
+'passwordreset-emailsent-capture' => 'Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.',
 'passwordreset-emailerror-capture' => 'Ein áminningar teldupostur var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til brúkaran: $1',
 
 # Special:ChangeEmail
@@ -1737,11 +1737,6 @@ Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
 'listusers-submit' => 'Sýna',
 'listusers-noresult' => 'Ongin brúkari var funnin.',
 
-# Special:ActiveUsers
-'activeusers-hidebots' => 'Fjal bottar',
-'activeusers-hidesysops' => 'Fjal umboðsstjórar (administratorar)',
-'activeusers-noresult' => 'Ongir brúkarar funnir.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Brúkara bólka rættindi',
 'listgrouprights-summary' => 'Henda síða vísir ein lista av brúkarabólkum, sum eru útgreinaðir á hesi wiki og rættindini hjá teimum einstøku bólkunum.
index 839696b..00382f4 100644 (file)
@@ -59,6 +59,7 @@
  * @author Lucyin
  * @author McDutchie
  * @author Meithal
+ * @author Metroitendo
  * @author Moyg
  * @author Nicolas NALLET
  * @author Nicolas Raoul
@@ -415,8 +416,6 @@ $messages = array(
 'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent cette page",
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
 'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
 'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
@@ -431,6 +430,7 @@ $messages = array(
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-useeditwarning' => 'M’avertir quand je quitte une page de modification sans publier les changements',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
@@ -1152,6 +1152,8 @@ Elle existe déjà.",
 'content-failed-to-parse' => "Échec de l'analyse du contenu de $2 pour le modèle $1: $3",
 'invalid-content-data' => 'Données du contenu non valides',
 'content-not-allowed-here' => 'Le contenu "$1" n\'est pas autorisé sur la page [[$2]]',
+'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
+Si vous êtes connecté avec votre compte, vous pouvez retirer cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.',
 
 # Content models
 'content-model-wikitext' => 'wikitexte',
@@ -1373,7 +1375,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchresulttext' => "Pour plus d'informations sur la recherche dans {{SITENAME}}, voir [[{{MediaWiki:Helppage}}|{{int:help}}]].",
 'searchsubtitle' => "Vous avez recherché « '''[[:$1]]''' » ([[Special:Prefixindex/$1|toutes les pages commençant par « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toutes les pages qui ont un lien vers « $1 »]])",
 'searchsubtitleinvalid' => "Vous avez recherché « '''$1''' »",
-'toomanymatches' => "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
+'toomanymatches' => 'Un trop grand nombre d’occurrences a été renvoyé, veuillez soumettre une requête différente.',
 'titlematches' => 'Correspondances dans les titres des pages',
 'notitlematches' => 'Aucun titre de page ne correspond à la recherche.',
 'textmatches' => 'Correspondances dans le texte des pages',
@@ -1429,15 +1431,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'powersearch-togglenone' => 'Aucune',
 'search-external' => 'Recherche externe',
 'searchdisabled' => 'La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.',
-
-# Quickbar
-'qbsettings' => "Barre d'outils",
-'qbsettings-none' => 'Aucune',
-'qbsettings-fixedleft' => 'Gauche',
-'qbsettings-fixedright' => 'Droite',
-'qbsettings-floatingleft' => 'Flottante à gauche',
-'qbsettings-floatingright' => 'Flottante à droite',
-'qbsettings-directionality' => "Fixe, en fonction de la directivité d'écriture de votre langue",
+'search-error' => 'Une erreur s’est produite en recherchant : $1',
 
 # Preferences page
 'preferences' => 'Préférences',
@@ -1994,7 +1988,6 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
 'http-curl-error' => "Erreur lors de la récupération de l'URL : $1",
-'http-host-unreachable' => "Impossible d'atteindre l'URL.",
 'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2321,15 +2314,6 @@ Ils nécessitent au moins un domaine de niveau supérieur, par exemple « *.org
 'listusers-noresult' => 'Aucun utilisateur trouvé. Vérifiez aussi les variantes de casse.',
 'listusers-blocked' => '(bloqué{{GENDER:$1||e|(e)}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Liste des utilisateurs actifs',
-'activeusers-intro' => 'Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}',
-'activeusers-from' => 'Afficher les utilisateurs depuis :',
-'activeusers-hidebots' => 'Masquer les robots',
-'activeusers-hidesysops' => 'Masquer les administrateurs',
-'activeusers-noresult' => 'Aucun utilisateur trouvé.',
-
 # Special:ListGroupRights
 'listgrouprights' => "Droits des groupes d'utilisateurs",
 'listgrouprights-summary' => "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.
@@ -2826,6 +2810,7 @@ Veuillez contacter votre fournisseur d'accès Internet ou votre support techniqu
 '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.',
+'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
 'cant-block-while-blocked' => "Vous ne pouvez pas bloquer d'autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.",
 'cant-see-hidden-user' => "L'utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N'ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
 'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
@@ -3126,22 +3111,17 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-watchlistedit-normal-submit' => 'Enlever les titres',
 'tooltip-watchlistedit-raw-submit' => 'Mise à jour de la liste de suivi',
 'tooltip-recreate' => 'Recréer la page même si celle-ci a été effacée',
-'tooltip-upload' => "Démarrer l'import",
+'tooltip-upload' => 'Démarrer l’import',
 'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
-'tooltip-undo' => "« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
-Permet de rétablir la version précédente et d'ajouter un motif dans la boîte de résumé.",
+'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
+Permet de rétablir la version précédente et d’ajouter un motif dans la boîte de résumé.',
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
 
 # Stylesheets
 'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
-'standard.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Standard. */',
-'nostalgia.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Nostalgia. */',
 'cologneblue.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Cologne Blue. */',
 'monobook.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */',
-'myskin.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage MySkin. */',
-'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
-'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
 'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
 'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
@@ -3154,13 +3134,8 @@ Permet de rétablir la version précédente et d'ajouter un motif dans la boîte
 
 # Scripts
 'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
-'standard.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Standard uniquement */',
-'nostalgia.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Nostalgie uniquement */',
 'cologneblue.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Bleu de cologne uniquement */',
 'monobook.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */',
-'myskin.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Mon habillage uniquement */',
-'chick.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Poussin uniquement */',
-'simple.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Simple uniquement */',
 'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
 'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
 'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
@@ -3239,13 +3214,8 @@ Permet de rétablir la version précédente et d'ajouter un motif dans la boîte
 'pageinfo-category-files' => 'Nombre de fichiers',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Bleu de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon Interface',
-'skinname-chick' => 'Poussin',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vector',
 
@@ -4127,6 +4097,8 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'htmlform-submit' => 'Soumettre',
 'htmlform-reset' => 'Défaire les modifications',
 'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Oui',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
index 997c21a..0b0f09a 100644 (file)
@@ -2311,15 +2311,6 @@ Ils ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *
 'listusers-noresult' => 'Nion utilisator trovâ.',
 'listusers-blocked' => '(blocâ{{GENDER:$1||ye|(ye)}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista des utilisators actifs',
-'activeusers-intro' => 'O est na lista des utilisators qu’ant ègzèrciê un’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
-'activeusers-count' => '$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}',
-'activeusers-from' => 'Fâre vêre los utilisators dês :',
-'activeusers-hidebots' => 'Cachiér los robots',
-'activeusers-hidesysops' => 'Cachiér los administrators',
-'activeusers-noresult' => 'Nion utilisator trovâ.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Drêts de les tropes d’utilisators',
 'listgrouprights-summary' => 'Vê-que na lista de les tropes d’utilisators dèfenies sur ceti vouiqui et pués los sins drêts d’accès.
index dadabb0..81b35f8 100644 (file)
@@ -48,9 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wis di tål foon wåchende brükere',
 'tog-oldsig' => 'Aktuel signatuur:',
 'tog-fancysig' => 'Signatuur behoonle ås wikitäkst',
-'tog-externaleditor' => 'Gewöönlik äksterne ediitor for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde
-[//www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
-'tog-externaldiff' => 'Gewöönlik äkstern program for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde[//www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
 'tog-showjumplinks' => '"Schafte tu"-ferbininge aktiwiire',
 'tog-uselivepreview' => 'Live-forbekiik ferwiinje (brükt JavaScript) (äksperimentäl)',
 'tog-forceeditsummary' => 'Woorschoue, wan bai dåt spiikern jü tuhuupefooting breecht',
@@ -64,6 +61,7 @@ $messages = array(
 'tog-diffonly' => 'Wis bai di fersjoonsferglik bloot da unerschiise, ai jü hiilj sid',
 'tog-showhiddencats' => 'Wis ferstäägene kategoriie',
 'tog-norollbackdiff' => 'Unerschiis eefter dåt tübäägseeten unerdrüke',
+'tog-useeditwarning' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
 
 'underline-always' => 'Åltens',
 'underline-never' => 'uler',
@@ -793,6 +791,8 @@ Dåt bestöö ål.',
 'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
 'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1073,15 +1073,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-external' => 'Extern säkj',
 'searchdisabled' => 'Jü {{SITENAME}}-säkj as deaktiviird. Dü koost intwasche ma Google säke. Betånk, dåt di säkindäks for {{SITENAME}} ferüüljet weese koon.',
 
-# Quickbar
-'qbsettings' => 'Sidjenliist',
-'qbsettings-none' => 'Niinj',
-'qbsettings-fixedleft' => 'Lachts, fääst',
-'qbsettings-fixedright' => 'Rochts, fääst',
-'qbsettings-floatingleft' => 'Lachts, auergung',
-'qbsettings-floatingright' => 'Rochts, auergung',
-'qbsettings-directionality' => 'Fääst, hinget faan di skriiwwai faan det spriak uf',
-
 # Preferences page
 'preferences' => 'Önjstalinge',
 'mypreferences' => 'Iinstelangen',
@@ -1632,6 +1623,7 @@ $1",
 'blocklist' => 'Spärd brükere',
 'ipblocklist' => 'Spärd brükere',
 'ipblocklist-legend' => 'Spärd brükere fine',
+'ipblocklist-submit' => 'Sjük',
 'expiringblock' => 'iinjet aw e $1 am e klook $2',
 'blocklink' => 'späre',
 'unblocklink' => 'frijeewe',
@@ -1784,6 +1776,9 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
 'svg-long-desc' => 'SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3',
 'show-big-image' => 'Färsjon önj huuger apliising',
 
+# Special:NewFiles
+'ilsubmit' => 'Sjük',
+
 # Bad image list
 'bad_image_list' => 'Formååt:
 
@@ -1843,8 +1838,12 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Färsjoon',
 
+# Special:FileDuplicateSearch
+'fileduplicatesearch-submit' => 'Sjük',
+
 # Special:SpecialPages
 'specialpages' => 'Spetsjåålside',
+'specialpages-group-login' => 'Melde di uun of skriiw di iin',
 
 # External image whitelist
 'external_image_whitelist' => " #Feranere detheer rä ei<pre>
@@ -1863,27 +1862,33 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'htmlform-selectorother-other' => 'Oudere',
 
 # New logging system
-'logentry-delete-delete' => '$1 hää det sidj $3 stregen',
-'logentry-delete-restore' => '$1 hää det sidj $3 weder iinsteld',
-'logentry-delete-event' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-delete-revision' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-delete-event-legacy' => '$1 hää det uunlukin feranert faan logbuk iindracher üüb $3',
-'logentry-delete-revision-legacy' => '$1 hää det uunlukin feranert faan wersjuunen faan det sidj $3',
-'logentry-suppress-delete' => '$1 hää det sidj $3 wechtrakt',
-'logentry-suppress-event' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-suppress-revision' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-suppress-event-legacy' => '$1 hää stalswigin det uunlukin fernanert faan logbuk iindracher üüb $3',
-'logentry-suppress-revision-legacy' => '$1 hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
+'logentry-delete-delete' => '$1 {{Gender:$2}} hää det sidj $3 stregen',
+'logentry-delete-restore' => '$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld',
+'logentry-delete-event' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan wersjuunen faan det sidj $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}} hää det sidj $3 wechtrakt',
+'logentry-suppress-event' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
 'revdelete-uname-hid' => 'brükernoome ferstäägen',
 'revdelete-uname-unhid' => 'brükernoome frijääwen',
 'revdelete-restricted' => 'gränse jüle uk for administratoore',
 'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
-'logentry-move-move' => '$1 hää det sidj $3 efter $4 fersköwen.',
-'logentry-move-move-noredirect' => '$1 hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
-'logentry-move-move_redir' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
-'logentry-move-move_redir-noredirect' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-move-move' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen.',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-newusers-newusers' => 'Brükerkonto $1 as {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-create2' => 'Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-autocreate' => 'Brükerkonto $1 as automaatisk {{GENDER:$2|iinracht}} wurden',
 'rightsnone' => '(-)',
 
+# Search suggestions
+'searchsuggest-search' => 'Sjük',
+
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunden}}',
 'duration-minutes' => '$1 {{PLURAL:$1|minüüt|minüüten}}',
index 07775cb..c617308 100644 (file)
@@ -282,7 +282,7 @@ $1",
 'mainpage' => 'Prìomh dhuilleag',
 'mainpage-description' => 'Prìomh dhuilleag',
 'policy-url' => 'Project:Poileasaidh',
-'portal' => 'Doras na Coimhearsnachd',
+'portal' => 'Doras na coimhearsnachd',
 'portal-url' => 'Project:Doras na coimhearsnachd',
 'privacy' => 'Am polasaidh prìobhaideachd',
 'privacypage' => 'Project:Am polasaidh prìobhaideachd',
@@ -520,7 +520,7 @@ Clàraich a-steach a-rithist nuair a gheibh thu e.',
 'blocked-mailpassword' => "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
 'eauthentsent' => 'Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.
 Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an treòrachadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.',
-'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.
+'throttled-mailpassword' => 'Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.
 Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
 'mailerror' => "Mearachd a' cur post: $1",
 'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
@@ -573,7 +573,7 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 
 # Special:PasswordReset
 'passwordreset' => 'Ath-shuidhich am facal-faire',
-'passwordreset-text' => "Lìon am foirm seo gus post-d fhaighinn sa bheil mion-fhiosrachadh a' chunntais agad.",
+'passwordreset-text' => 'Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.',
 'passwordreset-legend' => 'Ath-shuidhich am facal-faire',
 'passwordreset-disabled' => 'Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.',
 'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
@@ -583,13 +583,13 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
 'passwordreset-email' => 'Seòladh puist-d:',
 'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
 Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
 Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
@@ -597,9 +597,9 @@ Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 fac
 Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
 'passwordreset-emailelement' => 'Ainm-cleachdaiche: $1
 Facal-faire sealach: $2',
-'passwordreset-emailsent' => "Chaidh cuimhneachan a chur air a' phost-d.",
-'passwordreset-emailsent-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal.",
-'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
+'passwordreset-emailsent' => 'Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.',
+'passwordreset-emailsent-capture' => 'Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.',
+'passwordreset-emailerror-capture' => "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Atharraich am post-d',
@@ -888,8 +888,14 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'rev-deleted-event' => '(chaidh gnìomh an loga a thoirt air falbh)',
 'rev-delundel' => 'seall/falaich',
 'rev-showdeleted' => 'seall',
+'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
 'revdelete-hide-user' => 'Falaich ainm-cleachdaiche/seòladh IP an deasaiche',
+'revdelete-radio-same' => '(na atharraich)',
+'revdelete-radio-set' => 'Dèan seo',
+'revdelete-radio-unset' => 'Na dèan seo',
 'revdelete-log' => 'Adhbhar:',
+'revdelete-submit' => 'Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu',
 'revdel-restore' => 'mùth follaiseachd',
 'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
 'revdel-restore-visible' => 'mùthaidhean faicsinneach',
@@ -908,10 +914,13 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 
 # Diffs
 'history-title' => 'Eachdraidh nam mùthaidhean aig "$1"',
+'difference-multipage' => '(An diofar eadar na duilleagan)',
 'lineno' => 'Loidhne $1:',
 'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
+'showhideselectedversions' => 'Seall/Falaich na lèirmheasan a thagh thu',
 'editundo' => 'neo-dhèan',
 'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
 
 # Search results
 'searchresults' => 'Toraidhean rannsachaidh',
@@ -929,9 +938,11 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}',
 'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag',
 'viewprevnext' => 'Seall ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Roghainnean luirg',
 'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
 'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
 'searchhelp-url' => 'Help:Cuideachadh',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rùraich duilleagan aig a bheil an ro-leasachan seo]]',
 'searchprofile-articles' => 'Duilleagan susbainte',
 'searchprofile-project' => "Duilleagan nan cobharach 's nam pròiseactan",
 'searchprofile-images' => 'Ioma-mheadhanan',
@@ -952,6 +963,8 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'search-interwiki-default' => 'Toraidhean $1:',
 'search-interwiki-more' => '(barrachd)',
 'search-relatedarticle' => 'Co-cheangailte',
+'mwsuggest-disable' => 'Cuir na molaidhean luirg à comas',
+'searcheverything-enable' => 'Seall anns na namespaces air fad',
 'searchrelated' => 'co-cheangailte',
 'searchall' => 'a h-uile',
 'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
@@ -965,22 +978,33 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'powersearch-ns' => 'Lorg ann an namespaces:',
 'powersearch-redir' => 'Seall ath-sheòlaidhean',
 'powersearch-field' => 'Lorg',
-
-# Quickbar
-'qbsettings-none' => 'Chan eil gin',
+'powersearch-togglelabel' => 'Sgrùd:',
+'powersearch-toggleall' => 'Na h-uile',
+'powersearch-togglenone' => 'Chan eil gin',
+'search-external' => 'Lorg air an taobh a-muigh',
+'searchdisabled' => "Tha lorg air {{SITENAME}} à comas.
+'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.
+Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
 
 # Preferences page
 'preferences' => 'Roghainnean',
 'mypreferences' => 'Na roghainnean agam',
+'prefs-edits' => 'Co mheud deasachadh:',
+'prefsnologin' => 'Chan eil thu air clàradh a-steach',
+'prefsnologintext' => 'Feumaidh tu <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} clàradh a-steach]</span> mus urrainn dhut roghainnean cleachdaiche a chur air gleus.',
 'changepassword' => 'Atharraich facal-faire',
 'prefs-skin' => 'Bian',
 'skin-preview' => 'Ro-shealladh',
+'datedefault' => 'Gun roghainnean',
 'prefs-beta' => 'Feartan Beta',
 'prefs-datetime' => 'Ceann-là is àm',
 'prefs-labs' => 'Feartan nan deuchainn-lannan',
+'prefs-user-pages' => "Duilleagan a' chleachdaiche",
 'prefs-personal' => "Pròifil a' chleachdaiche",
 'prefs-rc' => 'Mùthaidhean ùra',
 'prefs-watchlist' => 'An clàr-faire',
+'prefs-watchlist-days' => "Co mheud latha a sheallar air a' chlàr-fhaire:",
+'prefs-watchlist-days-max' => "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
 'prefs-resetpass' => 'Atharraich am facal-faire',
 'prefs-changeemail' => 'Atharraich am post-d',
 'prefs-setemail' => 'Suidhich seòladh puist-d',
@@ -1009,13 +1033,30 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'timezoneregion-europe' => 'An Roinn-Eòrpa',
 'timezoneregion-indian' => 'An Cuan Innseanach',
 'timezoneregion-pacific' => 'An Cuan Sèimh',
+'prefs-namespaces' => 'Namespaces',
 'default' => 'an roghainn bhunaiteach',
+'prefs-files' => 'Faidhlichean',
 'prefs-custom-css' => 'CSS gnàthaichte',
+'prefs-custom-js' => 'JavaScript gnàthaichte',
+'prefs-common-css-js' => 'CSS/JavaScript ann an coitcheann do gach craiceann:',
+'prefs-reset-intro' => "'S urrainn dhut bun-roghainnean na làraich ath-shuidheachadh air an duilleag seo. Cha ghabh seo a neo-dhèanamh.",
+'prefs-emailconfirm-label' => 'Dearbhadh puist-d:',
+'prefs-textboxsize' => 'Meud na h-uinneige deasachaidh',
 'youremail' => 'Post-dealain:',
 'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
+'uid' => "ID {{GENDER:$1|a' chleachdaiche}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:',
+'prefs-registration' => 'Àm clàraidh:',
 'yourrealname' => "An dearbh ainm a th' ort:",
 'yourlanguage' => 'Cànan:',
+'yourvariant' => 'Eug-samhail cànan na susbaint:',
+'prefs-help-variant' => 'Do roghainn eug-samhail sgrìobhaidh a thèid duilleagan na h-uicipeid seo a shealltainn innte.',
 'yournick' => 'Earr-sgrìobhadh ùr:',
+'prefs-help-signature' => "Bu chòir dhut d' ainm a chur ri beachdan air duilleagan deasbaireachd le \"<nowiki>~~~~</nowiki>\" agus chithear d' ainm agus stampa ama 'na àite an uairsin.",
+'badsig' => 'Tha co-chàradh an t-soidhnidh mì-dhligheach.
+Thoir sùil air na tagaichean HTML.',
+'badsiglength' => 'Tha an t-earr-sgrìobhadh agad ro fhada.
+Chan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.',
 'yourgender' => 'Gnè:',
 'gender-unknown' => 'Gun innse',
 'gender-male' => 'Fireann',
@@ -1024,17 +1065,48 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'prefs-help-email' => "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
 'prefs-help-email-others' => "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.
 Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+'prefs-help-email-required' => 'Tha feum air seòladh puist-d.',
+'prefs-info' => 'Fiosrachadh bunasach',
+'prefs-i18n' => 'Cànan',
+'prefs-signature' => 'Earr-sgrìobhadh',
+'prefs-dateformat' => "Fòrmat a' chinn-là",
+'prefs-timeoffset' => 'Diofar ama',
 'prefs-advancedediting' => 'Roghainnean adhartach',
 'prefs-advancedrc' => 'Roghainnean adhartach',
 'prefs-advancedrendering' => 'Roghainnean adhartach',
 'prefs-advancedsearchoptions' => 'Roghainnean adhartach',
 'prefs-advancedwatchlist' => 'Roghainnean adhartach',
+'prefs-displayrc' => 'Roghainnean taisbeanaidh',
+'prefs-displaysearchoptions' => 'Roghainnean taisbeanaidh',
+'prefs-displaywatchlist' => 'Roghainnean taisbeanaidh',
+'prefs-diffs' => 'Diffs',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Tha coltas gu bheil am post-d dligheach',
+'email-address-validity-invalid' => 'Cuir a-steach post-d dligheach',
 
 # User rights
+'userrights' => "Stiùireadh ceadan a' chleachdaiche",
+'userrights-lookup-user' => 'Stiùirich na buidhnean chleachdaichean',
+'userrights-user-editname' => 'Cuir a-steach ainm-cleachdaiche:',
+'editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'editinguser' => "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'saveusergroups' => 'Sàbhail na buidhnean chleachdaichean',
+'userrights-groupsmember' => 'Ball de:',
+'userrights-groupsmember-auto' => 'Ball fèin-obrachail de:',
+'userrights-reason' => 'Adhbhar:',
+'userrights-no-interwiki' => 'Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.',
+'userrights-nodatabase' => 'Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.',
 'userrights-changeable-col' => 'Buidhnean as urrainn dhut atharrachadh',
 
 # Groups
+'group' => 'Buidheann:',
+'group-user' => 'Cleachdaichean',
+'group-bot' => 'Bots',
 'group-sysop' => 'Rianadairean',
+'group-bureaucrat' => 'Biurocratan',
+'group-all' => '(na h-uile)',
 
 'group-user-member' => '{{GENDER:$1|cleachdaiche}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
@@ -1042,7 +1114,24 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 'group-bureaucrat-member' => '{{GENDER:$1|biùrocrat}}',
 
 'grouppage-user' => '{{ns:project}}:Cleachdaichean',
+'grouppage-autoconfirmed' => '{{ns:project}}:Cleachdaichean fèin-dearbhte',
+'grouppage-bot' => '{{ns:project}}:Bots',
 'grouppage-sysop' => '{{ns:project}}:Rianadairean',
+'grouppage-bureaucrat' => '{{ns:project}}:Biurocratan',
+
+# Rights
+'right-read' => 'Cead-leughaidh',
+'right-edit' => 'Cead-deasachaidh',
+'right-createpage' => "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
+'right-createtalk' => 'Cead duilleagan deasbaireachd a chruthachadh',
+'right-createaccount' => 'Cead cunntasan ùra a chruthachadh',
+'right-move' => 'Cead duilleagan a ghluasad',
+'right-move-subpages' => 'Cead duilleagan a ghluasad leis na fo-dhuilleagan aca',
+'right-move-rootuserpages' => 'Cead duilleagan chleachdaichean root a ghluasad',
+'right-movefile' => 'Cead faidhlichean a ghluasad',
+'right-upload' => 'Cead faidhlichean a luchdadh suas',
+'right-reupload' => 'Cead sgrìobhadh thairis air duilleagan a tha ann',
+'right-upload_by_url' => 'Faidhlichean a luchdadh suas o URL',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
@@ -1112,6 +1201,7 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
 
 'license' => 'Ceadachadh:',
 'license-header' => 'Ceadachadh',
+'nolicense' => 'Cha deach gin a thaghadh',
 
 # Special:ListFiles
 'listfiles' => 'Liosta nan ìomhaigh',
@@ -1175,11 +1265,13 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 # Book sources
 'booksources' => "Tùsan a tha 'nan leabhraichean",
 'booksources-search-legend' => "Lorg tùsan a tha 'nan leabhraichean",
-'booksources-go' => 'Rach',
+'booksources-go' => 'Siuthad',
 
 # Special:Log
 'log' => 'Logaichean',
 'all-logs-page' => 'A h-uile loga poblach',
+'logempty' => "Chan eil rud sam bith san loga a tha 'ga mhaidseadh.",
+'showhideselectedlogentries' => 'Seall/Falaich innteartan an loga a thagh thu',
 
 # Special:AllPages
 'allpages' => 'A h-uile duilleag',
@@ -1197,8 +1289,12 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 Chan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].
 Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
 
+# Special:DeletedContributions
+'deletedcontributions' => "Obair a' chleachdaiche a chaidh a sguabadh às",
+
 # Special:LinkSearch
 'linksearch' => 'Lorg sna ceanglaichean dhan taobh a-muigh',
+'linksearch-ns' => 'Namespace:',
 'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
 
 # Special:ListGroupRights
@@ -1206,6 +1302,8 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 
 # Email user
 'emailuser' => 'Cuir post-dealain dhan chleachdaiche seo',
+'emailusername' => 'Ainm-cleachdaiche:',
+'emailusernamesubmit' => 'Air adhart',
 'emailfrom' => 'O:',
 'emailto' => 'Gu:',
 'emailsubject' => 'Cuspair:',
@@ -1215,16 +1313,21 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 # Watchlist
 'watchlist' => 'An clàr-faire',
 'mywatchlist' => 'An clàr-faire',
-'watchlistfor2' => 'Do $1 $2',
+'watchlistfor2' => 'aig $1 $2',
 'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
+'addwatch' => "Cuir air a' chlàr-fhaire",
 'addedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a chur ri [[Special:Watchlist|do chlàr-faire]].
 Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.',
+'removewatch' => 'Thoir air falbh on chlàr-fhaire',
 'removedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].',
 'watch' => 'Cum sùil air',
 'watchthispage' => 'Cum sùil air an duilleag seo',
 'unwatch' => 'Na cum sùil tuilleadh',
+'unwatchthispage' => 'Na cum sùil tuilleadh',
+'notanarticle' => 'Chan e duilleag susbaint a tha ann',
 'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
 'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
+'wlheader-showupdated' => "* Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
 'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
 'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
 'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
@@ -1263,7 +1366,7 @@ Seall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoiri
 # Rollback
 'rollbacklink' => 'roilig air ais',
 'editcomment' => "Seo gearr-chunntas an deasachaidh: \"''\$1''\".",
-'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
+'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
 
 # Protect
 'protectlogpage' => 'Loga an dìon',
@@ -1274,6 +1377,7 @@ Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson
 'unprotectedarticle' => 'a neo-dhìon "[[$1]]"',
 'protect-title' => 'A\' dìonadh "$1"',
 'prot_1movedto2' => '[[$1]] gluaiste ri [[$2]]',
+'protect-norestrictiontypes-title' => 'Cha ghabh an duilleag seo a dhìon',
 'protect-legend' => 'Daingnich dìonadh',
 'protectcomment' => 'Adhbhar:',
 'protectexpiry' => 'Falbhaidh an ùine air:',
@@ -1290,8 +1394,12 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'protect-level-sysop' => 'Na ceadaich ach rianadairean',
 'protect-summary-cascade' => 'mar eas',
 'protect-expiring' => 'falbhaidh an ùine air $1 (UTC)',
+'protect-expiring-local' => 'falbhaidh an ùine air $1',
+'protect-expiry-indefinite' => 'buan',
 'protect-cascade' => "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
 'protect-cantedit' => "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
+'protect-othertime' => 'Àm eile:',
+'protect-othertime-op' => 'àm eile',
 'restriction-type' => 'Cead:',
 'restriction-level' => 'Ìre bacaidh:',
 
@@ -1303,6 +1411,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 # Namespace form on various pages
 'namespace' => 'Namespace:',
 'invert' => 'Cuir na thagh mi bun os cionn',
+'namespace_association' => 'Namespace co-cheangailte ris',
 'blanknamespace' => '(Prìomh)',
 
 # Contributions
@@ -1572,7 +1681,7 @@ Bidh an fheadhainn eile falaichte a ghnàth.
 #Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
 
 # Special:Tags
-'tag-filter' => 'Criathrag [[Special:Tags|Tag]]:',
+'tag-filter' => 'Criathrag [[Special:Tags|thagaichean]]:',
 
 # New logging system
 'rightsnone' => '(chan eil gin)',
index 5b4e3d9..b47f1ea 100644 (file)
@@ -278,8 +278,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de usuarios que están a vixiar',
 'tog-oldsig' => 'Sinatura actual:',
 'tog-fancysig' => 'Tratar a sinatura como se fose texto wiki (sen ligazón automática)',
-'tog-externaleditor' => 'Usar un editor externo por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-externaldiff' => 'Usar as diferenzas externas por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
 'tog-showjumplinks' => 'Permitir as ligazóns de accesibilidade "ir a"',
 'tog-uselivepreview' => 'Usar a vista previa en tempo real (cómpre JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisádeme cando o campo resumo estea baleiro',
@@ -294,6 +292,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar as categorías ocultas',
 'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
 'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
+'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -603,7 +602,7 @@ Por favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando
 'filedeleteerror' => 'Non se deu borrado o ficheiro "$1".',
 'directorycreateerror' => 'Non se puido crear o directorio "$1".',
 'filenotfound' => 'Non se deu atopado o ficheiro "$1".',
-'fileexistserror' => 'Resultou imposíbel escribir no ficheiro "$1": O ficheiro xa existe.',
+'fileexistserror' => 'Non se pode escribir no ficheiro "$1": O ficheiro xa existe.',
 'unexpected' => 'Valor inesperado: "$1"="$2".',
 'formerror' => 'Erro: Non se pode enviar o formulario.',
 'badarticleerror' => 'Non pode efectuarse esa acción nesta páxina.',
@@ -971,7 +970,7 @@ Se segue sen funcionar, probe a [[Special:UserLogout|saír do sistema]] e volver
 Se segue sen funcionar, probe a [[Special:UserLogout|saír do sistema]] e volver entrar.'''",
 'token_suffix_mismatch' => "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''
 Rexeitouse a edición para evitar que se corrompa o texto do artigo.
-Isto pode acontecer porque estea a empregar un servizo de ''proxy'' anónimo defectuoso baseado na web.",
+Isto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
 'edit_form_incomplete' => "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
 'editing' => 'Editando "$1"',
 'creating' => 'Creando "$1"',
@@ -1043,6 +1042,8 @@ Esta xa existe.',
 'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
 'invalid-content-data' => 'Datos de contido inválidos',
 'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
+Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "{{int:prefs-editing}}" das súas preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1226,7 +1227,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'mergehistory-box' => 'Fusionar as revisións de dúas páxinas:',
 'mergehistory-from' => 'Páxina de orixe:',
 'mergehistory-into' => 'Páxina de destino:',
-'mergehistory-list' => 'Historial de edicións fusionábeis',
+'mergehistory-list' => 'Historial de edicións fusionables',
 'mergehistory-merge' => 'As revisións seguintes de [[:$1]] pódense fusionar con [[:$2]]. Use a columna de botóns de selección para fusionar só as revisións creadasen e antes da hora indicada. Teña en conta que se usa as ligazóns de navegación a columna limparase.',
 'mergehistory-go' => 'Mostrar as edicións que se poden fusionar',
 'mergehistory-submit' => 'Fusionar as revisións',
@@ -1328,15 +1329,7 @@ Probe a fixar a súa petición con ''all:'' para procurar en todo o contido (inc
 'searchdisabled' => 'As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.
 Mentres tanto pode procurar usando o Google.
 Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Opcións da barra rápida',
-'qbsettings-none' => 'Ningunha',
-'qbsettings-fixedleft' => 'Fixa á esquerda',
-'qbsettings-fixedright' => 'Fixa á dereita',
-'qbsettings-floatingleft' => 'Flotante á esquerda',
-'qbsettings-floatingright' => 'Flotante á dereita',
-'qbsettings-directionality' => 'Fixa, segundo a dirección de escritura da súa lingua',
+'search-error' => 'Produciuse un erro durante a procura: $1',
 
 # Preferences page
 'preferences' => 'Preferencias',
@@ -1679,8 +1672,8 @@ Para incluír un ficheiro nunha páxina, use unha ligazón do seguinte xeito:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code>''' para usar unha resolución de 200 píxeles de ancho nunha caixa na marxe esquerda cunha descrición (\"texto alternativo\")
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para ligar directamente co ficheiro sen que este saia na páxina",
 'upload-permitted' => 'Tipos de ficheiro permitidos: $1.',
-'upload-preferred' => 'Tipos de arquivos preferidos: $1.',
-'upload-prohibited' => 'Tipos de arquivos prohibidos: $1.',
+'upload-preferred' => 'Tipos de ficheiro preferidos: $1.',
+'upload-prohibited' => 'Tipos de ficheiro prohibidos: $1.',
 'uploadlog' => 'rexistro de cargas',
 'uploadlogpage' => 'Rexistro de cargas',
 'uploadlogpagetext' => 'A continuación está a lista cos últimos ficheiros cargados no servidor.
@@ -1691,9 +1684,9 @@ Vexa a [[Special:NewFiles|galería de imaxes novas]] para ollar unha visión má
 'filereuploadsummary' => 'Cambios no ficheiro:',
 'filestatus' => 'Estado dos dereitos de autor:',
 'filesource' => 'Fonte:',
-'uploadedfiles' => 'Ficheiros cargados en {{SITENAME}}',
+'uploadedfiles' => 'Ficheiros cargados',
 'ignorewarning' => 'Ignorar a advertencia e gardar o ficheiro de calquera xeito',
-'ignorewarnings' => 'Ignorar os avisos',
+'ignorewarnings' => 'Ignorar as advertencias',
 'minlength1' => 'Os nomes dos ficheiros deben ter cando menos unha letra.',
 'illegalfilename' => 'O nome de ficheiro "$1" contén caracteres que non están permitidos nos títulos das páxinas.
 Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
@@ -1758,7 +1751,7 @@ Se aínda quere cargar o seu ficheiro, volva atrás e use outro nome.
 'uploadfromurl-queued' => 'A súa carga púxese á cola.',
 'uploaddisabledtext' => 'A carga de ficheiros está desactivada.',
 'php-uploaddisabledtext' => 'As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.',
-'uploadscripted' => 'Este ficheiro contén HTML ou código (script code) que pode producir erros ao ser interpretado polo navegador.',
+'uploadscripted' => 'Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.',
 'uploadvirus' => 'O ficheiro contén un virus! Detalles: $1',
 'uploadjava' => 'O ficheiro é un ZIP que contén un ficheiro .class de Java.
 Non están permitidas as cargas de ficheiros Java, dado que poden causar restricións de seguridade.',
@@ -1797,8 +1790,8 @@ $1',
 'upload-warning-subj' => 'Advertencia ao cargar',
 'upload-warning-msg' => 'Houbo un problema durante a carga desde [$2]. Pode volver ao [[Special:Upload/stash/$1|formulario de subidas]] para corrixilo.',
 
-'upload-proto-error' => 'Protocolo erróneo',
-'upload-proto-error-text' => 'A carga remota require URLs que comecen por <code>http://</code> ou <code>ftp://</code>.',
+'upload-proto-error' => 'Protocolo incorrecto',
+'upload-proto-error-text' => 'A carga remota require enderezos URL que comecen por <code>http://</code> ou <code>ftp://</code>.',
 'upload-file-error' => 'Erro interno',
 'upload-file-error-text' => 'Produciuse un erro interno ao intentar crear un ficheiro temporal no servidor.
 Por favor, contacte cun [[Special:ListUsers/sysop|administrador]] do sistema.',
@@ -1898,12 +1891,12 @@ Para unha seguridade óptima, img_auth.php está desactivado.',
 'http-read-error' => 'Erro de lectura HTTP.',
 'http-timed-out' => 'O pedido HTTP expirou.',
 'http-curl-error' => 'Ocorreu un erro ao acceder ao URL: $1',
-'http-host-unreachable' => 'Non se puido acceder ao URL.',
 'http-bad-status' => 'Houbo un problema durante a solicitude HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Non se logrou acceder a ese URL',
-'upload-curl-error6-text' => 'Non se logrou acceder ao URL que indicou. Comprobe que ese URL é correcto e que o sitio está activo.',
+'upload-curl-error6' => 'Non se puido acceder ao enderezo URL',
+'upload-curl-error6-text' => 'Non se puido acceder ao enderezo URL especificado.
+Comprobe que ese enderezo URL é correcto e que o sitio está activo.',
 'upload-curl-error28' => 'Rematou o tempo de espera',
 'upload-curl-error28-text' => 'O sitio tardou demasiado en responder.
 Por favor, comprobe que está activo, agarde un anaco e inténteo de novo.
@@ -1974,7 +1967,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'upload-disallowed-here' => 'Non pode sobrescribir este ficheiro.',
 
 # File reversion
-'filerevert' => 'Reverter $1',
+'filerevert' => 'Reverter "$1"',
 'filerevert-legend' => 'Reverter o ficheiro',
 'filerevert-intro' => 'Está a piques de reverter o ficheiro "\'\'\'[[Media:$1|$1]]\'\'\'" ata a [$4 versión do $2 ás $3].',
 'filerevert-comment' => 'Motivo:',
@@ -2226,15 +2219,6 @@ Cómpre, polo menos, un dominio de nivel superior; por exemplo, "*.org".<br />
 'listusers-noresult' => 'Non se atopou ningún usuario.',
 'listusers-blocked' => '(bloqueado)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista de usuarios activos',
-'activeusers-intro' => 'Esta é unha lista cos usuarios que tiveron algún tipo de actividade {{PLURAL:$1|no último día|nos últimos $1 días}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|acción|accións}} {{PLURAL:$3|no último día|nos últimos $3 días}}',
-'activeusers-from' => 'Mostrar os usuarios que comecen por:',
-'activeusers-hidebots' => 'Agochar os bots',
-'activeusers-hidesysops' => 'Agochar os administradores',
-'activeusers-noresult' => 'Non se atopou ningún usuario.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Dereitos dun usuario segundo o seu grupo',
 'listgrouprights-summary' => 'A seguinte lista mostra os grupos de usuario definidos neste wiki, cos seus dereitos de acceso asociados.
@@ -2624,10 +2608,10 @@ Explique a razón específica do bloqueo (por exemplo, citando as páxinas concr
 ** Inserir información falsa
 ** Eliminar o contido de páxinas
 ** Ligazóns lixo a sitios externos
-** Inserir textos sen sentido ou inintelixíbeis
+** Inserir textos sen sentido ou inintelixibles
 ** Comportamento intimidatorio/acoso
 ** Abuso de múltiples contas de usuario
-** Nome de usuario inaceptábel',
+** Nome de usuario inaceptable',
 'ipb-hardblock' => 'Impedir que usuarios rexistrados editen desde este enderezo IP',
 'ipbcreateaccount' => 'Previr a creación de contas',
 'ipbemailban' => 'Impedir que o usuario envíe correos electrónicos',
@@ -2725,9 +2709,10 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent
 '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",
+'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',
+'xffblockreason' => 'Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1',
 'cant-block-while-blocked' => 'Non pode bloquear outros usuarios mentres vostede estea bloqueado.',
 'cant-see-hidden-user' => 'O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.',
 'ipbblocked' => 'Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado',
@@ -2761,7 +2746,7 @@ Lembre [[Special:UnlockDB|eliminar o bloqueo]] unha vez completado o seu manteme
 O título vello vaise converter nunha páxina de redirección ao novo título.
 Pode actualizar automaticamente as redireccións que van dar ao título orixinal.
 Se escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
-Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
+Vostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
 Teña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.
 Isto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.
@@ -2772,7 +2757,7 @@ por favor, asegúrese de que entende as consecuencias disto antes de proseguir."
 'movepagetext-noredirectfixer' => "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.
 O título vello vaise converter nunha páxina de redirección ao novo título.
 Asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
-Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
+Vostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
 Teña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.
 Isto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.
@@ -3039,13 +3024,8 @@ Pode ver o código fonte.',
 
 # Stylesheets
 'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
-'standard.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Clásica */',
-'nostalgia.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Morriña */',
 'cologneblue.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Azul colonial */',
 'monobook.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */',
-'myskin.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Parrulo */',
-'simple.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Sinxela */',
 'modern.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Moderna */',
 'vector.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */',
 'print.css' => '/* O CSS que se coloque aquí afectará ás impresións */',
@@ -3058,13 +3038,8 @@ Pode ver o código fonte.',
 
 # Scripts
 'common.js' => '/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */',
-'standard.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Clásica */',
-'nostalgia.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Morriña */',
 'cologneblue.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */',
 'monobook.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */',
-'myskin.js' => '/* O JavaScript que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Parrulo */',
-'simple.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Sinxela */',
 'modern.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */',
 'vector.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */',
 'group-autoconfirmed.js' => '/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */',
@@ -3144,13 +3119,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clásica',
-'skinname-nostalgia' => 'Morriña',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A miña aparencia',
-'skinname-chick' => 'Parrulo',
-'skinname-simple' => 'Sinxela',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3684,7 +3654,7 @@ Pode ser que caducase.',
 'confirmemail_success' => 'Confirmouse o seu enderezo de correo electrónico. Agora xa pode [[Special:UserLogin|acceder ao sistema]] e facer uso do wiki.',
 'confirmemail_loggedin' => 'Xa se confirmou o seu enderezo de correo electrónico.',
 'confirmemail_error' => 'Houbo un problema ao gardar a súa confirmación.',
-'confirmemail_subject' => '{{SITENAME}} - Verificación do enderezo de correo electrónico',
+'confirmemail_subject' => 'Confirmación do enderezo de correo electrónico de {{SITENAME}}',
 'confirmemail_body' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
 rexistrou a conta "$2" con este enderezo de correo electrónico en {{SITENAME}}.
 
@@ -3959,6 +3929,8 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfacer os cambios',
 'htmlform-selectorother-other' => 'Outro',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Si',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
index ae6b140..4a90c60 100644 (file)
@@ -179,8 +179,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ધ્યાનમાં રાખતા સભ્યોની સંખ્યા બતાવો',
 'tog-oldsig' => 'હાલના હસ્તાક્ષર',
 'tog-fancysig' => 'હસ્તાક્ષરનો વિકિલખાણ તરીકે ઉપયોગ કરો (સ્વચાલિત કડી વગર)',
-'tog-externaleditor' => 'બીજું એડીટર વાપરો. (ફક્ત એકસપર્ટ માટે, તમારા કમ્પ્યુટરમાં સેટીંગ્સ બદલવા પડશે. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => "''આના પર જાવ'' કડીને સક્રીય કરો.",
 'tog-uselivepreview' => 'લાઇવ પ્રિવ્યુ જુઓ (જાવાસ્ક્રીપ્ટ જરૂરી) (પ્રાયોગીક)',
 'tog-forceeditsummary' => "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
@@ -195,6 +193,7 @@ $messages = array(
 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
 'tog-noconvertlink' => 'Disable link title conversion',
 'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો',
+'tog-useeditwarning' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
 
 'underline-always' => 'હંમેશાં',
 'underline-never' => 'કદી નહિ',
@@ -285,6 +284,7 @@ $messages = array(
 'newwindow' => '(નવા પાનામાં ખુલશે)',
 'cancel' => 'રદ કરો',
 'moredotdotdot' => 'વધારે...',
+'morenotlisted' => 'વધુ યાદી કરેલી નથી...',
 'mypage' => 'પાનું',
 'mytalk' => 'ચર્ચા',
 'anontalk' => 'આ IP માટેનું ચર્ચા પાનું',
@@ -518,6 +518,8 @@ $1',
 'cannotdelete' => 'ફાઇલ કે પાનું "$1" હટાવી શકાયું નથી.
 શક્ય છે કે અન્ય કોઈએ પહેલેથી હટાવી દીધું હોય.',
 'cannotdelete-title' => '"$1" પાનું કાઢી શકતા નથી',
+'delete-hook-aborted' => 'દૂર કરવાનું હૂક વડે રોકી રાખવામાં આવ્યું.
+તે કોઇ કારણ આપતું નથી.',
 'badtitle' => 'ખરાબ નામ',
 'badtitletext' => 'આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે.
 શક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.',
@@ -589,7 +591,7 @@ $2',
 'gotaccount' => "પહેલેથી ખાતું ખોલેલું છે? '''$1'''.",
 'gotaccountlink' => 'પ્રવેશ કરો',
 'userlogin-resetlink' => 'પોતાની પ્રવેશ માહિતી ભૂલી ગયા છો?',
-'createaccountmail' => 'àª\87-મà«\87àª\87લ àª¦à«\8dવારા',
+'createaccountmail' => 'àª\95ામàª\9aલાàª\89 àª\97મà«\87-તà«\87મ àªªàª¾àª¸àªµàª°à«\8dડ àªµàª¾àªªàª°à«\8b àª\85નà«\87 àª¤à«\87નà«\87 àª¨à«\80àª\9aà«\87 àª\86પà«\87લ àª\87મà«\87લ àª¸àª°àª¨àª¾àª®àª¾ àªªàª° àª®à«\8bàª\95લà«\8b',
 'createaccountreason' => 'કારણ:',
 'badretype' => 'તમે દાખલ કરેલ ગુપ્તસંજ્ઞા મળતી આવતી નથી.',
 'userexists' => 'દાખલ કરેલું સભ્ય નુ નામ વપરાશમાં છે.</br>
@@ -692,7 +694,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'પાસવર્ડ રીસેટ કરો',
-'passwordreset-text' => 'àª\86પના àª\88 àª®à«\87લ àª\96ાતા àª¨à«\80 àª®àª¾àª¹àª¿àª¤à«\80 àª®à«\87ળવવા àª®àª¾àª\9fà«\87 àª\86 àª«à«\8bરà«\8dમ àª®àª¾àª\82 àªµàª¿àª\97તà«\8b àª­રો.',
+'passwordreset-text' => 'તમારà«\8b àªªàª¾àª¸àªµàª°à«\8dડ àª¬àª¦àª²àªµàª¾ àª®àª¾àª\9fà«\87 àª\86 àª«à«\8bરà«\8dમ àªªà«\82રà«\81 àª\95રો.',
 'passwordreset-legend' => 'પાસવર્ડ રીસેટ કરો',
 'passwordreset-disabled' => 'આ વિકી પર પાસવર્ડ રીસેટ કરવા પર પ્રતિબંધ છે.',
 'passwordreset-pretext' => '{{PLURAL: $1| | એક નીચે માહિતીના ટુકડાઓ દાખલ}}',
@@ -716,8 +718,8 @@ $2
 {{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો..',
 'passwordreset-emailelement' => 'વપરાશકર્તા નામ: $1
 કામચલાઉ પાસવર્ડ: $2',
-'passwordreset-emailsent' => 'àª\8fàª\95 àª¸à«\8dમà«\83તિપતà«\8dર àª\88 મેલ મોકલવામાં આવ્યો છે.',
-'passwordreset-emailsent-capture' => 'àª\8fàª\95 àª¸à«\8dમà«\83તિપતà«\8dર àª\88 àª®à«\87લ àª®à«\8bàª\95લવામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª\86 પ્રમાણે છે.',
+'passwordreset-emailsent' => 'પાસવરà«\8dડ àª¬àª¦àª²àªµàª¾àª¨à«\8b àª\87મેલ મોકલવામાં આવ્યો છે.',
+'passwordreset-emailsent-capture' => 'પાસવરà«\8dડ àª¬àª¦àª²àªµàª¾àª¨à«\8b àª\87મà«\87લ àª®à«\8bàª\95લવામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª¨à«\80àª\9aà«\87 પ્રમાણે છે.',
 'passwordreset-emailerror-capture' => 'એક સ્મૃતિપત્ર ઈ મેલ બનાવવા માં આવ્યો છે, જે આ પ્રમાણે છે, પરંતુ તે યુઝર ને મોકલવા માં નિષ્ફળ થયો છે: $1',
 
 # Special:ChangeEmail
@@ -935,6 +937,8 @@ $2
 તે પહેલેથી હાજર છે.',
 'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 'invalid-content-data' => 'અયોગ્ય વિગત માહિતી',
+'editwarning-warning' => 'આ પાનું છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
+જો તમે પ્રવેશ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.',
 
 # Content models
 'content-model-wikitext' => 'વિકિલખાણ',
@@ -1190,7 +1194,7 @@ $1",
 'search-interwiki-default' => '$1 પરીણામો:',
 'search-interwiki-more' => '(વધુ)',
 'search-relatedarticle' => 'શોધ સંબંધિત',
-'mwsuggest-disable' => 'AJAX સુઝાવો નિષ્ક્રીય કરો',
+'mwsuggest-disable' => 'શોધ સુઝાવો નિષ્ક્રીય કરો',
 'searcheverything-enable' => 'નામસ્થળોમાં શોધો:',
 'searchrelated' => 'શોધ સંબંધિત',
 'searchall' => 'બધા',
@@ -1212,15 +1216,7 @@ $1",
 'searchdisabled' => "{{SITENAME}} ઉપર શોધ બંધ કરી દેવામાં આવી છે.
 ત્યાં સુધી તમે ગુગલ દ્વારા શોધ કરી શકો.
 '''નોંધઃ'''{{SITENAME}}નાં તેમના (ગુગલના) ઈન્ડેક્સ જુના હોઇ શકે.",
-
-# Quickbar
-'qbsettings' => 'શીઘ્રપટ્ટ',
-'qbsettings-none' => 'કોઇપણ નહીં',
-'qbsettings-fixedleft' => 'અચળ ડાબે',
-'qbsettings-fixedright' => 'અચળ જમણે',
-'qbsettings-floatingleft' => 'ચલિત ડાબે',
-'qbsettings-floatingright' => 'ચલિત જમણે',
-'qbsettings-directionality' => 'નિશ્ચિત, તમારી ભાષા સ્ક્રિપ્ટ directionality પર આધાર રાખીને',
+'search-error' => 'શોધ કરતી વખતે ક્ષતિ આવી: $1',
 
 # Preferences page
 'preferences' => 'પસંદ',
@@ -1764,7 +1760,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'http-read-error' => 'HTTP વાચન ત્રુટિ.',
 'http-timed-out' => ' HTTP અરજી કાલાતિત થઇ ગઇ.',
 'http-curl-error' => 'URL: $1 ખેંચી લાવવામાં ત્રુટિ',
-'http-host-unreachable' => 'URL સુધી ન પહોંચી શકાયું.',
 'http-bad-status' => 'HTTP અરજી વખતે કોઈ અડચણ આવી : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1833,6 +1828,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'uploadnewversion-linktext' => 'આ ફાઇલની નવી આવૃત્તિ ચઢાવો',
 'shared-repo-from' => '$1 થી',
 'shared-repo' => 'સાંઝો ભંડાર',
+'upload-disallowed-here' => 'તમે આ ફાઇલ ઉપર લખી શકતા નથી.',
 
 # File reversion
 'filerevert' => '$1 હતું તેવું કરો',
@@ -1918,6 +1914,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 તેઓ વધુ યોગ્ય પાનાં સાથે જોડાયેલા હોવા જોઇએ.<br />
 પાનાને સંદિગ્ધ વાક્યો વાળું પાનું ત્યારે કહી શકાય જ્યારે તે [[MediaWiki:Disambiguationspage]] નામના માળખા સાથે જોડાયેલું હોય.",
 
+'pageswithprop' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
+'pageswithprop-legend' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
+'pageswithprop-prop' => 'ગુણધર્મ નામ:',
+'pageswithprop-submit' => 'જાઓ',
+
 'doubleredirects' => 'બમણું દિશાનિર્દેશન',
 'doubleredirectstext' => 'આ પાનું દિશા નિર્દેશિત પાના પર થયેલા દિશા નિર્દેશિત પાનાની યાદિ બતાવે છે.
 દરેક લિટીમાં પાના પ્રથમ અને દ્વીતીય દિશા નિર્દેશન ક્ડી બતાવે છે, તે સિવાય દ્વીતીય દિશા નિર્દેશનનું લક્ષ્ય પણ બતાવે છે કે મોટે ભાગે મૂળ પાનું હોઇ શકે છેૢ જેના પર પ્રથમ દિશા નિર્દેશન લક્ષિત છે. <del>Crossed out</del> લિટીઓ  નો ઉત્તર મેળવાયો છે.',
@@ -2079,15 +2080,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'listusers-noresult' => 'કોઇ સભ્ય ન મળ્યો',
 'listusers-blocked' => '(પ્રતિબંધિત)',
 
-# Special:ActiveUsers
-'activeusers' => 'સક્રિય સભ્યોની યાદી',
-'activeusers-intro' => 'છેલ્લા  $1 {{PLURAL:$1|દિવસ|દિવસો}}માં જે સભ્યોએ કંઈક યોગદાન કર્યું હોય તેમની યાદી.',
-'activeusers-count' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} છેલ્લા {{PLURAL:$3|દિવસ |$3 દિવસો }}માં',
-'activeusers-from' => 'આનાથી શરૂ થતા સભ્યો દર્શાવો:',
-'activeusers-hidebots' => 'બોટને છુપાવો',
-'activeusers-hidesysops' => 'પ્રબંધકો છુપાવો',
-'activeusers-noresult' => 'કોઇ સક્રીય સભ્ય ન મળ્યો',
-
 # Special:ListGroupRights
 'listgrouprights' => 'સભ્ય જૂથ ના હક્કો',
 'listgrouprights-summary' => 'નીચે આ વિકિ પર વ્યાખ્યાયિત સભ્ય જૂથોની યાદી, તેમની સાથે સંકળાયેલા હક્કો સાથે આપી છે.
@@ -2145,7 +2137,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'usermessage-editor' => 'તંત્ર સંદેશાઓ',
 
 # Watchlist
-'watchlist' => 'મારà«\80 àª§à«\8dયાનસà«\82àª\9aà«\80',
+'watchlist' => 'ધ્યાનસૂચી',
 'mywatchlist' => 'ધ્યાનસૂચિ',
 'watchlistfor2' => 'ધ્યાન સૂચિ $1 $2',
 'nowatchlist' => 'તમારી ધ્યાન સૂચિ ખાલી છે',
@@ -2300,6 +2292,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 'prot_1movedto2' => '[[$1]]નું નામ બદલીને [[$2]] કરવામાં આવ્યું છે.',
 'protect-badnamespace-title' => 'સંરક્ષિત ન કરી શકાતું નામસ્થળ',
 'protect-badnamespace-text' => 'આ નામસ્થળમાં પાના સુરક્ષિત કરી શકાતા નથી.',
+'protect-norestrictiontypes-title' => 'અસુરક્ષિત પાનું',
 'protect-legend' => 'સંરક્ષણ બહાલી આપો',
 'protectcomment' => 'કારણ:',
 'protectexpiry' => 'સમાપ્તિ:',
@@ -2317,9 +2310,9 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 
 તમે આ પાનાઓનું સંરક્ષણ સ્તર બદલી શકો છો, પરંતુ તેની અસર ધોધાકાર સંરક્ષણ પર પડવી જોઇએ નહીં.',
 'protect-default' => 'બધા સભ્યોને પરવાનગી',
-'protect-fallback' => '"$1" પરવાનગી જરૂરી',
-'protect-level-autoconfirmed' => 'નવા àª\85નà«\87 àª¨àª¹à«\80 àª¨à«\8bàª\82ધાયà«\87લા àª¸àª­à«\8dયà«\8b àªªàª° àªªà«\8dરતિબàª\82ધ',
-'protect-level-sysop' => 'માત્ર પ્રબંધકો',
+'protect-fallback' => 'માત્ર "$1" પરવાનગી સાથેના સભ્યોને માન્ય રાખો',
+'protect-level-autoconfirmed' => 'માતà«\8dર àª\86પમà«\87ળà«\87 àª\96ાતરà«\80 àª¥àª¯à«\87લા àª¸àª­à«\8dયà«\8bનà«\87 àª®àª¾àª¨à«\8dય àª°àª¾àª\96à«\8b',
+'protect-level-sysop' => 'માત્ર પ્રબંધકોને માન્ય રાખો',
 'protect-summary-cascade' => 'ધોધાકાર',
 'protect-expiring' => '$1 (UTC) એ સમાપ્ત થાય છે',
 'protect-expiring-local' => '$1ના નિવૃત્ત થશે',
@@ -2930,12 +2923,19 @@ $1',
 'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
 'pageinfo-header-basic' => 'સામાન્ય માહિતી',
 'pageinfo-header-edits' => 'ઇતિહાસ સંપાદન',
+'pageinfo-header-restrictions' => 'પાનાંની સુરક્ષા',
 'pageinfo-header-properties' => 'પાનાંના ગુણધર્મો',
 'pageinfo-display-title' => 'દેખાવ શિર્ષક',
+'pageinfo-default-sort' => 'મૂળભૂત ગોઠવણી કળ',
 'pageinfo-length' => 'પૃષ્ઠની લંબાઇ (બાઇટમાં)',
+'pageinfo-article-id' => 'પાનાં ઓળખ',
+'pageinfo-language' => 'પાનાંની વિગતની ભાષા',
 'pageinfo-robot-policy' => 'શોધ એન્જિન સ્થિતિ',
+'pageinfo-robot-index' => 'અનુક્રમિય',
+'pageinfo-robot-noindex' => 'અનુક્રમિય નહી',
 'pageinfo-views' => 'જોનારાની સંખ્યા',
 'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
+'pageinfo-subpages-name' => 'આ પાનાંનું ઉપપાનું',
 'pageinfo-firstuser' => 'પૃષ્ઠ સર્જક',
 'pageinfo-firsttime' => 'પૃષ્ઠ સર્જનની તારીખ',
 'pageinfo-lastuser' => 'છેલ્લો ફેરફાર કરનાર',
@@ -2947,6 +2947,10 @@ $1',
 'pageinfo-redirectsto-info' => 'માહિતી',
 'pageinfo-contentpage-yes' => 'હા',
 'pageinfo-protect-cascading-yes' => 'હા',
+'pageinfo-category-info' => 'શ્રેણી માહિતી',
+'pageinfo-category-pages' => 'પાનાંઓની સંખ્યા',
+'pageinfo-category-subcats' => 'ઉપશ્રેણીઓની સંખ્યા',
+'pageinfo-category-files' => 'ફાઇલ્સની સંખ્યા',
 
 # Patrolling
 'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
@@ -3666,7 +3670,7 @@ $5
 'specialpages-group-highuse' => 'વધુ વપરાશ ધરાવતા પાના',
 'specialpages-group-pages' => 'પાનાની યાદીઓ',
 'specialpages-group-pagetools' => 'પાના સાધનો',
-'specialpages-group-wiki' => 'વિàª\95િ àª®àª¾àª¹àª¿àª¤à«\80સàª\82àª\9a અને સાધનો',
+'specialpages-group-wiki' => 'માહિતà«\80 અને સાધનો',
 'specialpages-group-redirects' => 'ખાસ પાના પરના સમૂહ દિશાનિર્દેશન',
 'specialpages-group-spam' => 'સ્પેમ સાધનો',
 
@@ -3761,10 +3765,10 @@ $5
 'logentry-move-move_redir-noredirect' => '$1એ દિશાનિર્દેશન કરીને પાના $3ને $4 પર વાળ્યું પણ પાછળ દિશાનિર્દેશન છોડ્યું નહી',
 'logentry-patrol-patrol' => '$1 આવૃત્તિ ચિહ્નિત થયેલ પાનાં $4 $3 ચોકી કરવા ફરવા નીકળવું',
 'logentry-patrol-patrol-auto' => '$1 આપોઆપ ચિહ્નિત ચોકી પહેરો કરવા લાગ્યા આવૃત્તિ પાનું $4 $3',
-'logentry-newusers-newusers' => 'સભ્ય ખાતું $1 બનાવવામાં આવ્યું',
-'logentry-newusers-create' => 'સભ્ય ખાતું $1 બનાવવામાં આવ્યું',
-'logentry-newusers-create2' => 'સભ્ય ખાતું $3 $1 વડે બનાવવામાં આવ્યું',
-'logentry-newusers-autocreate' => 'àª\8fàª\95ાàª\89નà«\8dàª\9f $1 àª¬àª¨àª¾àªµàª¨àª¾àª° àª\86પà«\8bàª\86પ',
+'logentry-newusers-newusers' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}',
+'logentry-newusers-create' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}',
+'logentry-newusers-create2' => 'સભ્ય ખાતું $3 $1 વડે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}',
+'logentry-newusers-autocreate' => 'વપરાશàª\95રà«\8dતા àª\96ાતà«\81àª\82 $1 àª\86પમà«\87ળà«\87 {{GENDER:$2|બનાવવામાàª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82}}',
 'rightsnone' => '(કંઈ નહી)',
 
 # Feedback
index a1e453c..0e113aa 100644 (file)
@@ -381,8 +381,6 @@ $messages = array(
 'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים אחרי הדף',
 'tog-oldsig' => 'החתימה הקיימת:',
 'tog-fancysig' => 'פירוש החתימה כקוד ויקי (ללא קישור אוטומטי)',
-'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-externaldiff' => 'שימוש בתוכנת השוואת הגרסאות החיצונית כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
 'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "קפוץ אל"',
 'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (דרוש JavaScript) (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
@@ -397,6 +395,7 @@ $messages = array(
 'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
 'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
 'tog-norollbackdiff' => 'השמטת ההבדלים בין הגרסאות לאחר ביצוע שחזור',
+'tog-useeditwarning' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
 
 'underline-always' => 'תמיד',
 'underline-never' => 'לעולם לא',
@@ -832,7 +831,7 @@ $2',
 עליכם להיכנס לאתר ולשנות את סיסמתכם בהקדם האפשרי. אם מישהו אחר ביקש סיסמה חדשה זו או אם נזכרתם בסיסמתכם
 ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמתכם הישנה.',
 'noemail' => 'לא רשומה כתובת דואר אלקטרוני עבור המשתמש "$1".',
-'noemailcreate' => 'עליכם לספק כתובת דואר אלקטרוני תקינה',
+'noemailcreate' => 'עליכם לספק כתובת דואר אלקטרוני תקינה.',
 'passwordsent' => 'סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור "$1".
 אנא היכנסו חזרה לאתר אחרי שתקבלו אותה.',
 'blocked-mailpassword' => 'כתובת ה־IP שלכם חסומה מעריכה, ולפיכך אינכם מורשים להשתמש באפשרות שחזור הסיסמה כדי למנוע ניצול לרעה של התכונה.',
@@ -1138,6 +1137,8 @@ $2
 'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
 'invalid-content-data' => 'מידע שגוי על התוכן',
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
+'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
+אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
 
 # Content models
 'content-model-wikitext' => 'טקסט ויקי',
@@ -1421,15 +1422,7 @@ $1",
 'searchdisabled' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.
 בינתיים אפשר לחפש באמצעות גוגל.
 שימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.',
-
-# Quickbar
-'qbsettings' => 'הגדרות סרגל כלים',
-'qbsettings-none' => 'ללא',
-'qbsettings-fixedleft' => 'קבוע משמאל',
-'qbsettings-fixedright' => 'קבוע מימין',
-'qbsettings-floatingleft' => 'צף משמאל',
-'qbsettings-floatingright' => 'צף מימין',
-'qbsettings-directionality' => 'קבוע, תלוי בכיוון הכתב של השפה שלך',
+'search-error' => 'אירעה שגיאה במהלך החיפוש: $1',
 
 # Preferences page
 'preferences' => 'העדפות',
@@ -1991,7 +1984,6 @@ $1',
 'http-read-error' => 'שגיאת קריאה של HTTP.',
 'http-timed-out' => 'עבר זמן ההמתנה של בקשת ה־HTTP.',
 'http-curl-error' => 'שגיאה בקבלת כתובת ה־URL‏: $1',
-'http-host-unreachable' => 'לא ניתן להגיע לכתובת ה־URL.',
 'http-bad-status' => 'הייתה בעיה בשליחת בקשת ה־HTTP‏: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2318,15 +2310,6 @@ $1',
 'listusers-noresult' => 'לא נמצאו משתמשים.',
 'listusers-blocked' => '(חסום)',
 
-# Special:ActiveUsers
-'activeusers' => 'רשימת משתמשים פעילים',
-'activeusers-intro' => 'זוהי רשימת המשתמשים שביצעו פעולה כלשהי {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.',
-'activeusers-count' => '{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}',
-'activeusers-from' => 'הצגת משתמשים החל מ:',
-'activeusers-hidebots' => 'הסתרת בוטים',
-'activeusers-hidesysops' => 'הסתרת מפעילי מערכת',
-'activeusers-noresult' => 'לא נמצאו משתמשים.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'רשימת הרשאות לקבוצה',
 'listgrouprights-summary' => 'זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל אחת.
@@ -2814,6 +2797,7 @@ $1',
 'proxyblocksuccess' => 'בוצע.',
 'sorbsreason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו.',
 'sorbs_create_account_reason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו. אינכם יכולים ליצור חשבון.',
+'xffblockreason' => 'כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1',
 'cant-block-while-blocked' => 'אינכם יכולים לחסום משתמשים אחרים כשאתם חסומים.',
 'cant-see-hidden-user' => 'המשתמש שאתם מנסים לחסום כבר נחסם והוסתר. כיוון שאין לכם את ההרשאה לחסימת משתמש והסתרתו, אינכם רשאים לצפות בחסימת המשתמש או לערוך אותה.',
 'ipbblocked' => 'אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים',
@@ -3128,13 +3112,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */',
-'standard.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Standard בלבד */',
-'nostalgia.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Nostalgia בלבד */',
 'cologneblue.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב CologneBlue בלבד */',
 'monobook.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */',
-'myskin.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MySkin בלבד */',
-'chick.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Chick בלבד */',
-'simple.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Simple בלבד */',
 'modern.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Modern בלבד */',
 'vector.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */',
 'print.css' => '/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */',
@@ -3147,13 +3126,8 @@ $1',
 
 # Scripts
 'common.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */',
-'standard.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Standard */',
-'nostalgia.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Nostalgia */',
 'cologneblue.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב CologneBlue */',
 'monobook.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */',
-'myskin.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב MySkin */',
-'chick.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Chick */',
-'simple.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Simple */',
 'modern.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Modern */',
 'vector.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */',
 'group-autoconfirmed.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור משתמשים ותיקים */',
@@ -3233,13 +3207,8 @@ $1',
 'pageinfo-category-files' => 'מספר הקבצים',
 
 # Skin names
-'skinname-standard' => 'קלאסי',
-'skinname-nostalgia' => 'נוסטלגיה',
 'skinname-cologneblue' => 'מים כחולים',
 'skinname-monobook' => 'מונובוק',
-'skinname-myskin' => 'העיצוב שלי',
-'skinname-chick' => "צ'יק",
-'skinname-simple' => 'פשוט',
 'skinname-modern' => 'מודרני',
 'skinname-vector' => 'וקטור',
 
@@ -4105,6 +4074,8 @@ $5
 'htmlform-submit' => 'שליחה',
 'htmlform-reset' => 'ביטול השינויים',
 'htmlform-selectorother-other' => 'אחר',
+'htmlform-no' => 'לא',
+'htmlform-yes' => 'כן',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 עם תמיכה בחיפוש בטקסט מלא',
index fe473fb..b1bc115 100644 (file)
@@ -468,7 +468,7 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
 'gotaccountlink' => 'Log in',
 'userlogin-resetlink' => 'Ka aap aapan login kare waala jaankari ke bhulae gaya hae?',
-'createaccountmail' => 'e-mail se',
+'createaccountmail' => 'Ek temporary password ke kaam me laao aur iske niche dekhawa gais Email pe bhej do',
 'createaccountreason' => 'Kaaran:',
 'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
 'userexists' => 'Ii sadasya ke naam aur koi ke hae.
@@ -513,8 +513,8 @@ Agar jo aur koi ii request karis hai, nai to aap aapan password yaad kar liya ha
 'passwordsent' => 'Ek nawaa password ke "$1" ke registered e-mail pe bheja gais hai. Meharbaani kar ke aap password mile ke baad login karna.',
 'blocked-mailpassword' => 'Aap ke IP address ke block kar dewa gais hai, aur iske kaaran aap ke password recovery function kaam me lae ke ijajat nai hai,',
 'eauthentsent' => 'Ek confirmation e-mail aap ke dewa gae e-mail address be bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.',
-'throttled-mailpassword' => 'Ek password reminder ke pichhle {{PLURAL:$1|hour|$1 hours}} me bhej dewa gais hai.
-Abuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|hour|$1 hours}} me bheja jaai.',
+'throttled-mailpassword' => 'Ek password reset Email ke pahile bheja gais hae, pichhle  {{PLURAL:$1|ghanta|$1 ghanta}} me bhej me.
+Abuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|ghanta|$1 ghanta}} me bheja jaai.',
 'mailerror' => 'Mail bheje me galti hoe gais hai: $1',
 'acct_creation_throttle_hit' => 'Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle kuch din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.
 Ii kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.',
@@ -543,6 +543,7 @@ Thora deri baad fir se kosis karna.',
 # Email sending
 'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
 'user-mail-no-addy' => 'Bina e-mail address rahe pe bhi e-mail bheje ke kosis karaa gais hae.',
+'user-mail-no-body' => 'Ek khaali, nai to kaafi chhota email bheje ke kosis kara rahaa.',
 
 # Change password dialog
 'resetpass' => 'Password ke badlo',
@@ -565,7 +566,7 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
 
 # Special:PasswordReset
 'passwordreset' => 'Password ke badlo',
-'passwordreset-text' => 'Aapan account ke baare me jaankari ke receive kare ke khatir ii fom ke bharo.',
+'passwordreset-text' => 'Password ke reset kare ke khatir ii form ke bharo.',
 'passwordreset-legend' => 'Password ke badlo',
 'passwordreset-disabled' => 'II wiki me password ke badle ke ijaajat nai hae.',
 'passwordreset-pretext' => '{{PLURAL:$1||Niche ke ek data ke likho}}',
@@ -1101,15 +1102,6 @@ Aapan query ke ''all:'' se suruu kar ke visay suchi me khojo (including talk pag
 Aap tab tak Google se khoje sakta hai.
 Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Koi nai',
-'qbsettings-fixedleft' => 'Left me fixed hai',
-'qbsettings-fixedright' => 'Right me fixed hai',
-'qbsettings-floatingleft' => 'Baaen or baho',
-'qbsettings-floatingright' => 'Daaen or baho',
-'qbsettings-directionality' => 'Banae dewa gais hae, lekin ii aap ke bhasa ke script directionality ke uppar nibhar hae',
-
 # Preferences page
 'preferences' => 'Pasand',
 'mypreferences' => 'Pasand',
@@ -1654,7 +1646,6 @@ Puura surakchha ke khatir, img_auth.php ke band kar dewa gais hae.',
 'http-read-error' => 'HTTP ke parrhe me galti hae',
 'http-timed-out' => 'HTTP ke khatir time nai hae.',
 'http-curl-error' => 'URL ke laawe me galti hoe gais hae: $1',
-'http-host-unreachable' => 'URL pahunche nai sakaa hae',
 'http-bad-status' => 'HTTP ke maange ke time kuch garrbarr hoe gais hae: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1977,15 +1968,6 @@ Support karaa gais protocol: <code>$1</code> (defaults to http:// if no protocol
 'listusers-noresult' => 'Koi sadasya ke nai pawa gais hai.',
 'listusers-blocked' => '(rok dewa gais hai)',
 
-# Special:ActiveUsers
-'activeusers' => 'Active sadasya ke list',
-'activeusers-intro' => 'Ii suchi uu sadasya ke hae jon ki pahile {{PLURAL:$1|din|din}} me kuchh karin hae.',
-'activeusers-count' => '$1 haali ke {{PLURAL:$1|badlao|badlao}} pichhle {{PLURAL:$3|din|$3 din}} me',
-'activeusers-from' => 'Sadasya jon ki hian se suruu hoe hai ke dekhao:',
-'activeusers-hidebots' => 'Bots ke lukao',
-'activeusers-hidesysops' => 'Administrator log ke lukao',
-'activeusers-noresult' => 'koi sadasya ke pawa nai gais hai.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Sadasya  ke group adhikar',
 'listgrouprights-summary' => 'Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan  associated access rights ke saathe
@@ -2850,6 +2832,7 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
 'pageinfo-robot-noindex' => 'Indexable nai hae',
 'pageinfo-views' => 'Ketna dafe dekha gais hae',
 'pageinfo-watchers' => 'Ketnaa jane panna ke dekhe hae',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae',
 'pageinfo-redirects-name' => 'Ii panna pe redirect karo',
 'pageinfo-subpages-name' => 'Ii panna ke subpage',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
index 765c9ae..f1bc100 100644 (file)
@@ -2213,15 +2213,6 @@ Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http://
 'listusers-noresult' => 'Nema takvih suradnika.',
 'listusers-blocked' => '(blokiran)',
 
-# Special:ActiveUsers
-'activeusers' => 'Popis aktivnih suradnika',
-'activeusers-intro' => 'Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
-'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
-'activeusers-from' => 'Prikaži suradnike počevši od:',
-'activeusers-hidebots' => 'Sakrij botove',
-'activeusers-hidesysops' => 'Sakrij administratore',
-'activeusers-noresult' => 'Niti jedan suradnik nije nađen.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Prava suradničkih skupina',
 'listgrouprights-summary' => 'Ovo je popis suradničkih skupina određenih na ovoj wiki, s njihovim pripadajućim pravima.
index f8ea051..6e5cb8c 100644 (file)
@@ -1183,15 +1183,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.',
 
-# Quickbar
-'qbsettings' => 'Pobóčna lajsta',
-'qbsettings-none' => 'Žane',
-'qbsettings-fixedleft' => 'Leži nalěwo',
-'qbsettings-fixedright' => 'Leži naprawo',
-'qbsettings-floatingleft' => 'Wisa nalěwo',
-'qbsettings-floatingright' => 'Wisa naprawo',
-'qbsettings-directionality' => 'Kruty, wotwisny wot pisanskeho směra twojeje rěče',
-
 # Preferences page
 'preferences' => 'Nastajenja',
 'mypreferences' => 'Nastajenja',
@@ -1744,7 +1735,6 @@ Za optimalnu wěstotu je img_auth.php znjemóžnjeny.',
 'http-read-error' => 'Čitanski zmylk HTTP.',
 'http-timed-out' => 'Naprašowanje HTTP je čas překročiło.',
 'http-curl-error' => 'Zmylk při wołanju URL: $1',
-'http-host-unreachable' => 'URL njeda so docpěć.',
 'http-bad-status' => 'Problem je za HTTP-naprašowanje wustupił: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2060,15 +2050,6 @@ Znajmjeńša hłowna domena je trěbna, na přikład "*.org".<br />
 'listusers-noresult' => 'Njemóžno wužiwarjow namakać. Prošu wobkedźbuj, zo so mało- abo wulkopisanje na wotprašowanje wuskutkuje.',
 'listusers-blocked' => '(blokowany)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lisćina aktiwnych wužiwarjow',
-'activeusers-intro' => 'To je lisćina wužiwarjow, kotřiž běchu aktiwni za {{PLURAL:$1|posledni dźeń|poslednjej $1 dnjej|poslednje $1 dny|poslednich $1 dnjow}}:',
-'activeusers-count' => '$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|zańdźenej dnju|zańdźenymaj $3 dnjomaj|zańdźenych $3 dnjach}}',
-'activeusers-from' => 'Wužiwarjow zwobraznić, započinajo z:',
-'activeusers-hidebots' => 'Boćiki schować',
-'activeusers-hidesysops' => 'Administratorow schować',
-'activeusers-noresult' => 'Žani wužiwarjo namakani.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Prawa wužiwarskeje skupiny',
 'listgrouprights-summary' => 'Slěduje lisćina wužiwarskich skupinow na tutej wikiju z jich wotpowědnymi přistupnymi prawami. Tu móžeš [[{{MediaWiki:Listgrouprights-helppage}}|dalše informacije]] wo jednotliwych prawach namakać.',
@@ -2544,6 +2525,7 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
 '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ć.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twoja pak ta proksy-serwera, kotryž wužiwaš, je so zablokowała. Prěnjotna přičina za blokowanje bě: $1',
 'cant-block-while-blocked' => 'Njemóžeš druhich wužiwarjow blokować, mjeztym zo ty sy zablokowany.',
 'cant-see-hidden-user' => 'Wužiwar, kotrehož pospytuješ blokować, bu hižo zablokowany a schowany. Dokelž nimaš prawo wužiwarja schować, njemóžeš blokowanje wužiwarja widźeć abo wobdźěłać.',
 'ipbblocked' => 'Njemóžeš druhich wužiwarjow blokować abo wotblokować, dokelž ty sam sy zablokowany',
@@ -2917,13 +2899,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-category-files' => 'Ličba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kölnjanska módrina',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Ćipka',
-'skinname-simple' => 'Jednory',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
index 0214e82..2bc316d 100644 (file)
@@ -630,8 +630,8 @@ Per favor aperi session de novo post reciper lo.',
 'blocked-mailpassword' => 'Tu adresse IP es blocate de facer modificationes, e pro impedir le abuso, le uso del function pro recuperar contrasignos es equalmente blocate.',
 'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail specificate.
 Pro poter reciper altere e-mail a iste conto, tu debe sequer le instructiones in iste e-mail pro confirmar que le conto es realmente tue.',
-'throttled-mailpassword' => 'Un rememoration del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
-Pro prevenir le abuso, solmente un rememoration de contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Un message pro le reinitialisation del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
+Pro prevenir le abuso, solmente un message pro le reinitialisation del contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Error de inviar e-mail: $1',
 'acct_creation_throttle_hit' => 'Le visitatores de iste wiki usante tu adresse IP ha create {{PLURAL:$1|1 conto|$1 contos}} durante le ultime die, e isto es le maximo permittite in iste periodo de tempore.
 A causa de isto, le visitatores usante iste adresse IP non pote crear nove contos al momento.',
@@ -684,7 +684,7 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
 
 # Special:PasswordReset
 'passwordreset' => 'Reinitialisar contrasigno',
-'passwordreset-text' => 'Complete iste formulario pro reciper un rememoration in e-mail del datos de tu conto.',
+'passwordreset-text' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
 'passwordreset-legend' => 'Reinitialisar contrasigno',
 'passwordreset-disabled' => 'Le reinitialisation de contrasignos ha essite disactivate in iste wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Entra un del elementos de datos hic infra}}',
@@ -694,8 +694,8 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
 'passwordreset-capture-help' => 'Si tu marca iste quadrato, le e-mail (con le contrasigno temporari) non solmente essera inviate al usator, ma anque monstrate a te.',
 'passwordreset-email' => 'Adresse de e-mail:',
 'passwordreset-emailtitle' => 'Detalios del conto in {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava un rememoration del
-detalios de tu conto in {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es
+'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu
+contrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es
 associate con iste adresse de e-mail:
 
 $2
@@ -2136,15 +2136,6 @@ Isto necessita specificar al minus le dominio de nivello superior, per exemplo "
 'listusers-noresult' => 'Nulle usator trovate.',
 'listusers-blocked' => '(blocate)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista de usatores active',
-'activeusers-intro' => 'Isto es un lista de usatores que habeva alcun typo de activitate intra le ultime $1 {{PLURAL:$1|die|dies}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|action|actiones}} in le ultime {{PLURAL:$3|die|$3 dies}}',
-'activeusers-from' => 'Presentar usatores a partir de:',
-'activeusers-hidebots' => 'Celar bots',
-'activeusers-hidesysops' => 'Celar administratores',
-'activeusers-noresult' => 'Nulle usator trovate.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Derectos del gruppos de usatores',
 'listgrouprights-summary' => 'Lo sequente es un lista de gruppos de usatores definite in iste wiki, con lor derectos de accesso associate.
index b8f27d7..2dacc45 100644 (file)
@@ -12,6 +12,7 @@
  * @author Aldnonymous
  * @author Anakmalaysia
  * @author ArdWar
+ * @author Bawoor
  * @author Bennylin
  * @author Borgx
  * @author Dosmiin Barsbold
@@ -364,10 +365,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan jumlah pemantau',
 'tog-oldsig' => 'Tanda tangan sekarang:',
 'tog-fancysig' => 'Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)',
-'tog-externaleditor' => 'Gunakan editor eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-externaldiff' => 'Gunakan diff eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
 'tog-showjumplinks' => 'Aktifkan pranala pembantu "langsung ke"',
 'tog-uselivepreview' => 'Gunakan pratayang langsung (JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
@@ -382,6 +379,7 @@ $messages = array(
 'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
 'tog-noconvertlink' => 'Matikan konversi judul pranala',
 'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
+'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
 
 'underline-always' => 'Selalu',
 'underline-never' => 'Tidak pernah',
@@ -447,19 +445,19 @@ $messages = array(
 'dec' => 'Des',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
+'pagecategories' => '{{PLURAL:$1|Kategori}}',
 'category_header' => 'Halaman dalam kategori "$1"',
 'subcategories' => 'Subkategori',
 'category-media-header' => 'Media dalam kategori "$1"',
 'category-empty' => "''Saat ini, tidak terdapat halaman ataupun media dalam kategori ini.''",
-'hidden-categories' => '{{PLURAL:$1|Kategori tersembunyi|Kategori tersembunyi}}',
+'hidden-categories' => '{{PLURAL:$1|Kategori tersembunyi}}',
 'hidden-category-category' => 'Kategori tersembunyi',
-'category-subcat-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu subkategori berikut.|Kategori ini memiliki {{PLURAL:$1|subkategori|$1 subkategori}} berikut, dari total $2.}}',
-'category-subcat-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|subkategori|$1 subkategori}} berikut.',
-'category-article-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu halaman berikut.|Kategori ini memiliki {{PLURAL:$1|halaman|$1 halaman}}, dari total $2.}}',
-'category-article-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|satu halaman|$1 halaman}} berikut.',
-'category-file-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu berkas berikut.|Kategori ini memiliki {{PLURAL:$1|berkas|$1 berkas}} berikut, dari total $2.}}',
-'category-file-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|berkas|$1 berkas}} berikut.',
+'category-subcat-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 subkategori}} berikut, dari total $2.}}',
+'category-subcat-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 subkategori}} berikut.',
+'category-article-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 halaman}}, dari total $2.}}',
+'category-article-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 halaman}} berikut.',
+'category-file-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut, dari total $2.}}',
+'category-file-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Halaman yang diindeks',
 'noindex-category' => 'Halaman yang tidak diindeks',
@@ -516,7 +514,7 @@ $messages = array(
 'searchbutton' => 'Cari',
 'go' => 'Tuju ke',
 'searcharticle' => 'Tuju ke',
-'history' => 'Halaman riwayat',
+'history' => 'Riwayat halaman',
 'history_short' => 'Versi terdahulu',
 'updatedmarker' => 'diubah sejak kunjungan terakhir saya',
 'printableversion' => 'Versi cetak',
@@ -529,8 +527,8 @@ $messages = array(
 'create-this-page' => 'Buat halaman ini',
 'delete' => 'Hapus',
 'deletethispage' => 'Hapus halaman ini',
-'undelete_short' => 'Batal hapus $1 {{PLURAL:$1|suntingan|suntingan}}',
-'viewdeleted_short' => 'Lihat {{PLURAL:$1|satu suntingan|$1 suntingan}} yang dihapus',
+'undelete_short' => 'Batal hapus {{PLURAL:$1|$1 suntingan}}',
+'viewdeleted_short' => 'Lihat {{PLURAL:$1|$1 suntingan}} yang dihapus',
 'protect' => 'Lindungi',
 'protect_change' => 'ubah',
 'protectthispage' => 'Lindungi halaman ini',
@@ -558,7 +556,7 @@ $messages = array(
 'redirectedfrom' => '(Dialihkan dari $1)',
 'redirectpagesub' => 'Halaman pengalihan',
 'lastmodifiedat' => 'Halaman ini terakhir diubah pada $2, $1.',
-'viewcount' => 'Halaman ini telah diakses sebanyak {{PLURAL:$1|satu kali|$1 kali}}.<br />',
+'viewcount' => 'Halaman ini telah diakses sebanyak {{PLURAL:$1|$1 kali}}.<br />',
 'protectedpage' => 'Halaman yang dilindungi',
 'jumpto' => 'Langsung ke:',
 'jumptonavigation' => 'navigasi',
@@ -594,7 +592,7 @@ $1',
 
 'badaccess' => 'Kesalahan hak akses',
 'badaccess-group0' => 'Anda tidak diizinkan untuk melakukan tindakan yang Anda minta.',
-'badaccess-groups' => 'Tindakan yang Anda minta dibatasi untuk pengguna dalam {{PLURAL:$2|kelompok|salah satu dari kelompok}}: $1.',
+'badaccess-groups' => 'Tindakan yang Anda minta dibatasi untuk pengguna dalam {{PLURAL:$2|kelompok}}: $1.',
 
 'versionrequired' => 'Dibutuhkan MediaWiki versi $1',
 'versionrequiredtext' => 'MediaWiki versi $1 dibutuhkan untuk menggunakan halaman ini. Lihat [[Special:Version|halaman versi]]',
@@ -607,11 +605,11 @@ $1',
 'youhavenewmessages' => 'Anda mempunyai $1 ($2).',
 'newmessageslink' => 'pesan baru',
 'newmessagesdifflink' => 'perubahan terakhir',
-'youhavenewmessagesfromusers' => 'Anda memiliki $1 dari {{PLURAL:$3||}}pengguna lain ($2).',
+'youhavenewmessagesfromusers' => 'Anda memiliki $1 dari {{PLURAL:$3|$3 pengguna lain}} ($2).',
 'youhavenewmessagesmanyusers' => 'Anda memiliki $1 dari pengguna lain ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1||}}pesan baru',
-'newmessagesdifflinkplural' => '{{PLURAL:$1||}}perubahan terakhir',
-'youhavenewmessagesmulti' => 'Anda mendapat beberapa pesan baru pada $1',
+'newmessageslinkplural' => '{{PLURAL:$1|pesan baru}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan}} terakhir',
+'youhavenewmessagesmulti' => 'Anda mendapat pesan baru pada $1',
 'editsection' => 'sunting',
 'editsection-brackets' => '[$1]',
 'editold' => 'sunting',
@@ -626,7 +624,7 @@ $1',
 'collapsible-expand' => 'Kembangkan',
 'thisisdeleted' => 'Lihat atau kembalikan $1?',
 'viewdeleted' => 'Lihat $1?',
-'restorelink' => '$1 {{PLURAL:$1|suntingan|suntingan}} yang telah dihapus',
+'restorelink' => '{{PLURAL:$1|$1 suntingan}} yang telah dihapus',
 'feedlinks' => 'Umpan:',
 'feed-invalid' => 'Tipe permintaan umpan tidak tepat.',
 'feed-unavailable' => 'Umpan sindikasi tidak tersedia',
@@ -654,7 +652,7 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'Tidak ada tindakan tersebut',
-'nosuchactiontext' => 'Tindakan yang diminta oleh URL tersebut tidak valid. Anda mungkin salah mengetikkan URL, atau mengikuti suatu pranala yang tak betul. Hal ini juga mungkin mengindikasikan suatu bug pada perangkat lunak yang digunakan oleh {{SITENAME}}.',
+'nosuchactiontext' => 'Tindakan yang diminta oleh URL tersebut tidak valid. Anda mungkin salah mengetikkan URL, atau mengikuti suatu pranala yang tak benar. Hal ini juga mungkin mengindikasikan suatu bug pada perangkat lunak yang digunakan oleh {{SITENAME}}.',
 'nosuchspecialpage' => 'Tidak ada halaman istimewa tersebut',
 'nospecialpagetext' => '<strong>Anda meminta halaman istimewa yang tidak sah.</strong>
 
@@ -811,8 +809,8 @@ Silakan masuk log kembali setelah menerima surel tersebut.',
 'blocked-mailpassword' => 'Alamat IP Anda diblokir dari penyuntingan dan karenanya tidak diizinkan menggunakan fungsi pengingat kata sandi untuk mencegah penyalahgunaan.',
 'eauthentsent' => 'Sebuah surel untuk konfirmasi telah dikirim ke alamat surel.
 Anda harus mengikuti instruksi di dalam surel tersebut untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda. {{SITENAME}} tidak akan mengaktifkan fitur surel jika langkah ini belum dilakukan.',
-'throttled-mailpassword' => 'Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|jam|$1 jam}} terakhir.
-Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.
+Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.',
 'mailerror' => 'Kesalahan dalam mengirimkan surel: $1',
 'acct_creation_throttle_hit' => 'Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diijinkan.
 Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.',
@@ -862,7 +860,7 @@ Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sa
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Lengkapi formulir ini untuk menerima surel pengingat detail akun Anda.',
+'passwordreset-text' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
 'passwordreset-legend' => 'Setel ulang sandi',
 'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
@@ -878,7 +876,7 @@ terkait dengan alamat surel ini:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
+{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.
 Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
 permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
 ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
@@ -887,15 +885,15 @@ ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
+{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.
 Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
 permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
 ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
 'passwordreset-emailelement' => 'Nama pengguna: $1
 Sandi sementara: $2',
-'passwordreset-emailsent' => 'Surel pengingat telah dikirimkan.',
-'passwordreset-emailsent-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dikirim.',
-'passwordreset-emailerror-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dihasilkan, tetapi gagal mengirimkannya ke pengguna: $1',
+'passwordreset-emailsent' => 'Surel setel ulang kata sandi telah dikirimkan.',
+'passwordreset-emailsent-capture' => 'Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.',
+'passwordreset-emailerror-capture' => 'Surel setel ulang kata sandi telah dihasilkan, yang ditampilkan di bawah, tetapi gagal mengirimkannya ke pengguna: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ubah alamat surel',
@@ -1110,6 +1108,8 @@ karena telah ada.',
 'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
 'invalid-content-data' => 'Data konten tidak sah',
 'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
+Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat "{{int:prefs-editing}}" pada halaman preferensi Anda.',
 
 # Content models
 'content-model-wikitext' => 'teks wiki',
@@ -1391,15 +1391,7 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'searchdisabled' => 'Pencarian {{SITENAME}} sementara dimatikan.
 Anda dapat mencari melalui Google untuk sementara waktu.
 Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.',
-
-# Quickbar
-'qbsettings' => 'Pengaturan bar pintas',
-'qbsettings-none' => 'Tidak ada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Mengambang sebelah kiri',
-'qbsettings-floatingright' => 'Mengambang sebelah kanan',
-'qbsettings-directionality' => 'Tetap, tergantung pada bentuk skrip dari bahasa Anda',
+'search-error' => 'Kesalahan terjadi saat mencari: $1',
 
 # Preferences page
 'preferences' => 'Preferensi',
@@ -1825,7 +1817,7 @@ Jika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain
 'uploadjava' => 'Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.
 Penggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.',
 'upload-source' => 'Berkas sumber',
-'sourcefilename' => 'Nama berkas sumber:',
+'sourcefilename' => 'Jeneng berkas sumber:',
 'sourceurl' => 'URL sumber:',
 'destfilename' => 'Nama berkas tujuan:',
 'upload-maxfilesize' => 'Ukuran berkas maksimum: $1',
@@ -1956,7 +1948,6 @@ Untuk pilihan keamanan, img_auth.php dinonaktifkan.',
 'http-read-error' => 'Kesalahan pembacaan HTTP',
 'http-timed-out' => 'Permintaan HTTP lewat tenggat.',
 'http-curl-error' => 'Kesalahan saat mengambil URL: $1',
-'http-host-unreachable' => 'Tidak dapat mencapai URL.',
 'http-bad-status' => 'Ada masalah saat permintaan halaman HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2282,15 +2273,6 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listusers-noresult' => 'Pengguna tidak ditemukan.',
 'listusers-blocked' => '(diblokir)',
 
-# Special:ActiveUsers
-'activeusers' => 'Daftar pengguna aktif',
-'activeusers-intro' => 'Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.',
-'activeusers-count' => '$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir',
-'activeusers-from' => 'Tampilkan pengguna mulai dari:',
-'activeusers-hidebots' => 'Sembunyikan bot',
-'activeusers-hidesysops' => 'Sembunyikan pengurus',
-'activeusers-noresult' => 'Pengguna tidak ditemukan.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Daftar kelompok pengguna',
 'listgrouprights-summary' => 'Berikut adalah daftar kelompok pengguna yang terdapat di wiki ini, dengan daftar hak akses mereka masing-masing. Informasi lebih lanjut mengenai hak masing-masing dapat ditemukan di [[{{MediaWiki:Listgrouprights-helppage}}|halaman bantuan hak pengguna]].',
@@ -2746,9 +2728,9 @@ Alasan yang diberikan untuk pemblokiran $1 adalah: "$2"',
 'blocklog-showsuppresslog' => 'Pengguna ini telah diblokir dan disembunyikan sebelumnya. Log supresi disediakan di bawah untuk referensi:',
 'blocklogentry' => 'memblokir [[$1]] dengan waktu kedaluwarsa $2 $3',
 'reblock-logentry' => 'mengubah pemblokiran [[$1]] dengan waktu kedaluwarsa $2 $3',
-'blocklogtext' => 'Di bawah ko adolah log panyakek jo pambukaan sakek pado pangguno.
-Alamaik IP nan kanai sakek sacaro otomatis indak nampak dalam dafta ko.
-Lihek [[Special:BlockList|dafta panyakek]] untuak kasado pangguno nan koni kanai sakek.',
+'blocklogtext' => 'Di bawah ini adalah log pemblokiran dan pembukaan blokir terhadap pengguna.
+Alamat IP yang diblokir secara otomatis tidak terdapat di dalam daftar ini.
+Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat ini diblokir.',
 'unblocklogentry' => 'menghilangkan blokir "$1"',
 'block-log-flags-anononly' => 'hanya pengguna anonim',
 'block-log-flags-nocreate' => 'pembuatan akun dimatikan',
@@ -2777,6 +2759,7 @@ Lihek [[Special:BlockList|dafta panyakek]] untuak kasado pangguno nan koni kanai
 '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.',
+'xffblockreason' => 'Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1',
 'cant-block-while-blocked' => 'Anda tidak dapat memblokir pengguna lain ketika Anda sendiri sedang diblokir.',
 'cant-see-hidden-user' => 'Pengguna yang anda coba blokir telah di blokir dan di sembunyikan. Selama anda tidak memiliki hak sembunyikan pengguna, anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.',
 'ipbblocked' => 'Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena anda sendiri diblokir',
@@ -3085,13 +3068,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang ada di sini akan diterapkan pada semua kulit. */',
-'standard.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Standar. */',
-'nostalgia.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Nostalgia. */',
 'cologneblue.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Cologne Blue. */',
 'monobook.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */',
-'myskin.css' => '/* CSS yang ada di sini akan diterapkan pada kulit MySkin. */',
-'chick.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Chick. */',
-'simple.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Sederhana. */',
 'modern.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Modern. */',
 'vector.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Vektor. */',
 'print.css' => '/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */',
@@ -3104,13 +3082,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Scripts
 'common.js' => '/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */',
-'standard.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Standard */',
-'nostalgia.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Nostalgia */',
 'cologneblue.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Cologne Blue */',
 'monobook.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */',
-'myskin.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MySkin */',
-'chick.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Chick */',
-'simple.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Simple */',
 'modern.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Modern */',
 'vector.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */',
 'group-autoconfirmed.js' => '/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */',
@@ -3191,13 +3164,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'pageinfo-category-files' => 'Jumlah berkas',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Biru Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sederhana',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -4137,17 +4105,17 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'sqlite-no-fts' => '$1 tanpa dukungan pencarian teks lengkap',
 
 # New logging system
-'logentry-delete-delete' => '$1 menghapus halaman $3',
-'logentry-delete-restore' => '$1 mengembalikan halaman $3',
-'logentry-delete-event' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
-'logentry-delete-revision' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  revisi di halaman $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah ketertampilan log peristiwa pada $3',
-'logentry-delete-revision-legacy' => '$1 mengubah ketertampilan revisi pada halaman $3',
-'logentry-suppress-delete' => '$1 mensupresi halaman $3',
-'logentry-suppress-event' => '$1 secara diam-diam mengubah ketertampilan  {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
-'logentry-suppress-revision' => '$1 diam-diam mengubah ketertampilan {{PLURAL:$5||}} $5 revisi di halaman $3: $4',
-'logentry-suppress-event-legacy' => '$1 diam-diam mengubah ketertampilan log peristiwa pada $3',
-'logentry-suppress-revision-legacy' => '$1 diam-diam mengubah ketertampilan revisi pada halaman $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|menghapus}} halaman $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mengembalikan}} halaman $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5  revisi}} di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|menimpa}} halaman $3',
+'logentry-suppress-event' => '$1 secara diam-diam {{GENDER:$2|mengubah}} tampilan  {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-suppress-revision' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 revisi}} di halaman $3: $4',
+'logentry-suppress-event-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-suppress-revision-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
 'revdelete-content-hid' => 'konten disembunyikan',
 'revdelete-summary-hid' => 'ringkasan suntingan disembunyikan',
 'revdelete-uname-hid' => 'nama pengguna disembunyikan',
@@ -4156,20 +4124,20 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'revdelete-uname-unhid' => 'nama pengguna tidak disembunyikan',
 'revdelete-restricted' => 'akses telah dibatasi untuk opsis',
 'revdelete-unrestricted' => 'pembatasan akses opsis dihapuskan',
-'logentry-move-move' => '$1 memindahkan halaman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 memindahkan halaman $3 ke $4 tanpa membuat pengalihan',
-'logentry-move-move_redir' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama',
-'logentry-move-move_redir-noredirect' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
-'logentry-patrol-patrol' => '$1 menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-patrol-patrol-auto' => '$1 secara otomatis menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-newusers-newusers' => 'Akun pengguna $1 telah dibuat',
-'logentry-newusers-create' => '$1 membuat akun pengguna',
-'logentry-newusers-create2' => '$1 membuat akun pengguna $3',
-'logentry-newusers-byemail' => 'Akun pengguna  $3  diciptakan oleh  $1  dan password dikirim melalui surel',
-'logentry-newusers-autocreate' => 'Akun $1 dibuat secara otomatis',
-'logentry-rights-rights' => '$1 mengubah keanggotaan grup $3 dari $4 menjadi $5',
-'logentry-rights-rights-legacy' => '$1 mengubah keanggotaan grup $3',
-'logentry-rights-autopromote' => '$1 secara otomatis dipromosikan dari $4 menjadi $5',
+'logentry-move-move' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa membuat pengalihan',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-patrol-patrol-auto' => '$1 otomatis {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-newusers-newusers' => 'Akun pengguna $1 telah {{GENDER:$2|dibuat}}',
+'logentry-newusers-create' => '$1 {{GENDER:$2|membuat}} akun pengguna',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|membuat}} akun pengguna $3',
+'logentry-newusers-byemail' => 'Akun pengguna  $3  {{GENDER:$2|dibuat}} oleh  $1  dan password dikirim melalui surel',
+'logentry-newusers-autocreate' => 'Akun $1 {{GENDER:$2|dibuat}} secara otomatis',
+'logentry-rights-rights' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3 dari $4 menjadi $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3',
+'logentry-rights-autopromote' => '$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5',
 'rightsnone' => '(tidak ada)',
 
 # Feedback
index 9a96023..bc66a9e 100644 (file)
@@ -538,11 +538,11 @@ Awan ti esurat a naipatulod para kadagiti sumaganad a langa.',
 'invalidemailaddress' => 'Ti esurat a pagtaengam ket saan a maawat ngamin ket kasla adda ti saan a napudno a nakabuklan.
 Pangngaasi nga ikkam ti nasayaat a nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
 'cannotchangeemail' => 'Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
-'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
+'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatulod kadagiti esurat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
 'accountcreatedtext' => 'Ti pakabilangan ti agar-aramat para iti  $1 ket naaramiden.',
 'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
-'createaccount-text' => 'Adda nagaramid ti pakabilangan para iti e-surat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti "$2", iti kontrasenias a "$3".
+'createaccount-text' => 'Adda nagaramid ti pakabilangan para iti esurat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti "$2", iti kontrasenias a "$3".
 Nasken a sumrekka ken sukatam ti kontraseniasmo tattan.
 
 Mabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
@@ -587,7 +587,7 @@ Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a t
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
 'passwordreset-capture' => 'Kitaem ti nagbanagan ti esurat?',
-'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
+'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
 'passwordreset-email' => 'Esurat a pagtaengan:',
 'passwordreset-emailtitle' => 'Salaysay ti pakabilangan iti {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangidisso manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket
@@ -596,9 +596,9 @@ nakairaman iti daytoy nga esurat a pagtaengan:
 $2
 
 {{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
-Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
-panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
-agtuloy ka nga agusar ti daan a kontrasenias.',
+Sumrekka kuman ta agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a 
+panagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken 
+agtuloyka nga agusar ti daan a kontrasenias.',
 'passwordreset-emailtext-user' => 'Daytoy nga  agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangidisso manen ti bukodmo a kontrasenias para iti {{SITENAME}}
 ($4) .  {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilanagn ti agar-aramat ket
 nakairaman iti daytoy nga esurat a pagtaengan:
@@ -677,7 +677,7 @@ Ti rason ket ''$2''.
 
 Mabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panag-serra.
 Dimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a naipan iti [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.
-Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasim nga iramanmo nga ited ti ania man wenno agpada kadagitoy iti ania man a panagsaludsodmo.",
+Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasim nga iramanmo nga ited ti aniaman wenno agpada kadagitoy iti aniaman a panagsaludsodmo.",
 'autoblockedtext' => 'Ti IP a pagtaengam ket na-automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.
 Ti rason nga inted ket:
 
@@ -702,7 +702,7 @@ Pangngaasim nga ikabil ken ipapudnom ti esuratmo idiay [[Special:Preferences|kay
 Mabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.',
 'loginreqtitle' => 'Masapul ti sumrek',
 'loginreqlink' => 'sumrek',
-'loginreqpagetext' => 'Nasken a $1 ka tapno makakitaka kadagiti sabsabali a pampanid.',
+'loginreqpagetext' => 'Naskenka a $1 tapno makakitaka kadagiti sabsabali a pampanid.',
 'accmailtitle' => 'Naipatuloden ti kontrasenias.',
 'accmailtext' => "Ti kontrasenias para ken ni [[User talk:$1|$1]] ket naipatuloden ken ni $2.
 
@@ -722,9 +722,9 @@ Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]
 wenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid].',
 'noarticletext-nopermission' => 'Awan ti agdama  a linaon daytoy a panid.
 Mabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti dadduma a panid, wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat ti daytoy a panid.',
-'missing-revision' => 'Ti panagbalbaliw ti #$1 tipanid a nanaganan ti "{{PAGENAME}}" ket awan.
+'missing-revision' => 'Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti "{{PAGENAME}}" ket awan.
 
-Daytoy ket kadawyan a gapuanan babaen ti samaganad a panilpo ti baak a pakasaritaan iti maysa a panid a naikkaten.
+Daytoy ket kadawyan a gapuanan babaen ti sumaganad a panilpo ti baak a pakasaritaan iti maysa a naikkaten a panid.
 Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].',
 'userpage-userdoesnotexist' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro. 
 Pangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.',
@@ -854,8 +854,8 @@ Adda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}
 'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti nairaman a kadakkel ti plantilia.
 Adda dagiti plantilia a saanto a mairaman.",
 'post-expand-template-inclusion-category' => 'Pampanid nga ayan ti plantilia a  nagsobra ti kadakkel ti rukod a nairaman',
-'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
-Dagitoy a panagpalawag  ket naikkaten.",
+'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.
+Dagitoy a panangipalawag ket naikkaten.",
 'post-expand-template-argument-category' => 'Dagiti panid a naglaon ti naikkat a plantilia kadagiti kasinnungat',
 'parser-template-loop-warning' => 'Adda nasarakan a silo ti plantilia: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ti kinauneg ti panagdullit ti plantilia ket nagpatingga ti napalabes ($1)',
@@ -1162,7 +1162,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-resetpass' => 'Sukatan ti kontrasenias',
 'prefs-changeemail' => 'Sukatan ti esurat a pagtaengan',
 'prefs-setemail' => 'Ikabil ti esurat a pagtaengan',
-'prefs-email' => 'Pagpilian ti e-surat',
+'prefs-email' => 'Pagpilian ti esurat',
 'prefs-rendering' => 'Tabas',
 'saveprefs' => 'Idulin',
 'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
@@ -1345,7 +1345,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'right-hideuser' => 'Serraan ti maysa a nagan ti agar-aramat, ilemmeng manipud ti publiko',
 'right-ipblock-exempt' => 'Labsan dagiti IP a serra, dagiti automatiko a serra ken dagiti nasakup a serra.',
 'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti proxie',
-'right-unblockself' => 'Ikkaten ti panaka-serra kaniada',
+'right-unblockself' => 'Ikkaten ti pannaka-serra kaniada',
 'right-protect' => 'Sukatan dagiti lessaad ti salaknib ken dagiti panid a nasalakniban ti panag-urnos',
 'right-editprotected' => 'Urnosen dagiti nasalakniban a panid (nga awan ti sariap a salaknib")',
 'right-editinterface' => 'Urnosen ti "interface" ti agar-aramat',
@@ -1690,7 +1690,6 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'http-read-error' => 'Biddut ti panagbasa ti HTTP.',
 'http-timed-out' => 'Nagsardeng ti panagtulod ti HTTP.',
 'http-curl-error' => 'Biddut ti panagala ti URL: $1',
-'http-host-unreachable' => 'Di madanon ti URL',
 'http-bad-status' => 'Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2018,15 +2017,6 @@ Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
 'listusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
 'listusers-blocked' => '(naserraan)',
 
-# Special:ActiveUsers
-'activeusers' => 'Listaan dagiti nasiglat nga agar-aramat',
-'activeusers-intro' => 'Daytoy ti listaan dagiti agar-aramat nga adda inararamidda kadagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga alaldaw}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|a tignay|tigtignay}} idi kalpasan ti {{PLURAL:$3|nga aldaw|$3 nga alaldaw}}',
-'activeusers-from' => 'Iparang dagiti agar-aramat a mangrugi iti:',
-'activeusers-hidebots' => 'Ilemmeng dagiti bot',
-'activeusers-hidesysops' => 'Ilemmeng dagiti administrador',
-'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Dagiti karbengan ti grupo ti agar-aramat',
 'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.
index 0e7e82d..c97e167 100644 (file)
@@ -713,8 +713,8 @@ halda áfram að nota gamla lykilorðið.',
 Vinsamlegast skráðu þig inn á ný þegar þú hefur móttekið það.',
 'blocked-mailpassword' => 'Þér er ekki heimilt að gera breytingar frá þessu netfangi og  því getur þú ekki fengið nýtt lykilorð í pósti.  Þetta er gert til þess að koma í veg fyrir skemmdarverk.',
 'eauthentsent' => 'Staðfestingarpóstur hefur verið sendur á uppgefið netfang. Þú verður að fylgja leiðbeiningunum í póstinum til þess að virkja netfangið og staðfesta að það sé örugglega þitt.',
-'throttled-mailpassword' => 'Áminning fyrir lykilorð hefur nú þegar verið send, innan við {{PLURAL:$1|síðasta klukkutímans|$1 síðustu klukkutímanna}}.
-Til að koma í veg fyrir misnotkun, er aðeins ein áminning send {{PLURAL:$1|hvern klukkutíma|hverja $1 klukkutíma}}.',
+'throttled-mailpassword' => 'Tölvupóstur til að endursetja lykilorðið hefur þegar verið sent, innan við {{PLURAL:$1|síðasta klukkutímans|$1 síðustu klukkutímanna}}.
+Til að koma í veg fyrir misnotkun, er aðeins einn tölvupóstur sendur {{PLURAL:$1|hvern klukkutíma|hverja $1 klukkutíma}}.',
 'mailerror' => 'Upp kom villa við sendingu tölvupósts: $1',
 'acct_creation_throttle_hit' => 'Því miður, hafa verið búnir til {{PLURAL:$1|1 aðgang|$1 aðganga}} nýr aðgangar í dag sem er hámarksfjöldi nýskráninga á einum degi.
 Þú getur því miður ekki búið til nýjan aðgang frá þessari IP-tölu að svo stöddu.',
@@ -766,7 +766,7 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 
 # Special:PasswordReset
 'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að fá tölvupóst um áminningu um notendauplýsingarnar þínar.',
+'passwordreset-text' => 'Fylltu út þennan reit til að endursetja lykilorðið þitt.',
 'passwordreset-legend' => 'Endurstilla lykilorð',
 'passwordreset-disabled' => 'Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Sláðu inn einn hluta gagnanna hér fyrir neðan}}',
@@ -776,14 +776,15 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 'passwordreset-capture-help' => 'Ef þú hakar við þennan reit verður tölvupósturinn (með tímabundna lykilorðinu) sýndur þér og einnig sendur notandanum.',
 'passwordreset-email' => 'Netfang:',
 'passwordreset-emailtitle' => 'Notendaupplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um 
+endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
 
 $2
 
 Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
-'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
 
 $2
 
@@ -792,9 +793,9 @@ Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt ly
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailelement' => 'Notendanafn: $1
 Tímabundið lykilorð: $2',
-'passwordreset-emailsent' => 'Áminning hefur verið send í tölvupósti.',
-'passwordreset-emailsent-capture' => 'Áminning hefur verið send í tölvupósti, sem er sýnd hér fyrir neðan.',
-'passwordreset-emailerror-capture' => 'Áminning var búin til, sem er sýnd hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
+'passwordreset-emailsent' => 'Töluvpóstur til að endursetja lykilorðið hefur verið sendur.',
+'passwordreset-emailsent-capture' => 'Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.',
+'passwordreset-emailerror-capture' => 'Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Breyting netfangs',
@@ -1296,15 +1297,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 Þú getur leitað í genum Google á meðan.
 Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 
-# Quickbar
-'qbsettings' => 'Valblað',
-'qbsettings-none' => 'Sleppa',
-'qbsettings-fixedleft' => 'Fast vinstra megin',
-'qbsettings-fixedright' => 'Fast hægra megin',
-'qbsettings-floatingleft' => 'Fljótandi til vinstri',
-'qbsettings-floatingright' => 'Fljótandi til hægri',
-'qbsettings-directionality' => 'Lagað, fer eftir því í hvaða átt er skrifað á þínu tungumáli.',
-
 # Preferences page
 'preferences' => 'Stillingar',
 'mypreferences' => 'Mínar stillingar',
@@ -1853,7 +1845,6 @@ Vegna öryggissjónarmiða er img_auth.php óvirkt.',
 'http-read-error' => 'HTTP lesturs villa.',
 'http-timed-out' => 'Tímamörk HTTP beiðni rann út.',
 'http-curl-error' => 'Villa við að sækja vefslóð: $1',
-'http-host-unreachable' => 'Gat ekki náð í vefslóðina',
 'http-bad-status' => 'Mistök við HTTP beiðnina: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2175,15 +2166,6 @@ Leitin þarf að minnsta kosti að innihalda rótarlén, eins og "*.org"
 'listusers-noresult' => 'Enginn notandi fannst.',
 'listusers-blocked' => '(bannaður)',
 
-# Special:ActiveUsers
-'activeusers' => 'Virkir notendur',
-'activeusers-intro' => 'Þetta er listi yfir notendur sem hafa verið virkir {{PLURAL:$1|síðasta|síðustu}} $1 {{PLURAL:$1|dag|daga}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|aðgerð|aðgerðir}} á {{PLURAL:$3|síðastliðnum degi|síðustu $3 dögum}}',
-'activeusers-from' => 'Sýna notendur sem byrja á:',
-'activeusers-hidebots' => 'Fela vélmenni',
-'activeusers-hidesysops' => 'Fela möppudýr',
-'activeusers-noresult' => 'Enginn notandi fannst.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Notandahópréttindi',
 'listgrouprights-summary' => 'Hér er listi yfir notendahópa á þessum wiki, með þeirra réttindum. 
@@ -3069,13 +3051,8 @@ Vinsamlegast reyndu aftur.',
 'pageinfo-category-files' => 'Fjöldi skráa',
 
 # Skin names
-'skinname-standard' => 'Sígilt',
-'skinname-nostalgia' => 'Gamaldags',
 'skinname-cologneblue' => 'Kölnarblátt',
 'skinname-monobook' => 'EinBók',
-'skinname-myskin' => 'Mitt þema',
-'skinname-chick' => 'Gella',
-'skinname-simple' => 'Einfalt',
 'skinname-modern' => 'Nútímalegt',
 
 # Patrolling
@@ -3822,17 +3799,17 @@ Tæknilegir örðugleikar eru á þessari síðu.',
 'sqlite-no-fts' => '$1 án fullum texta leitar stuðningi',
 
 # New logging system
-'logentry-delete-delete' => '$1 eyddi síðunni $3',
-'logentry-delete-restore' => '$1 endurvakti $3',
-'logentry-delete-event' => '$1 breytti sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-delete-revision' => '$1 breytti sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-delete-event-legacy' => '$1 breytti sýnileika færslna á $3',
-'logentry-delete-revision-legacy' => '$1 breytti sýnileika útgáfna á $3',
-'logentry-suppress-delete' => '$1 bældi niður síðuna $3',
-'logentry-suppress-event' => '$1 breytti leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-suppress-revision' => '$1 breytti leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-suppress-event-legacy' => '$1 breytti leynilega sýnileika færslna á $3',
-'logentry-suppress-revision-legacy' => '$1 breytti leynilega sýnileika útgáfna á $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|eyddi}} síðunni $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|endurvakti}} $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika færslna á $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika útgáfna á $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|bældi niður}} síðuna $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika færslna á $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika útgáfna á $3',
 'revdelete-content-hid' => 'efni falið',
 'revdelete-summary-hid' => 'breytingarágrip falið',
 'revdelete-uname-hid' => 'notandanafn falið',
@@ -3841,20 +3818,20 @@ Tæknilegir örðugleikar eru á þessari síðu.',
 'revdelete-uname-unhid' => 'notandanafn birt',
 'revdelete-restricted' => 'hömlur settar á stjórnendur',
 'revdelete-unrestricted' => 'fjarlægja hömlur á stjórnendur',
-'logentry-move-move' => '$1 færði $3 á $4',
-'logentry-move-move-noredirect' => '$1 færði $3 á $4 án þess að skilja eftir tilvísun',
-'logentry-move-move_redir' => '$1 færði $3 á $4 yfir tilvísun',
-'logentry-move-move_redir-noredirect' => '$1 færði $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
-'logentry-patrol-patrol' => '$1 merkti útgáfu $3 frá $4 sem yfirfarna',
-'logentry-patrol-patrol-auto' => '$1 merkti sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
-'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create2' => '$1 stofnaði notandaaðganginn $3',
-'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var búinn til af $1 og lykilorðið var sent með tölvupósti',
-'logentry-newusers-autocreate' => 'Aðgangurinn $1 var stofnaður sjálfvirkt',
-'logentry-rights-rights' => '$1 breytti réttindum $3 frá $4 í $5',
-'logentry-rights-rights-legacy' => '$1 breytti réttindum $3',
-'logentry-rights-autopromote' => '$1 fékk sjálfvirkt aukin réttindi frá $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|færði}} $3 á $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 án þess að skilja eftir tilvísun',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkti}} útgáfu $3 frá $4 sem yfirfarna',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkti}} sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
+'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3',
+'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti',
+'logentry-newusers-autocreate' => 'Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt',
+'logentry-rights-rights' => '$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|breytti}} réttindum $3',
+'logentry-rights-autopromote' => '$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5',
 'rightsnone' => '(engum)',
 
 # Feedback
@@ -3930,4 +3907,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
 'duration-millennia' => '$1 {{PLURAL:$1|árþúsund}}',
 
+# Image rotation
+'rotate-comment' => 'Myndinni var snúið um $1 {{PLURAL:$1|gráðu|gráður}} réttsælis',
+
 );
index 19c2042..1f72e96 100644 (file)
@@ -316,8 +316,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostra il numero di utenti che hanno la pagina in osservazione',
 'tog-oldsig' => 'Firma attuale:',
 'tog-fancysig' => 'Tratta la firma come wikitesto (senza un collegamento automatico)',
-'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
 'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript; sperimentale)",
 'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
@@ -332,6 +330,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra categorie nascoste',
 'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
 'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
+'tog-useeditwarning' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -577,6 +576,7 @@ $1',
 'site-atom-feed' => 'Feed Atom di $1',
 'page-rss-feed' => 'Feed RSS per "$1"',
 'page-atom-feed' => 'Feed Atom per "$1"',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (la pagina non esiste)',
 'sort-descending' => 'Ordinamento decrescente',
 'sort-ascending' => 'Ordinamento crescente',
@@ -645,13 +645,14 @@ Si prega di segnalare l\'accaduto a un [[Special:ListUsers/sysop|amministratore]
 'unexpected' => 'Valore imprevisto: "$1"="$2".',
 'formerror' => 'Errore: impossibile inviare il modulo',
 'badarticleerror' => 'Operazione non consentita per questa pagina.',
-'cannotdelete' => 'Non è stato possibile cancellare il file "$1".
+'cannotdelete' => 'Non è stato possibile cancellare la pagina o il file "$1".
 Potrebbe essere stato già cancellato da qualcun altro.',
 'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
 'delete-hook-aborted' => "La cancellazione è stata annullata dall'hook.
 Non è stata restituita alcuna spiegazione.",
 'badtitle' => 'Titolo non corretto',
-'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato o con caratteri non ammessi oppure deriva da un errore nei collegamenti tra siti wiki diversi o versioni in lingue diverse dello stesso sito.',
+'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato oppure deriva da un errore nei collegamenti interlingua o interwiki.
+Potrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.',
 'perfcached' => "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
 'perfcachedts' => "I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al $1. Un massimo di {{PLURAL:$4|un risultato è disponibile|$4 risultati sono disponibili}} in cache.",
 'querypage-no-updates' => 'Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.',
@@ -1045,6 +1046,8 @@ Esiste già.',
 'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
 'invalid-content-data' => 'Dati contenuti non validi',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+'editwarning-warning' => 'Lasciare questa pagina potrebbe costarti la perdita di tutti i cambiamenti effettuati.
+Se sei loggato, puoi disattivare questo avviso nella sezione "{{int:prefs-editing}}" delle tue preferenze.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1251,7 +1254,7 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'compareselectedversions' => 'Confronta le versioni selezionate',
 'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
 'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non mostrate)',
+'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non mostrate)',
 'difference-missing-revision' => '{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.
 
@@ -1319,15 +1322,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'powersearch-togglenone' => 'Nessuno',
 'search-external' => 'Ricerca esterna',
 'searchdisabled' => 'La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fisso, a seconda della direzione del testo nella tua lingua',
+'search-error' => 'Si è verificato un errore durante la ricerca: $1',
 
 # Preferences page
 'preferences' => 'Preferenze',
@@ -1869,7 +1864,6 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
 'http-read-error' => 'Errore di lettura HTTP.',
 'http-timed-out' => 'Richiesta HTTP scaduta.',
 'http-curl-error' => "Errore durante il recupero dell'URL: $1",
-'http-host-unreachable' => 'URL non raggiungibile.',
 'http-bad-status' => "C'è stato un problema durante la richiesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2193,15 +2187,6 @@ Vedi anche le [[Special:WantedCategories|categorie richieste]].',
 'listusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
 'listusers-blocked' => '(bloccato)',
 
-# Special:ActiveUsers
-'activeusers' => 'Elenco degli utenti attivi',
-'activeusers-intro' => 'Questo è un elenco di utenti che hanno avuto qualche tipo di attività da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.',
-'activeusers-count' => "$1 {{PLURAL:$1|azione|azioni}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
-'activeusers-from' => 'Mostra gli utenti a partire da:',
-'activeusers-hidebots' => 'Nascondi i bot',
-'activeusers-hidesysops' => 'Nascondi gli amministratori',
-'activeusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Diritti del gruppo utente',
 'listgrouprights-summary' => "Di seguito sono elencati i gruppi utente definiti per questo sito, con i diritti d'accesso loro associati.
@@ -2681,6 +2666,7 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
 '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",
 'cant-block-while-blocked' => 'Non è possibile bloccare altri utenti mentre si è bloccati.',
 'cant-see-hidden-user' => 'L\'utente che si sta tentando di bloccare è stato già bloccato e nascosto. Poiché non hai il permesso "hideuser", non è possibile visualizzare o modificare il blocco dell\'utente.',
 'ipbblocked' => 'Non puoi bloccare o sbloccare altri utenti, perché tu stesso sei bloccato',
@@ -2977,13 +2963,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Stylesheets
 'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
-'standard.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Standard */',
-'nostalgia.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Nostalgia */',
 'cologneblue.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Cologne Blue */',
 'monobook.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */',
-'myskin.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin MySkin */',
-'chick.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Chick */',
-'simple.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Simple */',
 'modern.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Modern */',
 'vector.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */',
 'print.css' => "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
@@ -2996,13 +2977,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Scripts
 'common.js' => '/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */',
-'standard.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Standard */',
-'nostalgia.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Nostalgia */',
 'cologneblue.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Cologne Blue */',
 'monobook.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */',
-'myskin.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MySkin */',
-'chick.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Chick */',
-'simple.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Simple */',
 'modern.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */',
 'vector.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */',
 'group-autoconfirmed.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /',
@@ -3838,7 +3814,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 
 # Special:BlankPage
 'blankpage' => 'Pagina vuota',
-'intentionallyblankpage' => 'Questa pagina è lasciata volutamente vuota ed è usata per benchmark, ecc.',
+'intentionallyblankpage' => 'Questa pagina è lasciata volutamente vuota.',
 
 # External image whitelist
 'external_image_whitelist' => " #Lasciare questa riga esattamente com'è<pre>
@@ -3895,6 +3871,8 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'htmlform-submit' => 'Invia',
 'htmlform-reset' => 'Annulla modifiche',
 'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
index 1afc66c..9ef1f91 100644 (file)
@@ -393,8 +393,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
 'tog-fancysig' => '署名をウィキ文として扱う (自動リンクなし)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
 'tog-uselivepreview' => 'ライブプレビューを使用 (JavaScriptが必要) (開発中)',
 'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
@@ -409,6 +407,7 @@ $messages = array(
 'tog-showhiddencats' => '隠しカテゴリを表示',
 'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
+'tog-useeditwarning' => '変更を保存せずに編集画面から離れようとしたら警告',
 
 'underline-always' => '常に付ける',
 'underline-never' => '常に付けない',
@@ -1175,6 +1174,8 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'content-failed-to-parse' => '$2のコンテンツを$1モデルとして構文解析できませんでした: $3',
 'invalid-content-data' => '本文データが無効です',
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
+'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
+ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
 
 # Content models
 'content-model-wikitext' => 'ウィキテキスト',
@@ -1462,15 +1463,7 @@ $1",
 'searchdisabled' => '{{SITENAME}}の検索機能は無効化されています。
 さしあたってはGoogleなどで検索できます。
 ただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。',
-
-# Quickbar
-'qbsettings' => 'クイックバー',
-'qbsettings-none' => 'なし',
-'qbsettings-fixedleft' => '左端',
-'qbsettings-fixedright' => '右端',
-'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
-'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
+'search-error' => '検索する際にエラーが発生しました: $1',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -2048,7 +2041,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください
 'http-read-error' => 'HTTP読み込みエラーです。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
 'http-curl-error' => 'URLからの取得に失敗しました: $1',
-'http-host-unreachable' => 'URLに到達できません。',
 'http-bad-status' => 'HTTP リクエストで問題が発生しました: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2064,7 +2056,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'license-header' => 'ライセンス',
 'nolicense' => '選択なし',
 'license-nopreview' => '(プレビューはありません)',
-'upload_source_url' => '(有効かつ一般に公開されているURL)',
+'upload_source_url' => '(有効かつ一般に公開されている URL)',
 'upload_source_file' => '(あなたのコンピューター上のファイル)',
 
 # Special:ListFiles
@@ -2380,15 +2372,6 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'listusers-noresult' => '利用者が見つかりませんでした。',
 'listusers-blocked' => '(ブロック中)',
 
-# Special:ActiveUsers
-'activeusers' => '活動中の利用者一覧',
-'activeusers-intro' => 'これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。',
-'activeusers-count' => '過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}',
-'activeusers-from' => '最初に表示する利用者:',
-'activeusers-hidebots' => 'ボットを隠す',
-'activeusers-hidesysops' => '管理者を隠す',
-'activeusers-noresult' => '利用者が見つかりませんでした。',
-
 # Special:ListGroupRights
 'listgrouprights' => '利用者グループの権限',
 'listgrouprights-summary' => '以下は、このウィキに登録されている利用者グループと、それぞれに割り当てられている権限の一覧です。
@@ -2617,7 +2600,7 @@ $2による直前の版へ変更されました。',
 ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
 このページの保護レベルを変更できますが、カスケード保護には影響しません。',
-'protect-default' => 'ã\81\99ã\81¹ã\81¦ã\81®å\88©ç\94¨è\80\85ã\82\92許可',
+'protect-default' => 'ã\81\99ã\81¹ã\81¦ã\81®å\88©ç\94¨è\80\85ã\81«許可',
 'protect-fallback' => '「$1」権限を持つ利用者のみに許可',
 'protect-level-autoconfirmed' => '自動承認された利用者のみに許可',
 'protect-level-sysop' => '管理者のみに許可',
@@ -2727,8 +2710,8 @@ $1',
 'contribsub2' => '利用者: $1 ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
 'uctop' => '(最新)',
-'month' => 'ã\81\93ã\82\8c以å\89\8dã\81®æ\9c\88:',
-'year' => 'ã\81\93ã\82\8c以å\89\8dã\81®å¹´:',
+'month' => 'ã\81\93ã\81®æ\9c\88以å\89\8d:',
+'year' => 'ã\81\93ã\81®å¹´ä»¥å\89\8d:',
 
 'sp-contributions-newbies' => '新規利用者の投稿のみ表示',
 'sp-contributions-newbies-sub' => '新規利用者のみ',
@@ -2808,7 +2791,7 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]をブロックしました。<br />
 [[Special:BlockList|ブロックの一覧]]を参照してください。',
 'ipb-blockingself' => '自分自身をブロックしようとしています! 本当に実行しますか?',
-'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべてのリストやログでこの利用者名が表示されません。本当に実行しますか?',
+'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべての一覧や記録項目で利用者名が表示されません。本当に実行しますか?',
 'ipb-edit-dropdown' => 'ブロック理由を編集',
 'ipb-unblock-addr' => '$1のブロックを解除',
 'ipb-unblock' => '利用者またはIPアドレスのブロックを解除',
@@ -2893,6 +2876,7 @@ $1 のブロックの理由は「''$2''」です。",
 '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' => 'ブロックしようとしている利用者は、既にブロックされ隠されています。
 あなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。',
@@ -3058,7 +3042,7 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 # Thumbnails
 'thumbnail-more' => '拡大',
 'filemissing' => 'ファイルがありません',
-'thumbnail_error' => 'サムネイルの作成中にエラーが発生しました: $1',
+'thumbnail_error' => 'サムネイルの作成エラー: $1',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
 'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
@@ -3212,13 +3196,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Stylesheets
 'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
-'standard.css' => '/* ここに記述したCSSはスタンダード外装の利用者に影響します */',
-'nostalgia.css' => '/* ここに記述したCSSはノスタルジア外装の利用者に影響します */',
 'cologneblue.css' => '/* ここに記述したCSSはケルンブルー外装の利用者に影響します */',
 'monobook.css' => '/* ここに記述したCSSはモノブック外装の利用者に影響します */',
-'myskin.css' => '/* ここに記述したCSSはマイスキン外装の利用者に影響します */',
-'chick.css' => '/* ここに記述したCSSはチック外装の利用者に影響します */',
-'simple.css' => '/* ここに記述したCSSはシンプル外装の利用者に影響します */',
 'modern.css' => '/* ここに記述したCSSはモダン外装の利用者に影響します */',
 'vector.css' => '/* ここに記述したCSSはベクター外装の利用者に影響します */',
 'print.css' => '/* ここに記述したCSSは印刷出力に影響します */',
@@ -3231,13 +3210,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Scripts
 'common.js' => '/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */',
-'standard.js' => '/* ここにあるすべてのJavaScriptは、スタンダード外装を使用している利用者に対して読み込まれます */',
-'nostalgia.js' => '/* ここにあるすべてのJavaScriptは、ノスタルジア外装を使用している利用者に対して読み込まれます */',
 'cologneblue.js' => '/* ここにあるすべてのJavaScriptは、ケルンブルー外装を使用している利用者に対して読み込まれます */',
 'monobook.js' => '/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */',
-'myskin.js' => '/* ここにあるすべてのJavaScriptは、マイスキン外装を使用している利用者に対して読み込まれます */',
-'chick.js' => '/* ここにあるすべてのJavaScriptは、チック外装を使用している利用者に対して読み込まれます */',
-'simple.js' => '/* ここにあるすべてのJavaScriptは、シンプル外装を使用している利用者に対して読み込まれます */',
 'modern.js' => '/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */',
 'vector.js' => '/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */',
 'group-autoconfirmed.js' => '/* ここにあるすべてのJavaScriptは、自動承認された利用者に対して読み込まれます */',
@@ -3318,13 +3292,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'pageinfo-category-files' => 'ファイル数',
 
 # Skin names
-'skinname-standard' => 'クラシック',
-'skinname-nostalgia' => 'ノスタルジア',
 'skinname-cologneblue' => 'ケルンブルー',
 'skinname-monobook' => 'モノブック',
-'skinname-myskin' => 'マイスキン',
-'skinname-chick' => 'チック',
-'skinname-simple' => 'シンプル',
 'skinname-modern' => 'モダン',
 'skinname-vector' => 'ベクター',
 
@@ -4253,7 +4222,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 # Database error messages
 'dberr-header' => 'このウィキには問題があります',
 'dberr-problems' => '申し訳ありません!
-このウェブサイトに技術的な問題が発生しています。',
+このウェブサイトに技術的な障害が発生しています。',
 'dberr-again' => '数分間待った後、もう一度読み込んでください。',
 'dberr-info' => '(データベースサーバー $1 に接続できませんでした)',
 'dberr-usegoogle' => '元に戻るまで、Googleを利用して検索できます。',
@@ -4271,6 +4240,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
+'htmlform-no' => 'いいえ',
+'htmlform-yes' => 'はい',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (全文検索あり)',
index 83163b9..e2c8beb 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Anggoro
+ * @author Bawoor
  * @author Bennylin
  * @author Helix84
  * @author Hoo
@@ -52,11 +53,11 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisen ngisoré pranala:',
-'tog-justify' => 'Ratakna paragraf',
-'tog-hideminor' => 'Delikna suntingan cilik ing owah-owahan pungkasan',
-'tog-hidepatrolled' => 'Delikna suntingan sing wis dipatroli ing kaca owah-owahan',
-'tog-newpageshidepatrolled' => 'Delikna kaca sing wis dipatroli saka daftar kaca anyar',
-'tog-extendwatchlist' => 'Kembangna daftar pangawasan kanggo nuduhaké kabèh pangowahan, ora mung sing paling anyar',
+'tog-justify' => 'Ratakaké paragrap',
+'tog-hideminor' => 'Dhelikaké suntingan cilik ing owah-owahan pungkasan',
+'tog-hidepatrolled' => 'Dhelikaké suntingan kapanto ing owah-owahan pungkasan',
+'tog-newpageshidepatrolled' => 'Dhelikaké kaca kapanto saka daptar kaca anyar',
+'tog-extendwatchlist' => 'Jembaraké daptar pangawasan kanggo nuduhaké kabèh owahan, ora mung sing paling anyar',
 'tog-usenewrc' => 'Owah-owahané paguyuban miturut kaca nèng owah-owahan anyar lan daptar panto (mbutuhaké JavaScript)',
 'tog-numberheadings' => 'Wènèhana nomer judul secara otomatis',
 'tog-showtoolbar' => 'Tuduhna <em>toolbar</em> (batang piranti) panyuntingan',
@@ -80,10 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tuduhna cacahé pangawas',
 'tog-oldsig' => 'Tapak asma sing ana:',
 'tog-fancysig' => 'Anggepen tapak asta minangka teks wiki (tanpa pranala otomatis)',
-'tog-externaleditor' => 'Pigunakaken program pangolah tembung jawi (namung tumrap ahli, perlu pangaturan mligi ing komputer panjenengan. 
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-externaldiff' => 'Pigunakaken diff eksternal sacara bektan (namung tumrap para ahli, perlu pangaturan mligi ing komputer panjenengan.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
 'tog-showjumplinks' => 'Aktifna pranala pambiyantu "langsung menyang"',
 'tog-uselivepreview' => 'Nganggoa pratayang langsung (JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Élingna aku menawa kothak ringkesan suntingan isih kosong',
@@ -97,6 +94,7 @@ $messages = array(
 'tog-diffonly' => 'Aja dituduhaké isi kaca ing ngisor bédané suntingan',
 'tog-showhiddencats' => 'Tuduhna kategori sing didelikaké',
 'tog-norollbackdiff' => 'Lirwaaké prabédan sawusé nglakokaké sawijining pambalikan.',
+'tog-useeditwarning' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
 
 'underline-always' => 'Tansah',
 'underline-never' => 'Ora',
@@ -512,8 +510,8 @@ Yèn wong liya sing nglakoni panyuwunan iki, utawa panjenengan éling tembung sa
 'passwordsent' => 'Tembung sandhi anyar wis dikirim menyang alamat layang e-mail panjenengan sing wis didaftar kanggo "$1". Mangga mlebu log manèh sawisé nampa e-mail iku.',
 'blocked-mailpassword' => "Alamat IP panjenengan diblokir saka panyuntingan, mulané panjenengan ora olèh nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
 'eauthentsent' => 'Sawijining layang élèktronik (e-mail) kanggo ndhedhes (konfirmasi) wis dikirim menyang alamat layang élèktronik panjenengan. Panjenengan kudu nuruti instruksi sajroning layang iku kanggo ndhedhes yèn alamat iku bener kagungané panjenengan. {{SITENAME}} ora bakal ngaktifaké fitur layang élèktronik yèn langkah iki durung dilakoni.',
-'throttled-mailpassword' => 'Sawijining pènget tembung sandi wis dikirim, jroning {{PLURAL:$1|jam|$1 jam}} pungkasan iki.
-Kanggo nyegah salah-guna, mung siji pènget tembung sandi waé sing bisa dikirim saben {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Layang kanggo mbalèkaké tembung sandhi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.
+Kanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung sandhi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan ing ngirimaké layang e-mail: $1',
 'acct_creation_throttle_hit' => 'Tamu ing wiki iki kanthi alamat IP sing padha karo panjenengan wis gawé {{PLURAL:$1|1 akun|$1 akun}} ing sadina pungkasan, nganti cacah maksimum sing diidinaké.
 Amarga saka kuwi., tamu kanthi alamat IP iki ora bisa gawé akun manèh kanggo sauntara iki.',
@@ -562,7 +560,7 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 
 # Special:PasswordReset
 'passwordreset' => 'Balèni setèl tembung sandhi',
-'passwordreset-text' => 'Ganepi pormulir iki kanggo nampa pangéling layang èlèktronik kanggo rincian akun Sampéyan.',
+'passwordreset-text' => 'Jangkepi pormulir iki kanggo mbalèkaké tembung sandhiné Sampéyan.',
 'passwordreset-legend' => 'Balèni setèl tembung sandhi',
 'passwordreset-disabled' => 'Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Lebokaké siji bagéyan data ngisor iki}}',
@@ -572,30 +570,23 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 'passwordreset-capture-help' => 'Yèn Sampéyan nyentang kothak iki, layang èlèktronik (mawa tembung sandhi sawetara) bakal ditampilaké nèng Sampéyan lan uga dikirim nèng panganggo.',
 'passwordreset-email' => 'Alamat layang èlèktronik:',
 'passwordreset-emailtitle' => 'Rincian akun nèng {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat
-detail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut
-terkait dengan alamat surel ini:
+'passwordreset-emailtext-ip' => 'Ana uwong (mbok menawa Sampéyan, mawa angka IP $1) njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
-Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
-permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
-ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
-'passwordreset-emailtext-user' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat detail akun untuk {{SITENAME}} ($4).
-{{PLURAL:$3|Akun|Akun-akun}} berikut terkait dengan alamat surel ini:
+{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.
+Sampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.',
+'passwordreset-emailtext-user' => 'Panganggo $1 seka {{SITENAME}} njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
-Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
-permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
-ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
+{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.
+Sampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.',
 'passwordreset-emailelement' => 'Jeneng panganggo: $1
 Tembung sandhi sawetara: $2',
-'passwordreset-emailsent' => 'Layang èlèktronik pangèling wis dikirim.',
-'passwordreset-emailsent-capture' => 'Layang èlèktronik pangèling wis dikirim kaya ngisor iki.',
-'passwordreset-emailerror-capture' => 'Layang èlèktronik pangèling ditampilaké nèng ngisor iki, nanging ora kasil dikirim: $1',
+'passwordreset-emailsent' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim.',
+'passwordreset-emailsent-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.',
+'passwordreset-emailerror-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis ditokaké, bisa didelok ngisor iki, nanging gagal nalika dikirim menyang panganggoné: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat layang èlèktronik',
@@ -1057,7 +1048,7 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-default' => 'Pituwas $1:',
 'search-interwiki-more' => '(luwih akèh)',
 'search-relatedarticle' => 'Kagandhèng',
-'mwsuggest-disable' => 'Patènana sugèsti AJAX',
+'mwsuggest-disable' => 'Tutup saka panemu-panemu ing golèk',
 'searcheverything-enable' => 'Golèki ing kabèh bilik-jeneng',
 'searchrelated' => 'kagandhèng',
 'searchall' => 'kabèh',
@@ -1077,15 +1068,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-external' => 'Panggolèkan èkstèrnal',
 'searchdisabled' => 'Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pengaturan bar sidhatan',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Wis pesthi, gumantung saka wujud skrip basané Sampéyan',
-
 # Preferences page
 'preferences' => 'Preferensi (pilihan)',
 'mypreferences' => 'Préferènsi',
@@ -1506,7 +1488,7 @@ Mangga priksa panyetèlan pangunggahan berkas.',
 'uploadjava' => 'Berkas kuwi berkas ZIP sing kaisi berkas .class Java.
 Ngungga berkas Java ora dililakaké amarga bisa nyebabaké ngluwèhaké wates kamanan.',
 'upload-source' => 'Berkas sumber',
-'sourcefilename' => 'Jeneng berkas sumber',
+'sourcefilename' => 'Jeneng berkas sumber:',
 'sourceurl' => 'URL sumber:',
 'destfilename' => 'Jeneng berkas sing dituju',
 'upload-maxfilesize' => 'Ukuran maksimal berkas: $1',
@@ -1623,7 +1605,6 @@ Kanggo kamanan paling apik, img_auth.php dipatèni.',
 'http-read-error' => 'Kasalahan maca HTTP.',
 'http-timed-out' => 'Panjalukan HTTP kliwat wates wektu.',
 'http-curl-error' => 'Kasalahan nalika njupuk URL: $1',
-'http-host-unreachable' => 'Ora bisa ngranggèh URL.',
 'http-bad-status' => 'Ana masalah nalika njaluk HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1781,6 +1762,12 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
 Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
 Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-legend' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-text' => 'Kaca iki njlèntèhaké kaca-kaca sing nganggo ubarampé astamiwa.',
+'pageswithprop-prop' => 'Arané ubarampé:',
+'pageswithprop-submit' => 'Nuju',
+
 'doubleredirects' => 'Pangalihan dobel',
 'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
 Saben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing "sajatiné", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.
@@ -1943,15 +1930,6 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listusers-noresult' => 'Panganggo ora ditemokaké.',
 'listusers-blocked' => '(diblokir)',
 
-# Special:ActiveUsers
-'activeusers' => 'Dhaptar panganggo aktif',
-'activeusers-intro' => 'Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.',
-'activeusers-count' => '$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan',
-'activeusers-from' => 'Tampilna panganggo wiwit saka:',
-'activeusers-hidebots' => 'Delikna bot',
-'activeusers-hidesysops' => 'Delikna pangurus',
-'activeusers-noresult' => 'Panganggo ora ditemokaké.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Hak-hak grup panganggo',
 'listgrouprights-summary' => 'Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.
@@ -2783,6 +2761,7 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
 'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
 'pageinfo-views' => 'Cacahing delokan',
 'pageinfo-watchers' => 'Cacahé pangawas kaca',
+'pageinfo-few-watchers' => 'Kurang seka $1 {{PLURAL:$1|wong tilik|wong tilik}}',
 'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
 'pageinfo-subpages-name' => 'Subhalaman halaman ini',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pengalihan|pengalihan}}; $3 {{PLURAL:$3|non-pengalihan|non-pengalihan}})',
@@ -3595,9 +3574,9 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 'sqlite-no-fts' => '$1 tanpa sengkuyungan golèkan tèks jangkep',
 
 # New logging system
-'logentry-delete-delete' => '$1 mbusak kaca $3',
-'logentry-delete-restore' => '$1 mbalèkaké kaca $3',
-'logentry-delete-event' => '$1 ngganti patampilan {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} nèng $3: $4',
+'logentry-delete-delete' => '$1 {{GENDER:$2|mbusak}} kaca $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mbalèkaké}} kaca $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ngganti}} parupané {{PLURAL:$5|sak prastawa log|$5 prastawa log}} ana ing $3: $4',
 'logentry-delete-revision' => '$1 ngganti patampilan {{PLURAL:$5|sak pambenahan|$5 pambenahan}} nèng kaca $3: $4',
 'logentry-delete-event-legacy' => '$1 ngganti patampilan saka kadadéan log nèng $3',
 'logentry-delete-revision-legacy' => '$1 ngganti patampilan saka pambenahan nèng kaca $3',
@@ -3618,7 +3597,7 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 'logentry-move-move-noredirect' => '$1 mindhahaké kaca $3 nèng $4 tanpa nginggalaké pangalihan',
 'logentry-move-move_redir' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan',
 'logentry-move-move_redir-noredirect' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan tanpa nginggalaké pangalihan',
-'logentry-patrol-patrol' => '$1 nandhai benahan $4 saka kaca $3 kaawasi',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|nengeri}} rèvisi $4 saka kaca $3 sing diawasi',
 'logentry-patrol-patrol-auto' => '$1 otomatis nandhai benahan $4 saka kaca $3 kaawasai',
 'logentry-newusers-newusers' => 'Akun panganggo $1 digawé',
 'logentry-newusers-create' => 'Akun panganggo $1 digawé',
@@ -3703,4 +3682,7 @@ Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal
 'duration-centuries' => '$1 {{PLURAL:$1|abad|abad}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milénium|milénium}}',
 
+# Image rotation
+'rotate-comment' => 'Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam',
+
 );
index d012011..2e70002 100644 (file)
@@ -659,9 +659,8 @@ $2',
 'eauthentsent' => 'დამადასტურებელი შეტყობინება გაიგზავნა თქვენს მიერ მითითებულ ელ. ფოსტის მისამართზე.
 სანამ ნებისმიერი სხვა შეტყობინება გაიგზავნებოდეს თქვენს ანგარიშზე, გთხოვთ მიჰყვეთ ელ.
 ფოსტაში მითითებულ ინსტრუქციებს, რათა დაადასტუროთ რომ ანგარიში ნამდვილად თქვენია.',
-'throttled-mailpassword' => 'პაროლის შეხსენება უკვე გაგზავნილია ბოლო $1 საათის განმავლობაში.
-ბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ
-$1 საათში.',
+'throttled-mailpassword' => 'პაროლის შეხსენება უკვე გაგზავნილია ბოლო {{PLURAL:$1|საათის|$1 საათის}} განმავლობაში.
+ბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ {{PLURAL:$1|საათში|$1 საათში}}.',
 'mailerror' => 'შეცდომა ფოსტის გაგზავნაში: $1',
 'acct_creation_throttle_hit' => '24 საათის განმავლობაში თქვენი IP-მისამართითან {{PLURAL:$1|შეიქმნა $1 ანგარიში|შეიქმნა $1 ანგარიშები|შეიქმნა $1 ანგარიშის}}, რაც არის აკრძალული დროის ამ მონაკვეთისთის.
 აქედან გამომდინარე თქვენი IP-მისამართის მქონე მომხმარებლები ვეღარ შექმნიან ანგარიშები.',
@@ -711,7 +710,7 @@ $1 საათში.',
 
 # Special:PasswordReset
 'passwordreset' => 'პაროლის აღდგენა',
-'passwordreset-text' => 'á\83¨á\83\94á\83\90á\83\95á\83¡á\83\94á\83\97 á\83\94á\83¡ á\83¤á\83\9dá\83 á\83\9bá\83\90, á\83 á\83\90á\83\97á\83\90 á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83\97 á\83\9bá\83\98á\83\98á\83¦á\83\9dá\83\97 á\83¨á\83\94á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\9eá\83\90á\83 á\83\90á\83\9bá\83\94á\83¢á\83 á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83¡á\83\90á\83®á\83\94á\83\91.',
+'passwordreset-text' => 'á\83¨á\83\94á\83\90á\83\95á\83¡á\83\94á\83\97 á\83\94á\83¡ á\83¤á\83\9dá\83 á\83\9bá\83\90, á\83 á\83\90á\83\97á\83\90 á\83\99á\83\95á\83\9aá\83\90á\83\95 á\83\93á\83\90á\83\90á\83§á\83\94á\83\9cá\83\9dá\83\97 á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98.',
 'passwordreset-legend' => 'პაროლის აღდგენა',
 'passwordreset-disabled' => 'ამ ვიკიში პაროლის კვლავ დაყენების ფუნქცია გამორთულია.',
 'passwordreset-pretext' => '{{PLURAL:$1||შეიყვანეთ ქვემოთ მოცემულ მონაცემთა ერთ-ერთი ნაწილი.}}',
@@ -722,32 +721,32 @@ $1 საათში.',
 'passwordreset-email' => 'ელ. ფოსტის მისამართი:',
 'passwordreset-emailtitle' => 'ანგარიშის მონაცემები {{SITENAME}}-თვის',
 'passwordreset-emailtext-ip' => 'ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი 
\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\90 {{SITENAME}}-á\83\97á\83\95á\83\98á\83¡ ($4).
\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83¡á\83\90á\83\98á\83¢á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ {{SITENAME}} ($4).
 {{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:
 
 $2
 
-{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|$5 დღე}}.
+{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.
 თქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.
 თუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი
 და აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას
 და გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.',
 'passwordreset-emailtext-user' => 'მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი 
\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\90 {{SITENAME}}-á\83\97á\83\95á\83\98á\83¡ ($4).
\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83¡á\83\90á\83\98á\83¢á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ {{SITENAME}} ($4).
 {{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:
 
 $2
 
-{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|$5 დღე}}.
+{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.
 თქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.
 თუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი
 და აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას
 და გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.',
 'passwordreset-emailelement' => 'მომხმარებლის სახელი: $1
 დროებითი პაროლი: $2',
-'passwordreset-emailsent' => 'á\83¨á\83\94á\83¡á\83\90á\83®á\83¡ენებელი ელ.ფოსტა გაიგზავნა.',
-'passwordreset-emailsent-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\98 á\83¨á\83\94á\83¡á\83\90á\83®á\83¡ენებელი წერილი გაიგზავნა.',
-'passwordreset-emailerror-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98 á\83¨á\83\94á\83¡á\83\90á\83®á\83¡ენებელი წერილი, რომლის გაგზავნაც ვერ მოხერხდა: $1 გამო',
+'passwordreset-emailsent' => 'á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83¡á\83\90á\83§ენებელი ელ.ფოსტა გაიგზავნა.',
+'passwordreset-emailsent-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83¡á\83\90á\83§ენებელი წერილი გაიგზავნა.',
+'passwordreset-emailerror-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¡á\83\90á\83§ენებელი წერილი, რომლის გაგზავნაც ვერ მოხერხდა: $1 გამო',
 
 # Special:ChangeEmail
 'changeemail' => 'ელ-ფოსტის მისამართის შეცვლა',
@@ -1249,15 +1248,6 @@ $1",
 'search-external' => 'გარე ძიება',
 'searchdisabled' => '{{SITENAME}}ში ძებნა გაუქმებულია. თქვენ შეგიძლიათ დროის შუალედით Google-ით ძებნა. მიაქციეთ ყურადღება, რომ {{SITENAME}}ში შესაძლებელია მათი ინდექსები აქტუალური არ არის.',
 
-# Quickbar
-'qbsettings' => 'სწრაფი ზოლი',
-'qbsettings-none' => 'არაფერი',
-'qbsettings-fixedleft' => 'ფიქსირებული მარცხნივ',
-'qbsettings-fixedright' => 'ფიქსირებული მარჯვნივ',
-'qbsettings-floatingleft' => 'მარცხნივ მცურავი',
-'qbsettings-floatingright' => 'მარჯვნივ მცურავი',
-'qbsettings-directionality' => 'ფიქსირებული, დამოკიდებული თქვენი ენის წერილობით მიმართულებაზე',
-
 # Preferences page
 'preferences' => 'კონფიგურაცია',
 'mypreferences' => 'კონფიგურაცია',
@@ -1802,7 +1792,6 @@ $1',
 'http-read-error' => 'HTTP წაკითხვის შეცდომა.',
 'http-timed-out' => 'HTTP მოთხოვნის დრო გავიდა.',
 'http-curl-error' => 'შეცდომა URL: $1-ის მოთხოვნისას',
-'http-host-unreachable' => 'URL მიუწვდომელია',
 'http-bad-status' => 'HTTP მოთხოვნისას აღმოჩენილია შეცდომა - $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1961,6 +1950,9 @@ $1',
 ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
 გვერდი ითვლება მრავამნიშვნელოვნად, თუ მასში განთავსებულია თარგი, რომლის სახელიც მითითებულია გვერდზე [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'გვერდები განსაზღვრული თვისებით',
+'pageswithprop-legend' => 'გვერდები განსაზღვრული თვისებით',
+'pageswithprop-text' => 'აქ მოცემულია გვერდები, რომელთაც ხელით განესაზღვრათ გარკვეული თვისებები.',
 'pageswithprop-prop' => 'თვისების სახელი:',
 'pageswithprop-submit' => 'მიდი',
 
@@ -2019,7 +2011,7 @@ $1',
 'mostimages' => 'ყველაზე მეტი ბმულების მქონე ფაილები',
 'mostinterwikis' => 'ყველაზე მეტი ინტერვიკის მქონე სტატია',
 'mostrevisions' => 'ყველაზე მეტად რედაქტირებული სტატიები',
-'prefixindex' => 'á\83§á\83\95á\83\94á\83\9aá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 (á\83\97á\83\90á\83\95á\83¡á\83\90á\83 á\83\97ით)',
+'prefixindex' => 'á\83§á\83\95á\83\94á\83\9aá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 (á\83\9eá\83 á\83\94á\83¤á\83\98á\83¥á\83¡ით)',
 'prefixindex-namespace' => 'ყველა პრეფიქსიანი გვერდი ($1 სახელთა სივრცე)',
 'shortpages' => 'მოკლე გვერდები',
 'longpages' => 'გრძელი გვერდები',
@@ -2088,7 +2080,7 @@ $1',
 'allpagesprev' => 'წინა',
 'allpagesnext' => 'შემდეგი',
 'allpagessubmit' => 'ჩვენება',
-'allpagesprefix' => 'á\83\90á\83¡á\83\90á\83®ე გვერდები პრეფიქსით:',
+'allpagesprefix' => 'á\83\90á\83©á\83\95á\83\94á\83\9cე გვერდები პრეფიქსით:',
 'allpagesbadtitle' => 'მოცემული გვერდის სათაური არასწორია ან აქვს ინტერვიკი ან ნათშორისი პრეფიქსი. იგი შესაძლოა შეიცავდეს ერთ ან მეტ სიმბოლოს, რომელიც არ შეიძლება გამოყენებულ იქნას სათაურში.',
 'allpages-bad-ns' => '{{SITENAME}} "$1" არ აქვს სახელთა სივრცე.',
 'allpages-hide-redirects' => 'გადამისამართებების დამალვა',
@@ -2129,15 +2121,6 @@ $1',
 'listusers-noresult' => 'მომხმარებელი ვერ ვიპოვეთ.',
 'listusers-blocked' => '(დაბლოკილია)',
 
-# Special:ActiveUsers
-'activeusers' => 'აქტიურ მომხმარებელთა სია',
-'activeusers-intro' => 'ეს არის მომხმარებელთა სია, რომელთაც აქვს წვლილი უკანასკნელი $1 {{PLURAL:$1|დღის|დღის}} განმავლობაში.',
-'activeusers-count' => '$1 {{PLURAL:$1|მოქმედება|მოქმედება}} {{PLURAL:$3|დღის|$3 დღის}} განმავლობაში.',
-'activeusers-from' => 'მომხმარებელთა ჩვენება, დაწყებული:',
-'activeusers-hidebots' => 'რობოტების დამალვა',
-'activeusers-hidesysops' => 'ადმინისტრატორების დამალვა',
-'activeusers-noresult' => 'მომხმარებლები არ არიან ნაპოვნი.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'მომხმარებელთა ჯგუფების უფლებები',
 'listgrouprights-summary' => 'ქვემოთ წარმოდგენილია ამ ვიკიში გარკვეულ ჯგუფთა სია და მათი უფლებები.
@@ -2635,6 +2618,7 @@ $1',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'თქვენი IP-მისამართი მიჩნევა ღია პროქსიდ DNSBL-ის თანახმად.',
 'sorbs_create_account_reason' => 'თქვენი IP-მისამართი ითვლება ღია პროქსიდ DNSBL-ის ანახმად. თქვენ ვერ შექმნით ანგარიშს.',
+'xffblockreason' => 'დაიბლოკა IP-მისამართი, რომელიც იმყოფებოდა X-Forwarded-For-ის სათაურში და რომელიც გეკუთვნით თქვენ ან თქვენ მიერ გამოყენებულ პროქსი-სერვერს. დაბლოკვის თავდაპირველი მიზეზი იყო: $1',
 'cant-block-while-blocked' => 'თქვენ ვერ დაბლოკავთ სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
 'cant-see-hidden-user' => 'მომხმარებელი, რომლის დაბლოკვასაც ცდილოთ, უკვე დაბლოკილია და დამალულია. რადგანაც თქვენ არ გაქვთ დამალულ მომხმარებლებთან მუშაობის ნებართვა, თქვენ ვერ შეცვლით ამ ბლოკს.',
 'ipbblocked' => 'თქვენ ვერ დაბლოკავთ ან მოხსნით ბლოკს სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
@@ -2939,13 +2923,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */',
-'standard.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება სტანდარტული გაფორმების თემაში */',
-'nostalgia.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ნოსტალგიური გაფორმების თემაში */',
 'cologneblue.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება კელნის ლურჯი გაფორმების თემაში */',
 'monobook.css' => '/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */',
-'myskin.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ჩემი იერსახის გაფორმების თემაში */',
-'chick.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება წიწილის გაფორმების თემაში */',
-'simple.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება მარტივი გაფორმების თემაში */',
 'modern.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება თანამედროვე გაფორმების თემაში */',
 'vector.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */',
 'group-autoconfirmed.css' => '/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */',
@@ -3029,13 +3008,8 @@ $1',
 'pageinfo-category-files' => 'ფაილების რაოდენობა',
 
 # Skin names
-'skinname-standard' => 'კლასიკური',
-'skinname-nostalgia' => 'ნოსტალგია',
 'skinname-cologneblue' => 'კელნის ლურჯი',
 'skinname-monobook' => 'მონობუკი',
-'skinname-myskin' => 'საკუთარი',
-'skinname-chick' => 'წიწილა',
-'skinname-simple' => 'მარტივი',
 'skinname-modern' => 'თანამედროვე',
 'skinname-vector' => 'ვექტორული',
 
@@ -3921,17 +3895,17 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე',
 
 # New logging system
-'logentry-delete-delete' => 'მომხმარებელმა $1 წაშალა გვერდი: „$3“',
-'logentry-delete-restore' => '$1 აღადგინა გვერდი $3',
-'logentry-delete-event' => '$1 შეცვალა {{PLURAL:$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 ჟურნალის ჩანაწერების}} ხილვადობა $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 {{GENDER:$2|წაშალა}} გვერდი: „$3“',
+'logentry-delete-restore' => 'მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3',
+'logentry-delete-event' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
+'logentry-delete-revision' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4',
+'logentry-delete-event-legacy' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} ჩანაწერების ჟურნალის ხილვადობა $3-ზე',
+'logentry-delete-revision-legacy' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} რედაქტირების კომენტარი გვერდზე $3',
+'logentry-suppress-delete' => 'მომხმარებელმა $1 {{GENDER:$2|ჩაახშო}} $3 გვერდი',
+'logentry-suppress-event' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
+'logentry-suppress-revision' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა $3 გვერდზე: $4',
+'logentry-suppress-event-legacy' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} $3 ჩანაწერების ჟურნალის ხილვადობა',
+'logentry-suppress-revision-legacy' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} ვერსიის ხილვადობა $3 გვერდზე',
 'revdelete-content-hid' => 'შინაარსი დამალულია',
 'revdelete-summary-hid' => 'რედაქტირების აღწერა დამალულია',
 'revdelete-uname-hid' => 'მომხმარებლის სახელი დაფარულია',
@@ -3940,20 +3914,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-byemail' => 'მომხმარებლის ანგარიში $3 შექმნა მომხმარებელმა $1 და პაროლი გაგზავნა ელ. ფოსტით',
-'logentry-newusers-autocreate' => 'ავტომატურად შეიქმნა მომხმარებლის ანგარიში $1',
-'logentry-rights-rights' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის $4-დან $5-ზე',
-'logentry-rights-rights-legacy' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის',
-'logentry-rights-autopromote' => '$1 ავტომატურად იქნა გადაყვანილი $4–დან $5–ში',
+'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 {{GENDER:$2|გადაიტანა}} გვერდი $3 $4-ში გადამისამართების დატოვების გარეშე',
+'logentry-patrol-patrol' => 'მომხმარებელმა $1 {{GENDER:$2|გააკეთა}} გვერდის „$3“ $4 ვერსიის პატრულირება',
+'logentry-patrol-patrol-auto' => 'მომხმარებელმა $1 ავტომატურად {{GENDER:$2|გააკეთა}} გვერდის „$3“ $4 ვერსიის პატრულირება',
+'logentry-newusers-newusers' => 'მომხმარებლის ანგარიში $1 {{GENDER:$2|შექმნილია}}',
+'logentry-newusers-create' => '{{GENDER:$2|შეიქმნა}} მომხმარებლის ანგარიში $1',
+'logentry-newusers-create2' => 'მომხმარებლის ანგარიში $3 {{GENDER:$2|შექმნა}} მომხმარებელმა $1',
+'logentry-newusers-byemail' => 'მომხმარებლის ანგარიში $3 {{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-თვის',
+'logentry-rights-autopromote' => 'მომხმარებელი $1 ავტომატურად იქნა {{GENDER:$2|გადაყვანილი}} $4–დან $5–ში',
 'rightsnone' => '(არცერთი)',
 
 # Feedback
@@ -4029,4 +4003,7 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'duration-centuries' => '$1 {{PLURAL:$1|საუკუნე|საუკუნე}}',
 'duration-millennia' => '$1 {{PLURAL:$1|ათასწლეული|ათასწლეული}}',
 
+# Image rotation
+'rotate-comment' => 'სურათი მოტრიალებულია $1 {{PLURAL:$1|გრადუსით|გრადუსით}} საათის ისრის მიმართულებით',
+
 );
index cc838e4..3d6afa0 100644 (file)
@@ -752,9 +752,9 @@ $2',
 'eauthentsent' => 'អ៊ីមែល​សម្រាប់​ផ្ទៀងផ្ទាត់​បញ្ជាក់ត្រូវបានផ្ញើទៅ​អាសយដ្ឋានអ៊ីមែល​ដែលបានចុះត្រាហើយ។
 
 មុននឹងមាន​អ៊ីមែលផ្សេងមួយទៀត​ត្រូវផ្ញើទៅ​គណនីនេះ អ្នកត្រូវតែ​ធ្វើតាមសេចក្តីណែនាំ​ក្នុងអ៊ីមែល​នោះ ដើម្បីបញ្ជាក់ថា​គណនីបច្ចុប្បន្ន​ពិតជា​របស់អ្នកពិតប្រាកដមែន។',
-'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80ពាក្យសម្ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
+'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aពាក្យសម្ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
 
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80ពាក្យសម្ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aពាក្យសម្ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
 'mailerror' => 'បញ្ហាក្នុងការផ្ញើអ៊ីមែល៖ $1',
 'acct_creation_throttle_hit' => 'អ្នកទស្សនា​វិគី​នេះ​ដោយ​ប្រើប្រាស់​អាសយដ្ឋានIPរបស់​អ្នក​ បានបង្កើត{{PLURAL:$1|គណនីមួយ|គណនីចំនួន$1}}នៅ​ថ្ងៃ​ចុងក្រោយ។ ចំនួននេះ​ជា​ចំនួន​អតិបរមារ​ដែល​ត្រូវ​បាន​អនុញ្ញាត​សម្រាប់​រយៈពេល​នេះ​។
 
@@ -2182,15 +2182,6 @@ $1',
 'listusers-noresult' => 'រកមិនឃើញអ្នកប្រើប្រាស់នេះទេ។',
 'listusers-blocked' => '(ស្ថិតក្រោមការហាមឃាត់)',
 
-# Special:ActiveUsers
-'activeusers' => 'បញ្ជីរាយនាមអ្នកប្រើប្រាស់សកម្ម',
-'activeusers-intro' => 'នេះជាបញ្ជីរាយនាមអ្នកប្រើប្រាស់ដែលមានសកម្មភាពក្នុងរូបភាពណាមួយក្នុងរយៈពេល $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}ចុងក្រោយ។',
-'activeusers-count' => '{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ',
-'activeusers-from' => 'បង្ហាញអត្តនាមផ្ដើមដោយ៖',
-'activeusers-hidebots' => 'លាក់រូបយន្ត',
-'activeusers-hidesysops' => 'លាក់អភិបាល',
-'activeusers-noresult' => 'អ្នកប្រើប្រាស់​រកមិនឃើញ​។​',
-
 # Special:ListGroupRights
 'listgrouprights' => 'សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់',
 'listgrouprights-summary' => 'ខាងក្រោមនេះជាបញ្ជីរាយឈ្មោះក្រុមអ្នកប្រើប្រាស់ដែលបានកំណត់ជាមួយនឹងសិទ្ធិរបស់គេនៅលើវិគីនេះ។ មាន[[{{MediaWiki:Listgrouprights-helppage}}|ព័ត៌មានបន្ថែម]] អំពីសិទ្ធិផ្ទាល់ខ្លួន។',
index a175268..d4937e4 100644 (file)
@@ -1438,10 +1438,6 @@ $2',
 'listusers-submit' => 'ತೋರು',
 'listusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
 
-# Special:ActiveUsers
-'activeusers' => 'ಸಕ್ರಿಯ ಸದಸ್ಯರ ಪಟ್ಟಿ',
-'activeusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'ಬಳಕೆದಾರ ಗುಂಪು ಹಕ್ಕುಗಳು',
 'listgrouprights-summary' => 'ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರಚಲಿತವಾಗಿರುವ ಬಳಕೆದಾರ ಗುಂಪುಗಳು ಮತ್ತು ಆ ಗುಂಪುಗಳಿಗೆ ಅನ್ವಯಿಸುವ ಹಕ್ಕುಗಳು ಈ ಕೆಳಗಿನಂತಿದೆ.',
index 61cb9ce..fc8f8d7 100644 (file)
@@ -374,8 +374,6 @@ $messages = array(
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
 'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요) (시험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
@@ -390,6 +388,7 @@ $messages = array(
 'tog-showhiddencats' => '숨은 분류 보기',
 'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보이지 않기',
+'tog-useeditwarning' => '수정한 내용을 저장하지 않고 편집 양식을 닫거나 다른 페이지로 이동할 때 알림',
 
 'underline-always' => '항상',
 'underline-never' => '치지 않음',
@@ -1145,6 +1144,8 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'content-failed-to-parse' => '$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3',
 'invalid-content-data' => '잘못된 내용 데이터입니다',
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
+'editwarning-warning' => '이 창에서 벗어나면 저장하지 않은 편집이 모두 사라집니다.
+로그인한 경우, 환경 설정 ‘{{int:prefs-editing}}’란에서 이 경고창을 띄우지 않도록 설정할 수 있습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1183,7 +1184,7 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 
 # Account creation failure
 'cantcreateaccounttitle' => '계정을 만들 수 없음',
-'cantcreateaccount-text' => "í\98\84ì\9e¬ ì\95\84ì\9d´í\94¼ ì£¼ì\86\8c('''$1''')ë\8a\94 [[User:$3|$3]] ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95´ ê³\84ì \95 ë§\8cë\93¤ê¸°ê°\80 ì°¨ë\8b¨ë\90\9c ì\83\81í\83\9cì\9e\85니다.
+'cantcreateaccount-text' => "í\98\84ì\9e¬ ì\95\84ì\9d´í\94¼ ì£¼ì\86\8c('''$1''')ë\8a\94 [[User:$3|$3]] ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95´ ê³\84ì \95 ë§\8cë\93¤ê¸°ê°\80 ì°¨ë\8b¨ë\90\98ì\97\88ì\8aµ니다.
 
 차단 이유는 다음과 같습니다: $2",
 
@@ -1431,15 +1432,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
-
-# Quickbar
-'qbsettings' => '빨리가기 맞춤',
-'qbsettings-none' => '없음',
-'qbsettings-fixedleft' => '왼쪽 고정',
-'qbsettings-fixedright' => '오른쪽 고정',
-'qbsettings-floatingleft' => '왼쪽 유동',
-'qbsettings-floatingright' => '오른쪽 유동',
-'qbsettings-directionality' => '사용자 언어의 문자 입력 방향에 맞추어 고정',
+'search-error' => '찾는 동안 오류가 발생했습니다: $1',
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
@@ -2008,7 +2001,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'http-read-error' => 'HTTP 읽기 오류.',
 'http-timed-out' => 'HTTP 요청 시간 초과.',
 'http-curl-error' => 'URL 열기 오류: $1',
-'http-host-unreachable' => 'URL에 접근하지 못했습니다.',
 'http-bad-status' => 'HTTP 요청 중 오류 발생: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2024,7 +2016,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'license-header' => '라이선스',
 'nolicense' => '선택하지 않음',
 'license-nopreview' => '(미리 보기 불가능)',
-'upload_source_url' => ' (유효하고, 모든 사람이 접근 가능한 URL)',
+'upload_source_url' => '(올바르고, 공개적으로 접근할 수 있는 URL)',
 'upload_source_file' => ' (당신의 컴퓨터에 있는 파일)',
 
 # Special:ListFiles
@@ -2340,15 +2332,6 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers-noresult' => '해당 사용자가 없습니다.',
 'listusers-blocked' => '(차단됨)',
 
-# Special:ActiveUsers
-'activeusers' => '활동적인 사용자 목록',
-'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
-'activeusers-count' => '최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
-'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
-'activeusers-hidebots' => '봇을 숨기기',
-'activeusers-hidesysops' => '관리자를 숨기기',
-'activeusers-noresult' => '사용자가 없습니다.',
-
 # Special:ListGroupRights
 'listgrouprights' => '사용자 권한 목록',
 'listgrouprights-summary' => '다음은 이 위키에서 설정된 사용자 권한 그룹의 목록입니다.
@@ -2555,7 +2538,7 @@ $UNWATCHURL
 'movedarticleprotection' => '사용자가 문서의 보호 설정을 "[[$2]]"에서 "[[$1]]"으로 옮겼습니다',
 'protect-title' => '"$1" 보호하기',
 'protect-title-notallowed' => '"$1" 문서의 보호 수준 보기',
-'prot_1movedto2' => '[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95¨',
+'prot_1movedto2' => '[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\98®ê¹\80',
 'protect-badnamespace-title' => '보호할 수 없는 이름공간',
 'protect-badnamespace-text' => '이 이름공간에 있는 문서는 보호할 수 없습니다.',
 'protect-norestrictiontypes-text' => '이 문서는 제한 유형을 사용할 수 없음으로 보호할 수 없습니다.',
@@ -2850,6 +2833,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 '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' => '차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
 사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
@@ -2920,8 +2904,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'newtitle' => '새 문서 이름',
 'move-watch' => '문서 주시하기',
 'movepagebtn' => '이동',
-'pagemovedsub' => '문서 이동함',
-'movepage-moved' => '\'\'\'"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.\'\'\'',
+'pagemovedsub' => '옮기기 성공',
+'movepage-moved' => '\'\'\'"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.\'\'\'',
 'movepage-moved-redirect' => '넘겨주기 문서를 만들었습니다.',
 'movepage-moved-noredirect' => '넘겨주기 문서를 남기지 않았습니다.',
 'articleexists' => '문서가 이미 존재하거나 이름이 올바르지 않습니다.
@@ -2933,7 +2917,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'move-subpages' => '하위 문서도 함께 ($1개 이하) 이동합니다.',
 'move-talk-subpages' => '토론 문서의 하위 문서도 ($1개까지) 함께 이동합니다.',
 'movepage-page-exists' => '이동할 수 없습니다. "$1" 문서가 이미 존재합니다.',
-'movepage-page-moved' => '"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.',
+'movepage-page-moved' => '"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.',
 'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
 'movepage-max-pages' => '{{PLURAL:$1|문서}}를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
 'movelogpage' => '이동 기록',
@@ -3167,13 +3151,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Stylesheets
 'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
-'standard.css' => '/* 이 CSS 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.css' => '/* 이 CSS 설정은 노스텔지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.css' => '/* 이 CSS 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.css' => '/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.css' => '/* 이 CSS 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.css' => '/* 이 CSS 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.css' => '/* 이 CSS 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.css' => '/* 이 CSS 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'print.css' => '/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */',
@@ -3186,13 +3165,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Scripts
 'common.js' => '/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */',
-'standard.js' => '/* 이 자바스크립트 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.js' => '/* 이 자바스크립트 설정은 노스텔지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.js' => '/* 이 자바스크립트 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.js' => '/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.js' => '/* 이 자바스크립트 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.js' => '/* 이 자바스크립트 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.js' => '/* 이 자바스크립트 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.js' => '/* 이 자바스크립트 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.js' => '/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'group-autoconfirmed.js' => '/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */',
@@ -3273,13 +3247,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-category-files' => '파일 수',
 
 # Skin names
-'skinname-standard' => '클래식',
-'skinname-nostalgia' => '노스탤지아',
 'skinname-cologneblue' => '쾰른 블루',
 'skinname-monobook' => '모노북',
-'skinname-myskin' => '마이스킨',
-'skinname-chick' => '치크',
-'skinname-simple' => '심플',
 'skinname-modern' => '모던',
 'skinname-vector' => '벡터',
 
@@ -4100,6 +4069,8 @@ $5
 'htmlform-submit' => '저장',
 'htmlform-reset' => '바꾼 것을 되돌리기',
 'htmlform-selectorother-other' => '기타',
+'htmlform-no' => '아니오',
+'htmlform-yes' => '예',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (본문 전체 찾기)',
index 46d4361..58716fb 100644 (file)
@@ -1914,15 +1914,6 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listusers-noresult' => 'Къошулуучула табылмадыла.',
 'listusers-blocked' => '(блокга салыныбды)',
 
-# Special:ActiveUsers
-'activeusers' => 'Актив къошулуучуланы тизмеси',
-'activeusers-intro' => 'Бу, ахыр $1 {{PLURAL:$1|кюнде|кюнде}} къаллайда болсун ишлетме кёргюзген къошлуучуланы тизмесиди.',
-'activeusers-count' => 'Ахыр {{PLURAL:$3|кюнде|$3 кюнде}} $1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
-'activeusers-from' => 'Бу бла башланнган къошлуучуланы кёргюз:',
-'activeusers-hidebots' => 'Ботланы джашыр',
-'activeusers-hidesysops' => 'Администраторланы джашыр',
-'activeusers-noresult' => 'Къошлуучу табылмады.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Къошулуучуланы къауумуну хакълары',
 'listgrouprights-summary' => 'Тюбюндеги бу викиде танылгъан къошулуучу къауумланы эмда аланы хакъларыны тизмеси.
index 5a5cc2b..107dfba 100644 (file)
@@ -240,8 +240,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin',
 'tog-oldsig' => 'Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:',
 'tog-fancysig' => 'Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)',
-'tog-externaleditor' => 'Nemm jedes Mol en extern Editor-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-externaldiff' => 'Nemm jedes Mol en extern Diff-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
 'tog-showjumplinks' => '„Jangk-noh“-Links usjevve, die bei em „Zojang ohne Barrikad“ helfe dun',
 'tog-uselivepreview' => 'Dun de „Lebendije Vör-Aansich“ zeije (bruch Java_Skripp)',
 'tog-forceeditsummary' => 'Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht',
@@ -256,6 +254,7 @@ $messages = array(
 'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
 'tog-noconvertlink' => 'Don de Tittele nit ümwandelle',
 'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
+'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
 
 'underline-always' => 'jo, ongershtriishe',
 'underline-never' => 'nä',
@@ -344,6 +343,7 @@ $messages = array(
 'newwindow' => '(Mäht e neu Finster op, wann Dinge Brauser dat kann)',
 'cancel' => 'Stopp! Avbreche!',
 'moredotdotdot' => 'Mieh&nbsp;…',
+'morenotlisted' => 'Et jeiht noch wigger&nbsp;&hellip;',
 'mypage' => 'Metmaachersigg',
 'mytalk' => 'Klaafsigg',
 'anontalk' => 'Klaaf för de IP-Adress',
@@ -661,7 +661,7 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
 'gotaccountlink' => 'Enlogge',
 'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
-'createaccountmail' => 'Scheck mer en E-Mail met Passwood',
+'createaccountmail' => 'Scheck mer en E-Mail met enem neu ußjedachte Passwood op Zick',
 'createaccountreason' => 'Jrond:',
 'badretype' => 'Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.',
 'userexists' => 'Ene Metmaacher met däm Name jidd et ald.
@@ -732,7 +732,7 @@ Ene schöne Jroß vun {{GRAMMAR:Dat|{{SITENAME}}}}.
 'passwordsent' => 'E neu Passwood es aan de E-Mail Adress vun däm Metmaacher „$1“ ungerwähs. Meld dich domet aan, wann De et häs. Dat ahle Passwood bliev erhalde un kann och noch jebruch wääde, bes dat De Dich et eetste Mol met däm Neue enjelogg häs.',
 'blocked-mailpassword' => 'Ding IP Adress es blockeet.',
 'eauthentsent' => 'En <i lang="en">e-mail</i> es jetz ungerwähs aan di Adress, die en de Enstellunge steiht. Ih dat <i lang="en">e-mails</i> üvver {{GRAMMAR:Genitiv iere male|{{SITENAME}}}} <i lang="en">e-mail</i>-Knopp verscheck wääde künne, muss de <i lang="en">e-mail</i>-Adress eets ens bestätich woode sin. Wat mer doför maache moß, steiht en dä <i lang="en">e-mail</i> dren, die jrad avjescheck woode es.',
-'throttled-mailpassword' => 'En Erennerung för di Passwood es ungerwähs. Domet ene fiese Möpp keine Dress fabrizeet, passeet dat hüchstens eimol en {{PLURAL:$1|der Stund|$1 Stunde|nidd ens eine Stund}}.',
+'throttled-mailpassword' => 'En Erennerung för di Passwood es alld ongerwähs, un mieh wi eimol en {{PLURAL:$1|der Schtond|$1 Schtonde|nidd ens ener Schtond}} dommer kein schecke.',
 'mailerror' => 'Fähler beim E-Mail Verschecke: $1.',
 'acct_creation_throttle_hit' => '<b>Schad.</b>
 Besöker fun däm Wiki heh han övver de IP-Addräß, övver di De jraad aam
@@ -769,6 +769,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
 # Email sending
 'php-mail-error-unknown' => 'Nit bekannte Fähler met dä Funxjohn <code lang="en">mail()</code> vum PHP',
 'user-mail-no-addy' => 'Do häs versöhg en <i lang="en">e-mail</i> der ohne en Adräß ze verschecke',
+'user-mail-no-body' => 'En dä <i lang="en">e-mail</i> schteiht nix udder zoh winnisch dren.',
 
 # Change password dialog
 'resetpass' => 'Passwood tuusche udder neu ußjävve',
@@ -791,7 +792,7 @@ Do häs Der enzwesche e neuZweschepasswood jehollt.',
 
 # Special:PasswordReset
 'passwordreset' => 'Et Paßwoot zeröck säze',
-'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm en <i lang="en">e-mail</i> ze krijje, woh jät övver der Zohjang heh obb et Wiki för Desch dren shteiht.',
+'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm e neu Paßwoot faßzelääje.',
 'passwordreset-legend' => 'Et Paßwoot zeröck säze',
 'passwordreset-disabled' => 'Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.',
 'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
@@ -801,8 +802,8 @@ Do häs Der enzwesche e neuZweschepasswood jehollt.',
 'passwordreset-capture-help' => 'Wann De heh e Krüzje määß, kriß de di <i lang="en">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.',
 'passwordreset-email' => 'De Adräß för de <i lang="en">e-mail</i>:',
 'passwordreset-emailtitle' => 'Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Do künns et sällver jewääse sin, öhnswää hät vun dä Adräß $1 en Internet öm
-en e-mail jefrooch, met Daate övver Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
+'passwordreset-emailtext-ip' => 'Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm
+e neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
 $4
 Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
 
@@ -813,8 +814,8 @@ Donn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi
 Do dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot
 entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
 moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
-'passwordreset-emailtext-user' => 'Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm en e-mail jefrooch,
-met Daate övver Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
+'passwordreset-emailtext-user' => 'Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,
+r Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
 $4
 Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
 
@@ -827,9 +828,9 @@ entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
 moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
 'passwordreset-emailelement' => 'Metmaacher Name: $1
 Eijmohl-Paßwoot: $2',
-'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom Zohjang heh es verscheck.',
-'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> es verscheck. Heh dronger kanns De se lässe.',
-'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> sullt verscheck wääde. Heh dronger kanns De se lässe. Dat Verschecke hät ävver nit jeflup, wääje: $1.',
+'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.',
+'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.',
+'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke hät nit jeflup: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
@@ -1051,10 +1052,10 @@ oder fottjeschmesse wääde. Wann Der dat nit rääch es, schriev nix. Et es och
 Dä Tex, dä De heh jescheck häs, dä es {{PLURAL:$1|ein|$1|kei}} Kilobyte jruuß.
 Dat {{PLURAL:$2|es mieh wie ei|sin mieh wie $2|es kei}} Kilobyte. Dat künne mer nit speichere!",
 'readonlywarning' => "'''Opjepass:'''
-De Daatebank es jesperrt woode, wo Do ald am Ändere wors.
+De Daatebank es jesperrt woode, wo Do ald am Ändere wohs.
 Dä.
-Jetz kanns De Ding Änderunge nit mieh avspeichere.
-Dun se bei Dir om Rechner fasshalde un versök et späder noch ens.
+Jetz kanns De Ding Änderunge nit mieh faßhallde lohße.
+Dun se bei Dir om Rechner faßhalde un versöhg et schpäder noch ens.
 
 Nävvebei, dä Datenbank-Köbes hät för et Sperre och ene Jrund aanjejovve: $1",
 'protectedpagewarning' => "'''Opjepass: Die Sigg heh es jäje Veränderunge jeschötz. Nor de Wiki-Köbesse künne se ändere.'''
@@ -1093,6 +1094,8 @@ Ene Jrond weße mer nit.',
 'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
 'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
 'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+'editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
+Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „{{int:prefs-editing}}“ en Dinge Enshtellunge.',
 
 # Content models
 'content-model-wikitext' => 'Wikitäx',
@@ -1354,7 +1357,7 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'search-interwiki-default' => '$1 hät heh di Träffer jefonge:',
 'search-interwiki-more' => '(mieh)',
 'search-relatedarticle' => 'Ähnlesch',
-'mwsuggest-disable' => 'Kein automatische Hölp-Liss per Ajax beim Tippe em Feld för et Söke',
+'mwsuggest-disable' => 'Donn kein automattische Leß met Sigge beim Tippe em Feld för et Söhke aanzeije.',
 'searcheverything-enable' => 'En alle Appachtemangs söhke',
 'searchrelated' => 'ähnlesch',
 'searchall' => 'all',
@@ -1385,15 +1388,7 @@ Sigge us {{GRAMMAR:Dative|{{SITENAME}}}} finge.
 Et es nit jesaht,
 dat dänne ihr Daate topaktuell sin,
 ävver et es besser wie jaa_nix.',
-
-# Quickbar
-'qbsettings' => '„Flöcke Links“',
-'qbsettings-none' => 'Fottlooße, dat well ich nit sinn',
-'qbsettings-fixedleft' => 'Am linke Rand fass aanjepapp',
-'qbsettings-fixedright' => 'Am rächte Rand fass aanjepapp',
-'qbsettings-floatingleft' => 'Am linke Rand am Schwevve',
-'qbsettings-floatingright' => 'Am rächte Rand am Schwevve',
-'qbsettings-directionality' => 'Faß, passend för wi eröm de Schreff för Ding Schprooch jeiht',
+'search-error' => 'An error has occurred while searching: $1',
 
 # Preferences page
 'preferences' => 'ming Enstellunge',
@@ -1971,7 +1966,6 @@ Dröm es <code lang="en">img_auth.php</code> zor Sisherheit heh affjeschalldt.',
 'http-read-error' => 'Et Lässe beim <code lang="en">HTTP</code> es donävve jeange.',
 'http-timed-out' => 'Di <code lang="en">HTTP</code>-Aanforderung hät zoh lang jebruch.',
 'http-curl-error' => 'Ene Fähler es opjetrodde beim Holle vun däm <code lang="en">URL</code>: $1',
-'http-host-unreachable' => 'Mer sen nit noh dämm <i lang="en">URL</i> dorschjekumme.',
 'http-bad-status' => 'Bei dä <code lang="en">HTTP</code>-Aanforderung es e Problem opjetrodde: Fähler&nbsp;$1 — $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2055,7 +2049,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'filerevert-intro' => '<span class="plainlinks">Do bes di Datei \'\'\'[[Media:$1|$1]]\'\'\' op di [$4 Version fum $2 öm $3 Uhr] zeröck aam sätze.</span>',
 'filerevert-comment' => 'Jrond:',
 'filerevert-defaultcomment' => 'Zerök jesaz op di Version fum $1 öm $2 Uhr',
-'filerevert-submit' => 'Zeröcknemme',
+'filerevert-submit' => 'Zeröcknämme',
 'filerevert-success' => '<span class="plainlinks">Di Dattei \'\'\'[[Media:$1|$1]]\'\'\' es jäz op di [$4 Version fum $2 öm $3 Uhr] zerök jesatz.</span>',
 'filerevert-badversion' => 'Mer han kei Version fun dä Datei för dä aanjejovve Zickpunk.',
 
@@ -2139,6 +2133,12 @@ Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
 
 Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
 
+'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
+'pageswithprop-legend' => 'Sigge med en Eijeschaff',
+'pageswithprop-text' => 'Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han',
+'pageswithprop-prop' => 'Dä name vun dä Eijeschaff:',
+'pageswithprop-submit' => 'Lohß Jonn!',
+
 'doubleredirects' => 'Ömleitunge op Ömleitunge',
 'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
 zweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.
@@ -2314,7 +2314,7 @@ eins vun all däm op eimol.',
 'linksearch-ok' => 'Söhke',
 'linksearch-text' => 'Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Naame, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beishpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> 
 
-De Brauserprotokolle, di mer beim Söke aanjäjovve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
+{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
 'linksearch-line' => '„$2“ hät ene Link op $1',
 'linksearch-error' => 'Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.',
 
@@ -2324,15 +2324,6 @@ De Brauserprotokolle, di mer beim Söke aanjäjovve kann, sin: <code>$1</code>,
 'listusers-noresult' => 'Keine Metmaacher jefonge.',
 'listusers-blocked' => '(jespert)',
 
-# Special:ActiveUsers
-'activeusers' => 'Leß met de aktiive Metmaacher',
-'activeusers-intro' => 'Dat heh es en Leß met dä Metmaacher, di {{PLURAL:$1|zick jäßtere|en de läzde $1 Dääsch|hück}} ööhnsjät jemaat han.',
-'activeusers-count' => '{{PLURAL:$1|ein Änderung|$1 Änderunge|kein Änderunge}} {{PLURAL:$3|aam lezde Daach|en de lezte $3 Dääsch|hück}}',
-'activeusers-from' => 'Donn de Metmaacher zeije aff:',
-'activeusers-hidebots' => 'De Bots fott lohße',
-'activeusers-hidesysops' => 'De Wiki_Köbesse fott lohße',
-'activeusers-noresult' => 'Kein Metmaacher jefonge.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Metmaacher-Jruppe-Rääschte',
 'listgrouprights-summary' => 'Hee kütt de Liss met dä Medmaacher-Jruppe, di dat Wiki hee kennt, un denne ier Rääschte.
@@ -2340,7 +2331,7 @@ Mieh övver de einzel Rääschte fenkt Er op de [[{{MediaWiki:Listgrouprights-he
 'listgrouprights-key' => 'Lejend:
 * Dat es e <span class="listgrouprights-granted">jejovve Rääsch</span>
 * Dat es e <span class="listgrouprights-revoked">fottjenumme Rääsch</span>',
-'listgrouprights-group' => 'Jrupp',
+'listgrouprights-group' => 'Jropp',
 'listgrouprights-rights' => 'Räächte',
 'listgrouprights-helppage' => 'Help:Jrupperäächte',
 'listgrouprights-members' => '(opliste)',
@@ -2397,7 +2388,7 @@ Alles klor?',
 'usermessage-editor' => 'Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide',
 
 # Watchlist
-'watchlist' => 'ming Oppassliss',
+'watchlist' => 'ming Oppaßleß',
 'mywatchlist' => 'Oppaßleß',
 'watchlistfor2' => 'För dä $1 $2',
 'nowatchlist' => 'En Ding Oppassliss es nix dren.',
@@ -2405,12 +2396,8 @@ Alles klor?',
 'watchnologin' => 'Nit enjelogg',
 'watchnologintext' => 'Öm Ding Oppassliss ze ändere, mööts de ald [[Special:UserLogin|enjelogg]] sin.',
 'addwatch' => 'En de Oppassliss don',
-'addedwatchtext' => "Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].
-Av jetz, wann die Sigg verändert weed, oder ehr Klaafsigg, dann weed dat en de
-Oppassliss jezeich. Dä Endrach för die Sigg kütt en  '''Fettschreff''' en de
-„[[Special:RecentChanges|Neuste Änderunge]]“, domet De dä do och flöck fengs.
-Wann de dä widder loss wääde wells us Dinger Oppaßleß,
-dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
+'addedwatchtext' => 'Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].
+Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Oppaßleß.',
 'removewatch' => 'Us de Oppassliss nämme',
 'removedwatchtext' => 'Die Sigg „[[:$1]]“ es jetz us de [[Special:Watchlist|Oppassliss]] erusjenomme.',
 'watch' => 'Drop Oppasse',
@@ -2546,6 +2533,8 @@ En Leß met de [[Special:ProtectedPages|em Momang jeschözde Sigge]] ham_mer och
 'prot_1movedto2' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt.',
 'protect-badnamespace-title' => 'Appachtemang nit schözbaa.',
 'protect-badnamespace-text' => 'En dämm Appachtemang kam_mer kein Sigge schöze.',
+'protect-norestrictiontypes-text' => 'Heh di Sigg kam_mer nit schöze, weil et jaa_kein Zoote vun Schoz em Wiki jitt.',
+'protect-norestrictiontypes-title' => 'Di Sigg es nit schözbaa.',
 'protect-legend' => 'Sigg schötze',
 'protectcomment' => 'Aanlaß odder Jrund:',
 'protectexpiry' => 'Duur, wi lang:',
@@ -2561,8 +2550,8 @@ Di Sigg '''„$1“:''' es jetz jrad:",
 'protect-cascadeon' => 'Die Sigg es en enne Schotz-Kaskad. Se es enjebonge en {{PLURAL:$1|die Sigg|$1 Sigge|kein Sigg}}, die per Kaskade-Schotz jeschötz {{PLURAL:$1|es|sin|es}}. Do kanns dä Schotz för die Sigg heh ändere, ävver di Kaskad blief bestonn. Dat heh sin die Sigge en dä Kaskad:',
 'protect-default' => 'Jeede Metmaacher eraan lohße',
 'protect-fallback' => 'Do weet dat Rääsch „$1“ jebruch.',
-'protect-level-autoconfirmed' => 'Donn neu Metmaacher un namelose Metmaacher nit dranlooße',
-'protect-level-sysop' => 'Nor de Wiki-Köbesse dranlooße',
+'protect-level-autoconfirmed' => 'Bloß de automattesch beschtääteschte Metmaacher dranlooße',
+'protect-level-sysop' => 'Bloß de Wiki-Köbesse dranlooße',
 'protect-summary-cascade' => 'met Schotz-Kaskad',
 'protect-expiring' => 'bes öm $3 Uhr (UTC) aam $2',
 'protect-expiring-local' => 'löüf uß: $1',
@@ -2662,8 +2651,7 @@ $1',
 'blanknamespace' => '(Atikkele)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm Metmaacher}} $1
-{{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
+'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
 'contributions-title' => 'Beidräsch fum  $1',
 'mycontris' => 'Beidrähch',
 'contribsub2' => 'För dä Metmaacher: $1 ($2)',
@@ -2837,6 +2825,7 @@ un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rä
 '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!',
+'xffblockreason' => 'En <i lang="en">IP-</i>Adräs en ener <code lang="en">X-Forwarded-For</i> Koppreih es jeschpächt: Et künnt de Dinge udder enem <i lang="en">proxy server</i> zweschedren sing Adräß sin. Der Jrond för et Schpärre woh orschprönglesch: $1',
 'cant-block-while-blocked' => 'Do kanns ander Metmaacher nit sperre, esu lang wi De sellver jesperrt bes.',
 'cant-see-hidden-user' => 'Dä Metmaacher, dä De shperre wells, es al jeshperrt un verschtoche. Weil De nit dat Rääsch häs. Metmaacher ze vershteiche (<code>hideuser</code>), kanns De däm sing Sperr och nit ändere.',
 'ipbblocked' => 'Do kanns kein ander Metmaachere sperrre, weil De sellver jesperrt bes',
@@ -2864,21 +2853,21 @@ un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rä
 'move-page' => 'De Sigg „$1“ ömnenne',
 'move-page-legend' => 'Sigg Ömnenne',
 'movepagetext' => "Heh kanns De en Sigg ömnenne.
-Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
-Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
+Domet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
+Unger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.
 
-Do kannß dat Höksche setze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.
-Links op dä ahle Tittel blieve ävver wie se wore, wann De dat Höksche nit setz.
-Dat heiß, dann moß De selver nohluure, ov do jetz [[Special:DoubleRedirects|dubbelde Ömleidunge]] udder [[Special:BrokenRedirects|kapodde Ömleidunge]] bei eruskumme.
+Do kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.
+Links op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.
+Dat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.
 Wann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.
-Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorch!
+Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!
 
-De Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es nix drop, oder et es en Ömleitung un se es noch nie jeändert woode.
-Esu kam_mer en Sigg jlich widder zeröck ömnenne, wam_mer sich bem Ömnenne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop steiht.
+De Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.
+Esu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.
 
 '''Oppjepass!'''
-Wat beim Ömnenne erus kütt, künnt en opfällije un villeich stürende Änderung aam Wiki sin, besönders bei öff jebruchte Sigge.
-Alsu bes secher, dat De versteihs, wat De heh am maache bes, ih dat De et mähs!",
+Wat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.
+Alsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
 'movepagetext-noredirectfixer' => "Heh kanns De en Sigg ömnenne.
 Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
 Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
@@ -3158,13 +3147,8 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Stylesheets
 'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
-'standard.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Klassesch“ */',
-'nostalgia.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Nostaljesch“ */',
 'cologneblue.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */',
 'monobook.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */',
-'myskin.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Ming Skin“ */',
-'chick.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Höhnsche“ */',
-'simple.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Eijfach“ */',
 'modern.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */',
 'vector.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */',
 'print.css' => '/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */',
@@ -3177,13 +3161,8 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Scripts
 'common.js' => '/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */',
-'standard.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Klassesch" jescheck */',
-'nostalgia.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Nostaljesch" jescheck */',
 'cologneblue.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Kölsch Blou" jescheck */',
 'monobook.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Monnobooch" jescheck */',
-'myskin.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Ming Skin" jescheck */',
-'chick.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Höhnsche" jescheck */',
-'simple.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Eijfach" jescheck */',
 'modern.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Modern" jescheck */',
 'vector.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Vector" jescheck */',
 'group-autoconfirmed.js' => '/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */',
@@ -3232,6 +3211,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-robot-noindex' => 'kammer nit opnämme',
 'pageinfo-views' => 'De Aanzahl Affroofe',
 'pageinfo-watchers' => 'De Aanzahl Oppaßer för di Sigg',
+'pageinfo-few-watchers' => 'Et jidd_er winnijer wi {{PLURAL:$1|eine|$1|keine}} Oppaßer.',
 'pageinfo-redirects-name' => 'Ömleidong(e) op heh di Sigg',
 'pageinfo-subpages-name' => 'Ongersigg(e) vun heh dä Sigg',
 'pageinfo-subpages-value' => '$1 (dovun {{PLURAL:$2|ein Ömleidong|$2 Ömleidonge|kein Ömleidong}} un {{PLURAL:$3|ein nomaale Sigg|$3 nomaale Sigge|kein nomaale Sigg}})',
@@ -3246,6 +3226,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Ei Zauberwoot|$1 Zauberwööter|Kein Zauberwööter}}',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
 'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
+'pageinfo-transclusions' => 'En {{PLURAL:$1|ein Sigk|$1 Sigge|kein Sigk}} enjeföösch',
 'pageinfo-toolboxlink' => 'Övver heh di Sigg',
 'pageinfo-redirectsto' => 'Leidt öm op',
 'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
@@ -3254,15 +3235,14 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
 'pageinfo-protect-cascading-yes' => 'Joh',
 'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
+'pageinfo-category-info' => 'Aanjaabe övver Saachjroppe',
+'pageinfo-category-pages' => 'De Aanzahl Sigge',
+'pageinfo-category-subcats' => 'De Aanzahl Ongerjroppe',
+'pageinfo-category-files' => 'De Aanzahl Dateie',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostaljesch',
 'skinname-cologneblue' => 'Kölsch Blau',
 'skinname-monobook' => 'MonoBoch',
-'skinname-myskin' => 'Ming Skin',
-'skinname-chick' => 'Höhnche',
-'skinname-simple' => 'Eifach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3343,6 +3323,8 @@ $1',
 'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
 'hours' => '{{PLURAL:$1|ein Schtundt|$1 Schtunde|kein Schtundt}}',
 'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'months' => '{{PLURAL:$1|Eine&nbsp;Monhnd|$1&nbsp;Mohnde|Keine&nbsp;Monhnd}}',
+'years' => '{{PLURAL:$1|Ein&nbsp;Jonhr|$1&nbsp;Johre|Kei&nbsp;Jonhr}}',
 'ago' => 'vür $1',
 'just-now' => 'jraad äävens',
 
@@ -3943,7 +3925,7 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'bitrate-yottabits' => '$1&nbps;Ybps',
 
 # Live preview
-'livepreview-loading' => 'Ben am Lade …',
+'livepreview-loading' => 'Ben aam Laade{{int:ellipsis}}',
 'livepreview-ready' => 'Fädesch jelaade.',
 'livepreview-failed' => 'De lebendije Vör-Ansich klapp jrad nit.
 Don de nomaale Vör-Ansich nemme.',
@@ -4076,7 +4058,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 'specialpages-group-highuse' => 'Öff jebruch…',
 'specialpages-group-pages' => 'Siggeliste',
 'specialpages-group-pagetools' => 'Werrekzüch för Sigge',
-'specialpages-group-wiki' => 'Werrekzüch un Date vum Systeem',
+'specialpages-group-wiki' => 'Werrekzüch un Daate vum Syßteem',
 'specialpages-group-redirects' => '{{int:nstab-special}}e, die ömleite, söke, un finge',
 'specialpages-group-spam' => 'Werrekzüch jäje SPÄM',
 
@@ -4141,23 +4123,25 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 'htmlform-submit' => 'Lohß Jonn!',
 'htmlform-reset' => 'Änderunge retuur nämme',
 'htmlform-selectorother-other' => 'Annder',
+'htmlform-no' => 'Nää',
+'htmlform-yes' => 'Joh',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
 'sqlite-no-fts' => 'Version $1 (kann ävver nit en janze Täxte söhke)',
 
 # New logging system
-'logentry-delete-delete' => ' $1 hät di Sigg „$3“ fottjeschmeße.',
-'logentry-delete-restore' => 'Dä $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt..',
-'logentry-delete-event' => 'Dä $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}}  vun dä Sigg „$3“ $4.',
-'logentry-delete-revision' => 'Dä $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}}  vun dä Sigg „$3“ $4.',
-'logentry-delete-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ verändert.',
-'logentry-delete-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ verändert.',
-'logentry-suppress-delete' => ' $1 hät di Sigg „$3“ ongerdröck.',
-'logentry-suppress-event' => 'Dä $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}}  vun dä Sigg „$3“ $4.',
-'logentry-suppress-revision' => 'Dä $1 hät heimlesh för {{PLURAL:$5|ein Version|$5 Versione|kein Version}}  vun dä Sigg „$3“ $4.',
-'logentry-suppress-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ heimlesch verändert.',
-'logentry-suppress-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
+'logentry-delete-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.',
+'logentry-delete-restore' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt.',
+'logentry-delete-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
+'logentry-delete-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-delete-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en de Logbööscher vun dä Sigg „$3“ verändert.',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ verändert.',
+'logentry-suppress-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ ongerdröck.',
+'logentry-suppress-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} en dä Sigg „$3“ $4.',
+'logentry-suppress-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesch för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en dä Logbööscher op dä Sigg „$3“ heimlesch verändert.',
+'logentry-suppress-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
 'revdelete-content-hid' => 'der Enhalt verstoche',
 'revdelete-summary-hid' => 'dat Fäld „{{int:summary}}“ vershtoche',
 'revdelete-uname-hid' => 'der Name vum Metmaacher verstoche',
@@ -4166,16 +4150,27 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 'revdelete-uname-unhid' => 'der Name vum Metmaacher öffentlesh jemaat',
 'revdelete-restricted' => ', och för de Wiki-Köbesse',
 'revdelete-unrestricted' => ', och för de Wiki-Köbesse',
-'logentry-move-move' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
-'logentry-move-move-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
-'logentry-move-move_redir' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleingungssigg fottjeschmeße.',
-'logentry-move-move_redir-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongssigg fottjeschmeße un kein neue Ömliedongssig aanjelaat.',
-'logentry-patrol-patrol' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
-'logentry-patrol-patrol-auto' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
-'logentry-newusers-newusers' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create2' => 'Dä $1 hät dä $3 als ene neue Metmaacher aanjelaat.',
-'logentry-newusers-autocreate' => 'Dä $1 wood automattesch als Metmaacher aanjelaat.',
+'logentry-move-move' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
+'logentry-move-move-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
+'logentry-move-move_redir' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleindongßsigg fottjeschmeße.',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongßsigg fottjeschmeße un kein neue Ömleidongßsig aanjelaat.',
+'logentry-patrol-patrol' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
+'logentry-patrol-patrol-auto' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
+'logentry-newusers-newusers' => '{{GENDER:$2
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue Metmaacherėn
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue Metmaacherėn
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'logentry-newusers-create' => '{{GENDER:$4
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue Metmaacherėn
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue Metmaacherėn
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'logentry-newusers-create2' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $3 wood {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.',
+'logentry-newusers-byemail' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} aanjelaat un {{GENDER:$4|sing|em sing|däm sing|dä iehr|däm sing}} Paßwoot met der <i lang="en>e-mail</i> verscheck.',
+'logentry-newusers-autocreate' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood automattesch {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} aanjelaat.',
 'logentry-rights-rights' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.',
 'logentry-rights-rights-legacy' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.',
 'logentry-rights-autopromote' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.',
@@ -4234,6 +4229,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-ok-but-empty' => 'Fähler: Mer krijje kein Antwoot vum ẞööver.',
 'api-error-overwrite' => 'En Dattei ze övverschrieve es nit zohjelohße.',
 'api-error-stashfailed' => 'Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.',
+'api-error-publishfailed' => 'Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.',
 'api-error-timeout' => 'Dä ẞööver hät en dä jewennde Zick nit jeantwoot.',
 'api-error-unclassified' => 'Ene Fähler es opjetrodde, der mer nit kenne.',
 'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
@@ -4244,14 +4240,17 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-verification-error' => 'Di Dattei künnt kappott sin, udder en verkehte Endong em Naame han.',
 
 # Durations
-'duration-seconds' => '{{PLURAL:$1|ein Sekund|$1 Sekunde|kein Sekund}}',
-'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
-'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
-'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
-'duration-weeks' => '{{PLURAL: $1|en Woch|$1 Woche|kein Woch}}',
-'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
-'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
-'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
-'duration-millennia' => '{{PLURAL:$1|e Johrdousend|$1 Johrdousende|kei Johrdousend}}',
+'duration-seconds' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'duration-minutes' => '{{PLURAL:$1|ein&nbsp;Menot|$1&nbsp;Menotte|kein&nbsp;Menot}}',
+'duration-hours' => '{{PLURAL:$1|en&nbsp;Schtond|$1&nbsp;Schtonde|kein&nbsp;Schtond}}',
+'duration-days' => '{{PLURAL:$1|ene&nbsp;Daach|$1&nbsp;Dääsch|keine&nbsp;Daach}}',
+'duration-weeks' => '{{PLURAL: $1|en&nbsp;Woch|$1&nbsp;Woche|kein&nbsp;Woch}}',
+'duration-years' => '{{PLURAL:$1|e&nbsp;Johr|$1&nbsp;Johre|kei&nbsp;Johr}}',
+'duration-decades' => '{{PLURAL:$1|zehn&nbsp;Johre|$1&nbsp;Johzehnte|kei&nbsp;Johzehnt}}',
+'duration-centuries' => '{{PLURAL:$1|e&nbsp;Johhondert|$1&nbsp;Johhonderte|kei&nbsp;Johhondert}}',
+'duration-millennia' => '{{PLURAL:$1|e&nbsp;Johdousend|$1&nbsp;Johdousende|kei&nbsp;Johdousend}}',
+
+# Image rotation
+'rotate-comment' => 'Dat Beld wood öm {{PLURAL:$1|$1 Jraad}} esu eröm jedrieht, wi der Ohrzeijer leuf.',
 
 );
index 1b1a99d..fb2c736 100644 (file)
@@ -662,8 +662,8 @@ Astengkirina dawî bi referansa li jêr hatiye piştrastkirin:',
 'userjspreview' => "'''Zanibe ku tu tenê JavaScript'a xwe diceribînî, ew hê nehatiye tomarkirin!'''",
 'updated' => '(Hate rojanekirin)',
 'note' => "'''Nîşe:'''",
-'previewnote' => "'''Ji bîr neke ku ev bi tenê çavdêriyek e.'''
-Ev rûpel hîn nehatiye tomarkirin!",
+'previewnote' => "'''Ji bîr neke ku ev tenê pêşdîtinek e.'''
+Guhertinên te hê nehatine tomarkirin!",
 'continue-editing' => 'Guhertinê bidomîne',
 'editing' => 'Biguherîne: "$1"',
 'creating' => '$1 tê çêkirin',
@@ -821,7 +821,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Vebijartinên lêgerrînê',
 'searchmenu-exists' => "'''Rûpeleke bi navê \"[[:\$1]]\" li ser vê wîkiyê heye.'''",
-'searchmenu-new' => 'Rûpela "[[:$1]]" li ser vê derê çêke!',
+'searchmenu-new' => 'Rûpela "[[:$1]]" çêke!',
 'searchhelp-url' => 'Help:Alîkarî',
 'searchprofile-articles' => 'Rûpelên naverokê',
 'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
@@ -1351,12 +1351,6 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'listusers-noresult' => 'Bikarhêner nehate dîtin.',
 'listusers-blocked' => '(hate astengkirin)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lîsteya bikarhênerên çalak',
-'activeusers-hidebots' => "Bot'an veşêre",
-'activeusers-hidesysops' => 'Rêveberan veşêre',
-'activeusers-noresult' => 'Tu bikarhêner nehate dîtin.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Mafên koma bikarhêner',
 'listgrouprights-group' => 'Kom',
@@ -1601,7 +1595,7 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'whatlinkshere-hideredirs' => 'Beralîkirinan $1',
 'whatlinkshere-hidetrans' => 'Naverokan $1',
 'whatlinkshere-hidelinks' => 'Girêdanan $1',
-'whatlinkshere-hideimages' => '$1 lînkên wêneyan',
+'whatlinkshere-hideimages' => 'Girêdanên wêneyan $1',
 'whatlinkshere-filters' => 'Parzûn',
 
 # Block/unblock
@@ -1619,14 +1613,14 @@ Sedemekê binivîse!",
 'ipbreason' => 'Sedem',
 'ipbreasonotherlist' => 'Sedemeke din',
 'ipbreason-dropdown' => '*Sedemên astengkirinê
-** vandalîzm
-** agahiya şaş kire gotarekê
-** naveroka rûpelekê vala kir
-** girêdanên xerab tevlî rûpelan dikir
-** tiştên tewş dikir gotaran
-** heqaretkirin
-** pir hesab bikaranîn
-** navekî ku nayê pejirandin',
+** Vandalîzm
+** Agahiya şaş dikire gotarekê
+** Naveroka rûpelekê vala kir
+** Girêdanên xerab tevlî rûpelan dikir
+** Tiştên tewş tevlî gotaran dikir
+** Heqaretkirin
+** Pir hesab bikaranîn
+** Navekî ku nayê pejirandin',
 'ipbcreateaccount' => 'Çêkirina hesaban qedexe bike',
 'ipbemailban' => 'Ji bo şandina e-nameyan qedexe bike.',
 'ipbenableautoblock' => "Otomatîk IP'yên niha û yên nû yê vê bikarhênerê astengbike.",
@@ -1743,6 +1737,7 @@ da bikarî navê wê rûpelê biguherînî.',
 'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
 'movelogpage' => 'guhertina nav',
 'movelogpagetext' => 'Li jêr lîsteyek ji rûpelan ku navê wan hatiye guherandin heye.',
+'movenosubpage' => 'Binrûpelên vê rûpelê tune ne.',
 'movereason' => 'Sedem',
 'revertmove' => 'şûnde vegerîne',
 'delete_and_move' => 'Jêbibe û nav biguherîne',
@@ -1874,6 +1869,8 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'pageinfo-redirectsto-info' => 'agahî',
 'pageinfo-contentpage-yes' => 'Erê',
 'pageinfo-protect-cascading-yes' => 'Erê',
+'pageinfo-category-pages' => 'hejmara rûpelan',
+'pageinfo-category-subcats' => 'Hejmara binkategoriyan',
 
 # Patrolling
 'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
@@ -2115,11 +2112,13 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'specialpages-group-users' => 'Bikarhêner û maf',
 'specialpages-group-pages' => 'Lîstên rûpelan',
 'specialpages-group-pagetools' => 'Amûrên rûpelê',
+'specialpages-group-wiki' => 'Dane û amûr',
 
 # Special:BlankPage
 'blankpage' => 'Rûpela vala',
 
 # Special:Tags
+'tag-filter' => 'Parzûna [[Special:Tags|nîşankirinê]]:',
 'tag-filter-submit' => 'Parzûn',
 'tags-title' => 'Nîşankirin',
 'tags-tag' => 'Tag name',
index 4682739..2585393 100644 (file)
@@ -188,8 +188,8 @@ $messages = array(
 'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
 'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
 'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => 'Utere editore externo semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Utere editore dissimilitudine externa semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manial:External_editors More information.])',
+'tog-externaleditor' => 'Editore externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
+'tog-externaldiff' => 'Editore dissimilitudinum externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
 'tog-showjumplinks' => 'Sinere nexus ostendi forma "salire ad" monstrata',
 'tog-uselivepreview' => 'Praevisum viventem adhibere (JavaScript)',
 'tog-forceeditsummary' => 'Si recensionem non summatim descripsero, me roga si continuare velim',
@@ -274,6 +274,9 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Huic categoriae est solum unus fasciculus.|Huic categoriae {{PLURAL:$1|est hic fasciculus|sunt hi $1 fasciculi}} ex omnino $2 fasciculis.}}',
 'category-file-count-limited' => 'Huic categoriae {{PLURAL:$1|est hic fasciculus|sunt hi $1 fasciculi}}.',
 'listingcontinuesabbrev' => 'cont.',
+'index-category' => 'Paginae quae in indice sunt',
+'noindex-category' => 'Paginae quae non in indice sunt',
+'broken-file-category' => 'Paginae cum nexibus ad fasciculos ruptis',
 
 'about' => 'De hoc',
 'article' => 'Pagina contenta continens',
@@ -868,14 +871,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'search-external' => 'Inquisitio externalis',
 'searchdisabled' => 'Per {{grammar:accusative|{{SITENAME}}}} ad tempus non potes quaerere. Interea per [http://www.google.com Googlem] quaeras. Nota indices {{grammar:genitive|{{SITENAME}}}} contentorum apud Googlem fortasse antiquiores esse.',
 
-# Quickbar
-'qbsettings' => 'Figuratio claustri celeris',
-'qbsettings-none' => 'Nullus',
-'qbsettings-fixedleft' => 'Constituere a sinistra',
-'qbsettings-fixedright' => 'Constituere a dextra',
-'qbsettings-floatingleft' => 'Innens a sinistra',
-'qbsettings-floatingright' => 'Innens a dextra',
-
 # Preferences page
 'preferences' => 'Praeferentiae',
 'mypreferences' => 'Praeferentiae',
@@ -943,6 +938,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'yourlanguage' => 'Lingua:',
 'yourvariant' => 'Differentia linguae contentorum:',
 'yournick' => 'Subscriptio nova:',
+'prefs-help-signature' => 'Cum in paginis disputationum scribas, "<nowiki>~~~~</nowiki>" conscribe, quod in subscriptionem tuam et indicationem temporis convertetur.',
 'badsig' => 'Subscriptio cruda non est valida; scrutina affixa HTML.',
 'badsiglength' => 'Subscriptio tua nimis longa est.
 {{PLURAL:$1|Una littera est|$1 litterae sunt}} longitudo maxima.',
@@ -1415,13 +1411,6 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
 'listusers-noresult' => 'Nullus usor inventus.',
 'listusers-blocked' => '(obstructus)',
 
-# Special:ActiveUsers
-'activeusers' => 'Index usorum activorum',
-'activeusers-count' => '{{PLURAL:$1|una recensio recens|$1 recensiones recentes}} {{PLURAL:$3|die proximo|in diebus $3 proximis}}',
-'activeusers-hidebots' => 'Celare automata',
-'activeusers-hidesysops' => 'Celare magistratus',
-'activeusers-noresult' => 'Nullus usor inventus.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Gregum usorum potestates',
 'listgrouprights-group' => 'Grex',
@@ -1984,7 +1973,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'pageinfo-toolboxlink' => 'De hac pagina',
 
 # Skin names
-'skinname-standard' => 'Norma',
 'skinname-cologneblue' => 'Caerulus Colonia',
 
 # Patrolling
index e5ddc84..a0825ec 100644 (file)
@@ -211,8 +211,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Àmostrar el kadhar de usadores que están akavidando las hojas',
 'tog-oldsig' => 'La firma presente',
 'tog-fancysig' => 'Tratar la firma como un vikiteksto (sin un atamiento otomatiko)',
-'tog-externaleditor' => 'Yir usando un ēdditor esterno (es sólo para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-externaldiff' => 'Yir usando un comparador (diff) esterno (sólo es para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
 'tog-showjumplinks' => 'Aktivar los atamientos de ayudo "{{int:jumpto}}"',
 'tog-uselivepreview' => 'Usar el "previsteo bivo" (JavaScript es menester) (eksperimental)',
 'tog-forceeditsummary' => 'Avizarme cuando dexo el somaryo vazío',
@@ -239,7 +237,7 @@ $messages = array(
 'editfont-serif' => 'Tipografía serif',
 
 # Dates
-'sunday' => 'Aljhadh',
+'sunday' => 'Aljhad',
 'monday' => 'Lunes',
 'tuesday' => 'Martes',
 'wednesday' => 'Miércoles',
@@ -256,7 +254,7 @@ $messages = array(
 'january' => 'Enero',
 'february' => 'Hevrero',
 'march' => 'Março',
-'april' => 'Avril',
+'april' => 'Abril',
 'may_long' => 'Mayo',
 'june' => 'Juño',
 'july' => 'Jullo',
@@ -268,7 +266,7 @@ $messages = array(
 'january-gen' => 'Enero',
 'february-gen' => 'Hevrero',
 'march-gen' => 'Março',
-'april-gen' => 'Avril',
+'april-gen' => 'Abril',
 'may-gen' => 'Mayo',
 'june-gen' => 'Juño',
 'july-gen' => 'Jullo',
@@ -280,7 +278,7 @@ $messages = array(
 'jan' => 'Ene',
 'feb' => 'Hev',
 'mar' => 'Mar',
-'apr' => 'Avr',
+'apr' => 'Abr',
 'may' => 'May',
 'jun' => 'Juñ',
 'jul' => 'Jull',
index d7a4bdb..e84ecab 100644 (file)
@@ -195,7 +195,7 @@ $messages = array(
 'tog-editsection' => "Linke fir d'Ännere vun eenzelnen Abschnitter weisen",
 'tog-editsectiononrightclick' => 'Eenzel Abschnitter mat Rietsklick änneren (JavaScript)',
 'tog-showtoc' => 'Inhaltsverzeechnes weise bei Säite mat méi wéi dräi Iwwerschrëften',
-'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser(fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
+'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
 'tog-watchcreations' => 'Säiten déi ech uleeën a Fichieren déi ech eroplueden op meng Iwwerwaachungslëscht derbäisetzen',
 'tog-watchdefault' => 'Säiten a Fichieren déi ech änneren op meng Iwwerwaachungslëscht derbäisetzen',
 'tog-watchmoves' => 'Säiten a Fichieren déi ech réckelen automatesch op meng Iwwerwaachungslëscht derbäisetzen',
@@ -399,7 +399,7 @@ $messages = array(
 'otherlanguages' => 'An anere Sproochen',
 'redirectedfrom' => '(Virugeleet vu(n) $1)',
 'redirectpagesub' => 'Viruleedungssäit',
-'lastmodifiedat' => "Dës Säit gouf den $1 ëm $2 Auer fir d'lescht geännert.",
+'lastmodifiedat' => "Dës Säit gouf de(n) $1 ëm $2 Auer fir d'lescht geännert.",
 'viewcount' => 'Dës Säit gouf bis elo {{PLURAL:$1|emol|$1-mol}} ofgefrot.',
 'protectedpage' => 'Gespaarte Säit',
 'jumpto' => 'Wiesselen op:',
@@ -728,7 +728,7 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
 'passwordreset-capture-help' => 'Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.',
 'passwordreset-email' => 'E-Mailadress:',
 'passwordreset-emailtitle' => 'Detailer vum Benotzerkont op{{SITENAME}}',
-'passwordreset-emailtext-ip' => "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet eng Erënnerung fir Är Benotzerkonteninformatiounen op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:
+'passwordreset-emailtext-ip' => "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:
 
 $2
 
@@ -1106,7 +1106,7 @@ Dir hutt keen Zougang dozou.',
 'revdelete-no-change' => "'''Opgepasst:''' D'Element vum $2 ëm $1 Auer huet schonn déi ugefrote Sichtbarkeetsastellung.",
 'revdelete-concurrent-change' => "Feeler beim Ännere vum Element vum $1 ëm $2 Auer: säit Statut schéngt geännert ginn ze si während Dir vericht hutt et z'änneren.
 Kuckt w.e.g. an de Logbicher no.",
-'revdelete-only-restricted' => 'Feler beim verstoppe vum Objet vum $2, $1: Dir kënnt keng Objete virun den Administrateure verstoppen ouni och eng vun den aneren Optiounen vum weisen erauszesichen.',
+'revdelete-only-restricted' => 'Feeler beim verstoppe vum Element vum $2, $1: Dir kënnt keng Elementer virun den Administrateure verstoppen ouni och eng vun den aneren Optiounen vum weisen erauszesichen.',
 'revdelete-reason-dropdown' => "* Generell Läschgrënn
 ** Verletzung vun den Droits d'Auteur
 ** Net ubruechte perséinlech Informatioun
@@ -1772,7 +1772,6 @@ Fir eng oprimal Sécherheet ass img_auth.php ausgeschalt.",
 'http-read-error' => 'HTTP-Feeler beim Liesen.',
 'http-timed-out' => 'HTTP-Ufro huet ze laang gebraucht (time out).',
 'http-curl-error' => 'Feeler beim Ofruff vun der URL: $1',
-'http-host-unreachable' => "D'URL konnt net erreecht ginn.",
 'http-bad-status' => 'Et gouf e Problem bäi der HTTP-Ufro: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2097,15 +2096,6 @@ Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
 'listusers-noresult' => 'Kee Benotzer fonnt.',
 'listusers-blocked' => '(gespaart)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lëscht vun den aktive Benotzer',
-'activeusers-intro' => 'Dëst ass eng Lëscht vun de Benotzer déi op iergend eng Manéier an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.',
-'activeusers-count' => '$1 {{PLURAL:$1|Aktioun|Aktiounen}} {{PLURAL:$3|gëschter|an de leschten $3 Deeg}}',
-'activeusers-from' => 'Benotzer weisen, ugefaang bäi:',
-'activeusers-hidebots' => 'Botte verstoppen',
-'activeusers-hidesysops' => 'Administrateure verstoppen',
-'activeusers-noresult' => 'Keng Benotzer fonnt.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rechter vun de Benotzergruppen',
 'listgrouprights-summary' => 'Dëst ass eng Lëscht vun den op dëser Wiki definéierte Benotzergruppen an den domat verbonnene Rechter.
@@ -2900,13 +2890,8 @@ Erlaabt et e Grond an de Resumé derbäizesetzen.',
 
 # Stylesheets
 'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
-'standard.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Klassesch''  */",
-'nostalgia.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Nostalgie''  */",
 'cologneblue.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Köln Blo''  */",
 'monobook.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook''  */",
-'myskin.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''MySkin''  */",
-'chick.css' => '/* Dës CSS huet nëmmen Afloss op de Skin "Chick" */',
-'simple.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Einfach''  */",
 'modern.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Modern''  */",
 
 # Scripts
@@ -2984,13 +2969,8 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-category-files' => 'Zuel vun de Fichieren',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Köln Blo',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3582,7 +3562,7 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
 'table_pager_first' => 'Éischt Säit',
 'table_pager_last' => 'Lescht Säit',
 'table_pager_limit' => '$1 Objete pro Säit weisen',
-'table_pager_limit_label' => 'Objete pro Säit:',
+'table_pager_limit_label' => 'Elementer pro Säit:',
 'table_pager_limit_submit' => 'Lass',
 'table_pager_empty' => 'Keng Resultater',
 
@@ -3773,12 +3753,12 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 # New logging system
 'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
 'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
-'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
-'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
+'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
+'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
 'logentry-suppress-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 ewechgeholl",
 'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|huet}} diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
 'revdelete-content-hid' => 'Inhalt verstoppt',
 'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
 'revdelete-uname-hid' => 'Benotzernumm verstoppt',
@@ -3788,8 +3768,8 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
 'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
 'logentry-move-move' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
-'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
-'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
+'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} ouni eng Viruleedung unzeleeën",
+'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen",
 'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
 'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt {{GENDER:$2|markéiert}}",
 'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt  {{GENDER:$2|markéiert}}",
@@ -3874,4 +3854,7 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'duration-centuries' => '$1 {{PLURAL:$1|Joerhonnert|Joerhonnerten}}',
 'duration-millennia' => '$1 {{PLURAL:$1|Millenaire|Millenairen}}',
 
+# Image rotation
+'rotate-comment' => 'Bild ëm $1 {{PLURAL:$1|Grad}} an der Richtung vun der Auer gedréint',
+
 );
index f49b17b..56545c9 100644 (file)
@@ -163,7 +163,7 @@ $messages = array(
 'vector-action-unprotect' => 'Хуьн дегишарун',
 'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикIел гъун кутун (кьилди "Вектор" акунар патал)',
 'vector-view-create' => 'Туькlуьрун',
-'vector-view-edit' => 'Дуьзар хъувун',
+'vector-view-edit' => 'Дуьзарин',
 'vector-view-history' => 'Тарихдиз килигун',
 'vector-view-view' => 'Кlелун',
 'vector-view-viewsource' => 'Чешме къалурун',
@@ -295,12 +295,12 @@ $messages = array(
 # General errors
 'error' => 'Гъалатl',
 'databaseerror' => 'Ганайбурун базадин гъалатI',
-'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тIвар алай ччиндин текст жагъанвач
+'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тӀвар алай ччиндин текст жагъанвач
 
-Ихьтин гьал адет яз алуднавай ччинин масакIавилерин тарихдиз цlуру  рекьяй элячlайла арадал къвезва.
+Ихьтин гьал адет яз алуднавай ччинин масакӀавилерин тарихдиз цӀуру рекьяй элячӀайла арадал къвезва.
 
-Себеб ам туштlа, виридалайни мумкин тирди куьне программада гъалатl жугъурун я
-Тавакъу ийида, URL  къалурна адакай   [[Special:ListUsers/sysop|администратордиз]] хабар це.',
+Себеб ам туштӀа, виридалайни мумкин тирди куьне программада гъалатӀ жугъурун я
+Тавакъу ийида, URL къалурна адакай [[Special:ListUsers/sysop|администратордиз]] хабар це.',
 'missingarticle-rev' => '(жуьре#: $1)',
 'internalerror' => 'КЪенепатан гъалатI',
 'internalerror_info' => 'КЪенепатан гъалатI $1',
@@ -315,7 +315,7 @@ $messages = array(
 'actionthrottled' => 'Фадвилин сергьятар',
 
 # Virus scanner
-'virus-scanfailed' => 'Сканди гъалатl (кулег$1)',
+'virus-scanfailed' => 'Сканди гъалатӀ (кулег$1)',
 'virus-unknownscanner' => 'Малумтушир антивирус',
 
 # Login and logout pages
@@ -327,7 +327,7 @@ $messages = array(
 'login' => 'Гьахьун',
 'nav-login-createaccount' => 'Гьахьун/аккаунт туькlуьрун',
 'loginprompt' => 'Системадиз гьахьун патал "куки" -яр куькlуьрна кIанзава',
-'userlogin' => 'ГЬахьун/аккаунт туькlуьрун',
+'userlogin' => 'Гьахьун/аккаунт туькӀуьрун',
 'userloginnocreate' => 'Гьахьун',
 'logout' => 'ЭкъечIун',
 'userlogout' => 'ЭкъечIун',
@@ -340,7 +340,7 @@ $messages = array(
 'userlogin-resetlink' => 'Гьахьунин куьлуь-шуьлуьяр рикlел алатнани?',
 'createaccountmail' => 'Э-чар галаз',
 'createaccountreason' => 'Себеб:',
-'loginerror' => 'ГЬахьунин гъалатI',
+'loginerror' => 'Гьахьунин гъалатӀ',
 'createaccounterror' => 'И аккаунт туькIуьриз мумкин ттуш: $1',
 'loginsuccesstitle' => 'Агалкьунралди гьахьун',
 'wrongpasswordempty' => 'Тавакъу ийида, ичIи тушир парол ттур.',
@@ -866,7 +866,7 @@ $messages = array(
 'disambiguationspage' => 'Template:гзафманавал',
 
 'brokenredirects-edit' => 'дегишарун',
-'brokenredirects-delete' => 'кÑ\8aакÑ\8aудун',
+'brokenredirects-delete' => 'алудун',
 
 'withoutinterwiki-submit' => 'КЪалурун',
 
@@ -880,7 +880,7 @@ $messages = array(
 'protectedpages' => 'Хвенвай ччинар',
 'listusers' => 'Уртахрин сиягь',
 'usercreated' => '{{GENDER:$3|Created}} идав $1 идал $2',
-'newpages' => 'ЦIийи ччинар',
+'newpages' => 'ЦӀийи ччинар',
 'newpages-username' => 'Иштиракчидин тlвар',
 'ancientpages' => 'виридалайни цIуру ччинар',
 'move' => 'ТIвар эхцигун',
@@ -1326,6 +1326,11 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 'compare-page1' => 'Чар 1',
 
 # New logging system
+'logentry-move-move' => '$3 макъаладин тӀвар $4 -диз масакӀа хъувуна',
+'logentry-move-move-noredirect' => '$3 макъаладин тӀвар, ракъурунин винелай $4 -диз масакӀа хъувуна',
+'logentry-move-move_redir' => '$3 макъаладин тӀвар, ракъурун тун тавуна $4 -диз масакӀа хъувуна',
+'logentry-move-move_redir-noredirect' => '$3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз масакӀа хъувуна',
+'logentry-newusers-autocreate' => 'Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва',
 'rightsnone' => '(садни)',
 
 # Feedback
index 9b439ce..6f91fe0 100644 (file)
@@ -617,7 +617,7 @@ Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'gotaccount' => "Jau turite paskyrą? '''$1'''.",
 'gotaccountlink' => 'Prisijunkite',
 'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
-'createaccountmail' => 'el. paštu',
+'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
 'createaccountreason' => 'Priežastis:',
 'badretype' => 'Įvesti slaptažodžiai nesutampa.',
 'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
@@ -662,6 +662,7 @@ Prašome prisijungti vėl, kai jūs jį gausite.',
 'eauthentsent' => 'Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.
 Prieš išsiunčiant kitą laišką į jūsų dėžutę, jūs turite vykdyti nurodymus laiške, kad patvirtintumėte, kad dėžutė tikrai yra jūsų.',
 'throttled-mailpassword' => 'Slaptažodžio priminimas jau buvo išsiųstas, per {{PLURAL:$1|$1 paskutinę valandą|$1 paskutines valandas|$1 paskutinių valandų}}.
+
 Norint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas {{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}.',
 'mailerror' => 'Klaida siunčiant paštą: $1',
 'acct_creation_throttle_hit' => 'Šio projekto lankytojai, naudojantys jūsų IP adresą, sukūrė {{PLURAL:$1|$1 paskyrą|$1 paskyras|$1 paskyrų}} per paskutiniąją dieną, o tai yra didžiausias leidžiamas kiekis per šį laiko tarpą.
@@ -714,7 +715,7 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
 
 # Special:PasswordReset
 'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami gauti el priminimas jūsų sąskaitos informaciją.',
+'passwordreset-text' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
 'passwordreset-legend' => 'Atstatyti slaptažodį',
 'passwordreset-disabled' => 'Slaptažodžių atstatymai šiame wikyje išjungti.',
 'passwordreset-pretext' => '{{PLURAL:$1| | Langelyje parašykite vieną duomenų vienetų žemiau}}',
@@ -724,8 +725,15 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
 'passwordreset-capture-help' => 'Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.',
 'passwordreset-email' => 'E-pašto adresas:',
 'passwordreset-emailtitle' => 'Paskyros informacija apie {{sitename}}',
-'passwordreset-emailtext-ip' => 'Kažkas (tikriausiai jūs, IP adresu $1 ) paprašė informacijos priminimas jūsų! N! sąskaitą {{sitename}} ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}} N!! N!, susijusių su šiuo e-pašto adresą!: N!! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai}} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
-'passwordreset-emailtext-user' => 'Vartotojo $1 d. {{sitename}} prašoma informacija priminimas jūsų sąskaitos {{sitename}}! N! ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}}, susijusių su šiuo e-pašto adresą:! N! N! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai }} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
+'passwordreset-emailtext-ip' => 'Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu $2
+
+{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigsis po {{PLURAL:$5|vienos dienos| $5 dienų}}. 
+
+Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.',
+'passwordreset-emailtext-user' => 'Naudotojas $1 svetainėje {{SITENAME}} sukūrė užklausą slaptažodžio priminimui svetainėje {{SITENAME}}
+($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. 
+
+{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galioti po {{PLURAL:$5|vienos dienos|$5 dienų}}. Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas padarė tai be jūsų žinios arba jūs prisiminėte savo pirminį slaptažodį, ir jūs nebenorite jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.',
 'passwordreset-emailelement' => 'Naudotojo vardas: $1
 Laikinas slaptažodis: $2',
 'passwordreset-emailsent' => 'Priminimo laiškas buvo išsiųstas.',
@@ -2060,15 +2068,6 @@ Palaikomi protokolai: <code>$1</code> (nei vieno iš jų nenurodykite paieškoje
 'listusers-noresult' => 'Nerasta jokių naudotojų.',
 'listusers-blocked' => '(užblokuotas)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktyvių naudotojų sąrašas',
-'activeusers-intro' => 'Tai naudotojų sąrašas, kurie ką nors padarė per $1 {{PLURAL:$1|paskutinę dieną|paskutines dienas|paskutinių dienų}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} per $3 {{PLURAL:$3|paskutinę dieną|paskutines dienas|paskutinių dienų}}',
-'activeusers-from' => 'Rodyti naudotojus, pradedant:',
-'activeusers-hidebots' => 'Slėpti robotus',
-'activeusers-hidesysops' => 'Slėpti administratorius',
-'activeusers-noresult' => 'Nerasta jokių naudotojų.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Naudotojų grupių teisės',
 'listgrouprights-summary' => 'Žemiau pateiktas naudotojų grupių, apibrėžtų šioje wiki, ir su jomis susijusių teisių sąrašas.
index 30c4628..8f60e6c 100644 (file)
@@ -27,17 +27,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
 'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
-'tog-watchcreations' => 'Ka phêk siamte ka ralvèn zing-ah telh rawh',
+'tog-watchcreations' => 'Ka phêk siamte leh ka taksa hlankaite ka ralvèn zing-ah telh rawh',
 'tog-watchdefault' => 'Ka phêk siamţhatte ka ralvèn zing-ah telh rawh',
-'tog-watchmoves' => 'Ka phêk sawnte ka ralvèn zing-ah telh rawh',
-'tog-watchdeletion' => 'Ka phêk nuaibo apiang ka ralvèn zingah telh rawh',
+'tog-watchmoves' => 'Ka phêk leh taksa sawnte ka ralvèn zing-ah telh rawh',
+'tog-watchdeletion' => 'Ka phêk leh taksa nuaibo apiang ka ralvèn zingah telh rawh',
 'tog-minordefault' => "Siamţhat tawh phawt chu 'tenau'-ah dah vek rawh",
 'tog-previewontop' => 'Siamţhatna bawm hmaah endikna dah rawh',
 'tog-previewonfirst' => 'Siamţhat vawi khatnaah endikna tilang rawh',
 'tog-nocache' => 'Fanna-in phêk a cache tur veng rawh',
-'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
+'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk emaw taksa pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
 'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin e-lehkha min thawn rawh',
-'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh e-lehkha min thawn tho rawh',
+'tog-enotifminoredits' => 'Phêk leh taksa siamţhat tenauah pawh e-lehkha min thawn tho rawh',
 'tog-enotifrevealaddr' => 'Hriattirna email zingah ka email address pho lang rawh',
 'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
 'tog-oldsig' => 'Khàrna hming hman mék:',
@@ -60,7 +60,7 @@ $messages = array(
 
 'underline-always' => 'Ziah/ngei ngei',
 'underline-never' => 'Ngai lo',
-'underline-default' => 'Rängpuifanna duhdàn',
+'underline-default' => 'Vun leh rängpuifanna duhdàn',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Siamţhatna hmun hawrawp pian',
@@ -145,8 +145,9 @@ $messages = array(
 'newwindow' => '(Tukverh tharah a inhawng ang)',
 'cancel' => 'Sûtna',
 'moredotdotdot' => 'Chhunzawmna...',
-'mypage' => 'Ka phêk',
-'mytalk' => 'Ka sawihona',
+'morenotlisted' => 'Tarlan loh dang...',
+'mypage' => 'Phêk',
+'mytalk' => 'Sawihona',
 'anontalk' => 'He chenhmun-IP tana sawihona',
 'navigation' => 'Fanzauna',
 'and' => '&#32;leh',
@@ -154,7 +155,7 @@ $messages = array(
 # Cologne Blue skin
 'qbfind' => 'Zawng rawh',
 'qbbrowse' => 'Fangvêl rawh',
-'qbedit' => 'Siamţhatna',
+'qbedit' => 'Siamhatna',
 'qbpageoptions' => 'He phêk hi',
 'qbmyoptions' => 'Ka phêkte',
 'qbspecialpages' => 'Phêk vohbîkte',
@@ -168,7 +169,7 @@ $messages = array(
 'vector-action-protect' => 'Venhimna',
 'vector-action-undelete' => 'Lak kir lehna',
 'vector-action-unprotect' => 'Venhimna dinhmun tidanglam rawh',
-'vector-simplesearch-preference' => 'Sawn awlsam lehzualna rawtna awmtir rawh (Vektawr vun tan chauh)',
+'vector-simplesearch-preference' => 'Zawn awlsam lehzualna rawtna awmtir rawh (Vektawr vun tan chauh)',
 'vector-view-create' => 'Siamna',
 'vector-view-edit' => 'Siamţhatna',
 'vector-view-history' => 'Hunhlui-chanchin',
@@ -178,6 +179,7 @@ $messages = array(
 'namespaces' => 'Hminghmun',
 'variants' => 'Zedang',
 
+'navigation-heading' => 'Fankualna',
 'errorpagetitle' => 'Dik lo',
 'returnto' => '$1 phekah kir leh rawh.',
 'tagline' => '{{SITENAME}} aṭangin',
@@ -224,10 +226,10 @@ $messages = array(
 'viewhelppage' => 'Ţanpuina phêk enna',
 'categorypage' => 'Pawl phêk enna',
 'viewtalkpage' => 'Sawinona en rawh',
-'otherlanguages' => 'Ţawng dangin',
+'otherlanguages' => 'awng dangin',
 'redirectedfrom' => '($1 aṭanga hruailuh a ni)',
 'redirectpagesub' => 'Hruailuhna phêk',
-'lastmodifiedat' => 'Hemi phek hi ni $1,  dar $2 khan siamţhat hnuhnun ber a ni.',
+'lastmodifiedat' => 'Hemi phek hi ni $1,  dar $2 khan siamhat hnuhnun ber a ni.',
 'viewcount' => 'He phêk hi vawi {{PLURAL:$1|khat|$1}} tlawh a ni tawh.',
 'protectedpage' => 'Phêk venhim',
 'jumpto' => 'Tah hian kal rawh:',
@@ -275,11 +277,15 @@ $1',
 'youhavenewmessages' => '($2) $1 i nei.',
 'newmessageslink' => 'thudawn thar',
 'newmessagesdifflink' => 'tihdanglam thar',
+'youhavenewmessagesfromusers' => 'Hmangtu dang {{PLURAL:$3|pakhat|$3}} hnên aṭang $1 i nei ($2)',
+'youhavenewmessagesmanyusers' => 'Hmangtu dang tamtak hnên aṭang $1 i nei nual ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|thudawn thar}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|tihdanglam}} thar',
 'youhavenewmessagesmulti' => '$1-ah thu dawn thar i nei',
-'editsection' => 'siamţhatna',
-'editold' => 'siamţhatna',
+'editsection' => 'siamhatna',
+'editold' => 'siamhatna',
 'viewsourceold' => 'A hnar enna',
-'editlink' => 'siamţhatna',
+'editlink' => 'siamhatna',
 'viewsourcelink' => 'a hnar enna',
 'editsectionhint' => 'Hemi thuhlawm hi siamţha rawh le: $1',
 'toc' => 'A chhung thute',
@@ -340,7 +346,7 @@ Zémpuiin dikhlelhna "<tt>$3: $4</tt>" a rawn khawhkïr.',
 Hei hi dnglm ţhing emaw phêk paih tawh zawmna hlui zui vanga awm a ni tlangpui. 
 
 Chumi a nih si loh chuan khawlthluakah hrik ţhalo i tawng tihna a ni ang. Khawngaihin [[Special:ListUsers/sysop|roreltu]] hnenah  a URL chiang taka sawiin hrilh rawh.',
-'missingarticle-rev' => '(siamţhatna zât: $1)',
+'missingarticle-rev' => '(siamhatna zât: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'Database salin a pu a umphâk laiin database amahin inkhar behtir a ni.',
 'internalerror' => 'Chhunglam dik loh',
@@ -371,10 +377,10 @@ Thil zawn: $2',
 'viewsource-title' => '$1 hnar en rawh',
 'actionthrottled' => 'Thiltih upbeh a ni.',
 'actionthrottledtext' => 'Thu dukdak lo ven nan hun rei lo te chhunga vawi tam tak tih nawn phal loh a ni, i thiltih ngai i tihnawn ngun tawh lutuk avangin dan beh hrih i ni. Nakin deuhvah tum chhin leh rawh.',
-'protectedpagetext' => 'He phêk hi khawih danglam theih loh nan venhim hrih a ni.',
+'protectedpagetext' => 'He phêk hi khawih danglam theih emaw tihchingpen theih loh nana venhim hrih a ni.',
 'viewsourcetext' => 'A hnar i lachhawngin i en thei ang:',
 'viewyourtext' => "'''I siamţhatte''' chu he phêkah hian i enin i lachhawng thei ang.",
-'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni.',
+'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni. Lehlinna tidanglam tur emaw belh tur chuan [//translatewiki.net/ translatewiki.net], MediaWiki lehzauna hmachhawp hi i hmang dawn nia.',
 'sqlhidden' => '(SQL zawhna thuhrûk hrih a ni)',
 'cascadeprotected' => 'He phêk hi siam danglam phal a ni hrih lo, a chhan chu {{PLURAL:$1|he phêk|hêng phêk}}, "a huhova venhim" tih hmanga ven chhunga awm a nih vang a ni: 
 $2',
@@ -385,6 +391,8 @@ $2',
 'titleprotected' => 'He phêk hi hmangtu [[User:$1|$1]] siam phalsak a ni lo. A chhan hetah: "\'\'$2\'\'" hian pêk a ni.',
 'invalidtitle-knownnamespace' => 'Hming pawm loh hminghmun "$2"-a "$3" tih thu chuang.',
 'invalidtitle-unknownnamespace' => 'Hming pawm loh leh hminghmun zât hriat loh $1-a thu chuang "$2"',
+'exception-nologin' => 'I la lût lo',
+'exception-nologin-text' => 'I thiltih emaw hawn tum ti thei tur hian  he wiki-ah hian i luh a ngai',
 
 # Virus scanner
 'virus-badscanner' => "Inremdan dikhlel: Hrik thiantu hriat loh: ''$1''",
@@ -395,12 +403,16 @@ $2',
 'logouttext' => "'''I chhuak fel ta.'''
 Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin <span class='plainlinks'>[$1 lût leh]</span> thei ang.
 I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei, i la  chhuak lo emaw tih mai tùrin.",
+'welcomeuser' => 'Chibai, $1!',
+'welcomecreation-msg' => 'I siangchan siam fel a ni ta.
+[[Special:Preferences|{{SITENAME}}-a i duhphung]] thlâk theihnghilh suh ang che.',
 'yourname' => 'Hmangtuhming:',
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
 'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
 'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
 'yourdomainname' => 'I ram:',
+'password-change-forbidden' => 'Hë wiki-ah hian thurûk i thlâk thei lo.',
 'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
 'login' => 'Luhna',
 'nav-login-createaccount' => 'Luhna / siangchan siamna',
@@ -446,6 +458,7 @@ Khawngaihin tum ţha leh rawh.',
 'noemailcreate' => 'E-chenhmun dik i ziah a ngai.',
 'passwordsent' => '"$1" tana i e-chenhmun pêkah thurûk thawn a ni ta.
 I dawn hnuah i lût dawn nia.',
+'blocked-mailpassword' => 'Phêkte khawih danglam thei lo tùrin i IP hi danbeh a ni; hman khawlohna vèn nan i thurûk dawn lêt leh phalsak i ni tawh lo.',
 'mailerror' => 'e-Lehkha thawn sual: $1',
 'emailauthenticated' => 'I e-chenhmun $2, $3-ah finfiah a ni.',
 'emailnotauthenticated' => 'I e-chenhmun finfiah a la ni lo.
@@ -491,6 +504,7 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
 
 # Special:PasswordReset
 'passwordreset' => 'Thurûk ziakţha rawh',
+'passwordreset-text' => 'I thurûk thlâk turin ahnuaia lehkha khu dah khat ang che.',
 'passwordreset-legend' => 'Thurûk ziakţha rawh',
 'passwordreset-username' => 'Hmangtu hming:',
 'passwordreset-domain' => 'Huamchin:',
@@ -510,6 +524,7 @@ Thurûk lailâwk: $2',
 'changeemail-oldemail' => 'Tùna i e-chenhmun:',
 'changeemail-newemail' => 'E-chenhmun thar:',
 'changeemail-none' => '(pakhat mah)',
+'changeemail-password' => 'I {{SITENAME}} thurûk:',
 'changeemail-submit' => 'E-chenhmun thlâk rawh',
 'changeemail-cancel' => 'Sûtna',
 
@@ -571,7 +586,7 @@ Tihsual palh thilthua heta lo lût i nih chuan i rangpuifanna-a '''letna''' fei
 Phêk dangah [[Special:Search/{{PAGENAME}}| he phêk hming hi i zawng]] thei ang, a nih loh pawhin a laichin 
 <span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} chanchin-ziak dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
 'noarticletext-nopermission' => 'He phêkah hian thu a la awm hrih lo.
-He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang. </span>',
+He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang,</span> mahsé hë phêk siam phalna hi i nei lo tlat thung.',
 'userpage-userdoesnotexist' => 'Hmangtu siangchan "$1" hi hriat a ni lo.
 He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 'userpage-userdoesnotexist-view' => 'Hmangtu siangchan "$1" hi hriat a ni lo.',
@@ -579,6 +594,7 @@ He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'usercssyoucanpreview' => "'''Rawlrûk:''' I CSS fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
 'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
+'updated' => '(Bithuam fel a ni)',
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
 I tihdanglamna dahţhat a la ni lo!",
@@ -589,10 +605,10 @@ I tihdanglamna dahţhat a la ni lo!",
 
 '''Hei hi siamṭhat tumna dànzui pangngai a nih chuan khawngaihin dahṭhat tum nawn leh rawh.'''
 I la dahṭhat theih loh cheu chuan [[Special:UserLogout|chhuah phawt ]] a, luh nawn leh hmang tein han bei vêl chhin lä.",
-'editing' => '$1 i siam(ţha) mék',
+'editing' => '$1 i siamṭha mék',
 'creating' => '$1 i siam mék',
-'editingsection' => '$1 (hlawm) i siam(ţha) mék',
-'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
+'editingsection' => '$1 (hlawm) i siamṭha mék',
+'editingcomment' => '$1 (hlawm thar) i siam mék',
 'editconflict' => 'Siamţhat inchuh: $1',
 'yourtext' => 'I thu tah hian:',
 'storedversion' => 'Ennawnna vawnţhat',
@@ -626,6 +642,13 @@ Nuaibo a ni tawh a nih hmèl.',
 'edit-already-exists' => 'Phêk thar siam theih a ni lo.
 A awm tawh sa.',
 'defaultmessagetext' => 'Thuthawn tùr ziahsa',
+'invalid-content-data' => 'Kentel phal loh thil',
+
+# Content models
+'content-model-wikitext' => 'wikithü',
+'content-model-text' => 'thutluang',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Vaukhanna:''' Siamsa telh a lian leh lutuk.
@@ -634,6 +657,15 @@ Siamsa ţhenkhat hmaih a ni ang.",
 'post-expand-template-argument-warning' => "'''Vaukhanna:''' He phekah hian siamsa kawng kaihparh theih lenzawng nei lian leh lutuk pakhat tal a awm a ni.
 Heng kawngte hi hmaih mai tur.",
 'post-expand-template-argument-category' => 'Siamsa kawng hmaih awmna phekte',
+'parser-template-loop-warning' => 'Siamsa inthawnkual a awm tlat: [[$1]]',
+'language-converter-depth-warning' => 'Ṭawng lehna thûkzawng pèl ($1)',
+'node-count-exceeded-category' => 'Tihbawk theih chin pèl phêkte',
+'node-count-exceeded-warning' => 'Suihbawl theih chin pèl phêkte',
+'expansion-depth-exceeded-category' => 'Tihchiam theih chin pèl phêkte',
+'expansion-depth-exceeded-warning' => 'Tihchiam theih chin phêkin a pèl',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Siangchan siam theih loh',
 
 # History pages
 'viewpagelogs' => 'He phêk chanchin hi en rawh',
@@ -668,6 +700,7 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'rev-delundel' => 'tilang/thup',
 'rev-showdeleted' => 'tihlanna',
 'revdelete-show-file-submit' => 'Aw',
+'revdelete-hide-restricted' => "Roreltute leh midangte paw'n an hmuh theih loh turin hriatna-taksa hi nuaibo rawh",
 'revdelete-radio-set' => 'Aw',
 'revdelete-radio-unset' => 'Aih',
 'revdelete-log' => 'Chhan:',
@@ -746,18 +779,9 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 Google hmangin i lo zawng hrih thei ang.
 {{SITENAME}} chhung zawnawlna hi a hlui lutuk tawh mai thei tih hria ang che.',
 
-# Quickbar
-'qbsettings' => 'Hmanrawliang',
-'qbsettings-none' => 'Pakhat mah',
-'qbsettings-fixedleft' => 'Veilam',
-'qbsettings-fixedright' => 'Dinglam',
-'qbsettings-floatingleft' => 'Veilama lang',
-'qbsettings-floatingright' => 'Dinglama lang',
-'qbsettings-directionality' => 'Bet, i ţawng inziahdàn hawzawnga zirin',
-
 # Preferences page
 'preferences' => 'Duhdàn',
-'mypreferences' => 'Ka duhdàn',
+'mypreferences' => 'Duhthlanna',
 'prefs-edits' => 'Siamţhat zât',
 'prefsnologin' => 'I la lût lo',
 'prefsnologintext' => 'Hmangtu duhdàn siam tùrin i <span class="plainlinks"> [{{fullurl:{{#Special:UserLogin}}|returnto=$1}} inziah luh] </span> a ngai.',
@@ -1351,12 +1375,6 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'listusers-noresult' => 'Hmangtu an awm lo.',
 'listusers-blocked' => '(danbeh)',
 
-# Special:ActiveUsers
-'activeusers' => 'Hmangtu hlun tlarna',
-'activeusers-hidebots' => 'Khawlmi thupna',
-'activeusers-hidesysops' => 'Roreltu thupna',
-'activeusers-noresult' => 'Hmangtu awm lo.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Hmangtu pawl dikna-chanvote',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Dikna-chanvo phalsak</span>
@@ -1388,8 +1406,8 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'usermessage-editor' => 'Thuthawntu khawl',
 
 # Watchlist
-'watchlist' => 'Ka ralvèn',
-'mywatchlist' => 'Ka ralvèn',
+'watchlist' => 'Ralvèn',
+'mywatchlist' => 'Ralvèn',
 'watchlistfor2' => '$1 tan $2',
 'nowatchlist' => 'Rálvèn i nei lo',
 'watchlistanontext' => 'I ralvèn en tùrin emaw siamṭha tùrin $1 rawh.',
@@ -1487,6 +1505,10 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'protect_expiry_invalid' => 'A tàwp hun i sawi kha a hman theih loh.',
 'protect_expiry_old' => 'A tàwp hun i thlan kha a thleng tawh!',
 'protect-unchain-permissions' => 'Vènhimna duhthlan dang chhuah zalenna',
+'protect-fallback' => '"$1" phalna nei hmangtute chauh remtihsakna',
+'protect-level-autoconfirmed' => 'Mahnia infinfiah hmangtute chauh remtihsakna',
+'protect-level-sysop' => 'Roreltute chauh remtihsakna',
+'protect-summary-cascade' => 'venhimchhàwnna',
 'protect-expiring' => '$1 (UTC) thleng',
 'protect-expiring-local' => '$1 thleng',
 'protect-expiry-indefinite' => 'tiamchin awm lo',
@@ -1534,9 +1556,9 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'blanknamespace' => '(Phekpui)',
 
 # Contributions
-'contributions' => 'Hmangtu kutthawhnate',
+'contributions' => '{{GENDER:$1|Hmangtu}} kutthawhnate',
 'contributions-title' => '$1 kutthawhnate',
-'mycontris' => 'Ka kutthawhnate',
+'mycontris' => 'Kutthawhnate',
 'contribsub2' => '$1 tan ($2) .',
 'nocontribs' => 'I zawn mil tihdanglamna a awm miah lo a nih hmel.',
 'uctop' => '(chung)',
@@ -1570,7 +1592,7 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'whatlinkshere-hideredirs' => 'hruailuhna $1',
 'whatlinkshere-hidetrans' => 'ziahhnante $1',
 'whatlinkshere-hidelinks' => 'zawmnate $1',
-'whatlinkshere-hideimages' => 'Thlalâk zawmna $1',
+'whatlinkshere-hideimages' => 'taksa zawmna $1',
 'whatlinkshere-filters' => 'Thlitfimna',
 
 # Block/unblock
index 45cb9d0..a5e402d 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Admresdeserv.
  * @author Dark Eagle
  * @author FnTmLV
  * @author Geimeris
@@ -80,8 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rādīt uzraudzītāju skaitu',
 'tog-oldsig' => 'Pašreizējais paraksts:',
 'tog-fancysig' => 'Vienkāršs paraksts (bez automātiskās saites)',
-'tog-externaleditor' => 'Pēc noklusējuma izmantot ārēju programmu lapu izmainīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
-'tog-externaldiff' => 'Pēc noklusējuma izmantot ārēju programmu izmaiņu parādīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
 'tog-showjumplinks' => 'Rādīt pārlēkšanas saites',
 'tog-uselivepreview' => "Lietot tūlītējo priekšskatījumu (izmanto ''JavaScript''; eksperimentāla iespēja)",
 'tog-forceeditsummary' => 'Atgādināt man, ja kopsavilkuma ailīte ir tukša',
@@ -95,6 +94,7 @@ $messages = array(
 'tog-diffonly' => 'Nerādīt lapu saturu zem izmaiņām',
 'tog-showhiddencats' => 'Rādīt slēptās kategorijas',
 'tog-norollbackdiff' => 'Neņemt vērā atšķirības, veicot atriti',
+'tog-useeditwarning' => 'Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas',
 
 'underline-always' => 'vienmēr',
 'underline-never' => 'nekad',
@@ -122,8 +122,8 @@ $messages = array(
 'thu' => 'Ce',
 'fri' => 'Pk',
 'sat' => 'Se',
-'january' => 'janvārī',
-'february' => 'februārī',
+'january' => 'Janvārs',
+'february' => 'Februārs',
 'march' => 'martā',
 'april' => 'aprīlī',
 'may_long' => 'maijā',
@@ -247,7 +247,7 @@ $messages = array(
 'unprotectthispage' => 'Mainīt šīs lapas aizsardzību',
 'newpage' => 'Jauna lapa',
 'talkpage' => 'Diskusija par šo lapu',
-'talkpagelinktext' => 'diskusija',
+'talkpagelinktext' => 'Diskusija',
 'specialpage' => 'Īpašā Lapa',
 'personaltools' => 'Lietotāja rīki',
 'postcomment' => 'Pievienot komentāru',
@@ -500,6 +500,7 @@ Tādēļ šobrīd no šīs IP adreses vairs nevar izveidot jaunus kontus.',
 'emailconfirmlink' => 'Apstiprināt tavu e-pasta adresi',
 'invalidemailaddress' => 'E-pasta adrese nevar tikt apstiprināta, jo izskatās nederīga. Lūdzu ievadi korekti noformētu e-pasta adresi, vai arī atstāj to lauku tukšu.',
 'cannotchangeemail' => 'Konta e-pasta adresi nevar nomainīt šajā wiki.',
+'emaildisabled' => 'Šī vietne nevar nosūtīt e-pastus.',
 'accountcreated' => 'Konts izveidots',
 'accountcreatedtext' => 'Lietotāja konts priekš $1 tika izveidots.',
 'createaccount-title' => 'Lietotāja konta izveidošana {{grammar:lokatīvs|{{SITENAME}}}}',
@@ -645,7 +646,7 @@ Ja tu esi anonīms lietotājs un uzskati, ka tev ir adresēti neatbilstoši kome
 'noarticletext' => 'Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.',
 'noarticletext-nopermission' => 'Šajā lapā pašlaik nav nekāda teksta.
 Tu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,
-vai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>.',
+vai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.',
 'userpage-userdoesnotexist' => 'Lietotājs "<nowiki>$1</nowiki>" nav reģistrēts.
 Lūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.',
 'userpage-userdoesnotexist-view' => 'Lietotājs "$1" nav reģistrēts.',
@@ -747,6 +748,8 @@ Izskatās, ka lapa ir dzēsta.',
 Tā jau eksistē.',
 'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
 'invalid-content-data' => 'Nederīgi satura dati',
+'editwarning-warning' => 'Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. 
+Ja esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā "rediģēšana"',
 
 # Content models
 'content-model-javascript' => 'JavaScript kods',
@@ -757,6 +760,8 @@ Tā jau eksistē.',
 'post-expand-template-inclusion-warning' => "'''Brīdinājums:''' iekļauto veidņu izmērs ir par lielu.
 Dažas veidnes netiks iekļautas.",
 'post-expand-template-inclusion-category' => 'Lapas, kurām pārsniegts iekļauto veidņu apjoms',
+'post-expand-template-argument-warning' => "'''Brīdinājums:''' Šī lapa satur vairāk neka vienu veidni argumentu, kas ir pārāk liels pec paplašināšanas.
+Šie argumenti ir izlaists.",
 'post-expand-template-argument-category' => 'Lapas, kurās ir izlaisti veidņu argumenti',
 'parser-template-loop-warning' => 'Veidne ir ievietota tādā pašā veidnē: [[$1]]',
 
@@ -959,13 +964,6 @@ $1",
 Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 Ņem vērā, ka meklētāju indeksētais {{grammar:ģenitīvs|{{SITENAME}}}} saturs var būt novecojis.',
 
-# Quickbar
-'qbsettings' => 'Rīku joslas stāvoklis',
-'qbsettings-fixedleft' => 'Fiksēts pa kreisi',
-'qbsettings-fixedright' => 'Fiksēts pa labi',
-'qbsettings-floatingleft' => 'Peldošs pa kreisi',
-'qbsettings-floatingright' => 'Peldošs pa labi',
-
 # Preferences page
 'preferences' => 'Izvēles',
 'mypreferences' => 'Iestatījumi',
@@ -1063,6 +1061,7 @@ Norādītā parametra vērtība būs publiski pieejama.',
 'prefs-help-realname' => 'Īstais vārds nav obligāti jānorāda.
 Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (ieguldījumu {{grammar:lokatīvs|{{SITENAME}}}}).',
 'prefs-help-email' => 'E-pasta adrese nav obligāta, bet ir nepieciešama nozaudētas paroles atjaunošanai.',
+'prefs-help-email-others' => 'Jus ari variet izvelties ka citi jus var kontaktēt uz jusu lietotajā sarunas lapu, neatklājot jus identitāti.',
 'prefs-help-email-required' => 'E-pasta adrese ir obligāta.',
 'prefs-info' => 'Pamatinformācija',
 'prefs-i18n' => 'Internacionalizācija',
@@ -1448,7 +1447,6 @@ Atļauta ir tikai failu piekļuve.',
 # HTTP errors
 'http-invalid-url' => 'Nederīgs URL: $1',
 'http-read-error' => 'HTTP nolasīšanas kļūda.',
-'http-host-unreachable' => 'URL nevarēja sasniegt.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL nevarēja sasniegt',
@@ -1727,14 +1725,6 @@ Skatīt arī [[Special:WantedCategories|''sarkanās'' kategorijas]].",
 'listusers-noresult' => 'Neviens lietotājs nav atrasts.',
 'listusers-blocked' => '(bloķēts)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktīvo lietotāju saraksts',
-'activeusers-intro' => 'Šis ir lietotāju saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.',
-'activeusers-from' => 'Parādīt lietotājus sākot ar:',
-'activeusers-hidebots' => 'Paslēpt botus',
-'activeusers-hidesysops' => 'Paslēpt administratorus',
-'activeusers-noresult' => 'Neviens lietotājs nav atrasts.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Lietotāju grupu tiesības',
 'listgrouprights-summary' => 'Šis ir šajā wiki definēto lietotāju grupu uskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.
@@ -1787,6 +1777,7 @@ Tā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu
 # Watchlist
 'watchlist' => 'Mani uzraugāmie raksti',
 'mywatchlist' => 'Uzraugāmie raksti',
+'watchlistfor2' => 'Priekš $1 ($2)',
 'nowatchlist' => 'Tavā uzraugāmo rakstu sarakstā nav neviena raksta.',
 'watchlistanontext' => 'Lūdzu $1, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.',
 'watchnologin' => 'Neesi iegājis',
@@ -2986,6 +2977,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Nezināma paplašinājuma iezīme "$1"',
+'duplicate-defaultsort' => '\'\'\'Brīdinājums:\'\'\' Noklusējuma kārtošanas atslēga "$2" ignorē kārtošanas atslēga "$1".',
 
 # Special:Version
 'version' => 'Versija',
index 8df81a7..2c3ca64 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Bawoor
  * @author Slamet Serayu (on map-bms.wikipedia.org)
  * @author StefanusRA
  * @author לערי ריינהארט
@@ -45,8 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tidhokna jumlah pangawas',
 'tog-oldsig' => 'Tapak asma sekiye:',
 'tog-fancysig' => 'Tapak asma dianggep dadi teks wiki (ora nganggo pranala otomatis)',
-'tog-externaleditor' => 'Gunakna editor eksternal secara gawan (kanggo sing ahli thok, perlu pengaturan mligi nang komputere rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkape.])',
-'tog-externaldiff' => 'Gunakna diff eksternal secara gawan (kanggo sing ahli thok, perlu pengaturan mligi nang komputere rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkape.])',
 'tog-showjumplinks' => 'Aktifna pranala pitulung "mlumpat maring"',
 'tog-uselivepreview' => 'Gunakna pratayang langsung (mbutuhna JavaScript) (egin jajalan)',
 'tog-forceeditsummary' => 'Emutna inyong anggere durung ngisi kotak ringkesan suntingan',
@@ -185,7 +184,7 @@ $messages = array(
 'errorpagetitle' => 'Kasalahan',
 'returnto' => 'Bali maring $1.',
 'tagline' => 'Sekang {{SITENAME}}',
-'help' => 'Rewang',
+'help' => 'Réwang',
 'search' => 'golet tulisan',
 'searchbutton' => 'Goleti',
 'go' => 'golet',
@@ -291,7 +290,7 @@ Deleng [[Special:Version|kaca versi]].',
 'viewsourcelink' => 'deleng sumbere',
 'editsectionhint' => 'Sunting bagian: $1',
 'toc' => 'Isi',
-'showtoc' => 'tidokna',
+'showtoc' => 'tidhokna',
 'hidetoc' => 'umpetna',
 'collapsible-collapse' => 'Umpetna',
 'collapsible-expand' => 'Tidokna',
@@ -588,12 +587,12 @@ Tembung sandhi sauntara: $2',
 'summary' => 'Ringkesan:',
 'subject' => 'Subyek/judhul:',
 'minoredit' => 'Kiye suntingan cilik',
-'watchthis' => 'Awasana kaca kiye',
+'watchthis' => 'Awasi kaca kiyé',
 'savearticle' => 'Simpen',
 'preview' => 'Pra tayang',
 'showpreview' => 'Pra tayang',
 'showlivepreview' => 'Pratayang langsung',
-'showdiff' => 'Deleng beda',
+'showdiff' => 'Ndeleng bedané',
 'anoneditwarning' => 'Rika ora kadaftar mlebu.
 Alamat IP-ne Rika bakal dicatet nang sajarah panyuntingane kaca kiye.',
 'anonpreviewwarning' => "''Rika durung mlebu log. Nyimpen kaca bakal nyatetna alamat IP-ne Rika nang riwayat suntingan kaca kiye.''",
@@ -909,15 +908,6 @@ Jajal aweh awalan ''all:'' kanggo nggolèti kabèh isi (kalebu kaca dhiskusi, ci
 Rika teyeng nggoleti nganggo Google disit.
 Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu sing lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pangaturan bar pintas',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Tetep, ngetutna maring bentuk skrip sekang basane Rika',
-
 # Preferences page
 'preferences' => 'Preferensi',
 'mypreferences' => 'Preferensi',
@@ -1200,7 +1190,7 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
 'diff' => 'bédane',
 'hist' => 'versi',
 'hide' => 'Umpetna',
-'show' => 'Tidokna',
+'show' => 'Tidhokna',
 'minoreditletter' => 'c',
 'newpageletter' => 'A',
 'boteditletter' => 'b',
@@ -1471,12 +1461,12 @@ Rika teyeng mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sensitif
 'emailuserfooter' => 'Layang kiye dikirimna sekang $1 ming $2 nggunakna fungsi "Layangpanganggo" nang {{SITENAME}}.',
 
 # Watchlist
-'watchlist' => 'Daftar pangawasane inyong',
-'mywatchlist' => 'Daptar pangawasane inyong',
+'watchlist' => 'Daftar sawangané inyong',
+'mywatchlist' => 'Daftar sawangané inyong',
 'watchlistfor2' => 'Kanggo $1 $2',
 'watch' => 'Pantau',
 'unwatch' => 'Batalna pantauan',
-'watchlist-details' => 'Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasane Rika, ningen ora ngitung kaca dhiskusi.',
+'watchlist-details' => 'Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasané Rika, ningèn kaca dhiskusiné ora mélu diétung.',
 'wlshowlast' => 'Tidokna $1 jam $2 dina $3 pungkasan',
 'watchlist-options' => 'Opsi daftar pangawasan',
 
@@ -1793,6 +1783,9 @@ Sing liyane bakal diumpetna sacara ''default''.
 # Core parser functions
 'duplicate-defaultsort' => "'''Pènget:''' Kunci baku sing nggo ngurutna (''Default sort key'') yakuwe \"\$2\" wis nggantèkna kunci baku sing nggo ngurutna sedurungé \"\$1\".",
 
+# Special:FilePath
+'filepath-submit' => 'Golèti',
+
 # Special:SpecialPages
 'specialpages' => 'Kaca-kaca khusus',
 
index 97adada..f91abd3 100644 (file)
@@ -376,8 +376,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Прикажи го бројот на корисници кои набљудуваат',
 'tog-oldsig' => 'Постоечки потпис:',
 'tog-fancysig' => 'Сметај го потписот за викитекст (без автоматска врска)',
-'tog-externaleditor' => 'По основно користи надворешен уредувач (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-externaldiff' => 'По основно користи надворешен програм за споредување верзии (само за стручњаци, потребно е специјално нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-showjumplinks' => 'Овозможи врски на пристапност „скокни на“',
 'tog-uselivepreview' => 'Користи преглед во живо (бара JavaScript) (експериментално)',
 'tog-forceeditsummary' => 'Извести ме кога нема опис на промените',
@@ -392,6 +390,7 @@ $messages = array(
 'tog-showhiddencats' => 'Прикажи скриени категории',
 'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
 'tog-norollbackdiff' => 'Изостави ја разликата по извршено отповикување',
+'tog-useeditwarning' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
 
 'underline-always' => 'Секогаш',
 'underline-never' => 'Никогаш',
@@ -1150,6 +1149,8 @@ $2
 'content-failed-to-parse' => 'Не успеав да ја предадам содржината од типот $2 за моделот $1: $3',
 'invalid-content-data' => 'Неважечки податоци од содржината',
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
+'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
+Ако сте најавени, можете да го исклучите ова предупредување во одделот „{{int:prefs-editing}}“ во вашите нагодувања.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1432,15 +1433,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} пребарувањето е оневозможено.
 Во меѓувреме, можете да пребарувате преку Google.
 Да напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.',
-
-# Quickbar
-'qbsettings' => 'Лента за брз избор',
-'qbsettings-none' => 'Без мени',
-'qbsettings-fixedleft' => 'Неподвижна лево',
-'qbsettings-fixedright' => 'Неподвижна десно',
-'qbsettings-floatingleft' => 'Променлива лево',
-'qbsettings-floatingright' => 'Променлива десно',
-'qbsettings-directionality' => 'Непроменливо зададен, во зависност од насоката на пишување на вашиот јазик',
+'search-error' => 'Се појави грешка при пребарувањето: $1',
 
 # Preferences page
 'preferences' => 'Нагодувања',
@@ -1786,9 +1779,9 @@ $1",
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.jpg]]</nowiki></code>''' за верзија на сликата во целосна големина
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.png|200px|thumb|left|опис]]</nowiki></code>''' за верзија на сликата со големина од 200 пиксели прикажана во соодветна кутија, со опис како што е наведено во '''опис'''
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Податотека.ogg]]</nowiki></code>''' за директно поврзување со податотеката без нејзино прикажување",
-'upload-permitted' => 'Ð\94озволени Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
-'upload-preferred' => 'Ð\9fÑ\80еÑ\84еÑ\80иÑ\80ани Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
-'upload-prohibited' => 'Ð\97абÑ\80анеÑ\82и Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
+'upload-permitted' => 'Ð\94опÑ\83Ñ\88Ñ\82ени Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
+'upload-preferred' => 'Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ани Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
+'upload-prohibited' => 'Ð\9dедопÑ\83Ñ\88Ñ\82ени Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
 'uploadlog' => 'дневник на подигања',
 'uploadlogpage' => 'Дневник на подигања',
 'uploadlogpagetext' => 'Наведен е список на најновите подигања на податотеки.
@@ -1810,8 +1803,8 @@ $1",
 'filetype-mime-mismatch' => 'Податотечната наставка „.$1“ не одговара на утврдениот MIME-тип на податотеката ($2).',
 'filetype-badmime' => 'Податотеките од MIME-тип „$1“ не се дозволени за подигање.',
 'filetype-bad-ie-mime' => 'Не може да се подигне оваа податотека бидејќи Internet Explorer би можел да го препознае како „$1“, што е оневозможен и потенцијално опасен тип на податотека.',
-'filetype-unwanted-type' => "'''„.$1“''' е непосакуван тип на податотека.
-{{PLURAL:$3|Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ан Ñ\82ип Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ|Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ани Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ñ\81е}} $2.",
+'filetype-unwanted-type' => "'''„.$1“''' е непосакуван податотечен тип.
+{{PLURAL:$3|Се Ð¿Ñ\80еÑ\82поÑ\87иÑ\82а Ñ\82ипоÑ\82|Се Ð¿Ñ\80еÑ\82поÑ\87иÑ\82ааÑ\82 Ñ\82иповиÑ\82е}} $2.",
 'filetype-banned-type' => "'''„.$1“''' не е допуштен тип на податотека.
 {{PLURAL:$3|Допуштен тип е|Допуштени типови се}} $2.",
 'filetype-missing' => 'Податотеката нема наставка (на пр. „.jpg“).',
@@ -1828,9 +1821,9 @@ $1",
 'tmp-write-error' => 'Грешка при запис на привремената податотека.',
 'large-file' => 'Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.',
 'largefileserver' => 'Големината на оваа податотека е поголема од максимално дозволената големина од серверот.',
-'emptyfile' => 'Ð\9fодаÑ\82оÑ\82екаÑ\82а Ñ\88Ñ\82о Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½Ð°Ð²Ñ\82е Ð¸Ð·Ð³Ð»ÐµÐ´Ð° Ð´ÐµÐºÐ° Ðµ Ð¿Ñ\80азна.
-Ова може да е поради грешка во името на податотеката.
\92е Ð¼Ð¾Ð»Ð¸Ð¼Ðµ Ð¿Ñ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð½Ð°Ð²Ð¸Ñ\81Ñ\82ина Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½ÐµÑ\82е Ð¾Ð²Ð°а податотека.',
+'emptyfile' => 'Податотеката што ја подигнавте е празна.
+Ова може да се должи на грешка во нејзиното име.
\9fÑ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð½Ð°Ð²Ð¸Ñ\81Ñ\82ина Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½ÐµÑ\82е Ð²Ð°ÐºÐ²Ð°Ñ\82а податотека.',
 'windows-nonascii-filename' => 'Опслужувачот не поддржува податотечни имиња со специјални знаци.',
 'fileexists' => 'Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.
 [[$1|thumb]]',
@@ -2005,7 +1998,6 @@ $1',
 'http-read-error' => 'Грешка при читањето на HTTP.',
 'http-timed-out' => 'HTTP-барањето истече.',
 'http-curl-error' => 'Грешка при добивањето на URL: $1',
-'http-host-unreachable' => 'Не можев да пристапам до URL-адресата',
 'http-bad-status' => 'Се појави проблем во текот на обработката на HTTP-барањето: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2337,15 +2329,6 @@ $1',
 'listusers-noresult' => 'Не е пронајден корисник.',
 'listusers-blocked' => '(блокиран)',
 
-# Special:ActiveUsers
-'activeusers' => 'Список на активни корисници',
-'activeusers-intro' => 'Ова е список на корисници кои биле на некој начин активни во последните $1 {{PLURAL:$1|ден|дена}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}',
-'activeusers-from' => 'Прикажи корисници почнувајќи од:',
-'activeusers-hidebots' => 'Скриј ботови',
-'activeusers-hidesysops' => 'Скриј администратори',
-'activeusers-noresult' => 'Нема пронајдено корисници.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права на кориснички групи',
 'listgrouprights-summary' => 'Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.
@@ -2498,7 +2481,7 @@ $UNWATCHURL
 'historywarning' => "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
 'confirmdeletetext' => 'На пат сте трајно да избришете страница заедно со нејзината историја.
 Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа, дека го правите ова во согласност со [[{{MediaWiki:Policy-url}}|политиката]].',
-'actioncomplete' => 'Дејството е спроведено',
+'actioncomplete' => 'Дејството е извршено',
 'actionfailed' => 'Неуспешно дејство',
 'deletedtext' => '„$1“ е избришана. Евиденција на скорешните бришења ќе најдете на $2.',
 'dellogpage' => 'Дневник на бришења',
@@ -2849,6 +2832,7 @@ $1',
 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..',
 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.
 Не можете да создадете корисничка сметка.',
+'xffblockreason' => 'Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1',
 'cant-block-while-blocked' => 'Не можете да блокирате други корисници додека и вие самите сте блокирани.',
 'cant-see-hidden-user' => 'Корисникот кој се обидувате да го блокирате е веќе блокиран и сокриен. Бидејќи вие немате права за сокривање на корисник, не можете да ги видите или уредувате корисничките блокирања.',
 'ipbblocked' => 'Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани',
@@ -2919,7 +2903,7 @@ $1',
 'movepagebtn' => 'Премести страница',
 'pagemovedsub' => 'Успешно преместување',
 'movepage-moved' => "'''„$1“ е преместена под името „$2“'''",
-'movepage-moved-redirect' => 'Ð\91еÑ\88е Ð½Ð°Ð¿Ñ\80авено пренасочување.',
+'movepage-moved-redirect' => 'Ð\9dапÑ\80авено Ðµ пренасочување.',
 'movepage-moved-noredirect' => 'Создавањето на пренасочување е оневозможено.',
 'articleexists' => 'Веќе постои страница со тоа име, или името што го одбравте е неважечко.
 Изберете друго име.',
@@ -2947,8 +2931,8 @@ $1',
 Дали сакате да ја избришете за да ослободите место за преместувањето?',
 'delete_and_move_confirm' => 'Да, избриши ја страницата',
 'delete_and_move_reason' => 'Избришано за да се ослободи место за преместувањето од „[[$1]]“',
-'selfmove' => 'СÑ\82Ñ\80аниÑ\86аÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¿Ñ\80емеÑ\81Ñ\82ена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ñ\86елниоÑ\82 Ð½Ð°Ñ\81лов Ñ\81е Ñ\81овпаÑ\93а Ñ\81о Ð¿Ñ\80вобиÑ\82ниоÑ\82 Ð½Ð°Ñ\81лов;
-не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80емеÑ\81Ñ\82и Ñ\81Ñ\82Ñ\80аниÑ\86а Ð²Ð¾ Ñ\81амаÑ\82а Ñ\81ебе.',
+'selfmove' => 'Ð\9fоÑ\98довнаÑ\82а Ð¸ Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81е Ð¸Ñ\81Ñ\82овеÑ\82ни;
+не Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82ам.',
 'immobile-source-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
 'immobile-target-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
 'immobile-target-namespace-iw' => 'Меѓувики-врска не може да се користи за преименување на страници.',
@@ -3164,13 +3148,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
-'standard.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Стандардно“ */',
-'nostalgia.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Носталгија“ */',
 'cologneblue.css' => '/* Тука поставениот CSS ќе се применува врз корисниците што го избрале рувото „Келнско сино“ */',
 'monobook.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Монобук“ */',
-'myskin.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Мое руво“ */',
-'chick.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Шик“ */',
-'simple.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Просто“ */',
 'modern.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Современо“ */',
 'vector.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */',
 'print.css' => '/* Тука поставениот CSS ќе се применува во верзијата за печатење */',
@@ -3183,13 +3162,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */',
-'standard.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат стандардното руво */',
-'nostalgia.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Носталгија“ */',
 'cologneblue.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Келнско сино“ */',
 'monobook.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Монобук“ */',
-'myskin.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што користат „Мое руво“ */',
-'chick.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Шик“ */',
-'simple.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Просто“ */',
 'modern.js' => '/* Било која Јава скрипта поставена овде ќе биде вчитана за сите корисници што го користат рувото Современо */',
 'vector.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Векторско“ */',
 'group-autoconfirmed.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на автопотврдените корисници */',
@@ -3270,13 +3244,8 @@ $1',
 'pageinfo-category-files' => 'Број на податотеки',
 
 # Skin names
-'skinname-standard' => 'Класично',
-'skinname-nostalgia' => 'Носталгија',
 'skinname-cologneblue' => 'Келнско сино',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Мое руво',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Просто',
 'skinname-modern' => 'Современо',
 'skinname-vector' => 'Векторско',
 
index 83a8cc4..da6e81d 100644 (file)
@@ -365,8 +365,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ശ്രദ്ധിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം കാണിക്കുക',
 'tog-oldsig' => 'നിലവിലുള്ള ഒപ്പ്:',
 'tog-fancysig' => 'ഒപ്പ് ഒരു വിക്കി എഴുത്തായി പരിഗണിക്കുക (കണ്ണി സ്വയം ചേർക്കേണ്ടതില്ല)',
-'tog-externaleditor' => 'സ്വതേ ബാഹ്യ എഡിറ്റർ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
-'tog-externaldiff' => 'വ്യത്യാസം അറിയാൻ സ്വതേ ബാഹ്യ ഉപകരണങ്ങൾ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
 'tog-showjumplinks' => '"പോവുക" ഗമ്യത കണ്ണികൾ പ്രാപ്തമാക്കുക',
 'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്) (പരീക്ഷണാടിസ്ഥാനം)',
 'tog-forceeditsummary' => 'തിരുത്തലുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക',
@@ -380,6 +378,7 @@ $messages = array(
 'tog-diffonly' => 'രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസത്തിനു താഴെ താളിന്റെ ഉള്ളടക്കം കാണിക്കരുത്.',
 'tog-showhiddencats' => 'മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങളെ കാണിക്കുക',
 'tog-norollbackdiff' => 'റോൾബാക്കിനു ശേഷം വ്യത്യാസം കാണിക്കാതിരിക്കുക',
+'tog-useeditwarning' => 'സേവ് ചെയ്യാത്ത മാറ്റങ്ങളോടു കൂടിയ തിരുത്തൽ താളിൽ നിന്നും പോകുമ്പോൾ എന്നെ അറിയിക്കുക',
 
 'underline-always' => 'എല്ലായ്പ്പോഴും',
 'underline-never' => 'ഒരിക്കലും അരുത്',
@@ -1088,6 +1087,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'content-failed-to-parse' => '$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3',
 'invalid-content-data' => 'അസാധുവായ ഉള്ളടക്ക ഡേറ്റ',
 'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
+'editwarning-warning' => 'ഈ താളിൽ നിന്നു പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കുന്നതാണ്.
+താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "{{int:prefs-editing}}" ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് ഒഴിവാക്കാവുന്നതാണ്.',
 
 # Content models
 'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
@@ -1371,15 +1372,6 @@ $1",
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
 
-# Quickbar
-'qbsettings' => 'ദ്രുത സൗകര്യം',
-'qbsettings-none' => 'ഒന്നുമില്ല',
-'qbsettings-fixedleft' => 'സ്ഥിരമായ ഇടത്',
-'qbsettings-fixedright' => 'സ്ഥിരമായ വലത്',
-'qbsettings-floatingleft' => 'ഇടത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-floatingright' => 'വലത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-directionality' => 'താങ്കളുടെ ഭാഷയുടെ ലിപിയിൽ എഴുത്തുന്ന ദിശയനുസരിച്ച് ശരിയാക്കിയിരിക്കുന്നു',
-
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
 'mypreferences' => 'ക്രമീകരണങ്ങൾ',
@@ -1922,7 +1914,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'http-read-error' => 'എച്ച്.റ്റി.റ്റി.പി. വിവരം പ്രദർശിപ്പിക്കുന്നതിൽ പിഴവ്.',
 'http-timed-out' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥന സമയം കഴിഞ്ഞു.',
 'http-curl-error' => 'യു.ആർ.എൽ. ശേഖരിക്കുന്നതിൽ പിഴവ്: $1',
-'http-host-unreachable' => 'യു.ആർ.എൽ.-ല്‍ എത്തിപ്പെടാന്‍ സാധിച്ചില്ല',
 'http-bad-status' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥനാ വേളയിൽ ഒരു പിഴവുണ്ടായി: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2246,15 +2237,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listusers-noresult' => 'ഈ സംഘത്തിൽ ഉൾപ്പെടുന്ന ഉപയോക്താക്കൾ ആരും ഇല്ല.',
 'listusers-blocked' => '(തടയപ്പെട്ടു)',
 
-# Special:ActiveUsers
-'activeusers' => 'സജീവ ഉപയോക്താക്കളുടെ പട്ടിക',
-'activeusers-intro' => 'ഇത് കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങളിൽ}} ഏതെങ്കിലും വിധത്തിലുള്ള പ്രവർത്തനങ്ങൾ ചെയ്ത ഉപയോക്താക്കളുടെ പട്ടികയാണ്.',
-'activeusers-count' => 'കഴിഞ്ഞ {{PLURAL:$3|ഒരു ദിവസം|$3 ദിവസങ്ങളിൽ}} {{PLURAL:$1|ഒരു പ്രവൃത്തി|$1 പ്രവൃത്തികൾ}}',
-'activeusers-from' => 'ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ കാട്ടുക:',
-'activeusers-hidebots' => 'യന്ത്രങ്ങളെ മറയ്ക്കുക',
-'activeusers-hidesysops' => 'കാര്യനിർവാഹകരെ മറയ്ക്കുക',
-'activeusers-noresult' => 'ഉപയോക്താക്കളില്ല',
-
 # Special:ListGroupRights
 'listgrouprights' => 'ഉപയോക്തൃവിഭാഗത്തിന്റെ അവകാശങ്ങൾ',
 'listgrouprights-summary' => 'ഈ വിക്കിയിൽ നിർവ്വചിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോക്തൃസംഘങ്ങളെയും, ആ സംഘങ്ങൾക്ക് പ്രാപ്തമായിട്ടുള്ള അവകാശങ്ങളേയും താഴെ കുറിച്ചിരിക്കുന്നു.
@@ -3056,11 +3038,7 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */',
-'standard.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സാർവത്രികം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'nostalgia.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ഗൃഹാതുരത്വം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'monobook.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'myskin.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എന്റിഷ്ടം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'chick.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സുന്ദരി ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'modern.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/',
 'noscript.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
@@ -3151,13 +3129,8 @@ $1',
 'pageinfo-category-files' => 'പ്രമാണങ്ങളുടെ എണ്ണം',
 
 # Skin names
-'skinname-standard' => 'സാർവത്രികം',
-'skinname-nostalgia' => 'ഗൃഹാതുരത്വം',
 'skinname-cologneblue' => 'ക്ലോൺ നീല',
 'skinname-monobook' => 'മോണോബുക്ക്',
-'skinname-myskin' => 'എന്റിഷ്ടം',
-'skinname-chick' => 'സുന്ദരി',
-'skinname-simple' => 'ലളിതം',
 'skinname-modern' => 'നവീനം',
 'skinname-vector' => 'വെക്റ്റർ',
 
@@ -3855,7 +3828,7 @@ $5
 
 ഈ പ്രോഗ്രാമിനൊപ്പം [{{SERVER}}{{SCRIPTPATH}}/COPYING ഗ്നു സാർവ്വജനിക അനുവാദപത്രത്തിന്റെ ഒരു പകർപ്പ്] താങ്കൾക്ക് ലഭിച്ചിരിക്കും; ഇല്ലെങ്കിൽ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA എന്ന വിലാസത്തിലെഴുതുക അല്ലെങ്കിൽ [//www.gnu.org/licenses/old-licenses/gpl-2.0.html അനുവാദപത്രം ഓൺലൈനായി വായിക്കുക].',
 'version-software' => 'ഇൻസ്റ്റോൾ ചെയ്ത സോഫ്റ്റ്‌വെയർ',
-'version-software-product' => 'à´¸àµ\8bà´«àµ\8dà´±àµ\8dà´±àµ\8dâ\80\8cà´µàµ\86യർ à´\89à´²àµ\8dà´ª്പന്നം',
+'version-software-product' => 'à´\89à´²്പന്നം',
 'version-software-version' => 'വിവരണം',
 'version-entrypoints' => 'പ്രവേശനസ്ഥാന യു.ആർ.എല്ലുകൾ',
 'version-entrypoints-header-entrypoint' => 'പ്രവേശനസ്ഥാനം',
@@ -3960,6 +3933,8 @@ $5
 'htmlform-submit' => 'സമർപ്പിക്കുക',
 'htmlform-reset' => 'മാറ്റങ്ങൾ വേണ്ട',
 'htmlform-selectorother-other' => 'മറ്റുള്ളവ',
+'htmlform-no' => 'ഇല്ല',
+'htmlform-yes' => 'ശരി',
 
 # SQLite database support
 'sqlite-has-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1',
index efb0ed4..9507703 100644 (file)
@@ -334,9 +334,9 @@ $messages = array(
 'tog-usenewrc' => 'वाढीव अलीकडील बदल वापरा (जावास्क्रीप्टच्या उपलब्धतेची गरज)',
 'tog-numberheadings' => 'शीर्षके स्वयंक्रमांकित करा',
 'tog-showtoolbar' => 'संपादन चिन्हे दाखवा (जावास्क्रीप्ट)',
-'tog-editondblclick' => 'दà¥\8bनवà¥\87ळा à¤\95à¥\8dलà¥\80à¤\95 à¤\95रà¥\81न पान संपादित करा (जावास्क्रीप्ट)',
+'tog-editondblclick' => 'दà¥\8bनवà¥\87ळा à¤\95à¥\8dलिà¤\95 à¤\95रà¥\82न पान संपादित करा (जावास्क्रीप्ट)',
 'tog-editsection' => '[संपादन] दुव्याने संपादन करणे शक्य करा',
-'tog-editsectiononrightclick' => 'विभाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95ावर à¤\89à¤\9cवà¥\8dया à¤\95à¥\8dलà¥\80कने संपादन करा(जावास्क्रीप्ट)',
+'tog-editsectiononrightclick' => 'विभाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95ावर à¤\89à¤\9cवà¥\8dया à¤\95à¥\8dलिकने संपादन करा(जावास्क्रीप्ट)',
 'tog-showtoc' => 'पानात ३ पेक्षा जास्त शीर्षके असल्यास अनुक्रमणिका दाखवा',
 'tog-rememberpassword' => 'माझा प्रवेश या संगणकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
 'tog-watchcreations' => 'मी तयार केलेली पाने माझ्या पहाऱ्याच्या सूचीमध्ये (माझी नित्य पहाण्याची सूची)टाका',
@@ -547,7 +547,7 @@ $messages = array(
 'jumpto' => 'येथे जा:',
 'jumptonavigation' => 'सुचालन',
 'jumptosearch' => 'शोध',
-'view-pool-error' => 'माफ à¤\95रा. à¤¯à¤¾à¤µà¥\87ळà¥\87स à¤¸à¤°à¥\8dवà¥\8dहरवर à¤¤à¤¾à¤£ à¤\86हà¥\87. à¤\85नà¥\87à¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤\98णà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\80त आहेत. पुन्हा या पानावर पोचण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.
+'view-pool-error' => 'माफ à¤\95रा. à¤¯à¤¾à¤µà¥\87ळà¥\87स à¤¸à¤°à¥\8dवà¥\8dहरवर à¤¤à¤¾à¤£ à¤\86हà¥\87. à¤\85नà¥\87à¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤\98णà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रित आहेत. पुन्हा या पानावर पोचण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.
 $1',
 'pool-timeout' => 'ताळ्यासाठी वाट पाहताना वेळ संपली',
 'pool-queuefull' => 'सर्व्हरवर ताण आहे.',
@@ -575,7 +575,7 @@ $1',
 
 'badaccess' => 'परवानगी नाकारण्यात आली आहे',
 'badaccess-group0' => 'तुम्ही करत असलेल्या क्रियेचे तुम्हाला अधिकार नाहीत.',
-'badaccess-groups' => 'à¤\86पण à¤µà¤¿à¤¨à¥\80त à¤\95à¥\87लà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤\96ालà¥\80ल {{PLURAL:$2|समà¥\82हासाठà¥\80|पà¥\88à¤\95à¥\80 à¤\8fà¤\95ा à¤¸à¤®à¥\82हासाठà¥\80}} à¤®à¤°à¥\8dयादà¥\80त आहे: $1.',
+'badaccess-groups' => 'à¤\86पण à¤µà¤¿à¤¨à¥\80त à¤\95à¥\87लà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤\96ालà¥\80ल {{PLURAL:$2|समà¥\82हासाठà¥\80|पà¥\88à¤\95à¥\80 à¤\8fà¤\95ा à¤¸à¤®à¥\82हासाठà¥\80}} à¤®à¤°à¥\8dयादित आहे: $1.',
 
 'versionrequired' => 'मीडियाविकीच्या $1 आवृत्तीची गरज आहे.',
 'versionrequiredtext' => 'हे पान वापरण्यासाठी मीडियाविकीच्या $1 आवृत्तीची गरज आहे. पहा [[Special:Version|आवृत्ती यादी]].',
@@ -630,7 +630,7 @@ $1',
 'nosuchaction' => 'अशी कृती अस्तित्वात नाही',
 'nosuchactiontext' => 'URL ने सांगितलेली कृती चुकीची आहे.
 तुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.
-à¤\95दाà¤\9aित à¤¹à¥\80 à¤\95à¥\83तà¥\80 {{SITENAME}} à¤®à¤§à¥\80ल à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤¸à¥\81दà¥\8dधा à¤¦à¤°à¥\8dशवित असेल.',
+à¤\95दाà¤\9aित à¤¹à¥\80 à¤\95à¥\83तà¥\80 {{SITENAME}} à¤®à¤§à¥\80ल à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤¸à¥\81दà¥\8dधा à¤¦à¤°à¥\8dशवà¥\80त असेल.',
 'nosuchspecialpage' => 'असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही',
 'nospecialpagetext' => '<strong>आपण केलेली विनंती अयोग्य विशेषपानासंबंधी आहे.</strong>
 
@@ -652,9 +652,9 @@ MySQL returned error "$3: $4".',
 'laggedslavemode' => 'सुचना: पानावर नवीन बदल नसतील.',
 'readonly' => 'विदागारास (database) ताळे आहे.',
 'enterlockreason' => 'विदागारास ताळे ठोकण्याचे कारण, ताळे उघडले जाण्याच्या अदमासे कालावधीसहीत द्या.',
-'readonlytext' => 'बहà¥\81धा à¤µà¤¿à¤¦à¤¾à¤\97ार à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसà¤\95रिता à¤¨à¤µà¥\80न à¤­à¤° à¤\98ालणà¥\8dयापासà¥\82न à¤\86णि à¤\87तर à¤¬à¤¦à¤² à¤\95रणà¥\8dयापासà¥\82न à¤¬à¤\82द à¤ à¥\87वणà¥\8dयात à¤\86ला à¤\86हà¥\87, à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसनà¤\82तर à¤¤à¥\8b à¤¨à¤¿à¤¯à¤®à¥\80त होईल.
+'readonlytext' => 'बहà¥\81धा à¤µà¤¿à¤¦à¤¾à¤\97ार à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसà¤\95रिता à¤¨à¤µà¥\80न à¤­à¤° à¤\98ालणà¥\8dयापासà¥\82न à¤\86णि à¤\87तर à¤¬à¤¦à¤² à¤\95रणà¥\8dयापासà¥\82न à¤¬à¤\82द à¤ à¥\87वणà¥\8dयात à¤\86ला à¤\86हà¥\87, à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसनà¤\82तर à¤¤à¥\8b à¤¨à¤¿à¤¯à¤®à¤¿त होईल.
 
-ताळà¥\87 à¤ à¥\8bà¤\95णाऱà¥\8dया à¤ªà¥\8dरबà¤\82धà¤\95ाà¤\82नà¥\80 à¤\96ालà¥\80ल à¤\95ारण à¤¨à¤®à¥\81द केले आहे: $1',
+ताळà¥\87 à¤ à¥\8bà¤\95णाऱà¥\8dया à¤ªà¥\8dरबà¤\82धà¤\95ाà¤\82नà¥\80 à¤\96ालà¥\80ल à¤\95ारण à¤¨à¤®à¥\82द केले आहे: $1',
 'missing-article' => 'डाटाबेसला "$1" $2 नावाचे पान मिळालेले नाही, जे मिळायला हवे होते.
 
 असे बहुदा संपुष्टात आलेल्या फरकामुळे किंवा वगळलेल्या पानाच्या इतिहास दुव्यामुळे घडते.
@@ -679,10 +679,10 @@ MySQL returned error "$3: $4".',
 'badarticleerror' => 'या पानावर ही कृती करता येत नाही.',
 'cannotdelete' => '$1 हे पान किंवा संचिका वगळता आलेली नाही. (आधीच इतर कुणी वगळले असण्याची शक्यता आहे.)',
 'cannotdelete-title' => '$1 ला वगळू शकत नाहि',
-'delete-hook-aborted' => 'à¤\96à¥\8bडणà¥\8dयाà¤\9aà¥\80  à¤\95à¥\8dरिया à¤®à¤§à¥\87à¤\9a à¤¥à¤¾à¤\82बवà¥\80ण्यात येत आहे.
+'delete-hook-aborted' => 'à¤\96à¥\8bडणà¥\8dयाà¤\9aà¥\80  à¤\95à¥\8dरिया à¤®à¤§à¥\87à¤\9a à¤¥à¤¾à¤\82बविण्यात येत आहे.
 कोणतेही कारण देण्यात आले नाही',
 'badtitle' => 'चुकीचे शीर्षक',
-'badtitletext' => 'à¤\86पण à¤®à¤¾à¤\97ितलà¥\87लà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\82à¤\95à¥\80ने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात एक किंवा अधिक शीर्षकअयोग्य चिन्हे आहेत.',
+'badtitletext' => 'à¤\86पण à¤®à¤¾à¤\97ितलà¥\87लà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\81à¤\95िने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात एक किंवा अधिक शीर्षकअयोग्य चिन्हे आहेत.',
 'perfcached' => 'खालील माहिती सयीमध्ये(कॅशे) ठेवली आहे त्यामुळे ती नवीनतम {{PLURAL:$1|one result is|$1 results }} नसावी.',
 'perfcachedts' => 'खालील माहिती सयीमध्ये(कॅशे) ठेवली आहे आणि शेवटी $1 ला {{PLURAL:$4|one result is|$4 results}} बदलली होती.',
 'querypage-no-updates' => 'सध्या या पाना करिता नवीसंस्करणे अनुपलब्ध केली आहेत.आत्ताच येथील विदा ताजा होणार नाही.',
@@ -692,8 +692,8 @@ MySQL returned error "$3: $4".',
 'viewsource' => 'स्रोत पहा',
 'viewsource-title' => '$1 चा उगम बघा',
 'actionthrottled' => 'कृती अवरूद्ध (throttle) केली',
-'actionthrottledtext' => 'à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(anti-spam measure), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धà¥\80त करण्यात आले आहे, आणि आपण या मर्यादेचे उल्लंघन केले आहे. कृपया थोड्या वेळाने पुन्हा प्रयत्न करा.',
-'protectedpagetext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¤² à¤¹à¥\8bà¤\8a à¤¨à¤¯à¥\87त à¤®à¥\8dहणà¥\81न सुरक्षित केले आहे.',
+'actionthrottledtext' => 'à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(anti-spam measure), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित करण्यात आले आहे, आणि आपण या मर्यादेचे उल्लंघन केले आहे. कृपया थोड्या वेळाने पुन्हा प्रयत्न करा.',
+'protectedpagetext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¤² à¤¹à¥\8bà¤\8a à¤¨à¤¯à¥\87त à¤®à¥\8dहणà¥\82न सुरक्षित केले आहे.',
 'viewsourcetext' => 'तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:',
 'viewyourtext' => 'तुम्ही या पानाचे स्त्रोत पाहू शकता व प्रत करू शकता',
 'protectedinterface' => 'हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.',
@@ -702,10 +702,10 @@ MySQL returned error "$3: $4".',
 'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केले गेलेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे, की जे पान/जी पाने शिडी पर्यायाने सुरक्षित आहेत:
 $2',
 'namespaceprotected' => "'''$1''' नामविश्वातील पाने बदलण्याची आपणांस परवानगी नाही.",
-'customcssprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 à¤¸à¥\80à¤\8fसà¤\8fस à¤ªà¤¾à¤¨ à¤¸à¤\82पादà¥\80त करण्याची परवानगी नाही.',
-'customjsprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 JavaScript à¤ªà¤¾à¤¨ à¤¸à¤\82पादà¥\80त करण्याची परवानगी नाही.',
+'customcssprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 à¤¸à¥\80à¤\8fसà¤\8fस à¤ªà¤¾à¤¨ à¤¸à¤\82पादित करण्याची परवानगी नाही.',
+'customjsprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 JavaScript à¤ªà¤¾à¤¨ à¤¸à¤\82पादित करण्याची परवानगी नाही.',
 'ns-specialprotected' => 'विशेष पाने संपादित करता येत नाहीत.',
-'titleprotected' => "या à¤¶à¥\80रà¥\8dषà¤\95ाà¤\9aà¥\87 à¤ªà¤¾à¤¨ à¤¸à¤¦à¤¸à¥\8dय [[User:$1|$1]]नà¥\87 à¤¨à¤¿à¤°à¥\8dमà¥\80त करण्यापासून सुरक्षित केलेले आहे.
+'titleprotected' => "या à¤¶à¥\80रà¥\8dषà¤\95ाà¤\9aà¥\87 à¤ªà¤¾à¤¨ à¤¸à¤¦à¤¸à¥\8dय [[User:$1|$1]]नà¥\87 à¤¨à¤¿à¤°à¥\8dमित करण्यापासून सुरक्षित केलेले आहे.
 ''$2'' हे कारण नमूद केलेले आहे.",
 'invalidtitle-knownnamespace' => '"$2" नामविश्वात "$3" हे अयोग्य शीर्षक',
 'exception-nologin' => 'प्रवेश केलेला नाही',
@@ -734,7 +734,7 @@ $2',
 'externaldberror' => 'विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.',
 'login' => 'प्रवेश करा',
 'nav-login-createaccount' => 'सदस्य प्रवेश',
-'loginprompt' => '{{SITENAME}}मधà¥\8dयà¥\87 à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\8dयाà¤\95रिता  à¤¸à¥\8dमà¥\83तिशà¥\87ष à¤\8aपलब्ध (Cookie enable)असणे आवश्यक आहे.',
+'loginprompt' => '{{SITENAME}}मधà¥\8dयà¥\87 à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\8dयाà¤\95रिता  à¤¸à¥\8dमà¥\83तिशà¥\87ष à¤\89पलब्ध (Cookie enable)असणे आवश्यक आहे.',
 'userlogin' => 'दाखल व्हा /सदस्य खाते उघडा',
 'userloginnocreate' => 'प्रवेश करा',
 'logout' => 'बाहेर पडा',
@@ -752,18 +752,18 @@ $2',
 'userexists' => 'या नावाने सदस्याची नोंदणी झालेली आहे.
 कृपया दुसरे सदस्य नाव निवडा.',
 'loginerror' => 'आपल्या प्रवेश नोंदणीमध्ये चूक झाली आहे',
-'createaccounterror' => 'हà¥\87 à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रता à¤¯à¥\87à¤\89 शकले नाही:$1',
-'nocookiesnew' => 'सदसà¥\8dय à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 ,पण à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤µà¤¾à¤ªà¤°à¥\82न à¤¦à¤¾à¤\96ल à¤\9dालà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\86हात.{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तà¥\80शà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तà¥\80शेष सुविधा अनुपलब्ध टेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.',
-'nocookieslogin' => '{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तà¥\80शà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तà¥\80शेष सुविधा अनुपलब्ध टेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा,आणि दाखल होण्यासाठी पुन्हा प्रयत्न करा.',
+'createaccounterror' => 'हà¥\87 à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रता à¤¯à¥\87à¤\8a शकले नाही:$1',
+'nocookiesnew' => 'सदसà¥\8dय à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 ,पण à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤µà¤¾à¤ªà¤°à¥\82न à¤¦à¤¾à¤\96ल à¤\9dालà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\86हात.{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तिशà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तिशेष सुविधा अनुपलब्ध टेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.',
+'nocookieslogin' => '{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तिशà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तिशेष सुविधा अनुपलब्ध टेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा,आणि दाखल होण्यासाठी पुन्हा प्रयत्न करा.',
 'nocookiesfornew' => 'हे सदस्य खाते अस्तित्वात नाही, त्यामुळे आम्ही त्याच्या स्रोताची खात्री करू शकलो नाही.
 तुमचे स्मृतिशेष उपलब्ध असण्याची खात्री करा, किंवा थोड्या वेळाने हे पान पुन्हा पहा.',
 'noname' => 'आपण नोंदणीसाठी सदस्याचे योग्य नाव लिहिले नाही.',
-'loginsuccesstitle' => 'à¤\86पलà¥\8dया à¤ªà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रित्या पूर्ण झाली',
+'loginsuccesstitle' => 'à¤\86पलà¥\8dया à¤ªà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80त्या पूर्ण झाली',
 'loginsuccess' => "'''तुम्ही {{SITENAME}} वर \"\$1\" नावाने प्रवेश केला आहे.'''",
 'nosuchuser' => '"$1" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:UserLogin/signup|नवीन खाते]] तयार करा.',
 'nosuchusershort' => '"$1" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?',
-'nouserspecified' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयनाव à¤¨à¤®à¥\81द करावे लागेल.',
-'login-userblocked' => 'या à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤\96ातà¥\87 â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयास à¤ªà¥\8dरवà¥\87श à¤\95रà¥\81 देणे शक्य नाही.',
+'nouserspecified' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयनाव à¤¨à¤®à¥\82द करावे लागेल.',
+'login-userblocked' => 'या à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤\96ातà¥\87 â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयास à¤ªà¥\8dरवà¥\87श à¤\95रà¥\82 देणे शक्य नाही.',
 'wrongpassword' => 'आपला परवलीचा शब्द चुकीचा आहे, पुन्हा एकदा प्रयत्न करा.',
 'wrongpasswordempty' => 'परवलीचा शब्द रिकामा आहे; परत प्रयत्न करा.',
 'passwordtooshort' => 'तुमचा परवलीचा शब्द जरूरीपेक्षा लहान आहे. यात कमीत कमी {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} पाहिजेत.',
@@ -782,7 +782,7 @@ $2',
 तो शब्द वापरुन पुन्हा प्रवेश करा.',
 'blocked-mailpassword' => 'संपादनापासून तुमच्या अंकपत्त्यास आडविण्यात आले आहे,आणि म्हणून दुरूपयोग टाळ्ण्याच्या दृष्टीने परवलीचाशब्द परत मिळवण्यास सुद्धा मान्यता उपलब्ध नाही.',
 'eauthentsent' => 'नामांकित ई-मेल पत्त्यावर एक निश्चितता स्वीकारक ई-मेल पाठविला गेला आहे.
-à¤\96ातà¥\8dयावर à¤\95à¥\8bणताहà¥\80 à¤\87तर à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयापà¥\82रà¥\8dवà¥\80 - à¤¤à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aाà¤\9a à¤\86हà¥\87, à¤¹à¥\87 à¤¸à¥\82निश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.',
+à¤\96ातà¥\8dयावर à¤\95à¥\8bणताहà¥\80 à¤\87तर à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयापà¥\82रà¥\8dवà¥\80 - à¤¤à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aाà¤\9a à¤\86हà¥\87, à¤¹à¥\87 à¤¸à¥\81निश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.',
 'throttled-mailpassword' => 'मागील {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} परवलीचा शब्द बदलण्यासाठीची सूचना पाठविलेली आहे. दुरुपयोग टाळण्यासाठी {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} फक्त एकदाच सूचना दिली जाईल.',
 'mailerror' => 'विपत्र पाठवण्यात त्रुटी: $1',
 'acct_creation_throttle_hit' => 'माफ करा, तुम्ही आत्तापर्यंत {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तुम्हाला आणखी खाती उघडता येणार नाहीत.',
@@ -791,14 +791,14 @@ $2',
 'noemailprefs' => 'खालील सुविधा कार्यान्वित करण्यासाठी इ-मेल पत्ता पुरवा.',
 'emailconfirmlink' => 'आपला ई-मेल पत्ता तपासून पहा.',
 'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
-'cannotchangeemail' => 'या à¤µà¤¿à¤\95à¥\80वर खात्याचा ईमेल बदलता येत नाही',
+'cannotchangeemail' => 'या à¤µà¤¿à¤\95िवर खात्याचा ईमेल बदलता येत नाही',
 'emaildisabled' => 'हे संकेतस्थळ विपत्र पाठवू शकत नाही.',
 'accountcreated' => 'खाते उघडले.',
 'accountcreatedtext' => '$1 चे सदस्यखाते उघडले.',
 'createaccount-title' => '{{SITENAME}} साठीची सदस्य नोंदणी',
 'createaccount-text' => 'तुमच्या विपत्र पत्त्याकरिता {{SITENAME}} ($4)वर "$2" नावाच्या कुणी "$3" परवलीने खाते उघडले आहे. कृपया आपण सदस्य प्रवेश करून आपला परवलीचा शब्द बदलावा.
 
-à¤\9cर à¤¹à¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤\9aà¥\81à¤\95à¥\80ने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
+à¤\9cर à¤¹à¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤\9aà¥\81à¤\95िने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
 'usernamehasherror' => 'सदस्यनामात "हॅश" वर्ण असू शकत नाहीत.',
 'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
 कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
@@ -819,7 +819,7 @@ $2',
 'newpassword' => 'नवीन परवलीचा शब्द:',
 'retypenew' => 'पुन्हा एकदा परवलीचा शब्द',
 'resetpass_submit' => 'परवलीचा शब्द टाका आणि प्रवेश करा',
-'resetpass_success' => 'तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87! à¤\86ता à¤¤à¥\81मà¤\9aा à¤ªà¥\8dरवà¥\87श à¤\95रà¥\80त आहोत...',
+'resetpass_success' => 'तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87! à¤\86ता à¤¤à¥\81मà¤\9aा à¤ªà¥\8dरवà¥\87श à¤\95रित आहोत...',
 'resetpass_forbidden' => 'परवलीचा शब्द बदलता येत नाही.',
 'resetpass-no-info' => 'या पानामध्ये थेट जाण्यासाठी तुम्हाला प्रवेश घ्यावा लागेल.',
 'resetpass-submit-loggedin' => 'परवलीचा शब्द बदला',
@@ -832,12 +832,12 @@ $2',
 'passwordreset' => 'परवलीचा शब्द पूर्ववत करा',
 'passwordreset-text' => 'तुमच्या खात्याच्या माहितीसंदर्भात विपत्राद्वारे अनुस्मारक येण्यासाठी हा अर्ज पूर्ण भरा.',
 'passwordreset-legend' => 'परवलीचा शब्द पूर्ववत करा',
-'passwordreset-disabled' => 'या à¤µà¤¿à¤\95à¥\80वर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
+'passwordreset-disabled' => 'या à¤µà¤¿à¤\95िवर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
 'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीच्या भागांपैकी एक भाग लिहा}}',
 'passwordreset-username' => 'सदस्यनाव:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
-'passwordreset-capture-help' => 'या à¤\9aà¥\8cà¤\95à¤\9fित खूण केली तर, ईमेल (तात्पुर्त्या परवली शब्दा सोबत) दखवण्यत व प्रयोगकर्त्त्यस पाठवण्यत येइल',
+'passwordreset-capture-help' => 'या à¤\9aà¥\8cà¤\95à¤\9fà¥\80त खूण केली तर, ईमेल (तात्पुर्त्या परवली शब्दा सोबत) दखवण्यत व प्रयोगकर्त्त्यस पाठवण्यत येइल',
 'passwordreset-email' => 'विपत्र पत्ता',
 'passwordreset-emailtitle' => '{{SITENAME}} वर खात्याची माहिती',
 'passwordreset-emailtext-ip' => 'कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शब्दांक पाठवावा’ अशी विनंती केली आहे ($4).
@@ -898,8 +898,8 @@ $2',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंक पत्ता (आयपी) नोंदला जाईल.",
 'anonpreviewwarning' => "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
-'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\82मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण à¤\9cतन à¤\95रा à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fà¥\80चकी मारली तर तेत्या शिवाय जतन होईल.",
-'missingcommenttext' => 'à¤\95à¥\83पया à¤\96ालà¥\80 à¤ªà¥\8dरतिà¤\95à¥\8dरà¥\80या भरा.',
+'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण à¤\9cतन à¤\95रा à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिचकी मारली तर तेत्या शिवाय जतन होईल.",
+'missingcommenttext' => 'à¤\95à¥\83पया à¤\96ालà¥\80 à¤ªà¥\8dरतिà¤\95à¥\8dरिया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही. आपण पुन्हा जतन करा अशी सूचना केली तर, तुमचे संपादन त्याशिवायच जतन होईल.",
 'summary-preview' => 'आढाव्याची झलक:',
 'subject-preview' => 'विषय/मथळा झलक:',
@@ -926,12 +926,12 @@ $2',
 
 तुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.
 
-[[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]]त à¤¶à¤¾à¤¬à¥\80त à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¤à¥\8dता à¤¨à¤®à¥\81द à¤\85सलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ à¤\86णि à¤¤à¥\81मà¥\8dहाला  à¤¤à¥\8b à¤µà¤¾à¤ªà¤°à¤£à¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त केले असल्यास तुम्ही  "या सदस्यास विपत्र पाठवा" सुविधा  वापरू शकणार नाही.
+[[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]]त à¤¶à¤¾à¤¬à¥\80त à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¤à¥\8dता à¤¨à¤®à¥\82द à¤\85सलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ à¤\86णि à¤¤à¥\81मà¥\8dहाला  à¤¤à¥\8b à¤µà¤¾à¤ªà¤°à¤£à¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤ªà¥\8dरतिबà¤\82धित केले असल्यास तुम्ही  "या सदस्यास विपत्र पाठवा" सुविधा  वापरू शकणार नाही.
 
-तà¥\81मà¤\9aा à¤¸à¥\8dथà¤\97न à¤\95à¥\8dर $5 à¤\86हà¥\87. à¤\95à¥\83पया à¤¤à¥\82मà¤\9aà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¶à¤\82à¤\95ासमाधाना à¤¸à¤¾à¤ à¥\80 à¤¹à¤¾ à¤\95à¥\8dरà¤\82माà¤\82à¤\95 à¤¨à¤®à¥\81द करा.',
+तà¥\81मà¤\9aा à¤¸à¥\8dथà¤\97न à¤\95à¥\8dर $5 à¤\86हà¥\87. à¤\95à¥\83पया à¤¤à¥\81मà¤\9aà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¶à¤\82à¤\95ासमाधाना à¤¸à¤¾à¤ à¥\80 à¤¹à¤¾ à¤\95à¥\8dरà¤\82माà¤\82à¤\95 à¤¨à¤®à¥\82द करा.',
 'blockednoreason' => 'कारण दिलेले नाही',
 'whitelistedittext' => 'लेखांचे संपादन करण्यासाठी आधी $1 करा.',
-'confirmedittext' => 'तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनà¥\87 à¤\95रणà¥\8dयापà¥\81र्वी तुमचा विपत्र पत्ता प्रमाणित करणे आवश्यक आहे.Please set and validate तुमचा विपत्र पत्ता तुमच्या[[Special:Preferences|सदस्य पसंती]]तून लिहा व सिद्ध करा.',
+'confirmedittext' => 'तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनà¥\87 à¤\95रणà¥\8dयापà¥\82र्वी तुमचा विपत्र पत्ता प्रमाणित करणे आवश्यक आहे.Please set and validate तुमचा विपत्र पत्ता तुमच्या[[Special:Preferences|सदस्य पसंती]]तून लिहा व सिद्ध करा.',
 'nosuchsectiontitle' => 'असा विभाग नाही.',
 'nosuchsectiontext' => 'तुम्ही अस्तिवात नसलेला विभाग संपादन करण्याचा प्रयत्न केला आहे.',
 'loginreqtitle' => 'प्रवेश गरजेचा आहे',
@@ -968,14 +968,14 @@ $2',
 'userjspreview' => "'''तुम्ही तुमची सदस्य जावास्क्रिप्ट तपासत आहात किंवा झलक पहात आहात ,ती अजून जतन केलेली नाही हे लक्षात घ्या!'''",
 'sitecsspreview' => "'''तुम्ही तुमच्या सी.एस.एस.ची केवळ झलक पहात आहात, ती अजून जतन केलेली नाही हे लक्षात घ्या.'''",
 'sitejspreview' => "'''तुम्ही तुमच्या जावास्क्रिप्टची केवळ झलक पहात आहात, ती अजून जतन केलेली नाही हे लक्षात घ्या.'''",
-'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" à¤\85शà¥\80 à¤¤à¥\8dवà¤\9aा à¤¨à¤¾à¤¹à¥\80.custom .css à¤\86णि .js à¤ªà¤¾à¤¨à¥\87 lowercase title à¤µà¤¾à¤ªà¤°à¤¤à¤¾à¤¤ à¤¹à¥\87 à¤²à¤\95à¥\8dषात à¤\98à¥\8dया, à¤\89दा. {{ns:user}}:Foo/vector.css à¤¯à¤¾ à¤µà¤¿à¤°à¥\82द्ध {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" à¤\85शà¥\80 à¤¤à¥\8dवà¤\9aा à¤¨à¤¾à¤¹à¥\80.custom .css à¤\86णि .js à¤ªà¤¾à¤¨à¥\87 lowercase title à¤µà¤¾à¤ªà¤°à¤¤à¤¾à¤¤ à¤¹à¥\87 à¤²à¤\95à¥\8dषात à¤\98à¥\8dया, à¤\89दा. {{ns:user}}:Foo/vector.css à¤¯à¤¾ à¤µà¤¿à¤°à¥\81द्ध {{ns:user}}:Foo/Vector.css.",
 'updated' => '(बदल झाला आहे.)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''लक्षात ठेवा की ही फक्त झलक आहे''', बदल अजून जतन करण्यात आलेले नाहीत.",
-'continue-editing' => 'सà¤\82पादन à¤\9aालà¥\81 राहुदे',
+'continue-editing' => 'सà¤\82पादन à¤\9aालà¥\82 राहुदे',
 'previewconflict' => 'वरील संपादन क्षेत्रातील मजकूर जतन केल्यावर या झलकेप्रमाणे दिसेल.',
-'session_fail_preview' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
-'session_fail_preview_html' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पार पाडू शकलो नाही.'''
+'session_fail_preview' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरिया पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
+'session_fail_preview_html' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरिया पार पाडू शकलो नाही.'''
 
 ''कारण {{SITENAME}}चे कच्चे HTML चालू ठेवले आहे, जावास्क्रिप्ट हल्ल्यांपासून बचाव व्हावा म्हणून झलक लपवली आहे.''
 
@@ -985,7 +985,7 @@ $2',
 असे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
 'edit_form_incomplete' => '”’तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा.',
 'editing' => '$1 चे संपादन होत आहे.',
-'creating' => '$1 à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\81 आहे',
+'creating' => '$1 à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 आहे',
 'editingsection' => '$1 (विभाग) संपादन',
 'editingcomment' => '$1 चे संपादन (प्रतिक्रिया)',
 'editconflict' => 'वादग्रस्त संपादन: $1',
@@ -995,18 +995,18 @@ $2',
 '''केवळ''' वरील पाठ्यभागामध्ये असलेले पाठ्य साठविण्यात येईल जर तुम्ही \"{{int:savearticle}}\" ही कळ दाबली.",
 'yourtext' => 'तुमचे पाठ्य',
 'storedversion' => 'साठविलेली आवृत्ती',
-'nonunicodebrowser' => "'''सावधान: à¤¤à¥\81मà¤\9aा à¤µà¤¿à¤\9aरà¤\95 à¤¯à¥\82निà¤\95à¥\8bड à¤\86धारà¥\80त à¤¨à¤¾à¤¹à¥\80. ASCII à¤¨à¤¸à¤²à¥\87लà¥\80  à¤\85à¤\95à¥\8dषरà¤\9aिनà¥\8dहà¥\87 à¤¸à¤\82पादन à¤\96िडà¤\95à¥\80त à¤¸à¥\8bळाà¤\85à¤\82à¤\95à¥\80 à¤\95à¥\82à¤\9fसà¤\82à¤\95à¥\87त (हà¥\87à¤\95à¥\8dà¤\9dाडà¥\87सà¥\80मल à¤\95à¥\8bड) à¤¸à¥\8dवरà¥\82पात à¤¦à¤¿à¤¸à¤£à¥\8dयाà¤\9aà¥\80, à¤¸à¥\81रà¤\95à¥\8dषà¥\80तपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
-'editingold' => "'''à¤\87शारा: à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¥\82ळ à¤ªà¥\83षà¥\8dठाà¤\9aà¥\80 à¤\8fà¤\95 à¤\95ालबाहà¥\8dय à¤\86वà¥\83तà¥\8dतà¥\80 à¤¸à¤\82पादित à¤\95रà¥\80त आहात.
+'nonunicodebrowser' => "'''सावधान: à¤¤à¥\81मà¤\9aा à¤µà¤¿à¤\9aरà¤\95 à¤¯à¥\81निà¤\95à¥\8bड à¤\86धारित à¤¨à¤¾à¤¹à¥\80. ASCII à¤¨à¤¸à¤²à¥\87लà¥\80  à¤\85à¤\95à¥\8dषरà¤\9aिनà¥\8dहà¥\87 à¤¸à¤\82पादन à¤\96िडà¤\95à¥\80त à¤¸à¥\8bळाà¤\85à¤\82à¤\95à¥\80 à¤\95à¥\82à¤\9fसà¤\82à¤\95à¥\87त (हà¥\87à¤\95à¥\8dà¤\9dाडà¥\87सà¥\80मल à¤\95à¥\8bड) à¤¸à¥\8dवरà¥\82पात à¤¦à¤¿à¤¸à¤£à¥\8dयाà¤\9aà¥\80, à¤¸à¥\81रà¤\95à¥\8dषितपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
+'editingold' => "'''à¤\87शारा: à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¥\82ळ à¤ªà¥\83षà¥\8dठाà¤\9aà¥\80 à¤\8fà¤\95 à¤\95ालबाहà¥\8dय à¤\86वà¥\83तà¥\8dतà¥\80 à¤¸à¤\82पादित à¤\95रित आहात.
 जर आपण बदल साठवून ठेवण्यात आले तर या नंतरच्या सर्व आवृत्त्यांमधील साठविण्यात आलेले बदल नष्ठ होतील.'''",
 'yourdiff' => 'फरक',
-'copyrightwarning' => "{{SITENAME}} à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤\95à¥\8bणतà¥\87हà¥\80 à¤²à¥\87à¤\96न $2 (à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 $1 à¤ªà¤¹à¤¾) à¤\85à¤\82तरà¥\8dà¤\97त à¤®à¥\81à¤\95à¥\8dत à¤\89दà¥\8dà¤\98à¥\8bषित à¤\95à¥\87लà¥\87 à¤\86हà¥\87 à¤\85सà¥\87 à¤\97à¥\83हित धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />
-तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हित à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठà¥\80त न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+'copyrightwarning' => "{{SITENAME}} à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤\95à¥\8bणतà¥\87हà¥\80 à¤²à¥\87à¤\96न $2 (à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 $1 à¤ªà¤¹à¤¾) à¤\85à¤\82तरà¥\8dà¤\97त à¤®à¥\81à¤\95à¥\8dत à¤\89दà¥\8dà¤\98à¥\8bषित à¤\95à¥\87लà¥\87 à¤\86हà¥\87 à¤\85सà¥\87 à¤\97à¥\83हà¥\80त धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />
+तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हà¥\80त à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
 'copyrightwarning2' => "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपल्या लेखनाचे मुक्त संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />
-तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हित à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठà¥\80त न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
-'longpageerror' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\86पण à¤¦à¤¿à¤²à¥\87ला à¤®à¤\9cà¤\95à¥\81र जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही',
-'readonlywarning' => "सावधान:विदाà¤\97ारास à¤­à¤°à¤£-पà¥\8bषणाà¤\95रिता à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87 à¤\86हà¥\87,तà¥\8dयामà¥\81ळà¥\87 à¤¸à¤§à¥\8dया à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¤\82पादन à¤\9cतन à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.à¤\9cर à¤¤à¥\81मà¥\8dहाला à¤¹à¤µà¥\87 à¤\85सà¥\87ल à¤¤à¤° à¤¨à¤\82तर à¤\89पयà¥\8bà¤\97 à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87, à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¤\9cà¤\95à¥\81र ’मजकुर संचिकेत’(टेक्स्ट फाईल मध्ये) कापून-चिटकवू शकता.'''
-विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87लà¥\8dया à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82नà¥\80 $1 à¤\85सà¥\87 à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रणà¥\87 à¤¦à¥\80ले आहे",
-'protectedpagewarning' => "'''सà¥\82à¤\9aना: à¤¹à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤ªà¤¾à¤¨ à¤\86हà¥\87. à¤«à¤\95à¥\8dत à¤ªà¥\8dरà¤\9aालà¤\95 à¤¯à¤¾à¤\9aà¥\8dयात à¤¬à¤¦à¤² à¤\95रà¥\81 शकतात.'''",
+तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हà¥\80त à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+'longpageerror' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\86पण à¤¦à¤¿à¤²à¥\87ला à¤®à¤\9cà¤\95à¥\82र जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही',
+'readonlywarning' => "सावधान:विदाà¤\97ारास à¤­à¤°à¤£-पà¥\8bषणाà¤\95रिता à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87 à¤\86हà¥\87,तà¥\8dयामà¥\81ळà¥\87 à¤¸à¤§à¥\8dया à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¤\82पादन à¤\9cतन à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.à¤\9cर à¤¤à¥\81मà¥\8dहाला à¤¹à¤µà¥\87 à¤\85सà¥\87ल à¤¤à¤° à¤¨à¤\82तर à¤\89पयà¥\8bà¤\97 à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87, à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¤\9cà¤\95à¥\82र ’मजकुर संचिकेत’(टेक्स्ट फाईल मध्ये) कापून-चिटकवू शकता.'''
+विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87लà¥\8dया à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82नà¥\80 $1 à¤\85सà¥\87 à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रणà¥\87 à¤¦à¤¿ले आहे",
+'protectedpagewarning' => "'''सà¥\82à¤\9aना: à¤¹à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤ªà¤¾à¤¨ à¤\86हà¥\87. à¤«à¤\95à¥\8dत à¤ªà¥\8dरà¤\9aालà¤\95 à¤¯à¤¾à¤\9aà¥\8dयात à¤¬à¤¦à¤² à¤\95रà¥\82 शकतात.'''",
 'semiprotectedpagewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
 'cascadeprotectedwarning' => "'''सावधान:''' हे पान निम्न-लिखीत शिडी-प्रतिबंधीत {{PLURAL:$1|पानात|पानात}} आंतरभूत असल्यामुळे,केवळ प्रचालक सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
 'titleprotectedwarning' => "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
@@ -1047,10 +1047,10 @@ $2',
 'content-model-css' => 'सीएसएस',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'â\80\9dâ\80\99à¤\87शारा:â\80\9dâ\80\99 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aिक पृथक्करण क्रिया कॉल्स आहेत.
+'expensive-parserfunction-warning' => 'â\80\9dâ\80\99à¤\87शारा:â\80\9dâ\80\99 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aà¥\80क पृथक्करण क्रिया कॉल्स आहेत.
 
 ते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.',
-'expensive-parserfunction-category' => 'à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aिक पार्सर क्रिया कॉल्स असणारी पाने',
+'expensive-parserfunction-category' => 'à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aà¥\80क पार्सर क्रिया कॉल्स असणारी पाने',
 'post-expand-template-inclusion-warning' => 'सूचना: साचे वाढविण्याची मर्यादा संपलेली आहे.
 काही साचे वगळले जातील.',
 'post-expand-template-inclusion-category' => 'अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे',
@@ -1062,14 +1062,14 @@ $2',
 'language-converter-depth-warning' => 'भाषा रुपांतरण खोली मर्यादा ओलांडली ($1)',
 
 # "Undo" feature
-'undo-success' => 'सà¤\82पादन à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\9cाà¤\8a à¤¶à¤\95तà¥\87.à¤\95à¥\83पया, à¤\86पण à¤¨à¥\87मà¤\95à¥\87 à¤¹à¥\87à¤\9a à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bà¥\80ता à¤¹à¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¤à¥\81लना à¤ªà¤¾à¤¹à¥\82 à¤¨à¤¿à¤¶à¥\8dà¤\9aà¥\80त à¤\95रा,à¤\86णि à¤¨à¤\82तर à¤¸à¤\82पादन à¤ªà¤°à¤¤à¤µà¤£à¥\8dयाà¤\9aà¥\87 à¤\95ाम à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\87à¤\9aà¥\8dà¤\9bà¥\80त बद्ल जतन करा.',
+'undo-success' => 'सà¤\82पादन à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\9cाà¤\8a à¤¶à¤\95तà¥\87.à¤\95à¥\83पया, à¤\86पण à¤¨à¥\87मà¤\95à¥\87 à¤¹à¥\87à¤\9a à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिता à¤¹à¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¤à¥\81लना à¤ªà¤¾à¤¹à¥\82 à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤\95रा,à¤\86णि à¤¨à¤\82तर à¤¸à¤\82पादन à¤ªà¤°à¤¤à¤µà¤£à¥\8dयाà¤\9aà¥\87 à¤\95ाम à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\87à¤\9aà¥\8dà¤\9bित बद्ल जतन करा.',
 'undo-failure' => 'दरम्यान परस्पर विरोधी संपादने झाल्यामुळे आपण हे संपादन परतवू शकत नाही.',
 'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]])यांची आवृत्ती $1 परतवली.',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'खाते उघडू शकत नाही',
-'cantcreateaccount-text' => "('''$1''')या à¤\86à¤\82तरà¤\9cाल à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\95डà¥\82नà¤\9aà¥\8dया à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमà¥\80तीस [[User:$3|$3]]ने अटकाव केला आहे.
+'cantcreateaccount-text' => "('''$1''')या à¤\86à¤\82तरà¤\9cाल à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\95डà¥\82नà¤\9aà¥\8dया à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमितीस [[User:$3|$3]]ने अटकाव केला आहे.
 
 $3ने ''$2'' कारण दिले आहे.",
 
@@ -1118,32 +1118,32 @@ $3ने ''$2'' कारण दिले आहे.",
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत]निर्देश असण्याची शक्यता आहे",
 'rev-deleted-text-unhide' => "या पानाचे संस्करण '''वगळले'''.
  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.
-à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\81 शकता].",
+à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\82 शकता].",
 'rev-suppressed-text-unhide' => "या पानाचे संस्करण '''दडपले'''.
  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.
-à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\81 शकता].",
-'rev-deleted-text-view' => "या à¤ªà¤¾à¤¨à¤¾à¤\9aि आवृत्ती '''वगळण्यात आली आहे'''.
-हà¥\87 à¤¤à¥\81मà¥\8dहि à¤¬à¤\98à¥\81 à¤¶à¤\95ता; à¤®à¤¹à¤¿à¤¤à¤¿ à¤¹à¤¿ तुम्हाला इथे सपदेल् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} कधुन तकले आहे].",
+à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\82 शकता].",
+'rev-deleted-text-view' => "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 आवृत्ती '''वगळण्यात आली आहे'''.
+हà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤¬à¤\98à¥\82 à¤¶à¤\95ता; à¤®à¤¹à¤¿à¤¤à¤¿ à¤¹à¥\80 तुम्हाला इथे सपदेल् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} कधुन तकले आहे].",
 'rev-suppressed-text-view' => "या पानाची आवृत्ती '''दडपली'''.
-à¤\86पण à¤¹à¥\87 à¤¬à¤\98à¥\81 शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
-'rev-deleted-no-diff' => "à¤\86पण à¤¯à¤¾à¤¤à¥\80ल à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 शकत नाही कारण त्यापैकी एक संस्करण '''वगळले''' आहे.
+à¤\86पण à¤¹à¥\87 à¤¬à¤\98à¥\82 शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
+'rev-deleted-no-diff' => "à¤\86पण à¤¯à¤¾à¤¤à¥\80ल à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 शकत नाही कारण त्यापैकी एक संस्करण '''वगळले''' आहे.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
 'rev-suppressed-no-diff' => 'तुम्ही हा फरक पाहू शकत नाही कारण या आवृत्त्यांमधील एक संस्करण ”’वगळण्यात आले आहे.”’',
 'rev-deleted-unhide-diff' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
 महिती एथे सुद्धा मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रीक्क्त कर्न्यात आले आहे].
-तà¥\81मà¥\8dमà¥\8dहि à¤\86तà¥\8dता à¤¸à¥\81दà¥\8dधा [$1 à¤«à¤°à¤\95 à¤¬à¤\98ा] à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर.",
+तà¥\81मà¥\8dमà¥\8dहि à¤\86तà¥\8dता à¤¸à¥\81दà¥\8dधा [$1 à¤«à¤°à¤\95 à¤¬à¤\98ा] à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर.",
 'rev-suppressed-unhide-diff' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
 महिती एथे सुद्धा मीलु शकेल  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} रीक्क्त कर्न्यात आले आहे].
-तà¥\81मà¥\8dमà¥\8dहि à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा [$1 à¤¹à¤¾ à¤«à¤°à¤\95 à¤\93लà¤\96ा] à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर.",
+तà¥\81मà¥\8dमà¥\8dहि à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा [$1 à¤¹à¤¾ à¤«à¤°à¤\95 à¤\93लà¤\96ा] à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर.",
 'rev-deleted-diff-view' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
-तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 शकता ; माहिती यात मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रिक्क्त केलेली महिती].",
+तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 शकता ; माहिती यात मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रिक्क्त केलेली महिती].",
 'rev-suppressed-diff-view' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
-तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 à¤¶à¤\95ता ; à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¯à¤¾à¤¤ à¤®à¥\80लà¥\81 à¤¶à¤\95à¥\87ल [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर].",
+तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 à¤¶à¤\95ता ; à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¯à¤¾à¤¤ à¤®à¥\80लà¥\81 à¤¶à¤\95à¥\87ल [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर].",
 'rev-delundel' => 'दाखवा/लपवा',
 'rev-showdeleted' => 'दाखवा',
 'revisiondelete' => 'आवर्तने वगळा/पुनर्स्थापित करा',
 'revdelete-nooldid-title' => 'अपेक्षीत आवृत्ती दिलेली नाही',
-'revdelete-nooldid-text' => '!!à¤\86पण à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤\95रावयाà¤\9aà¥\80 à¤\86वरà¥\8dतनà¥\87 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\95à¥\87लà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80त, à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\86वरà¥\8dतन à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤\95िà¤\82वा à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤§à¥\8dयाà¤\9aà¥\87 à¤\86वरà¥\8dतन à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\80त आहात.',
+'revdelete-nooldid-text' => '!!à¤\86पण à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤\95रावयाà¤\9aà¥\80 à¤\86वरà¥\8dतनà¥\87 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\95à¥\87लà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80त, à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\86वरà¥\8dतन à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤\95िà¤\82वा à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤§à¥\8dयाà¤\9aà¥\87 à¤\86वरà¥\8dतन à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रित आहात.',
 'revdelete-nologtype-title' => 'कोणताही क्रमलेखप्रकार दिलेला नाही',
 'revdelete-nologtype-text' => 'ही क्रिया करण्यासाठी तुम्ही यादीप्रकार निवडला नाही.',
 'revdelete-nologid-title' => 'अवैध क्रमलेख प्रविष्टी',
@@ -1155,15 +1155,15 @@ $3ने ''$2'' कारण दिले आहे.",
 'logdelete-selected' => "'''{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेल्या नोंदीकृत घटना}}:'''",
 'revdelete-text' => "'''वगळलेल्या नोंदी आणि घटना अजूनही पानाच्या इतिहासात आणि नोंदीत आढळेल,परंतु मजकुराचा भाग सार्वजनिक स्वरूपात उपलब्ध राहणार नाही.'''
 
-à¤\85à¤\9cà¥\82न à¤\87तर  à¤ªà¥\8dरतिबà¤\82ध à¤\98ातलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ {{SITENAME}}à¤\9aà¥\87 à¤\87तर à¤ªà¥\8dरबà¤\82धà¤\95 à¤\9dाà¤\95लà¥\87ला à¤®à¤\9cà¤\95à¥\81र याच दुव्याने परतवू शकतील.",
-'revdelete-confirm' => 'à¤\95à¥\83पया à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा à¤\95à¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤\9cà¥\87 à¤\95रà¥\80त आहात, त्याचे परिणाम जाणत आहात, आणि ते [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे काय?',
+à¤\85à¤\9cà¥\82न à¤\87तर  à¤ªà¥\8dरतिबà¤\82ध à¤\98ातलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ {{SITENAME}}à¤\9aà¥\87 à¤\87तर à¤ªà¥\8dरबà¤\82धà¤\95 à¤\9dाà¤\95लà¥\87ला à¤®à¤\9cà¤\95à¥\82र याच दुव्याने परतवू शकतील.",
+'revdelete-confirm' => 'à¤\95à¥\83पया à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा à¤\95à¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤\9cà¥\87 à¤\95रित आहात, त्याचे परिणाम जाणत आहात, आणि ते [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे काय?',
 'revdelete-suppress-text' => "लपवण्याचा वापर '''फक्त''' पुढील बाबतीत होतो:
 * अनुपयोगी माहिती
 * अयोग्य व्यक्तिगत माहिती
 *: ''गृहपत्ते, दूरध्वनी क्रमांक व सामाजिक सुरक्षा क्रमांक''",
 'revdelete-legend' => 'दृश्य बंधने निश्चित करा',
-'revdelete-hide-text' => 'à¤\86वरà¥\8dतà¥\80त à¤®à¤\9cà¤\95à¥\81र लपवा',
-'revdelete-hide-image' => 'सà¤\82à¤\9aिà¤\95ा à¤®à¤\9cà¤\95à¥\81र लपवा',
+'revdelete-hide-text' => 'à¤\86वरà¥\8dतà¥\80त à¤®à¤\9cà¤\95à¥\82र लपवा',
+'revdelete-hide-image' => 'सà¤\82à¤\9aिà¤\95ा à¤®à¤\9cà¤\95à¥\82र लपवा',
 'revdelete-hide-name' => 'कृती आणि लक्ष्य लपवा',
 'revdelete-hide-comment' => 'संपादन संक्षेप लपवा',
 'revdelete-hide-user' => 'संपादकाचे सदस्यनाव/आयपी अंकपत्ता लपवा',
@@ -1203,28 +1203,28 @@ $1",
 ** अनुपयोगी माहिती',
 'revdelete-otherreason' => 'इतर / आणखी कारण:',
 'revdelete-reasonotherlist' => 'इतर कारणे',
-'revdelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादà¥\80त करा',
+'revdelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादित करा',
 'revdelete-offender' => 'आवर्तन निर्माता:',
 
 # Suppression log
 'suppressionlog' => 'सप्रेशन नोंद',
 'suppressionlogtext' => 'खालील यादी ही रिक्क्त आनी ब्लोक त्याचे प्रकार हे आड्मिनिस्ट्रेटर्स पासून चुपे असतात.
-हà¥\87 à¤¬à¤\98ा [[Special:BlockList|IP block list]] à¤¸à¤¦à¥\8dधà¥\8dया à¤\9aालà¥\81 à¤\85सलà¥\87लà¥\87  à¤\93परà¥\87शà¥\8dनल à¤¬à¤¨à¥\8dस à¤\86णà¥\80 ब्लोच्क्स.',
+हà¥\87 à¤¬à¤\98ा [[Special:BlockList|IP block list]] à¤¸à¤¦à¥\8dधà¥\8dया à¤\9aालà¥\82 à¤\85सलà¥\87लà¥\87  à¤\93परà¥\87शà¥\8dनल à¤¬à¤¨à¥\8dस à¤\86णि ब्लोच्क्स.',
 
 # History merging
-'mergehistory' => 'पान à¤\88तिहासाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिकरण करा',
+'mergehistory' => 'पान à¤\88तिहासाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80करण करा',
 'mergehistory-header' => 'हे पान एका स्रोत पानाचा इतिहास एखाद्या नवीन पानात समाविष्ट करू देते.
 हा बदल पानाचे ऐतिहासिक सातत्य राखेल याची दक्षता घ्या.',
 'mergehistory-box' => 'दोन पानांची आवर्तने संमिलीत करा:',
 'mergehistory-from' => 'स्रोत पान:',
 'mergehistory-into' => 'लक्ष्य पान:',
 'mergehistory-list' => 'गोळाबेरीज करण्याजोगा संपादन इतिहास',
-'mergehistory-merge' => '[[:$1]]à¤\9aà¥\80 à¤ªà¥\82ढà¥\80ल à¤\86वरà¥\8dतनà¥\87 [[:$2]]मधà¥\8dयà¥\87 à¤\8fà¤\95तà¥\8dरित à¤\95रता à¤¯à¥\87तà¥\80ल.ठराविà¤\95 à¤µà¥\87ळà¥\80 à¤\85थवा à¤¤à¤¤à¥\8dपà¥\82रà¥\8dवà¥\80 à¤\9dालà¥\87लà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिà¤\95रण à¤\95रणà¥\8dयाà¤\95रिता à¤°à¥\87डà¥\80ओ कळ स्तंभ वापरा.हा स्तंभ सुचालन दुवे वापरल्यास पूर्वपदावर येईल हे लक्षात घ्या.',
+'mergehistory-merge' => '[[:$1]]à¤\9aà¥\80 à¤ªà¥\81ढà¥\80ल à¤\86वरà¥\8dतनà¥\87 [[:$2]]मधà¥\8dयà¥\87 à¤\8fà¤\95तà¥\8dरित à¤\95रता à¤¯à¥\87तà¥\80ल.ठराविà¤\95 à¤µà¥\87ळà¥\80 à¤\85थवा à¤¤à¤¤à¥\8dपà¥\82रà¥\8dवà¥\80 à¤\9dालà¥\87लà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80à¤\95रण à¤\95रणà¥\8dयाà¤\95रिता à¤°à¥\87डिओ कळ स्तंभ वापरा.हा स्तंभ सुचालन दुवे वापरल्यास पूर्वपदावर येईल हे लक्षात घ्या.',
 'mergehistory-go' => 'गोळाबेरीज करण्याजोगी संपादने दाखवा',
 'mergehistory-submit' => 'आवर्तने एकत्रित करा.',
 'mergehistory-empty' => 'कोणतेही आवर्तन एकत्रित करता येत नाही.',
-'mergehistory-success' => '[[:$1]] {{PLURAL:$3|à¤\9aà¥\87|à¤\9aà¥\80}} $3 {{PLURAL:$3|à¤\86वरà¥\8dतन|à¤\86वरà¥\8dतनà¥\87}} [[:$2]] à¤®à¤§à¥\8dयà¥\87 à¤¯à¤¶à¤¸à¥\8dवà¥\80रित्या एकत्रित केली.',
-'mergehistory-fail' => 'à¤\87तिहासाà¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिकरण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ नियमावलीची पुर्नतपासणी करा.',
+'mergehistory-success' => '[[:$1]] {{PLURAL:$3|à¤\9aà¥\87|à¤\9aà¥\80}} $3 {{PLURAL:$3|à¤\86वरà¥\8dतन|à¤\86वरà¥\8dतनà¥\87}} [[:$2]] à¤®à¤§à¥\8dयà¥\87 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80त्या एकत्रित केली.',
+'mergehistory-fail' => 'à¤\87तिहासाà¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80करण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ नियमावलीची पुर्नतपासणी करा.',
 'mergehistory-no-source' => 'स्रोत पान $1 अस्तित्वात नाही.',
 'mergehistory-no-destination' => 'लक्ष्य पान $1  अस्तित्वात नाही.',
 'mergehistory-invalid-source' => 'स्रोत पानाचे शीर्षक योग्य असणे आवश्यक आहे.',
@@ -1238,7 +1238,7 @@ $1",
 'mergelog' => 'नोंदी एकत्र करा',
 'pagemerge-logentry' => '[[$2]]मध्ये[[$1]] समाविष्ट केले ($3पर्यंतची आवर्तने)',
 'revertmerge' => 'वेगवेगळे करा',
-'mergelogpagetext' => 'à¤\8fà¤\95ापानाà¤\9aा à¤\87तिहास à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤¤ à¤\9fाà¤\95à¥\82न à¤\85à¤\97दà¥\80 à¤\85लिकडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.',
+'mergelogpagetext' => 'à¤\8fà¤\95ापानाà¤\9aा à¤\87तिहास à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤¤ à¤\9fाà¤\95à¥\82न à¤\85à¤\97दà¥\80 à¤\85लà¥\80कडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.',
 
 # Diffs
 'history-title' => '"$1" चा संपादन इतिहास',
@@ -1261,7 +1261,7 @@ $1",
 'toomanymatches' => 'खूप एकसारखी उत्तरे मिळाली, कृपया पृच्छा वेगळ्या तऱ्हेने करून पहा',
 'titlematches' => 'पानाचे शीर्षक जुळते',
 'notitlematches' => 'कोणत्याही पानाचे शीर्षक जुळत नाही',
-'textmatches' => 'पानातà¥\80ल à¤®à¤\9cà¤\95à¥\81र जुळतो',
+'textmatches' => 'पानातà¥\80ल à¤®à¤\9cà¤\95à¥\82र जुळतो',
 'notextmatches' => 'पानातील मजकुराशी जुळत नाही',
 'prevn' => 'मागील {{PLURAL:$1|$1}}',
 'nextn' => 'पुढील {{PLURAL:$1|$1}}',
@@ -1270,8 +1270,8 @@ $1",
 'shown-title' => '$1 {{PLURAL:$1|निकाल|निकाल}} निकाल प्रतिपान पहा',
 'viewprevnext' => 'पहा ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'विकल्प शोधा',
-'searchmenu-exists' => "'''या à¤µà¤¿à¤\95à¥\80वर \"[[:\$1]]\" या नावाचे पान आहे.'''",
-'searchmenu-new' => "'''या à¤µà¤¿à¤\95à¥\80वर \"[[:\$1]]\" हे पान तयार करा!'''",
+'searchmenu-exists' => "'''या à¤µà¤¿à¤\95िवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
+'searchmenu-new' => "'''या à¤µà¤¿à¤\95िवर \"[[:\$1]]\" हे पान तयार करा!'''",
 'searchhelp-url' => 'Help:साहाय्य पृष्ठ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसर्गानिशी असलेली पाने न्याहाळा]]',
 'searchprofile-articles' => 'संबंधित पाने',
@@ -1301,7 +1301,7 @@ $1",
 'showingresults' => "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
 'showingresultsnum' => "खाली दिलेले #'''$2'''पासून सुरू होणारे  {{PLURAL:$3|'''1''' निकाल|'''$3''' निकाल}}.",
 'showingresultsheader' => "'''$4''' साठी {{PLURAL:$5|'''$3'''पैकी '''$1''' निकाल|'''$3''' पैकी '''$1 - $2''' निकाल}}",
-'nonefound' => "'''सà¥\82à¤\9aना''':à¤\95ाहà¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87à¤\9a à¤¨à¥\87हमà¥\80 à¤¶à¥\8bधलà¥\80 à¤\9cातात. à¤¸à¤°à¥\8dव à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87 à¤¶à¥\8bधणà¥\8dयाà¤\95रà¥\80ता (चर्चा पाने, साचे, इ. सकट) कॄपया शोधशब्दांच्या आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविश्व लिहा.",
+'nonefound' => "'''सà¥\82à¤\9aना''':à¤\95ाहà¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87à¤\9a à¤¨à¥\87हमà¥\80 à¤¶à¥\8bधलà¥\80 à¤\9cातात. à¤¸à¤°à¥\8dव à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87 à¤¶à¥\8bधणà¥\8dयाà¤\95रिता (चर्चा पाने, साचे, इ. सकट) कॄपया शोधशब्दांच्या आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविश्व लिहा.",
 'search-nonefound' => 'दिलेल्या वर्णनाशी जुळणारे निकाल नाहीत.',
 'powersearch' => 'वाढीव शोध',
 'powersearch-legend' => 'वाढीव शोध',
@@ -1312,7 +1312,7 @@ $1",
 'powersearch-toggleall' => 'सर्व',
 'powersearch-togglenone' => 'काहीही नाही',
 'search-external' => 'बाह्य शोध',
-'searchdisabled' => '{{SITENAME}} à¤¶à¥\8bध à¤\85नà¥\81पलबà¥\8dध à¤\95à¥\87ला à¤\86हà¥\87.तà¥\8b à¤ªà¤°à¥\8dयà¤\82त à¤\97à¥\82à¤\97लवरà¥\82न à¤¶à¥\8bध à¤\98à¥\8dया.{{SITENAME}}à¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राà¤\9aà¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aिबदà¥\8dधता à¤¶à¤¿à¤³à¥\80 à¤\85सणà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\85सà¥\81 शकते हे लक्षात घ्या.',
+'searchdisabled' => '{{SITENAME}} à¤¶à¥\8bध à¤\85नà¥\81पलबà¥\8dध à¤\95à¥\87ला à¤\86हà¥\87.तà¥\8b à¤ªà¤°à¥\8dयà¤\82त à¤\97à¥\82à¤\97लवरà¥\82न à¤¶à¥\8bध à¤\98à¥\8dया.{{SITENAME}}à¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राà¤\9aà¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aिबदà¥\8dधता à¤¶à¤¿à¤³à¥\80 à¤\85सणà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\85सà¥\82 शकते हे लक्षात घ्या.',
 
 # Quickbar
 'qbsettings' => 'शीघ्रपट',
@@ -1366,9 +1366,9 @@ $1",
 'recentchangesdays-max' => 'जास्तीतजास्त $1 {{PLURAL:$1|दिवस|दिवस}}',
 'recentchangescount' => 'अलीकडील बदल, इतिहास व नोंद पानांमध्ये दाखवायाच्या संपादनांची संख्या:',
 'prefs-help-recentchangescount' => 'यात नुकतेच झालेले बदल, पानांचे इतिहास व याद्या या गोष्टी असतात.',
-'prefs-help-watchlist-token' => 'या à¤\95à¥\8dषà¥\87तà¥\8dरत à¤\97à¥\81पित à¤\95िलà¥\8dलि प्रदान केल्यस तुमच्या निरीक्षणयादीसाठी एक आरएसएस फीड उत्पन्न होईल.
-à¤\95à¥\8bणà¥\80हà¥\80 à¤\9cà¥\8dयाला à¤¯à¤¾ à¤\95à¥\8dषà¥\87तà¥\8dरातिल à¤\95िलà¥\8dलि à¤®à¤¾à¤¹à¤¿à¤¤ à¤\85सà¥\87ल à¤¤à¥\81मà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणयादà¥\80 à¤µà¤¾à¤\9aà¥\82 à¤¶à¤\95तà¥\8b, à¤¤à¥\8dयमà¥\81ळà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95िलà¥\8dलि निवडा.
-यà¥\87थà¥\87 à¤\8fà¤\95 à¤¯à¤\82तà¥\8dरà¤\9cनित à¤\95िलà¥\8dलि दिलेली आहे गरज असल्यस तुम्ही ती वपरु शकता: $1',
+'prefs-help-watchlist-token' => 'या à¤\95à¥\8dषà¥\87तà¥\8dरत à¤\97à¥\81पित à¤\95िलà¥\8dलà¥\80 प्रदान केल्यस तुमच्या निरीक्षणयादीसाठी एक आरएसएस फीड उत्पन्न होईल.
+à¤\95à¥\8bणà¥\80हà¥\80 à¤\9cà¥\8dयाला à¤¯à¤¾ à¤\95à¥\8dषà¥\87तà¥\8dरातà¥\80ल à¤\95िलà¥\8dलà¥\80 à¤®à¤¾à¤¹à¥\80त à¤\85सà¥\87ल à¤¤à¥\81मà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणयादà¥\80 à¤µà¤¾à¤\9aà¥\82 à¤¶à¤\95तà¥\8b, à¤¤à¥\8dयमà¥\81ळà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95िलà¥\8dलà¥\80 निवडा.
+यà¥\87थà¥\87 à¤\8fà¤\95 à¤¯à¤\82तà¥\8dरà¤\9cनित à¤\95िलà¥\8dलà¥\80 दिलेली आहे गरज असल्यस तुम्ही ती वपरु शकता: $1',
 'savedprefs' => 'तुमच्या पसंती जतन केल्या आहेत.',
 'timezonelegend' => 'वेळक्षेत्र',
 'localtime' => 'स्थानिक वेळ:',
@@ -1410,7 +1410,7 @@ $1",
 'prefs-help-variant' => 'या विकीची पाने दाखवण्यासाठी तुमच्या पसंतीचे शुद्धलेखन',
 'yournick' => 'आपले उपनाव (सहीसाठी)',
 'prefs-help-signature' => 'चर्चा पानावरील टिपणाखाली "<nowiki>~~~~</nowiki>" लिहावे म्हणजे त्याचे रूपांतर आपली सही व सही करण्याची वेळ यात होईल.',
-'badsig' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¸à¤¹à¥\80;HTML à¤\96à¥\82णा तपासा.',
+'badsig' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¸à¤¹à¥\80;HTML à¤\96à¥\81णा तपासा.',
 'badsiglength' => 'तुमची स्वाक्षरी खूप लांब आहे.
 टोपणनाव $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचे हवे.',
 'yourgender' => 'लिंग',
@@ -1458,7 +1458,7 @@ $1",
 * एक * चा अर्थ तुम्ही एकदा समावेश केल्यानंतर तो गट बदलू शकत नाही, किंवा काढल्यानंतर समावेश करू शकत नाही.',
 'userrights-reason' => 'कारण:',
 'userrights-no-interwiki' => 'इतर विकींवरचे सदस्य अधिकार बदलण्याची परवानगी तुम्हाला नाही.',
-'userrights-nodatabase' => 'विदा $1 à¤\85सà¥\8dतà¥\80त्वात नाही अथवा स्थानिक नाही.',
+'userrights-nodatabase' => 'विदा $1 à¤\85सà¥\8dतित्वात नाही अथवा स्थानिक नाही.',
 'userrights-nologin' => 'सदस्य अधिकार देण्यासाठी तुम्ही प्रबंधक म्हणून [[Special:UserLogin|प्रवेश केलेला]] असणे आवश्यक आहे.',
 'userrights-notallowed' => 'तुमच्या सदस्य खात्यास सदस्य अधिकारांची निश्चिती करण्याची परवानगी नाही.',
 'userrights-changeable-col' => 'गट जे तुम्ही बदलू शकता',
@@ -1513,7 +1513,7 @@ $1",
 'right-writeapi' => 'लेखन एपीआय चा उपयोग',
 'right-delete' => 'पृष्ठे वगळा',
 'right-bigdelete' => 'जास्त इतिहास असणारी पाने वगळा',
-'right-deletelogentry' => 'थरविà¤\95à¥\8d à¤²à¥\8bà¤\97à¥\8d à¤ªà¥\8dरवà¥\87शà¥\8d à¤¬à¤¨à¥\8dद à¤\86नि à¤\9aालà¥\81 करने',
+'right-deletelogentry' => 'थरविà¤\95à¥\8d à¤²à¥\8bà¤\97à¥\8d à¤ªà¥\8dरवà¥\87शà¥\8d à¤¬à¤¨à¥\8dद à¤\86नि à¤\9aालà¥\82 करने',
 'right-deleterevision' => 'एखाद्या पानाच्या विशिष्ट आवृत्त्या लपवा',
 'right-deletedhistory' => 'वगळलेल्या इतिहास नोंदी, त्यांच्या संलग्न मजकूराशिवाय पहा',
 'right-deletedtext' => 'वगळलेला मजकूर व वगळलेल्या आवर्तनांमधील बदल पहा',
@@ -1540,12 +1540,12 @@ $1",
 'right-importupload' => 'चढविलेल्या संचिकेतून पाने आयात करा',
 'right-patrol' => 'इतरांची संपादने तपासलेली म्हणून जतन करा',
 'right-autopatrol' => 'संपादने आपोआप तपासलेली (patrolled) म्हणून जतन करा',
-'right-patrolmarks' => 'à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\82मधà¥\80ल à¤¤à¤ªà¤¾à¤¸à¤²à¥\8dयाà¤\9aà¥\8dया à¤\96à¥\82णा पहा',
+'right-patrolmarks' => 'à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\82मधà¥\80ल à¤¤à¤ªà¤¾à¤¸à¤²à¥\8dयाà¤\9aà¥\8dया à¤\96à¥\81णा पहा',
 'right-unwatchedpages' => 'न पाहिलेल्या पानांची यादी पहा',
 'right-mergehistory' => 'पानांचा इतिहास एकत्रित करा',
 'right-userrights' => 'सर्व सदस्यांचे अधिकार संपादा',
 'right-userrights-interwiki' => 'इतर विकिंवर सदस्य अधिकार बदला',
-'right-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\81प लावा अथवा काढा',
+'right-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\82प लावा अथवा काढा',
 'right-override-export-depth' => 'पाने निर्यात करा (आंतरिक जेडलेली पाने पाचव्या पतळी पर्यंत समाविष्ट करुन).',
 'right-sendemail' => 'इतर सदस्यांना विपत्रे पाठवा',
 'right-passwordreset' => 'परवलीचा शब्द (पासवर्ड) पुन:स्थापित केल्याची इ मेल पहा.',
@@ -1592,7 +1592,7 @@ $1",
 'action-mergehistory' => 'पानाचा इतिहास विलीन करा',
 'action-userrights' => 'सर्व सदस्यांचे अधिकार संपादित करा',
 'action-userrights-interwiki' => 'इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा',
-'action-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\81प लावा अथवा काढा',
+'action-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\82प लावा अथवा काढा',
 'action-sendemail' => 'विपत्रे (ई-मेल्स) पाठवा.',
 
 # Recent changes
@@ -1600,7 +1600,7 @@ $1",
 'recentchanges' => 'अलीकडील बदल',
 'recentchanges-legend' => 'अलीकडील बदल पर्याय',
 'recentchanges-summary' => 'विकितील अलीकडील बदल या पानावर दिसतात.',
-'recentchanges-feed-description' => 'या à¤°à¤¸à¤¦à¥\80मधà¥\80ल à¤µà¤¿à¤\95à¥\80वर झालेले सर्वात अलीकडील बदल पहा.',
+'recentchanges-feed-description' => 'या à¤°à¤¸à¤¦à¥\80मधà¥\80ल à¤µà¤¿à¤\95िवर झालेले सर्वात अलीकडील बदल पहा.',
 'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार झाले',
 'recentchanges-label-minor' => 'हा एक छोटा बदल आहे',
 'recentchanges-label-bot' => 'हे संपादन एका सांगकाम्याकडून केले गेले आहे',
@@ -1623,7 +1623,7 @@ $1",
 'newpageletter' => 'न',
 'boteditletter' => 'सां',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]',
-'rc_categories' => 'वरà¥\8dà¤\97ाà¤\82पपà¥\81रतà¥\87 à¤®à¤°à¥\8dयादà¥\80त ठेवा ("|"ने वेगळे करा)',
+'rc_categories' => 'वरà¥\8dà¤\97ाà¤\82पपà¥\81रतà¥\87 à¤®à¤°à¥\8dयादित ठेवा ("|"ने वेगळे करा)',
 'rc_categories_any' => 'कोणतेही',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} बदला',
 'newsectionsummary' => '/* $1 */ नवीन विभाग',
@@ -1652,7 +1652,7 @@ $1",
 'upload_directory_missing' => 'अपलोड डिरेक्टरी ($1) सापडली नाही तसेच वेबसर्व्हर ती तयार करू शकलेला नाही.',
 'upload_directory_read_only' => '$1 या डिरेक्टरी मध्ये सर्व्हर लिहू शकत नाही.',
 'uploaderror' => 'चढवण्यात चूक',
-'upload-recreate-warning' => "'''सावधान: à¤¯à¤¾ à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aà¥\80à¤\95ा à¤µà¤\97ळलà¥\80 à¤\85थवा à¤¸à¥\8dथलाà¤\82तरà¥\80त करण्यात आली आहे.'''
+'upload-recreate-warning' => "'''सावधान: à¤¯à¤¾ à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aà¥\80à¤\95ा à¤µà¤\97ळलà¥\80 à¤\85थवा à¤¸à¥\8dथलाà¤\82तरित करण्यात आली आहे.'''
 या पानाची वगळल्याची व स्थलांतरणाची नोंद तुमच्या सोयीसाठी येथे पुरवली आहे.:",
 'uploadtext' => "खालील अर्ज नवीन संचिका चढविण्यासाठी वापरा.
 पूर्वी चढविलेल्या संचिका पाहण्यासाठी अथवा शोधण्यासाठी [[Special:FileList|चढविलेल्या संचिकांची यादी]] पहा. चढविलेल्या तसेच वगळलेल्या संचिकांची यादी पहाण्यासाठी [[Special:Log/upload|चढवलेल्या संचिकांची सूची]] व [[Special:Log/delete|वगळलेल्या संचिकांची सूची]] पहा.
@@ -1675,10 +1675,10 @@ $1",
 'filesource' => 'स्रोत:',
 'uploadedfiles' => 'चढवलेल्या संचिका',
 'ignorewarning' => 'सुचनेकडे दुर्लक्ष करा आणि संचिका जतन करा.',
-'ignorewarnings' => 'सरà¥\8dव à¤¸à¥\81चनांकडे दुर्लक्ष करा',
+'ignorewarnings' => 'सरà¥\8dव à¤¸à¥\82चनांकडे दुर्लक्ष करा',
 'minlength1' => 'संचिकानाम किमान एक अक्षराचे हवे.',
 'illegalfilename' => '"$1" या संचिकानामात शीर्षकात चालू न शकणारी अक्षरे आहेत. कृपया संचिकानाम बदलून पुन्हा चढवण्याचा प्रयत्न करा.',
-'filename-toolong' => '२४० à¤¬à¤¾à¤\88à¤\9fपà¥\87à¤\95à¥\8dषा à¤«à¤¾à¤\88लचे नांव स्वीकारले जाणार नाही.',
+'filename-toolong' => '२४० à¤¬à¤¾à¤\88à¤\9fपà¥\87à¤\95à¥\8dषा à¤«à¤¾à¤\87लचे नांव स्वीकारले जाणार नाही.',
 'badfilename' => 'संचिकेचे नाव बदलून "$1" असे केले आहे.',
 'filetype-mime-mismatch' => 'संचिका विस्तारक ".$1" ठरवलेल्या एमआयएमई संचिकाप्रकारांशी जुळत नाही ($2).',
 'filetype-badmime' => 'विविधामाप(माईम) "$1" प्रकारच्या संचिका चढवण्यास परवानगी नाही.',
@@ -1691,7 +1691,7 @@ $1",
 'filename-tooshort' => 'तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप कमी होती.',
 'filetype-banned' => 'याप्रकारची संचिका प्रतिबंधित आहे.',
 'verification-error' => 'संचिका पडताळणीत ही संचिका अनुत्तीर्ण झाली.',
-'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bà¥\80णारे संपादन बाह्य हुक द्वारे थंबवण्यात आले.',
+'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारे संपादन बाह्य हुक द्वारे थंबवण्यात आले.',
 'illegal-filename' => 'हे संचिकानाम प्रतिबंधित आहे.',
 'overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
 'unknown-error' => 'एक अज्ञात चूक उद्भवली.',
@@ -1700,16 +1700,16 @@ $1",
 'large-file' => 'संचिका $1 पेक्षा कमी आकाराची असण्याची अपेक्षा आहे, ही संचिका $2 एवढी आहे.',
 'largefileserver' => 'सेवा संगणकावर (सर्वर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.',
 'emptyfile' => 'चढवलेली संचिका रिकामी आहे. हे संचिकानाम चुकीचे लिहिल्याने असू शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.',
-'windows-nonascii-filename' => 'या à¤µà¤¿à¤\95à¥\80वर विशेष चिन्हातील फाईलनांवाचा आधार घेता येणार नाही.',
+'windows-nonascii-filename' => 'या à¤µà¤¿à¤\95िवर विशेष चिन्हातील फाईलनांवाचा आधार घेता येणार नाही.',
 'fileexists' => 'या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर <strong>[[:$1]]</strong> तपासा.
 [[$1|thumb]]',
 'filepageexists' => 'या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.
 [[$1|thumb]]',
 'fileexists-extension' => 'या नावाची संचिका अस्तित्वात आहे: [[$2|thumb]]
-* à¤\9aढवित असलेल्या संचिकेचे नाव: <strong>[[:$1]]</strong>
+* à¤\9aढवà¥\80त असलेल्या संचिकेचे नाव: <strong>[[:$1]]</strong>
 * अस्तित्वात असलेल्या संचिकेचे नाव: <strong>[[:$2]]</strong>
 कृपया दुसरे नाव निवडा.',
-'fileexists-thumbnail-yes' => "à¤\86पण à¤\9aढवित असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]
+'fileexists-thumbnail-yes' => "à¤\86पण à¤\9aढवà¥\80त असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]
 कृपया <strong>[[:$1]]</strong> ही संचिका तपासा.
 जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
 'file-thumbnail-no' => 'या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
@@ -1729,12 +1729,12 @@ $1",
 'copyuploaddisabled' => 'आंतरजालपत्त्याद्वारे चढवणे प्रतिबंधित आहे.',
 'uploadfromurl-queued' => 'तुमचे चढवणे नोंदवण्यात आले आहे',
 'uploaddisabledtext' => '{{SITENAME}} वर संचिका चढविण्यास बंदी घालण्यात आलेली आहे.',
-'php-uploaddisabledtext' => 'PHP à¤®à¤§à¥\8dयà¥\87 à¤¸à¤\82à¤\9aिà¤\95ा à¤\9aढवणà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त केले आहे.
+'php-uploaddisabledtext' => 'PHP à¤®à¤§à¥\8dयà¥\87 à¤¸à¤\82à¤\9aिà¤\95ा à¤\9aढवणà¥\87 à¤ªà¥\8dरतिबà¤\82धित केले आहे.
 कृपया file_uploads मांडणी (setting) तपासावी.',
-'uploadscripted' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87त HTML à¤\95िà¤\82वा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\95à¥\8bडà¤\9aा à¤\86à¤\82तरà¥\8dभाव à¤\86हà¥\87, à¤¤à¥\8dयाà¤\9aा à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤\9aरà¤\95ाà¤\95डà¥\82न à¤µà¤¿à¤\9aà¥\80त्र अर्थ लावला जाऊ शकतो.',
+'uploadscripted' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87त HTML à¤\95िà¤\82वा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\95à¥\8bडà¤\9aा à¤\86à¤\82तरà¥\8dभाव à¤\86हà¥\87, à¤¤à¥\8dयाà¤\9aा à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤\9aरà¤\95ाà¤\95डà¥\82न à¤µà¤¿à¤\9aित्र अर्थ लावला जाऊ शकतो.',
 'uploadvirus' => 'ह्या संचिकेत व्हायरस आहे. अधिक माहिती: $1',
-'uploadjava' => 'हà¥\80 à¤«à¤¾à¤\88ल à¤\9dà¥\80पà¥\8d à¤¹à¥\8dया à¤ªà¥\8dरà¤\95ारातिल आहे ज्यामधे जाव्हा .क्लास फाईल. आहे,
- à¤\9cावà¥\8dहा à¤«à¤¾à¤\88ल  à¤¹à¥\8dयात à¤µà¤¾à¤ªà¤°à¥\8dता  à¤¯à¥\87नार à¤¨à¤¾à¤¹à¤¿à¤¤ ,à¤\95ारन à¤\88थे सुरक्षेचे कारने येतात्',
+'uploadjava' => 'हà¥\80 à¤«à¤¾à¤\88ल à¤\9dà¥\80पà¥\8d à¤¹à¥\8dया à¤ªà¥\8dरà¤\95ारातà¥\80ल आहे ज्यामधे जाव्हा .क्लास फाईल. आहे,
+ à¤\9cावà¥\8dहा à¤«à¤¾à¤\88ल  à¤¹à¥\8dयात à¤µà¤¾à¤ªà¤°à¥\8dता  à¤¯à¥\87नार à¤¨à¤¾à¤¹à¥\80त ,à¤\95ारन à¤\87थे सुरक्षेचे कारने येतात्',
 'upload-source' => 'स्रोत संचिका',
 'sourcefilename' => 'स्रोत-संचिकानाम:',
 'sourceurl' => 'स्रोत युआरएल',
@@ -1752,13 +1752,13 @@ $1",
 
 $1',
 'upload-warning-subj' => 'चढवताना सूचना',
-'upload-warning-msg' => 'तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 à¤\9dालà¥\80. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:Upload/stash/$1|à¤\9aढवणà¥\8dयाà¤\9aा à¤\85रà¥\8dà¤\9c]] à¤ªà¥\81नà¥\8dहा à¤­à¤°à¥\81न ही चूक दूर करू शकता.',
+'upload-warning-msg' => 'तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 à¤\9dालà¥\80. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:Upload/stash/$1|à¤\9aढवणà¥\8dयाà¤\9aा à¤\85रà¥\8dà¤\9c]] à¤ªà¥\81नà¥\8dहा à¤­à¤°à¥\82न ही चूक दूर करू शकता.',
 
 'upload-proto-error' => 'चूकीचा संकेत',
-'upload-proto-error-text' => 'दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाà¤\9aà¥\8dया à¤\95à¥\8dरियà¥\87त <code>http://</code>पासà¥\82न à¤\95िà¤\82वा <code>ftp://</code>पासà¥\82न à¤¸à¥\82रू होणारी URL लागतात.',
+'upload-proto-error-text' => 'दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाà¤\9aà¥\8dया à¤\95à¥\8dरियà¥\87त <code>http://</code>पासà¥\82न à¤\95िà¤\82वा <code>ftp://</code>पासà¥\82न à¤¸à¥\81रू होणारी URL लागतात.',
 'upload-file-error' => 'अंतर्गत त्रूटी',
 'upload-file-error-text' => 'विदादात्यावर तात्पुरती संचिका तयार करण्याच्या प्रयत्न करत असताना अंतर्गत तांत्रिक अडचण आली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.',
-'upload-misc-error' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¤¿à¤¤ à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\82टी आलेली आहे.',
+'upload-misc-error' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¥\80त à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\81टी आलेली आहे.',
 'upload-misc-error-text' => 'चढवताना अज्ञात तांत्रिक अडचण आली.कृपया आंतरजालपत्ता सुयोग्य आणि उपलब्ध आहे का ते तपासा आणि पुन्हा प्रयत्न करा. अधिक अडचणी आल्यास तर [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.',
 'upload-too-many-redirects' => 'या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत',
 'upload-unknown-size' => 'अज्ञात आकारमान',
@@ -1789,10 +1789,10 @@ $1',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
 'backend-fail-internal' => 'पार्श्वभौमीक साठा "$1" यात अज्ञात चूक झाली आहे.',
 'backend-fail-contenttype' => '"$1" मध्ये ठेवलेल्या फाईलचा महितीचा प्रकार कळत नाही',
-'backend-fail-batchsize' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤¯à¤¾à¤¤à¥\80ल à¤¬à¥\85à¤\9a $1 à¤«à¤¾à¤\88ल{{PLURAL:$1|operation|operations}}; à¤®à¤§à¥\87 à¤®à¤°à¥\8dयादà¥\80त कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
+'backend-fail-batchsize' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤¯à¤¾à¤¤à¥\80ल à¤¬à¥\85à¤\9a $1 à¤«à¤¾à¤\88ल{{PLURAL:$1|operation|operations}}; à¤®à¤§à¥\87 à¤®à¤°à¥\8dयादित कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
 
 # Lock manager
-'lockmanager-notlocked' => '"$1" à¤²à¤¾ à¤®à¥\8bà¤\95ळà¥\87 à¤\95रता à¤\86लà¥\87 à¤¨à¤¾à¤¹à¥\80;तà¥\87 à¤\95à¥\81लà¥\81पबंद नाही.',
+'lockmanager-notlocked' => '"$1" à¤²à¤¾ à¤®à¥\8bà¤\95ळà¥\87 à¤\95रता à¤\86लà¥\87 à¤¨à¤¾à¤¹à¥\80;तà¥\87 à¤\95à¥\81लà¥\82पबंद नाही.',
 'lockmanager-fail-closelock' => '"$1" साठी लॉक फाइल बंद करू शकत नाही',
 'lockmanager-fail-deletelock' => '"$1" साठी लॉक फाइल वगळू शकत नाही',
 'lockmanager-fail-acquirelock' => '"$1" साठी लॉक फाइल मिळवू शकत नाही',
@@ -1813,7 +1813,7 @@ $1',
 
 # Special:UploadStash
 'uploadstash' => 'चढवणे लपवा',
-'uploadstash-summary' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\85शà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¤¹à¤¾à¤µà¤¯à¤¾à¤¸à¥\8d à¤®à¤¿à¤³à¤¤à¤¾à¤¤ à¤\9cà¥\8dया à¤\9aढवलà¥\8dया à¤\86हà¥\87त (à¤\85थवा à¤\9aढवलà¥\8dया à¤\9cात à¤\86हà¥\87त) à¤ªà¤°à¤\82तà¥\81 à¤\85à¤\9cà¥\81न विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
+'uploadstash-summary' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\85शà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¤¹à¤¾à¤µà¤¯à¤¾à¤¸à¥\8d à¤®à¤¿à¤³à¤¤à¤¾à¤¤ à¤\9cà¥\8dया à¤\9aढवलà¥\8dया à¤\86हà¥\87त (à¤\85थवा à¤\9aढवलà¥\8dया à¤\9cात à¤\86हà¥\87त) à¤ªà¤°à¤\82तà¥\81 à¤\85à¤\9cà¥\82न विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
 'uploadstash-clear' => 'लपवलेल्या संचिका काढा',
 'uploadstash-nofiles' => 'तुमच्याकडे लपवलेल्या संचिका नाहीत.',
 'uploadstash-badtoken' => 'हि कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
@@ -1847,7 +1847,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'http-read-error' => 'एचटीटीपी वाचन त्रुटी.',
 'http-timed-out' => 'विनंती वेळ सपला आहे',
 'http-curl-error' => 'आंतरजालपत्ता पकडताना चूक: $1',
-'http-host-unreachable' => 'आंतरजाल पत्त्यापाशी पोहोचले नाही',
 'http-bad-status' => 'एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1914,7 +1913,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृत्ती चढवा',
 'shared-repo-from' => '$1 पासून',
 'shared-repo' => 'एक मुक्त कोश',
-'upload-disallowed-here' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87वर à¤\86पण à¤ªà¥\81नरà¥\8dलिà¤\96ाण à¤\95रà¥\81 शकत नाही.',
+'upload-disallowed-here' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87वर à¤\86पण à¤ªà¥\81नरà¥\8dलिà¤\96ाण à¤\95रà¥\82 शकत नाही.',
 
 # File reversion
 'filerevert' => '$1 पूर्वपद',
@@ -1942,7 +1941,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filedelete-reason-dropdown' => '*वगळण्याची सामान्य कारणे
 ** प्रताधिकार उल्लंघन
 ** जुळी संचिका',
-'filedelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादà¥\80त करा',
+'filedelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादित करा',
 'filedelete-maintenance' => 'फाईल वगळने आणि पुन्:स्थापित करण्',
 'filedelete-maintenance-title' => 'संचिका (फाईल) वगळू शकत नाही.',
 
@@ -1986,7 +1985,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'statistics-edits' => '{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने',
 'statistics-edits-average' => 'प्रतिपान सरासरी संपादने',
 'statistics-views-total' => 'सर्व दाखवते',
-'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\81 नका.',
+'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\82 नका.',
 'statistics-views-peredit' => 'प्रति संपादनामागे पाहणे',
 'statistics-users' => 'नोंदणीकृत [[Special:ListUsers|सदस्य]]',
 'statistics-users-active' => 'कार्यरत सदस्य',
@@ -1998,7 +1997,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'disambiguations-text' => "निम्नलिखीत पाने एका '''नि:संदिग्धकरण पृष्ठास'''जोडली जातात. त्याऐवजी ती सुयोग्य विषयाशी जोडली जावयास हवीत.<br /> जर जर एखादे पान [[MediaWiki:Disambiguationspage]]पासून जोडलेला साचा वापरत असेल तर ते पान '''नि:संदिग्धकरण पृष्ठ''' गृहीत धरले जाते",
 
 'doubleredirects' => 'दुहेरी-पुनर्निर्देशने',
-'doubleredirectstext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\81रवतà¥\87 à¤\95à¥\80 à¤\9cà¥\80 à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¥\87 à¤¦à¥\81सऱà¥\8dया à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87 à¤¨à¤¿à¤°à¥\8dदà¥\87शà¥\80त झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
+'doubleredirectstext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\81रवतà¥\87 à¤\95à¥\80 à¤\9cà¥\80 à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¥\87 à¤¦à¥\81सऱà¥\8dया à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87 à¤¨à¤¿à¤°à¥\8dदà¥\87शित झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
 'double-redirect-fixed-move' => '[[$1]] हलवले गेले आहे.
 ते [[$2]] येथे निर्देशित होते.',
 'double-redirect-fixed-maintenance' => '[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन नीट केले.',
@@ -2028,7 +2027,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'ntransclusions' => '$1{{PLURAL:$1|पानावर|पानांवर}} वापर',
 'specialpage-empty' => 'या अहवालाकरिता(रिपोर्ट)कोणताही निकाल नाही.',
 'lonelypages' => 'पोरकी पाने',
-'lonelypagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82ना {{SITENAME}}à¤\9aà¥\8dया à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤\82à¤\95डà¥\82न à¤¦à¥\82वा जोड झालेली नाही.',
+'lonelypagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82ना {{SITENAME}}à¤\9aà¥\8dया à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤\82à¤\95डà¥\82न à¤¦à¥\81वा जोड झालेली नाही.',
 'uncategorizedpages' => 'अवर्गीकृत पाने',
 'uncategorizedcategories' => 'अवर्गीकृत वर्ग',
 'uncategorizedimages' => 'अवर्गीकृत चित्रे',
@@ -2040,8 +2039,8 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'wantedpages' => 'पाहिजे असलेले लेख',
 'wantedpages-badtitle' => 'परिणामाच्या यादीत अवैध शीर्षक: $1',
 'wantedfiles' => 'पाहिजे असलेल्या संचिका',
-'wantedfiletext-cat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतà¥\80त्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील. अशी पाने [[:$1]] येथे दिसतील.',
-'wantedfiletext-nocat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतà¥\80त्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.',
+'wantedfiletext-cat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील. अशी पाने [[:$1]] येथे दिसतील.',
+'wantedfiletext-nocat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.',
 'wantedtemplates' => 'पाहिजे असलेले साचे',
 'mostlinked' => 'सर्वाधिक जोडलेली पाने',
 'mostlinkedcategories' => 'सर्वाधिक जोडलेले वर्ग',
@@ -2059,11 +2058,11 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'protectedpages' => 'सुरक्षित पाने',
 'protectedpages-indef' => 'फक्त अनंत काळासाठी सुरक्षित केलेले',
 'protectedpages-cascade' => 'केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)',
-'protectedpagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरण à¤\95िà¤\82वा à¤¸à¤\82पादन à¤¯à¤¾à¤\82पासà¥\81न सुरक्षित आहेत',
-'protectedpagesempty' => 'सधà¥\8dया à¤¯à¤¾ à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेली नाहीत.',
+'protectedpagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरण à¤\95िà¤\82वा à¤¸à¤\82पादन à¤¯à¤¾à¤\82पासà¥\82न सुरक्षित आहेत',
+'protectedpagesempty' => 'सधà¥\8dया à¤¯à¤¾ à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित केलेली नाहीत.',
 'protectedtitles' => 'सुरक्षीत शीर्षके',
-'protectedtitlestext' => 'पà¥\81ढà¥\80ल à¤¶à¤¿à¤°à¥\8dषà¤\95à¥\87 à¤¬à¤¦à¤² à¤\98डवणà¥\8dयापासà¥\82न à¤¸à¥\81रà¤\95à¥\8dषà¥\80त आहेत.',
-'protectedtitlesempty' => 'या à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤¸à¤§à¥\8dया à¤\95à¥\8bणतà¥\80हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेली नाहीत.',
+'protectedtitlestext' => 'पà¥\81ढà¥\80ल à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¬à¤¦à¤² à¤\98डवणà¥\8dयापासà¥\82न à¤¸à¥\81रà¤\95à¥\8dषित आहेत.',
+'protectedtitlesempty' => 'या à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤¸à¤§à¥\8dया à¤\95à¥\8bणतà¥\80हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित केलेली नाहीत.',
 'listusers' => 'सदस्यांची यादी',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा',
@@ -2097,9 +2096,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'speciallogtitlelabel' => 'उद्दिष्ट (लक्ष):',
 'log' => 'नोंदी',
 'all-logs-page' => 'सर्व नोंदी',
-'alllogstext' => '{{SITENAME}}à¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤¨à¥\8bà¤\82दà¥\80à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dर à¤¦à¤°à¥\8dशन.नà¥\8bà¤\82द à¤ªà¥\8dरà¤\95ार, à¤¸à¤¦à¤¸à¥\8dयनाव à¤\95िà¤\82वा à¤¬à¤¾à¤§à¥\80त à¤ªà¤¾à¤¨ à¤¨à¤¿à¤µà¤¡à¥\82न à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¦à¥\83शà¥\8dयपान à¤®à¤°à¥\8dयादà¥\80त करू शकता.',
+'alllogstext' => '{{SITENAME}}à¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤¨à¥\8bà¤\82दà¥\80à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dर à¤¦à¤°à¥\8dशन.नà¥\8bà¤\82द à¤ªà¥\8dरà¤\95ार, à¤¸à¤¦à¤¸à¥\8dयनाव à¤\95िà¤\82वा à¤¬à¤¾à¤§à¤¿à¤¤ à¤ªà¤¾à¤¨ à¤¨à¤¿à¤µà¤¡à¥\82न à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¦à¥\83शà¥\8dयपान à¤®à¤°à¥\8dयादित करू शकता.',
 'logempty' => 'नोंदीत अशी बाब नाही.',
-'log-title-wildcard' => 'या à¤®à¤\9cà¤\95à¥\81रापासà¥\82न à¤¸à¥\81रà¥\82 à¤¹à¥\8bणारà¥\80 à¤¶à¤¿र्षके शोधा.',
+'log-title-wildcard' => 'या à¤®à¤\9cà¤\95à¥\81रापासà¥\82न à¤¸à¥\81रà¥\82 à¤¹à¥\8bणारà¥\80 à¤¶à¥\80र्षके शोधा.',
 'showhideselectedlogentries' => 'निवडलेले लॉग पहाणे /लपवणे',
 
 # Special:AllPages
@@ -2150,20 +2149,11 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'linksearch-error' => 'वाईल्डकार्ड्स होस्ट नावाच्या फक्त सुरवातीलाच येऊ शकतात.',
 
 # Special:ListUsers
-'listusersfrom' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\81न सुरू होणारे सदस्य दाखवा:',
+'listusersfrom' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\82न सुरू होणारे सदस्य दाखवा:',
 'listusers-submit' => 'दाखवा',
 'listusers-noresult' => 'एकही सदस्य सापडला नाही.',
 'listusers-blocked' => '(खंडित)',
 
-# Special:ActiveUsers
-'activeusers' => 'कार्यरत सदस्यांची यादी',
-'activeusers-intro' => '$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल',
-'activeusers-count' => 'शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|संपादन|संपादने}}',
-'activeusers-from' => 'पुढील शब्दापासुन सुरू होणारे सदस्य दाखवा:',
-'activeusers-hidebots' => 'सांगकामे लपवा',
-'activeusers-hidesysops' => 'प्रचालक लपवा',
-'activeusers-noresult' => 'एकही सदस्य सापडला नाही.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'सदस्य गट अधिकार',
 'listgrouprights-summary' => 'खाली या विकिवर दिलेली सदस्य गटांची यादी त्यांच्या अधिकारांसकट दर्शविलेली आहे. प्रत्येकाच्या अधिकारांची अधिक माहिती [[{{MediaWiki:Listgrouprights-helppage}}|इथे]] दिलेली आहे.',
@@ -2184,20 +2174,20 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 
 # Email user
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
-'mailnologintext' => 'à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर(à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤£à¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सणà¥\87 à¤\86णि  à¤ªà¥\8dरमाणित (à¤\88-मà¥\87ल) à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|पसà¤\82तà¥\80त]] à¤¨à¤®à¥\81द असणे आवश्यक आहे.',
+'mailnologintext' => 'à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर(à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤£à¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सणà¥\87 à¤\86णि  à¤ªà¥\8dरमाणित (à¤\88-मà¥\87ल) à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|पसà¤\82तà¥\80त]] à¤¨à¤®à¥\82द असणे आवश्यक आहे.',
 'emailuser' => 'या सदस्याला ई-मेल पाठवा',
 'emailuser-title-target' => '{{GENDER:$1|सदस्याला}} विपत्र पाठवा',
 'emailuser-title-notarget' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpage' => 'विपत्र (ईमेल) उपयोगकर्ता',
-'emailpagetext' => 'à¤\9cर à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤ªà¥\8dरमाणित à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88मà¥\87ल)पतà¥\8dता à¤¤à¥\80à¤\9aà¥\8dया à¤\85थवा à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80त à¤¨à¤®à¥\81द à¤\95à¥\87ला à¤\85सà¥\87ल,तर à¤\96ालà¥\80ल à¤¸à¤¾à¤°à¤£à¥\80 à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95(à¤\9a) à¤¸à¤\82दà¥\87श à¤ªà¤¾à¤ à¤µà¥\87ल.तà¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]] à¤¨à¤®à¥\81द केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
+'emailpagetext' => 'à¤\9cर à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤ªà¥\8dरमाणित à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88मà¥\87ल)पतà¥\8dता à¤¤à¤¿à¤\9aà¥\8dया à¤\85थवा à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80त à¤¨à¤®à¥\82द à¤\95à¥\87ला à¤\85सà¥\87ल,तर à¤\96ालà¥\80ल à¤¸à¤¾à¤°à¤£à¥\80 à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95(à¤\9a) à¤¸à¤\82दà¥\87श à¤ªà¤¾à¤ à¤µà¥\87ल.तà¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]] à¤¨à¤®à¥\82द केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
 'usermailererror' => 'पत्र बाब त्रुटी वापस पाठवली:',
 'defemailsubject' => '{{SITENAME}} "$1" सदस्याकडून विपत्र',
-'usermaildisabled' => 'सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरà¥\80य आहे',
+'usermaildisabled' => 'सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरिय आहे',
 'usermaildisabledtext' => 'या विकिवर तुम्हाला इतर सदस्यांना विपत्रे पाठवता येत नाहीत',
 'noemailtitle' => 'विपत्र पत्ता नाही',
 'noemailtext' => 'या सदस्याने वैध विपत्र पत्ता नमूद केलेला नाही.',
 'nowikiemailtitle' => 'विपत्र प्रतिबंधित',
-'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\81न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\88च्छित नाही.',
+'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\87च्छित नाही.',
 'emailnotarget' => 'प्राप्तकर्ता करीता अस्तित्वात नसलेले  किंवा अवैध सदस्य',
 'emailtarget' => 'प्राप्तकर्ता प्रयोक्ताचे नांव टाका.',
 'emailusername' => 'सदस्यनाम:',
@@ -2236,11 +2226,11 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchthispage' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'unwatch' => 'पहारा काढा',
 'unwatchthispage' => 'पहारा काढून टाका',
-'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¥\80त पान',
+'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¤¿त पान',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
 'watchnochange' => 'प्रदर्शित कालावधीत, तुम्ही नित्य पहाण्यासाठी ठेवलेली कोणतीही बाब संपादित झाली नाही.',
 'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
-'wlheader-enotif' => '* à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¸à¥\82à¤\9aना à¤¸à¥\81विधा à¤\8aपलब्ध केली.',
+'wlheader-enotif' => '* à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¸à¥\82à¤\9aना à¤¸à¥\81विधा à¤\89पलब्ध केली.',
 'wlheader-showupdated' => "* तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
@@ -2256,7 +2246,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watcherrortext' => '$1 साठीच्या तुमच्या पहाऱ्याच्या सूचीमधील मांडणीत (watchlist settings) बदल करताना त्रुटी आली.',
 
 'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
-'enotif_reset' => 'सरà¥\8dव à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¤¿à¤²à¥\8dयाà¤\9aà¥\87 à¤¨à¤®à¥\81द करा',
+'enotif_reset' => 'सरà¥\8dव à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¤¿à¤²à¥\8dयाà¤\9aà¥\87 à¤¨à¤®à¥\82द करा',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
 'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
 'enotif_subject_created' => '{{SITENAME}} पान $1  {{gender:$2|$2}} ने तयार केले',
@@ -2306,7 +2296,7 @@ $UNWATCHURL
 'delete-legend' => 'वगळा',
 'historywarning' => 'सूचना: तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
 'confirmdeletetext' => 'तुम्ही एक लेख त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
-à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रत à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¥\80णाम कृती करण्यापूर्वी जाणून घ्या.',
+à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रत à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रित à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿णाम कृती करण्यापूर्वी जाणून घ्या.',
 'actioncomplete' => 'काम पूर्ण',
 'actionfailed' => 'कृती अयशस्वी झाली',
 'deletedtext' => '"$1" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.',
@@ -2335,12 +2325,12 @@ $UNWATCHURL
 'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक उलटवा {{PLURAL:$1|संपादन|संपादने}}',
 'rollbackfailed' => 'द्रूतमाघार फसली',
 'cantrollback' => 'जुन्या आवृत्तीकडे परतवता येत नाही; शेवटचा संपादक या पानाचा एकमात्र लेखक आहे.',
-'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])à¤\9aà¥\87 à¤¶à¥\87वà¤\9fाà¤\9aà¥\87 [[:$1]]वà¥\87 à¤¸à¤\82पादन à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤¤à¤¾ à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80; à¤ªà¤¾à¤¨ à¤\86धà¥\80à¤\9a à¤\95à¥\81णà¥\80 à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤¸à¤\82पादà¥\80त केले आहे.
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])à¤\9aà¥\87 à¤¶à¥\87वà¤\9fाà¤\9aà¥\87 [[:$1]]वà¥\87 à¤¸à¤\82पादन à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤¤à¤¾ à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80; à¤ªà¤¾à¤¨ à¤\86धà¥\80à¤\9a à¤\95à¥\81णà¥\80 à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤¸à¤\82पादित केले आहे.
 
 शेवटचे संपादन [[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' => '(सदसà¥\8dयनाम à¤\95ाढà¥\82न à¤\9fाà¤\95लà¥\87) à¤¯à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤\89लà¤\9fवà¥\81न [[User:$1|$1]] यांच्या मागील आवृत्तीस न्या.',
+'revertpage-nouser' => '(सदसà¥\8dयनाम à¤\95ाढà¥\82न à¤\9fाà¤\95लà¥\87) à¤¯à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤\89लà¤\9fवà¥\82न [[User:$1|$1]] यांच्या मागील आवृत्तीस न्या.',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
@@ -2349,7 +2339,7 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => 'सुरक्षा नोंदी',
-'protectlogtext' => 'पानाà¤\82ना à¤²à¤¾à¤µà¤²à¥\87लà¥\8dया à¤¤à¤¾à¤³à¥\8dयाà¤\82à¤\9aà¥\80 à¤\86णि à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डणà¥\8dयाबदà¥\8dदलà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\96ालà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87.सधà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\81रà¤\95à¥\8dषà¥\80त पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.',
+'protectlogtext' => 'पानाà¤\82ना à¤²à¤¾à¤µà¤²à¥\87लà¥\8dया à¤¤à¤¾à¤³à¥\8dयाà¤\82à¤\9aà¥\80 à¤\86णि à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डणà¥\8dयाबदà¥\8dदलà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\96ालà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87.सधà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\81रà¤\95à¥\8dषित पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.',
 'protectedarticle' => '"[[$1]]" सुरक्षित केला',
 'modifiedarticleprotection' => '"[[$1]]"करिता सुरक्षापातळी बदलली',
 'unprotectedarticle' => '"[[$1]]" असुरक्षित केला.',
@@ -2358,7 +2348,7 @@ $UNWATCHURL
 'protect-title-notallowed' => '"$1" ची सुरक्षा पातळी पहा',
 'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळ्याखाली स्थानांतरित केले.',
 'protect-badnamespace-title' => 'असुरक्षणीय नामविश्व',
-'protect-badnamespace-text' => 'या à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त करता येत नाहीत',
+'protect-badnamespace-text' => 'या à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित करता येत नाहीत',
 'protect-norestrictiontypes-text' => 'हे पान सुरक्षित होऊ शकत नाही कारण कोणताही सुरक्षापातळी प्रकार उपलब्ध नाही.',
 'protect-norestrictiontypes-title' => 'सुरक्षापातळी नसलेले पान',
 'protect-legend' => 'सुरक्षापातळीतील बदल निर्धारित करा',
@@ -2368,7 +2358,7 @@ $UNWATCHURL
 'protect_expiry_old' => 'संपण्याचा कालावधी उलटून गेलेला आहे.',
 'protect-unchain-permissions' => 'पुढील संरक्षित विकल्प उघडा.',
 'protect-text' => "'''$1''' या पानाची सुरक्षापातळी तुम्ही इथे पाहू शकता अथवा बदलू शकता.",
-'protect-locked-blocked' => "तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त असताना सुरक्षा पातळी बदलू शकत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
+'protect-locked-blocked' => "तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82धित असताना सुरक्षा पातळी बदलू शकत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
 'protect-locked-dblock' => "विदागारास ताळे लागलेले असताना सुरक्षा पातळी बदलता येत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
 'protect-locked-access' => "तुम्हाला या पानाची सुरक्षा पातळी बदलण्याचे अधिकार नाहीत.
 '''$1''' या पानाची सुरक्षा पातळी पुढीलप्रमाणे:",
@@ -2388,7 +2378,7 @@ $UNWATCHURL
 'protect-existing-expiry' => 'शेवट दिनांक: $3, $2',
 'protect-otherreason' => 'इतर / अतिरिक्त कारण:',
 'protect-otherreason-op' => 'दुसरे कारण',
-'protect-dropdown' => '* à¤¸à¥\81रà¤\95à¥\8dषà¥\80त करण्याची सामान्य कारणे
+'protect-dropdown' => '* à¤¸à¥\81रà¤\95à¥\8dषित करण्याची सामान्य कारणे
 ** अती उपद्रव
 ** अती उत्पात
 ** अनुत्पादक संपादन युद्ध
@@ -2417,17 +2407,17 @@ $UNWATCHURL
 'undeletepage' => 'वगळलेली पाने पहा आणि पुनर्स्थापित करा',
 'undeletepagetitle' => "'''खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत'''.",
 'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
-'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87त}}. à¤µà¤¿à¤¦à¤¾à¤\97ारातà¥\80ल à¤¸à¤¾à¤ à¤µà¤£ à¤ à¤°à¤¾à¤µà¤¿क कालावधीने स्वच्छ करता येते.',
+'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87त}}. à¤µà¤¿à¤¦à¤¾à¤\97ारातà¥\80ल à¤¸à¤¾à¤ à¤µà¤£ à¤ à¤°à¤¾à¤µà¥\80क कालावधीने स्वच्छ करता येते.',
 'undelete-fieldset-title' => 'आवर्तने पुनर्स्थापित करा',
-'undeleteextrahelp' => "सà¤\82पà¥\82रà¥\8dण à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\8dयाà¤\95रिता,सारà¥\87 à¤°à¤\95ानà¥\87 à¤°à¤¿à¤\95ामà¥\87 à¤ à¥\87वा à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¨à¤¿à¤µà¤¡à¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रणà¥\8dयाà¤\95रिता, à¤\9cà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रावयाà¤\9aà¥\87 à¤¤à¥\8dयाà¤\82à¤\9aà¥\87 à¤°à¤\95ानà¥\87 à¤¨à¤¿à¤µà¤¡à¤¾ , à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. '''''पà¥\81नरà¥\8dयà¥\8bà¤\9cन ''''' à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\8dयास à¤¸à¤¾à¤°à¥\87 à¤°à¤\95ानà¥\87 à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरà¥\80या खिडकी रिकामी होईल.",
+'undeleteextrahelp' => "सà¤\82पà¥\82रà¥\8dण à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\8dयाà¤\95रिता,सारà¥\87 à¤°à¤\95ानà¥\87 à¤°à¤¿à¤\95ामà¥\87 à¤ à¥\87वा à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¨à¤¿à¤µà¤¡à¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रणà¥\8dयाà¤\95रिता, à¤\9cà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रावयाà¤\9aà¥\87 à¤¤à¥\8dयाà¤\82à¤\9aà¥\87 à¤°à¤\95ानà¥\87 à¤¨à¤¿à¤µà¤¡à¤¾ , à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. '''''पà¥\81नरà¥\8dयà¥\8bà¤\9cन ''''' à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\8dयास à¤¸à¤¾à¤°à¥\87 à¤°à¤\95ानà¥\87 à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरिया खिडकी रिकामी होईल.",
 'undeleterevisions' => '$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत',
 'undeletehistory' => 'जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.
 वगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.',
 'undeleterevdel' => 'पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.
 अशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.',
-'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\81र केवळ प्रचालकांना उपलब्ध असेल.',
+'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादित à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\82र केवळ प्रचालकांना उपलब्ध असेल.',
 'undelete-revision' => '$1चे($4चे, $5 येथील) आवर्तन $3 ने वगळले:',
-'undeleterevision-missing' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\85थवा à¤¨à¤¸à¤¾à¤ªà¤¡à¤£à¤¾à¤°à¥\87 à¤\86वरà¥\8dतन. à¤¤à¥\81मà¤\9aा à¤¦à¥\81वा à¤\95दाà¤\9aित à¤\9aà¥\82कीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
+'undeleterevision-missing' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\85थवा à¤¨à¤¸à¤¾à¤ªà¤¡à¤£à¤¾à¤°à¥\87 à¤\86वरà¥\8dतन. à¤¤à¥\81मà¤\9aा à¤¦à¥\81वा à¤\95दाà¤\9aित à¤\9aà¥\81कीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
 'undelete-nodiff' => 'पूर्वीचे कोणतेही आवर्तन आढळले नाही.',
 'undeletebtn' => 'वगळण्याची क्रिया रद्द करा',
 'undeletelink' => 'पहा/पुनर्स्थापित करा',
@@ -2445,16 +2435,16 @@ $UNWATCHURL
 'undelete-header' => 'अलीकडील वगळलेल्या पानांकरिता [[Special:Log/delete|वगळलेल्या नोंदी]] पहा.',
 'undelete-search-title' => 'वगळलेली पाने शोधा',
 'undelete-search-box' => 'वगळलेली पाने शोधा',
-'undelete-search-prefix' => 'पासà¥\82न à¤¸à¥\82रू होणारी पाने दाखवा:',
+'undelete-search-prefix' => 'पासà¥\82न à¤¸à¥\81रू होणारी पाने दाखवा:',
 'undelete-search-submit' => 'शोध',
 'undelete-no-results' => 'वगळलेल्यांच्या विदांमध्ये जुळणारी पाने सापडली नाहीत.',
 'undelete-filename-mismatch' => '$1 वेळेचे, वगळलेल्या संचिकेचे आवर्तन उलटवता येत नाही: नजुळणारे संचिकानाव',
 'undelete-bad-store-key' => '$1 वेळ दिलेली संचिका आवर्तन पुनर्स्थापित करता येत नाही:संचिका वगळण्यापूर्वी पासून मिळाली नव्हती.',
-'undelete-cleanup-error' => 'न à¤µà¤¾à¤ªà¤°à¤²à¥\87लà¥\80 à¤µà¤¿à¤¦à¤¾ à¤¸à¤\82à¤\9aिà¤\95ा "$1" à¤µà¤\97ळताना à¤¤à¥\8dरà¥\82टी दाखवते.',
+'undelete-cleanup-error' => 'न à¤µà¤¾à¤ªà¤°à¤²à¥\87लà¥\80 à¤µà¤¿à¤¦à¤¾ à¤¸à¤\82à¤\9aिà¤\95ा "$1" à¤µà¤\97ळताना à¤¤à¥\8dरà¥\81टी दाखवते.',
 'undelete-missing-filearchive' => 'संचिका विदास्मृती ID $1 पुनर्स्थापित करू शकत नाही कारण ती विदागारात उपलब्ध नाही. ती आधीच पुनर्स्थापित केली असण्याची शक्यता सुद्धा असू शकते.',
-'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\81न नाही टाकले तर पान शीर्षक',
+'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\82न नाही टाकले तर पान शीर्षक',
 'undelete-error-short' => 'संचिकेचे वगळणे उलटवताना त्रूटी: $1',
-'undelete-error-long' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\82टींचा अडथळा आला:
+'undelete-error-long' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\81टींचा अडथळा आला:
 
 $1',
 'undelete-show-file-confirm' => 'तुम्ही "<nowiki>$1</nowiki>" या संचिकेचे $2 येथून $3 वेळी असलेले आवर्तन नक्की पहाणार आहात?',
@@ -2463,7 +2453,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'नामविश्व:',
 'invert' => 'निवडीचा क्रम उलटा करा',
-'tooltip-invert' => 'निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धà¥\80त नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
+'tooltip-invert' => 'निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धित नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
 'namespace_association' => 'सहभागी नामविश्वे',
 'tooltip-namespace_association' => 'निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा',
 'blanknamespace' => '(मुख्य)',
@@ -2522,7 +2512,7 @@ $1',
 'blockip' => 'हा अंकपत्ता अडवा',
 'blockip-title' => 'सदस्यास प्रतिबंध करा',
 'blockip-legend' => 'सदस्यास प्रतिबंध करा',
-'blockiptext' => 'à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\95िà¤\82वा à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\80 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयाà¤\9aà¥\80 à¤\95à¥\8dषमता à¤ªà¥\8dरतिबà¤\82धà¥\80त  करण्याकरिता खालील सारणी वापरा.
+'blockiptext' => 'à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\95िà¤\82वा à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\80 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयाà¤\9aà¥\80 à¤\95à¥\8dषमता à¤ªà¥\8dरतिबà¤\82धित  करण्याकरिता खालील सारणी वापरा.
 हे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.
 खाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).',
 'ipadressorusername' => 'अंकपत्ता किंवा सदस्यनाम:',
@@ -2538,9 +2528,9 @@ $1',
 ** असंख्य खात्यांचा गैरवापर
 ** अस्वीकार्य सदस्यनाम',
 'ipb-hardblock' => 'या अंक पत्यावरुन (IP address) प्रवेश केलेल्या सदस्यांना बदल करण्यापासून प्रतिबंध करा.',
-'ipbcreateaccount' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
-'ipbemailban' => 'सदसà¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¾à¤ à¤µà¤£à¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
-'ipbenableautoblock' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\87ला à¤¶à¥\87वà¤\9fà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤\86णि à¤\9cà¥\87थà¥\82न à¤¯à¤¾ à¤ªà¥\81ढà¥\87 à¤¤à¥\8b à¤¸à¤\82पादनाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\87ल à¤¤à¥\87 à¤¸à¤°à¥\8dव à¤\85à¤\82à¤\95पतà¥\8dतà¥\87 à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धà¥\80त करा.',
+'ipbcreateaccount' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धित करा',
+'ipbemailban' => 'सदसà¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¾à¤ à¤µà¤£à¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धित करा',
+'ipbenableautoblock' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\87ला à¤¶à¥\87वà¤\9fà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤\86णि à¤\9cà¥\87थà¥\82न à¤¯à¤¾ à¤ªà¥\81ढà¥\87 à¤¤à¥\8b à¤¸à¤\82पादनाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\87ल à¤¤à¥\87 à¤¸à¤°à¥\8dव à¤\85à¤\82à¤\95पतà¥\8dतà¥\87 à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धित करा.',
 'ipbsubmit' => 'हा पत्ता अडवा',
 'ipbother' => 'इतर वेळ:',
 'ipboptions' => '२ तास:2 hours,१ दिवस:1 day,३ दिवस:3 days,१ आठवडा:1 week,२ आठवडे:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ वर्ष:1 year,अनंत:infinite',
@@ -2548,12 +2538,12 @@ $1',
 'ipbotherreason' => 'इतर/अजून कारण:',
 'ipbhidename' => 'सदस्य नाम प्रतिबंधन नोंदी, प्रतिबंधनाची चालू यादी आणि सदस्य यादी इत्यादीतून लपवा',
 'ipbwatchuser' => 'या सदस्याच्या सदस्य तसेच चर्चा पानावर पहारा ठेवा',
-'ipb-disableusertalk' => 'सदसà¥\8dयास à¤¸à¥\8dवत:à¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aापान à¤¸à¤\82पादणà¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
+'ipb-disableusertalk' => 'सदसà¥\8dयास à¤¸à¥\8dवत:à¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aापान à¤¸à¤\82पादणà¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धित करा',
 'ipb-change-block' => 'युपयोगकर्ताला पुन्हा ब्लाक करा सोबत स्थानिक सेथिँग.',
 'ipb-confirm' => 'अडथाळा सुनिश्चित करा.',
 'badipaddress' => 'अंकपत्ता बरोबर नाही.',
 'blockipsuccesssub' => 'अडवणूक यशस्वी झाली',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला à¤ªà¥\8dरतिबà¤\82धà¥\80त केले.<br />
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला à¤ªà¥\8dरतिबà¤\82धित केले.<br />
 प्रतिबंधनांचा आढावा घेण्याकरिता [[Special:BlockList|अंकपत्ता प्रतिबंधन सूची]] पहा.',
 'ipb-blockingself' => 'तुम्ही स्वतःलाच प्रतिबंधित करत आहात! तुम्ही ते नक्की करणार आहात का?',
 'ipb-confirmhideuser' => 'तुमच्याकडून सदस्य प्रतिबंधनासोबतच "सदस्य लपवला" जातो आहे.या कृउतीने सर्व याद्या आणि नोंदीतून सदस्य नाव लपविले जाते.असे करावयाचे आहे या बद्दल आपली खात्री आहे काय ?',
@@ -2588,11 +2578,11 @@ $1',
 'expiringblock' => 'समाप्ति $1 $2',
 'anononlyblock' => 'केवळ अनामिक',
 'noautoblockblock' => 'स्व्यंचलितप्रतिबंधन स्थगित केले',
-'createaccountblock' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त केली',
+'createaccountblock' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धित केली',
 'emailblock' => 'विपत्र प्रतिबंधीत',
 'blocklist-nousertalk' => 'ला स्वतःचे चर्चापान संपादता येत नाही',
 'ipblocklist-empty' => 'प्रतिबंधन यादी रिकामी आहे.',
-'ipblocklist-no-results' => 'विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤\85à¤\82à¤\95पतà¥\8dता à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाव à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेले नाही.',
+'ipblocklist-no-results' => 'विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤\85à¤\82à¤\95पतà¥\8dता à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाव à¤ªà¥\8dरतिबà¤\82धित केलेले नाही.',
 'blocklink' => 'अडवा',
 'unblocklink' => 'सोडवा',
 'change-blocklink' => 'ब्लॉक बदला',
@@ -2601,12 +2591,12 @@ $1',
 'autoblocker' => 'स्वयंचलितप्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
 'blocklogpage' => 'ब्लॉक यादी',
 'blocklog-showlog' => 'या सदस्यावर आधी बन्दी घालन्यात आली आहे. बन्दी सन्दर्भातील अधिक नोन्दी येथे आहेत',
-'blocklog-showsuppresslog' => 'हा à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\81रà¥\8dवà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त अथवा लपविला गेला होता.
+'blocklog-showsuppresslog' => 'हा à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\82रà¥\8dवà¥\80 à¤ªà¥\8dरतिबà¤\82धित अथवा लपविला गेला होता.
 लपविलेल्या नोंदी खाली संदर्भाकरिता उपलब्ध आहेत.',
 'blocklogentry' => '[[$1]] ला $2 $3 पर्यंत ब्लॉक केलेले आहे',
-'reblock-logentry' => ' $2 $3 à¤¹à¤¿ à¤\85à¤\82तà¥\80म वेळ देऊन   [[$1]] चे प्रतिबंधन बदलले',
+'reblock-logentry' => ' $2 $3 à¤¹à¥\80 à¤\85à¤\82तिम वेळ देऊन   [[$1]] चे प्रतिबंधन बदलले',
 'blocklogtext' => 'ही सदस्यांच्या प्रतिबंधनाची आणि प्रतिबंधने उठवल्याची नोंद आहे.
-à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेले अंकपत्ते नमूद केलेले नाहीत.
+à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धित केलेले अंकपत्ते नमूद केलेले नाहीत.
 सध्या लागू असलेली बंदी व प्रतिबंधनांच्या यादीकरिता [[Special:BlockList|अंकपत्ता प्रतिबंधन सूची]] पहा.',
 'unblocklogentry' => 'प्रतिबंधन $1 हटवले',
 'block-log-flags-anononly' => 'केवळ अनामिक सदस्य',
@@ -2618,35 +2608,35 @@ $1',
 'block-log-flags-hiddenname' => 'सदस्यनाम लपवलेले आहे',
 'range_block_disabled' => 'प्रचालकांची पल्ला बंधने घालण्याची क्षमता अनुपलब्ध केली आहे.',
 'ipb_expiry_invalid' => 'अयोग्य समाप्ती काळ.',
-'ipb_expiry_temp' => 'लपविलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤ªà¥\8dरतिबà¤\82धन à¤\95ायमसà¥\8dवरà¥\81पी असले पाहिजे.',
+'ipb_expiry_temp' => 'लपविलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤ªà¥\8dरतिबà¤\82धन à¤\95ायमसà¥\8dवरà¥\82पी असले पाहिजे.',
 'ipb_hide_invalid' => 'हे खात दाबन्यासाथि असमर्थ: ते सुध्दा बदल करन्याचि सकतात.',
 'ipb_already_blocked' => '"$1" आधीच अवरूद्ध केलेले आहे.',
-'ipb-needreblock' => '$1 à¤\86धà¥\80à¤\9a à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\86हà¥\87 . à¤¤à¥\81मà¥\8dहाला à¤¤à¥\8dयाà¤\9aि सेटींग्स बदलण्याची इच्छा आहे का ?',
+'ipb-needreblock' => '$1 à¤\86धà¥\80à¤\9a à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87 . à¤¤à¥\81मà¥\8dहाला à¤¤à¥\8dयाà¤\9aà¥\80 सेटींग्स बदलण्याची इच्छा आहे का ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|दुसरे प्रतिबंधन|इतर प्रतिबंधने}}',
 'unblock-hideuser' => 'सदस्याचे नाव हे गोपनीय असल्यामुळे हे सदस्य खाते आपण गोठवू शकत नाही',
 'ipb_cant_unblock' => 'त्रूटी: प्रतिबंधन क्र.$1 मिळाला नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.',
-'ipb_blocked_as_range' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता IP $1 à¤¹à¤¾ à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषपणà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथात,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤­à¤¾à¤\97 à¤®à¥\8dहाणà¥\82न à¤¤à¥\8b à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
+'ipb_blocked_as_range' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता IP $1 à¤¹à¤¾ à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषपणà¥\87 à¤ªà¥\8dरतिबà¤\82धित à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथात,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤­à¤¾à¤\97 à¤®à¥\8dहाणà¥\82न à¤¤à¥\8b à¤ªà¥\8dरतिबà¤\82धित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
 'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'blockme' => 'मला à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
+'blockme' => 'मला à¤ªà¥\8dरतिबà¤\82धित करा',
 'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
 'proxyblocker-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
-'proxyblockreason' => 'तà¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤ªà¥\8dरतिबà¤\82धà¥\80त केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
+'proxyblockreason' => 'तà¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤ªà¥\8dरतिबà¤\82धित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
 'proxyblocksuccess' => 'झाले.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
 'cant-block-while-blocked' => 'तुम्ही स्वतः प्रतिबंधित असताना इतरांना प्रतिबंधित करू शकत नाही.',
-'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धà¤\95रणà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤\86धà¥\80पासà¥\82नà¤\9a à¤ªà¥\8dरतिबà¤\82धà¥\80त आणि लपविले गेले आहे.
-तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aà¥\87 à¤\85धिà¤\95ार à¤¨à¤¸à¤²à¥\8dयामà¥\81ळà¥\87 , à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\8dरतिबà¤\82धन  à¤ªà¤¾à¤¹à¥\82 à¤\85थवा à¤¸à¤\82पादà¥\80त करू शकत नाही',
-'ipbblocked' => 'तà¥\81मà¤\9aà¥\87 à¤¸à¥\8dवत:à¤\9aà¥\87à¤\9a à¤\96ातà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धà¥\80त किंवा अप्रतिबंधीत करू शकत नाही',
+'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धà¤\95रणà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤\86धà¥\80पासà¥\82नà¤\9a à¤ªà¥\8dरतिबà¤\82धित आणि लपविले गेले आहे.
+तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aà¥\87 à¤\85धिà¤\95ार à¤¨à¤¸à¤²à¥\8dयामà¥\81ळà¥\87 , à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\8dरतिबà¤\82धन  à¤ªà¤¾à¤¹à¥\82 à¤\85थवा à¤¸à¤\82पादित करू शकत नाही',
+'ipbblocked' => 'तà¥\81मà¤\9aà¥\87 à¤¸à¥\8dवत:à¤\9aà¥\87à¤\9a à¤\96ातà¥\87 à¤ªà¥\8dरतिबà¤\82धित à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धित किंवा अप्रतिबंधीत करू शकत नाही',
 'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
 
 # Developer tools
 'lockdb' => 'विदागारास ताळे ठोका',
 'unlockdb' => 'विदागाराचे ताळे उघडा',
-'lockdbtext' => 'विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रणà¥\87,à¤\86णि à¤µà¤¿à¤¦à¥\87त à¤¬à¤¦à¤² à¤\98डवणाऱà¥\8dया à¤\87तर à¤\97à¥\8bषà¥\8dà¤\9fà¥\80 à¤¸à¤\82सà¥\8dथà¤\97à¥\80त होतील.
+'lockdbtext' => 'विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रणà¥\87,à¤\86णि à¤µà¤¿à¤¦à¥\87त à¤¬à¤¦à¤² à¤\98डवणाऱà¥\8dया à¤\87तर à¤\97à¥\8bषà¥\8dà¤\9fà¥\80 à¤¸à¤\82सà¥\8dथà¤\97ित होतील.
 कृपया तुम्हाला हेच करावयाचे आहे आणि भरण-पोषणा नंतर विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
-'unlockdbtext' => 'विदाà¤\97ाराà¤\9aà¥\87 à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डलà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
+'unlockdbtext' => 'विदाà¤\97ाराà¤\9aà¥\87 à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डलà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
 कृपया तुम्हाला हेच करावयाचे आहे हे निश्चित करा.',
 'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
 'unlockconfirm' => 'होय,मला खरेच विदागाराचे ताळे उघडवयाचे आहे.',
@@ -2682,7 +2672,7 @@ $1',
 जुने शीर्षक नवीन शीर्षकाकडे पुनर्निर्देशित करेल.
 
 [[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशनांकरीता तपासण्याची काळजी घ्या.
-à¤\89पलबà¥\8dध à¤¦à¥\81वà¥\87  à¤\9cà¥\80थे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात
+à¤\89पलबà¥\8dध à¤¦à¥\81वà¥\87  à¤\9cिथे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात
 
 जर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.
 पण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.
@@ -2696,7 +2686,7 @@ $1',
 
 या बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
 'movearticle' => 'पृष्ठाचे स्थानांतरण',
-'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरà¥\80त à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरà¥\80त होइल, सदस्य नाम बदलले जणार नाही.",
+'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित होइल, सदस्य नाम बदलले जणार नाही.",
 'movenologin' => 'प्रवेश केलेला नाही',
 'movenologintext' => 'पान स्थानांतरित करण्यासाठी तुम्हाला [[Special:UserLogin|प्रवेश]] करावा लागेल.',
 'movenotallowed' => '{{SITENAME}}वरील पाने स्थानांतरीत करण्याची आपल्यापाशी परवानगी नाही.',
@@ -2713,7 +2703,7 @@ $1',
 'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले
 नाव योग्य नाही आहे.
 कृपया दुसरे नाव शोधा.',
-'cantmove-titleprotected' => 'नवà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¿à¤°à¥\8dमà¥\80त à¤\95रणà¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
+'cantmove-titleprotected' => 'नवà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¿à¤°à¥\8dमित à¤\95रणà¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¤\95à¥\8dषित केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
 'talkexists' => 'पृष्ठ यशस्वीरीत्या स्थानांतरीत झाले पण चर्चा पृष्ठ स्थानांतरीत होवू
 शकले नाही कारण त्या नावाचे पृष्ठ आधीच अस्तित्वात होते. कृपया तुम्ही स्वतः ती पृष्ठे एकत्र करा.',
 'movedto' => 'कडे स्थानांतरण केले',
@@ -2734,7 +2724,7 @@ $1',
 'delete_and_move' => 'वगळा आणि स्थानांतरित करा',
 'delete_and_move_text' => '==वगळण्याची आवशकता==
 
-लà¤\95à¥\8dषà¥\8dयपान  "[[:$1]]" à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतà¥\80त्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
+लà¤\95à¥\8dषà¥\8dयपान  "[[:$1]]" à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतित्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
 'delete_and_move_confirm' => 'होय, पान वगळा',
 'delete_and_move_reason' => '"[[$1]]" पासून वगळून स्थानांतर केले.',
 'selfmove' => 'स्रोत आणि लक्ष्य पाने समान आहेत; एखादे पान स्वत:च्याच जागी स्थानांतरीत करता येत नाही.',
@@ -2744,23 +2734,23 @@ $1',
 'immobile-source-page' => 'हे पान हलवता येत नाही',
 'immobile-target-page' => 'लक्ष्य मथळा हलवता येत नाही.',
 'imagenocrossnamespace' => 'ज्या नामविश्वात संचिका साठविता येत नाहीत, त्या नामविश्वात संचिकांचे स्थानांतरण करता येत नाही',
-'nonfile-cannot-move-to-file' => 'सà¤\82à¤\9aिà¤\95ा à¤¸à¥\8dवरà¥\81पाची नसलेली माहिती आपणास संचिका नामविश्वात वळती करता येणार नाही',
+'nonfile-cannot-move-to-file' => 'सà¤\82à¤\9aिà¤\95ा à¤¸à¥\8dवरà¥\82पाची नसलेली माहिती आपणास संचिका नामविश्वात वळती करता येणार नाही',
 'imagetypemismatch' => 'दिलेले संचिकेचे एक्सटेंशन त्या संचिकेच्या प्रकाराशी जुळत नाही',
 'imageinvalidfilename' => 'लक्ष्यसंचिका अवैध आहे',
-'fix-double-redirects' => 'मà¥\81ळ à¤¶à¤¿र्षक दर्शविणारे फेरे अद्ययावत करा',
+'fix-double-redirects' => 'मà¥\81ळ à¤¶à¥\80र्षक दर्शविणारे फेरे अद्ययावत करा',
 'move-leave-redirect' => 'मागे एक पुनर्निर्देशन ठेवा',
 'protectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त प्रशासकीय अधिकार असलेले सदस्य याच्यात बदल करू शकतात.",
 'semiprotectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.
 सर्वांत ताजी यादी खाली संदर्भासाठी दिली आहे:",
 'move-over-sharedrepo' => '== संचिका अस्तित्वात आहे ==
 सामायिक भांडारात [[:$1]] नाव आधी पासून अस्तित्वात आहे. संचिका या नावावर स्थानांतरीत केल्यास सामायिक संचिकेवर चढेल.',
-'file-exists-sharedrepo' => 'धà¥\80रिà¤\95à¥\87साठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤µà¤¡à¤²à¥\87लà¥\87 à¤¨à¤¾à¤µ à¤¹à¥\87 à¤¸à¤¾à¤®à¥\81हà¥\80क संग्राहलयात आधीपासून वापरात असल्याने कृपया दुसरे नाव निवडा.',
+'file-exists-sharedrepo' => 'धà¥\80रिà¤\95à¥\87साठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤µà¤¡à¤²à¥\87लà¥\87 à¤¨à¤¾à¤µ à¤¹à¥\87 à¤¸à¤¾à¤®à¥\82हिक संग्राहलयात आधीपासून वापरात असल्याने कृपया दुसरे नाव निवडा.',
 
 # Export
 'export' => 'पाने निर्यात करा',
-'exporttext' => 'तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤\9cà¤\95à¥\81र आणि संपादन इतिहास किंवा  पानांचा संच एखाद्या XML वेष्ठणात ठेवून निर्यात करू शकता.हे तुम्हाला [[Special:Import|पान आयात करा]]वापरून मिडीयाविकि वापरणाऱ्या इतर विकित आयात करता येईल.
+'exporttext' => 'तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤\9cà¤\95à¥\82र आणि संपादन इतिहास किंवा  पानांचा संच एखाद्या XML वेष्ठणात ठेवून निर्यात करू शकता.हे तुम्हाला [[Special:Import|पान आयात करा]]वापरून मिडीयाविकि वापरणाऱ्या इतर विकित आयात करता येईल.
 
-पानà¥\87 à¤¨à¤¿à¤°à¥\8dयात à¤\95रणà¥\8dया à¤\95रिता,à¤\8fà¤\95ा à¤\93ळà¥\80त à¤\8fà¤\95 à¤®à¤¥à¤³à¤¾ à¤\85सà¥\87, à¤\96ालà¥\80ल à¤®à¤\9cà¤\95à¥\81र रकान्यात मथळे भरा आणि तुम्हाला ’सध्याची आवृत्ती तसेच सर्व जुन्या आवृत्ती ,पानाच्या इतिहास ओळी सोबत’, किंवा ’केवळ सध्याची आवृत्ती शेवटच्या संपादनाच्या माहिती सोबत’ हवी आहे का ते निवडा.
+पानà¥\87 à¤¨à¤¿à¤°à¥\8dयात à¤\95रणà¥\8dया à¤\95रिता,à¤\8fà¤\95ा à¤\93ळà¥\80त à¤\8fà¤\95 à¤®à¤¥à¤³à¤¾ à¤\85सà¥\87, à¤\96ालà¥\80ल à¤®à¤\9cà¤\95à¥\82र रकान्यात मथळे भरा आणि तुम्हाला ’सध्याची आवृत्ती तसेच सर्व जुन्या आवृत्ती ,पानाच्या इतिहास ओळी सोबत’, किंवा ’केवळ सध्याची आवृत्ती शेवटच्या संपादनाच्या माहिती सोबत’ हवी आहे का ते निवडा.
 
 तुम्ही नंतरच्या बाबतीत एखादा दुवा सुद्धा वापरू शकता, उदाहरणार्थ "[[{{MediaWiki:Mainpage}}]]" पाना करिता [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] .',
 'exportall' => 'सर्व पान एक्सपोर्ट करा',
@@ -2775,7 +2765,7 @@ $1',
 'export-addns' => 'वाढवा',
 'export-download' => 'संचिका म्हणून जतन करा',
 'export-templates' => 'साचे आंतरभूत करा',
-'export-pagelinks' => 'पà¥\81ढà¥\87 à¤\89लà¥\8dलà¥\87à¤\96à¥\80त पातळी पर्यंत दुवे दिलेल्या पानांचा आंतर्भाव करा :',
+'export-pagelinks' => 'पà¥\81ढà¥\87 à¤\89लà¥\8dलà¥\87à¤\96ित पातळी पर्यंत दुवे दिलेल्या पानांचा आंतर्भाव करा :',
 
 # Namespace 8 related
 'allmessages' => 'सर्व प्रणाली-संदेश',
@@ -2800,7 +2790,7 @@ $1',
 'djvu_page_error' => 'टप्प्याच्या बाहेरचे DjVu पान',
 'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढण्यात असमर्थ',
 'thumbnail-temp-create' => 'तात्पुरती इवलीशी संचिका बनविता आली नाही',
-'thumbnail-dest-create' => 'à¤\87षà¥\8dà¤\9fसà¥\8dथळà¥\80 à¤\88वलीशी संचिका जतन करता आली नाही',
+'thumbnail-dest-create' => 'à¤\87षà¥\8dà¤\9fसà¥\8dथळà¥\80 à¤\87वलीशी संचिका जतन करता आली नाही',
 'thumbnail_invalid_params' => 'इवल्याशाचित्राचा अयोग्य परिचय',
 'thumbnail_dest_directory' => 'लक्ष्य धारिकेच्या निर्मितीस असमर्थ',
 'thumbnail_image-type' => 'चित्रप्रकार समर्थित नाही',
@@ -2829,7 +2819,7 @@ $1',
 'importunknownsource' => 'आयात स्रोत प्रकार अज्ञात',
 'importcantopen' => 'आयातीत संचिका उघडणे जमले नाही',
 'importbadinterwiki' => 'अयोग्य आंतरविकि दुवा',
-'importnotext' => 'रिà¤\95ामà¥\87 à¤\85थवा à¤®à¤\9cà¤\95à¥\81र नाही',
+'importnotext' => 'रिà¤\95ामà¥\87 à¤\85थवा à¤®à¤\9cà¤\95à¥\82र नाही',
 'importsuccess' => 'आयात पूर्ण झाली!',
 'importhistoryconflict' => 'उपलब्ध इतिहास आवर्तने परस्पर विरोधी आहेत(हे पान पूर्वी आयात केले असण्याची शक्यता आहे)',
 'importnosources' => 'कोणतेही आंतरविकि आयात स्रोत व्यक्त केलेले नाहीत आणि प्रत्यक्ष इतिहास चढवा अनुपलब्ध केले आहे.',
@@ -2872,7 +2862,7 @@ $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'तुमचे सदस्य पान',
-'tooltip-pt-anonuserpage' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cà¥\8dया à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयानà¥\8dवयà¥\87 à¤¸à¤\82पादà¥\80त करत आहात त्याकरिता हे सदस्य पान',
+'tooltip-pt-anonuserpage' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cà¥\8dया à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयानà¥\8dवयà¥\87 à¤¸à¤\82पादित करत आहात त्याकरिता हे सदस्य पान',
 'tooltip-pt-mytalk' => 'तुमचे चर्चा पान',
 'tooltip-pt-anontalk' => 'या अंकपत्त्यापासून झालेल्या संपादनांबद्दल चर्चा',
 'tooltip-pt-preferences' => 'माझ्या पसंती',
@@ -2882,7 +2872,7 @@ $1',
 'tooltip-pt-anonlogin' => 'आपण खात्यात दाखल व्हावे या करिता प्रोत्साहन देतो, अर्थात ते अत्यावश्यक नाही.',
 'tooltip-pt-logout' => 'बाहेर पडा',
 'tooltip-ca-talk' => 'कंटेंट पानाबद्दलच्या चर्चा',
-'tooltip-ca-edit' => 'तà¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¥\8dलà¥\82 à¤¶à¤\95ता. à¤\95à¥\83पया à¤\9cतन à¤\95रणà¥\8dयापà¥\81र्वी झलक कळ वापरून पहा.',
+'tooltip-ca-edit' => 'तà¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¥\8dलà¥\82 à¤¶à¤\95ता. à¤\95à¥\83पया à¤\9cतन à¤\95रणà¥\8dयापà¥\82र्वी झलक कळ वापरून पहा.',
 'tooltip-ca-addsection' => 'नवीन चर्चा सुरू करा',
 'tooltip-ca-viewsource' => 'हे पान सुरक्षित आहे. तुम्ही याचा स्रोत पाहू शकता.',
 'tooltip-ca-history' => 'या पानाच्या जुन्या आवृत्या.',
@@ -2929,7 +2919,7 @@ $1',
 'tooltip-preview' => 'तुम्ही केलेल्या बदलांची झलक पहा, जतन करण्यापूर्वी कृपया हे वापरा!',
 'tooltip-diff' => 'या पाठ्यातील तुम्ही केलेले बदल दाखवा.',
 'tooltip-compareselectedversions' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवा.',
-'tooltip-watch' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त टाका.',
+'tooltip-watch' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aित टाका.',
 'tooltip-watchlistedit-normal-submit' => 'शीर्षके काढवीत',
 'tooltip-watchlistedit-raw-submit' => 'पाहण्याची सूची अद्ययावत करावी',
 'tooltip-recreate' => 'हे पान मागे वगळले असले तरी नवनिर्मीत करा',
@@ -2957,7 +2947,7 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'केर(स्पॅम) सुरक्षा चाचणी',
-'spamprotectiontext' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cतन à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bित à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤¨ à¤\95à¥\87र-à¤\89तà¥\8dपात à¤°à¥\8bधà¤\95 à¤\9aाळणà¥\80नà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त केले आहे.
+'spamprotectiontext' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cतन à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bित à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤¨ à¤\95à¥\87र-à¤\89तà¥\8dपात à¤°à¥\8bधà¤\95 à¤\9aाळणà¥\80नà¥\87 à¤ªà¥\8dरतिबà¤\82धित केले आहे.
 
 असे बाहेरच्या संकेतस्थळाचा दुवा देण्याची शक्यता असल्यामुळे घडू शकते.',
 'spamprotectionmatch' => 'खालील मजकुरामुळे आमची चिखलणी रोधक चाळणी सुरू झाली: $1',
@@ -2996,13 +2986,8 @@ $1',
 'pageinfo-category-files' => 'संचिकांची संख्या',
 
 # Skin names
-'skinname-standard' => 'अभिजात',
-'skinname-nostalgia' => 'रम्य',
 'skinname-cologneblue' => 'सुरेखनीळी',
 'skinname-monobook' => 'मोनोबुक',
-'skinname-myskin' => 'माझीकांती',
-'skinname-chick' => 'मस्त',
-'skinname-simple' => 'साधी',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -3014,18 +2999,18 @@ $1',
 'rcpatroldisabled' => 'अलीकडील बदलची गस्ती अनुपलब्ध',
 'rcpatroldisabledtext' => 'सध्या ’अलीकडील बदल’ ची गस्त सुविधा अनुपलब्ध केली आहे.',
 'markedaspatrollederror' => 'गस्तीची खूण करता येत नाही',
-'markedaspatrollederrortext' => 'à¤\97सà¥\8dत à¤\98ातलà¥\8dयाà¤\9aà¥\80 à¤\96à¥\82ण à¤\95रणà¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95 à¤\86वरà¥\8dतन à¤¨à¤®à¥\81द करावे लागेल.',
+'markedaspatrollederrortext' => 'à¤\97सà¥\8dत à¤\98ातलà¥\8dयाà¤\9aà¥\80 à¤\96à¥\82ण à¤\95रणà¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95 à¤\86वरà¥\8dतन à¤¨à¤®à¥\82द करावे लागेल.',
 'markedaspatrollederror-noautopatrol' => 'तुम्हाला स्वत:च्याच बदलांवर गस्त घातल्याची खूण करण्याची परवानगी नाही.',
 
 # Patrol log
 'patrol-log-page' => 'टेहळणीतील नोंदी',
-'patrol-log-header' => 'हà¥\80 à¤ªà¤¾à¤¹à¤£à¥\80नà¤\82तरà¤\9aà¥\8dया à¤¨à¤¿à¤°à¤¿क्षणाची नोंद आहे.',
+'patrol-log-header' => 'हà¥\80 à¤ªà¤¾à¤¹à¤£à¥\80नà¤\82तरà¤\9aà¥\8dया à¤¨à¤¿à¤°à¥\80क्षणाची नोंद आहे.',
 'log-show-hide-patrol' => '$1 गस्तीची नोंद',
 
 # Image deletion
 'deletedrevision' => 'जुनी आवृत्ती ($1) वगळली.',
 'filedeleteerror-short' => 'संचिका वगळताना त्रूटी: $1',
-'filedeleteerror-long' => 'सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\82टी आढळल्या:
+'filedeleteerror-long' => 'सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\81टी आढळल्या:
 
 $1',
 'filedelete-missing' => 'संचिका "$1" वगळता येत नाही, कारण ती अस्तित्वात नाही.',
@@ -3125,13 +3110,13 @@ $1',
 'exif-yresolution' => 'उभे रिझोल्यूशन',
 'exif-stripoffsets' => 'चित्रविदा स्थान',
 'exif-rowsperstrip' => 'प्रत्येक पट्टीतील ओळींची संख्या',
-'exif-stripbytecounts' => 'पà¥\8dरतà¥\8dयà¥\87à¤\95 à¤\86à¤\95à¥\81à¤\82à¤\9aà¥\80त पट्टीतील बाईट्सची संख्या',
+'exif-stripbytecounts' => 'पà¥\8dरतà¥\8dयà¥\87à¤\95 à¤\86à¤\95à¥\81à¤\82à¤\9aित पट्टीतील बाईट्सची संख्या',
 'exif-jpeginterchangeformat' => 'JPEG SOI करिता ऑफसेट',
 'exif-jpeginterchangeformatlength' => 'JPEG विदे च्या बाईट्स',
 'exif-whitepoint' => 'धवल बिंदू क्रोमॅटिसिटी',
 'exif-primarychromaticities' => 'क्रोमॅटिसिटीज ऑफ प्राईमारिटीज',
 'exif-ycbcrcoefficients' => 'कलर स्पेस ट्रान्स्फॉर्मेशन मॅट्रीक्स कोएफिशीयंट्स',
-'exif-referenceblackwhite' => 'à¤\95ाळà¥\8dया à¤\86णि à¤ªà¤¾à¤\82ढऱà¥\8dया à¤¸à¤\82दरà¥\8dभ à¤®à¥\81ल्यांची जोडी',
+'exif-referenceblackwhite' => 'à¤\95ाळà¥\8dया à¤\86णि à¤ªà¤¾à¤\82ढऱà¥\8dया à¤¸à¤\82दरà¥\8dभ à¤®à¥\82ल्यांची जोडी',
 'exif-datetime' => 'संचिका बदल तारीख आणि वेळ',
 'exif-imagedescription' => 'चित्र शीर्षक',
 'exif-make' => 'कॅमेरा उत्पादक',
@@ -3174,7 +3159,7 @@ $1',
 'exif-flashenergy' => 'लखाट उर्जा (फ्लॅश एनर्जी)',
 'exif-focalplanexresolution' => 'फोकल प्लेन x रिझोल्यूशन',
 'exif-focalplaneyresolution' => 'फोकल प्लेन Y रिझोल्यूशन',
-'exif-focalplaneresolutionunit' => 'फà¥\8bà¤\95ल à¤ªà¥\8dलà¥\87न  à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\82शन माप',
+'exif-focalplaneresolutionunit' => 'फà¥\8bà¤\95ल à¤ªà¥\8dलà¥\87न  à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\81शन माप',
 'exif-subjectlocation' => 'लक्ष्य स्थळ',
 'exif-exposureindex' => 'प्रभावन सूची',
 'exif-sensingmethod' => 'सेन्सींग पद्धती',
@@ -3194,7 +3179,7 @@ $1',
 'exif-subjectdistancerange' => 'गोष्टीपासूनचे पल्ला अंतर',
 'exif-imageuniqueid' => 'विशिष्ट चित्र क्रमांक',
 'exif-gpsversionid' => 'GPS खूण आवृत्ती',
-'exif-gpslatituderef' => 'à¤\89तà¥\8dतर à¤\95िà¤\82वा à¤¦à¤\95à¥\8dषà¥\80ण अक्षांश',
+'exif-gpslatituderef' => 'à¤\89तà¥\8dतर à¤\95िà¤\82वा à¤¦à¤\95à¥\8dषिण अक्षांश',
 'exif-gpslatitude' => 'अक्षांश',
 'exif-gpslongituderef' => 'पूर्व किंवा पश्चिम रेखांश',
 'exif-gpslongitude' => 'रेखांश',
@@ -3220,7 +3205,7 @@ $1',
 'exif-gpsdestbearing' => 'बीअरींग ऑफ डेस्टीनेशन',
 'exif-gpsdestdistanceref' => 'लक्ष्यस्थळापर्यंतच्या अंतराकरिता संदर्भ',
 'exif-gpsdestdistance' => 'लक्ष्यस्थळापर्यंतचे अंतर',
-'exif-gpsprocessingmethod' => 'GPS à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पद्धतीचे नाव',
+'exif-gpsprocessingmethod' => 'GPS à¤ªà¥\8dरà¤\95à¥\8dरिया पद्धतीचे नाव',
 'exif-gpsareainformation' => 'GPS विभागाचे नाव',
 'exif-gpsdatestamp' => 'GPSतारीख',
 'exif-gpsdifferential' => 'GPS डिफरेंशीअल सुधारणा',
@@ -3256,7 +3241,7 @@ $1',
 'exif-iimcategory' => 'वर्ग',
 'exif-iimsupplementalcategory' => 'पुरवणी श्रेणी',
 'exif-datetimeexpires' => 'या तारखेपश्चात वापरू नका',
-'exif-datetimereleased' => 'या à¤µà¥\87ळà¥\80/दिवशà¥\80 à¤ªà¥\8dरसà¥\83त (पà¥\8dरसारण )à¤\95à¥\87लà¥\87/मà¥\81à¤\95à¥\8dत à¤\95à¥\87लà¥\87 / à¤¸à¥\82रू केले',
+'exif-datetimereleased' => 'या à¤µà¥\87ळà¥\80/दिवशà¥\80 à¤ªà¥\8dरसà¥\83त (पà¥\8dरसारण )à¤\95à¥\87लà¥\87/मà¥\81à¤\95à¥\8dत à¤\95à¥\87लà¥\87 / à¤¸à¥\81रू केले',
 'exif-originaltransmissionref' => 'Original transmission location code: मूळ प्रसारण केले त्या स्थानाचे कूटाक्षर(कोड)',
 'exif-identifier' => 'ओळख दुवा',
 'exif-lens' => 'वापरलेले भिंग',
@@ -3280,7 +3265,7 @@ $1',
 'exif-disclaimer' => 'परवाना',
 'exif-contentwarning' => 'आशय विषयी सूचना',
 'exif-giffilecomment' => 'जीआयएफ संचिका टिप्पणी',
-'exif-intellectualgenre' => 'विशिषà¥\8dठ à¤µà¤¸à¥\8dतà¥\81चा प्रकार',
+'exif-intellectualgenre' => 'विशिषà¥\8dठ à¤µà¤¸à¥\8dतà¥\82चा प्रकार',
 'exif-subjectnewscode' => 'विषयाचे संकेतचिन्ह',
 'exif-scenecode' => 'IPTC दृश्य संकेत',
 'exif-event' => 'सादर केलेला उपक्रम',
@@ -3352,7 +3337,7 @@ $1',
 'exif-lightsource-17' => 'प्रकाश दर्जा A',
 'exif-lightsource-18' => 'प्रकाश दर्जा B',
 'exif-lightsource-19' => 'प्रमाण प्रकाश C',
-'exif-lightsource-24' => 'ISO à¤¸à¥\8dà¤\9fà¥\82डीयो टंगस्टन',
+'exif-lightsource-24' => 'ISO à¤¸à¥\8dà¤\9fà¥\81डीयो टंगस्टन',
 'exif-lightsource-255' => 'इतर प्रकाश स्रोत',
 
 # Flash modes
@@ -3362,7 +3347,7 @@ $1',
 'exif-flash-return-0' => 'लखलखाट (फ्लॅश) - प्रकाश परावर्तन नोंदणीची सुविधा अनुपलब्ध',
 'exif-flash-return-2' => 'लखलखाटाच्या (फ्लॅश)   परावर्तन प्रकाशाची नोंद झाली नाही',
 'exif-flash-return-3' => 'लखलखाटाचे (फ्लॅश) - प्रकाश परावर्तन होत असल्याचे टिपले',
-'exif-flash-mode-1' => 'à¤\85निवारà¥\8dय à¤²à¤\96लà¤\96ाà¤\9f à¤ªà¥\8dरदà¥\80पन (फà¥\8dलà¥\85श à¤«à¤¾à¤¯à¤°à¥\80ंग )',
+'exif-flash-mode-1' => 'à¤\85निवारà¥\8dय à¤²à¤\96लà¤\96ाà¤\9f à¤ªà¥\8dरदà¥\80पन (फà¥\8dलà¥\85श à¤«à¤¾à¤¯à¤°à¤¿ंग )',
 'exif-flash-mode-2' => 'अनिवार्य विना-लखलखाट  (फ्लॅश सप्रेशन)',
 'exif-flash-mode-3' => 'स्वयंचलित स्थिती',
 'exif-flash-function-1' => 'लखलखाट  (फ्लॅश) सुविधा अनुपलब्ध',
@@ -3371,10 +3356,10 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेंसर',
-'exif-sensingmethod-3' => 'à¤\9fà¥\82 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेन्सर',
-'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेंसर',
-'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरà¥\80या सेंसर',
+'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेंसर',
+'exif-sensingmethod-3' => 'à¤\9fà¥\82 à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेन्सर',
+'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेंसर',
+'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरिया सेंसर',
 'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
 'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेंसर',
 
@@ -3487,7 +3472,7 @@ $1',
 'exif-iimcategory-hth' => 'तब्येत',
 'exif-iimcategory-hum' => 'मानवी अभिरुचि',
 'exif-iimcategory-lab' => 'परिश्रम',
-'exif-iimcategory-lif' => 'à¤\86राम à¤\86णि à¤\9cिवन पद्धती',
+'exif-iimcategory-lif' => 'à¤\86राम à¤\86णि à¤\9cà¥\80वन पद्धती',
 'exif-iimcategory-pol' => 'राजनीती',
 'exif-iimcategory-rel' => 'धर्म व श्रद्धा',
 'exif-iimcategory-sci' => 'विज्ञान व तंत्रज्ञान',
@@ -3515,7 +3500,7 @@ $1',
 'confirmemail' => 'ई-मेल पत्ता पडताळून पहा',
 'confirmemail_noemail' => '[[Special:Preferences|सदस्य पसंतीत]] तुम्ही प्रमाणित विपत्र (ई-मेल) पत्ता दिलेला नाही.',
 'confirmemail_text' => 'विपत्र सुविधा वापरण्या पूर्वी {{SITENAME}}वर तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करणे गरजेचे आहे. तुमच्या पत्त्यावर निश्चितीकरण विपत्र (ई-मेल) पाठवण्याकरिता खालील बटण सुरू करा.विपत्रात कुटसंकेतच्(पासवर्ड) असलेला दुवा असेल;तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करण्या करिता तुमच्या विचरकात हा दिलेला दुवा चढवा.',
-'confirmemail_pending' => 'à¤\8fà¤\95 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤\95à¥\81à¤\9fसà¤\82à¤\95à¥\87त à¤\86धà¥\80à¤\9a à¤¤à¥\81मà¥\8dहाला à¤µà¤¿à¤ªà¤¤à¥\8dर à¤\95à¥\87ला à¤\86हà¥\87; à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤\85शातà¤\9a à¤\89à¤\98डलà¥\87 à¤\85सà¥\87ल à¤¤à¤°,à¤\8fà¤\95 à¤¨à¤µà¤¾ à¤\95à¥\81ट संकेत मागण्यापूर्वी,पाठवलेला मिळण्याकरिता थोडी मिनिटे वाट पहाणे तुम्हाला आवडू शकेल.',
+'confirmemail_pending' => 'à¤\8fà¤\95 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤\95à¥\81à¤\9fसà¤\82à¤\95à¥\87त à¤\86धà¥\80à¤\9a à¤¤à¥\81मà¥\8dहाला à¤µà¤¿à¤ªà¤¤à¥\8dर à¤\95à¥\87ला à¤\86हà¥\87; à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤\85शातà¤\9a à¤\89à¤\98डलà¥\87 à¤\85सà¥\87ल à¤¤à¤°,à¤\8fà¤\95 à¤¨à¤µà¤¾ à¤\95à¥\82ट संकेत मागण्यापूर्वी,पाठवलेला मिळण्याकरिता थोडी मिनिटे वाट पहाणे तुम्हाला आवडू शकेल.',
 'confirmemail_send' => 'विपत्र निश्चितीकरण नियमावली',
 'confirmemail_sent' => 'शाबितीकरण विपत्र पाठवले.',
 'confirmemail_oncreate' => 'तुमच्या विपत्र पत्त्यावर निश्चितीकरण कुटसंकेत पाठवला होता .
@@ -3523,7 +3508,7 @@ $1',
 'confirmemail_sendfailed' => 'पोच-विपत्र पाठवू शकलो नाही. अयोग्य चिन्हांकरिता पत्ता तपासा.
 
 मेलर परत आले: $1',
-'confirmemail_invalid' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80.नियमावलà¥\80 à¤\95ाल à¤¸à¤®à¤¾à¤ªà¥\8dत à¤\9dाला à¤\85सà¥\81 शकेल.',
+'confirmemail_invalid' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80.नियमावलà¥\80 à¤\95ाल à¤¸à¤®à¤¾à¤ªà¥\8dत à¤\9dाला à¤\85सà¥\82 शकेल.',
 'confirmemail_needlogin' => 'तुमचा विपत्रपत्ता प्रमाणित करण्यासाठी तुम्ही $1 करावयास हवे.',
 'confirmemail_success' => 'तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित झाला आहे.तुम्ही आता [[Special:UserLogin|दाखल]] होऊ शकता आणि विकिचा आनंद घेऊ शकता.',
 'confirmemail_loggedin' => 'तुमचा विपत्र (ई-मेल) पत्ता आता प्रमाणित झाला आहे.',
@@ -3576,7 +3561,7 @@ $5
 'deletedwhileediting' => '”’सूचना:”’ तुम्ही संपादन सुरू केल्यानंतर हे पान वगळले गेले आहे.',
 'confirmrecreate' => "तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान पुढील कारणाने वगळले:
 : ''$2''
-à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤\96रà¥\87à¤\9a à¤ªà¥\81नà¥\8dहा à¤¨à¤¿à¤°à¥\8dमà¥\80त करून हवे आहे का हे निश्चित करा.",
+à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤\96रà¥\87à¤\9a à¤ªà¥\81नà¥\8dहा à¤¨à¤¿à¤°à¥\8dमित करून हवे आहे का हे निश्चित करा.",
 'confirmrecreate-noreason' => 'तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान  वगळले. तुम्हाला हे पान खरेच पुन्हा निर्मित करून हवे आहे का हे निश्चित करा.',
 'recreate' => 'पुनर्निर्माण',
 
@@ -3629,14 +3614,14 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.',
-'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त कदाचित दाखवले नाही जाणार.',
+'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aित कदाचित दाखवले नाही जाणार.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.',
-'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त कोणतेही शीर्षक पान नोंदलेले नाही.',
+'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aित कोणतेही शीर्षक पान नोंदलेले नाही.',
 'watchlistedit-normal-title' => 'पहाऱ्याची सूचीचे संपादन करा',
 'watchlistedit-normal-legend' => 'शीर्षकपाने नित्य पहाण्याच्या सूचीतून काढा',
-'watchlistedit-normal-explain' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शà¥\80त केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
+'watchlistedit-normal-explain' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शित केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
 'watchlistedit-normal-submit' => 'शिर्षक वगळा',
 'watchlistedit-normal-done' => 'तुमच्या नित्य पहाण्या सूचीतून वगळलेली {{PLURAL:$1|1 शीर्षक होते |$1 शीर्षके होती }}:',
 'watchlistedit-raw-title' => 'कच्ची नित्य पहाण्याची सूची संपादित करा',
@@ -3647,8 +3632,8 @@ $5
 'watchlistedit-raw-titles' => 'शिर्षके:',
 'watchlistedit-raw-submit' => 'पहाऱ्याची सूची अद्ययावत करा.',
 'watchlistedit-raw-done' => 'तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षक होती }} भर घातली:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षक होती }} वगळले:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षक होती }} भर घातली:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षक होती }} वगळले:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'सुयोग्य बदल पहा',
@@ -3684,7 +3669,7 @@ $5
 'version-poweredby-others' => 'इतर',
 'version-license-info' => 'मिडियाविकि हे  मुक्त संगणक प्रणाली विकि पॅकेज आहे.Free Software Foundation प्रकाशित  GNU General Public परवान्याच्या अटीस अनुसरून तुम्ही त्यात बदल आणि/अथवा त्याचे  पुर्नवितरण  करू शकता.
 
-मिडियाविà¤\95ि  à¤¸à¤\82à¤\97णà¤\95 à¤ªà¥\8dरणालà¥\80 à¤\89पयà¥\82à¤\95à¥\8dत à¤ à¤°à¥\87ल à¤¯à¤¾ à¤\86शà¥\87नà¥\87 à¤µà¤¿à¤¤à¤°à¥\80त à¤\95à¥\87लà¥\80 à¤\9cात à¤\85सलà¥\80 à¤¤à¤°à¥\80;à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤µà¤¿à¤¤à¤°à¤£à¤¾à¤¸ à¤\85थवा à¤µà¤¿à¤¶à¥\80ष्ट उद्देशाकरिता योग्यतेची अगदी कोणतीही अप्रत्यक्ष अथवा उपलक्षित   अथवा  निहित अशा अथवा कोणत्याही प्रकारच्या केवळ  कोणत्याही प्राश्वासनाशिवायच (WITHOUT ANY WARRANTY) उपलब्ध आहे.अधिक माहिती करिता   GNU General Public License पहावे.
+मिडियाविà¤\95ि  à¤¸à¤\82à¤\97णà¤\95 à¤ªà¥\8dरणालà¥\80 à¤\89पयà¥\81à¤\95à¥\8dत à¤ à¤°à¥\87ल à¤¯à¤¾ à¤\86शà¥\87नà¥\87 à¤µà¤¿à¤¤à¤°à¤¿à¤¤ à¤\95à¥\87लà¥\80 à¤\9cात à¤\85सलà¥\80 à¤¤à¤°à¥\80;à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤µà¤¿à¤¤à¤°à¤£à¤¾à¤¸ à¤\85थवा à¤µà¤¿à¤¶à¤¿ष्ट उद्देशाकरिता योग्यतेची अगदी कोणतीही अप्रत्यक्ष अथवा उपलक्षित   अथवा  निहित अशा अथवा कोणत्याही प्रकारच्या केवळ  कोणत्याही प्राश्वासनाशिवायच (WITHOUT ANY WARRANTY) उपलब्ध आहे.अधिक माहिती करिता   GNU General Public License पहावे.
 
 तुम्हाला या प्रणाली सोबत [{{SERVER}}{{SCRIPTPATH}}/COPYING  GNU General Public License परवान्याची प्रत] मिळालेली असावयास हवी, तसे नसेल तर,[//www.gnu.org/licenses/old-licenses/gpl-2.0.html  येथे ऑनलाईन वाचा] किंवा the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ला लिहा.',
 'version-software' => 'स्थापित संगणक प्रणाली (Installed software)',
@@ -3699,7 +3684,7 @@ $5
 'filepath-page' => 'संचिका:',
 'filepath-submit' => 'चला',
 'filepath-summary' => 'हे विशेष पान संचिकेचा संपूर्ण मार्ग कळवते.
-à¤\9aितà¥\8dरà¥\87 à¤¸à¤\82पà¥\82रà¥\8dण à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\82शन à¤®à¤§à¥\8dयà¥\87 à¤¦à¤¾à¤\96वलà¥\80 à¤\86हà¥\87त,à¤\87तर à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\8dरà¤\95ार à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤\82बधà¥\80त प्रोग्रामने प्रत्यक्ष सुरू होतात.',
+à¤\9aितà¥\8dरà¥\87 à¤¸à¤\82पà¥\82रà¥\8dण à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\81शन à¤®à¤§à¥\8dयà¥\87 à¤¦à¤¾à¤\96वलà¥\80 à¤\86हà¥\87त,à¤\87तर à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\8dरà¤\95ार à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤\82बधित प्रोग्रामने प्रत्यक्ष सुरू होतात.',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'जुळ्या संचिका शोधा',
@@ -3734,11 +3719,11 @@ $5
 'intentionallyblankpage' => 'हे पान मुद्दाम कोरे सोडण्यात आले आहे.',
 
 # External image whitelist
-'external_image_whitelist' => '#हà¥\87 à¤\93ल à¤¬à¤°à¥\8bबर à¤\9cशि à¤\86हà¥\87 à¤¤à¤¶à¤¿ घेने.
+'external_image_whitelist' => '#हà¥\87 à¤\93ल à¤¬à¤°à¥\8bबर à¤\9cशà¥\80 à¤\86हà¥\87 à¤¤à¤¶à¥\80 घेने.
 #नेहमि वपरले जानारे सर्व चीह्न्न् वपरने.
 #बाहेरिल सर्व चित्राना ह्यासोबत जोद्दले जाइल.
-#हà¥\8dया à¤®à¤§à¤¿à¤² à¤\9cà¥\81ललà¥\87लà¥\87 à¤¸à¤°à¥\8dव à¤\9aितà¥\8dर à¤®à¥\8dहनà¥\81न à¤¦à¤\96वलà¥\87 à¤\9cतिल,à¤\85थवा à¤\9aितà¥\8dराà¤\9aि फक़्त् लिन्क दखवलि जाइल.
-## à¤¹à¥\8dया à¤\9aिहà¥\8dना à¤ªà¤¾à¤¸à¥\81न à¤¸à¥\81रà¥\81 à¤\9dलà¥\87लà¥\8dया à¤¸à¤°à¥\8dव à¤\93लि कमेन्त म्हनुन वपरर्ल्या जातिल.
+#हà¥\8dया à¤®à¤§à¥\80ल à¤\9cà¥\81ललà¥\87लà¥\87 à¤¸à¤°à¥\8dव à¤\9aितà¥\8dर à¤®à¥\8dहनà¥\81न à¤¦à¤\96वलà¥\87 à¤\9cतिल,à¤\85थवा à¤\9aितà¥\8dराà¤\9aà¥\80 फक़्त् लिन्क दखवलि जाइल.
+## à¤¹à¥\8dया à¤\9aिहà¥\8dना à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¥\82 à¤\9dलà¥\87लà¥\8dया à¤¸à¤°à¥\8dव à¤\93लà¥\80 कमेन्त म्हनुन वपरर्ल्या जातिल.
 #हे केस सेन्सेतिव आहे.',
 
 # Special:Tags
@@ -3746,7 +3731,7 @@ $5
 'tag-filter' => '[[Special:Tags|खूण]] गाळक:',
 'tag-filter-submit' => 'गाळक',
 'tags-title' => 'खुणा',
-'tags-intro' => 'पà¥\8dरणालà¥\80तà¥\82न à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤¸à¤\82पादनाà¤\82à¤\9aà¥\8dया à¤\85रà¥\8dथासहà¥\80त  à¤\96à¥\82णाà¤\82à¤\9aà¥\80  à¤¯à¤¾à¤¦à¥\80 à¤¨à¤®à¥\81द करणारे पान',
+'tags-intro' => 'पà¥\8dरणालà¥\80तà¥\82न à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤¸à¤\82पादनाà¤\82à¤\9aà¥\8dया à¤\85रà¥\8dथासहित  à¤\96à¥\81णाà¤\82à¤\9aà¥\80  à¤¯à¤¾à¤¦à¥\80 à¤¨à¤®à¥\82द करणारे पान',
 'tags-tag' => 'खूण नाव',
 'tags-display-header' => 'बदल सुचीवर कसे दिसेल',
 'tags-description-header' => 'अर्थाची पूर्ण माहिती',
@@ -3762,9 +3747,9 @@ $5
 'compare-rev1' => 'आवर्तन १',
 'compare-rev2' => 'आवर्तन २',
 'compare-submit' => 'तुलना करा',
-'compare-invalid-title' => 'तà¥\81मà¥\8dहà¥\80 à¤¨à¤®à¥\81द केलेले शीर्षक अग्राह्य आहे.',
+'compare-invalid-title' => 'तà¥\81मà¥\8dहà¥\80 à¤¨à¤®à¥\82द केलेले शीर्षक अग्राह्य आहे.',
 'compare-title-not-exists' => 'या नावाने काहीही अस्तित्वात नाही.',
-'compare-revision-not-exists' => 'à¤\86पण à¤¨à¤®à¥\81द करत असलेली आवृत्ती अस्तित्वात नाही.',
+'compare-revision-not-exists' => 'à¤\86पण à¤¨à¤®à¥\82द करत असलेली आवृत्ती अस्तित्वात नाही.',
 
 # Database error messages
 'dberr-header' => 'या विकीत एक चूक आहे',
@@ -3772,13 +3757,13 @@ $5
 'dberr-again' => 'थोडा वेळ थांबून पुन्हा पहा.',
 'dberr-info' => '( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)',
 'dberr-usegoogle' => 'तोपर्यंत गूगलवर शोधून पहा',
-'dberr-outofdate' => 'लà¤\95à¥\8dषात à¤\98à¥\8dया, à¤\86मà¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राबाबत à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\81à¤\9aà¥\80 à¤\95ालबाहà¥\8dय à¤\85सà¥\81 शकते',
+'dberr-outofdate' => 'लà¤\95à¥\8dषात à¤\98à¥\8dया, à¤\86मà¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राबाबत à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤\95ालबाहà¥\8dय à¤\85सà¥\82 शकते',
 'dberr-cachederror' => 'ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.',
 
 # HTML forms
 'htmlform-invalid-input' => 'तुम्ही दिलेल्या माहितीत काहीतरी गडबड आहे',
-'htmlform-select-badoption' => 'à¤\86पण à¤¨à¤®à¥\81द करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही',
-'htmlform-int-invalid' => 'à¤\86पण à¤¨à¤®à¥\81द केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.',
+'htmlform-select-badoption' => 'à¤\86पण à¤¨à¤®à¥\82द करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही',
+'htmlform-int-invalid' => 'à¤\86पण à¤¨à¤®à¥\82द केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.',
 'htmlform-float-invalid' => 'तुम्ही दिलेली किंमत आकडा नाही.',
 'htmlform-int-toolow' => '$1 किंवा मोठा आकडा द्या.',
 'htmlform-int-toohigh' => '$1 किंवा त्याहून छोटा आकडा द्या.',
@@ -3813,7 +3798,7 @@ $5
 'revdelete-unrestricted' => 'प्रबंधकांची बंधने काढली',
 'logentry-move-move' => '  $3पान    $4 कडे  $1 स्थानांतरीत',
 'logentry-move-move-noredirect' => '$1 ने $3 हे पान पुनर्निर्देशीत न करता $4 येथे स्थानांतरीत केले',
-'logentry-move-move_redir' => '$1 à¤¯à¤¾à¤\82नà¥\80 $3 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤²à¤¾à¤µà¥\81न $4 येथे हलवले',
+'logentry-move-move_redir' => '$1 à¤¯à¤¾à¤\82नà¥\80 $3 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤²à¤¾à¤µà¥\82न $4 येथे हलवले',
 'logentry-move-move_redir-noredirect' => '$1 ने $3 हे पान पुनर्निर्देशीत न करता $4 येथे पुर्ननिर्देशनावर  स्थानांतरीत केले',
 'logentry-patrol-patrol' => '  $3  पानाच्या  $1 सुचवलेल्या  $4 आवृत्तीस गस्त घातली',
 'logentry-patrol-patrol-auto' => '  $3  पानाच्या  $1 सुचवलेल्या  $4 आवृत्तीस स्वयंचलित गस्त घातली',
@@ -3844,7 +3829,7 @@ $5
 'searchsuggest-containing' => '.......हे असलेले',
 
 # API errors
-'api-error-badaccess-groups' => 'à¤\86पणास à¤¹à¥\8dया à¤µà¤¿à¤\95à¥\80वर संचिका चढवण्याची परवानगी नाही',
+'api-error-badaccess-groups' => 'à¤\86पणास à¤¹à¥\8dया à¤µà¤¿à¤\95िवर संचिका चढवण्याची परवानगी नाही',
 'api-error-badtoken' => 'अंतर्गत चूक: अयोग्य टोकन',
 'api-error-copyuploaddisabled' => "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
 'api-error-duplicate' => 'या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे [$2 दुसरी संचिका]| [$2 दुसऱ्या संचिका]}} आहेत.',
@@ -3865,14 +3850,14 @@ $5
 'api-error-internal-error' => 'अंतर्गत त्रुटी:आपण विकिवर चढविलेल्या संचिकेवर प्रक्रिया करतांना काहीतरी चुकले आहे.',
 'api-error-invalid-file-key' => 'अंतर्गत त्रुटी: तात्पुरत्या साठवणीत संचिका सापडली नाही.',
 'api-error-missingparam' => 'अंतर्गत चूक: मागणीतील काही नोंदी राहून गेल्या आहेत',
-'api-error-missingresult' => 'à¤\86à¤\82तरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤ªà¥\8dरत à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9dालà¥\80 à¤\95ि नाही हे ठरवता  येत नाही',
-'api-error-mustbeloggedin' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविणà¥\8dयासाठà¥\80 à¤\86पण à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\87 à¤\9cरà¥\82री आहे.',
+'api-error-missingresult' => 'à¤\86à¤\82तरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤ªà¥\8dरत à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9dालà¥\80 à¤\95à¥\80 नाही हे ठरवता  येत नाही',
+'api-error-mustbeloggedin' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविणà¥\8dयासाठà¥\80 à¤\86पण à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\87 à¤\9cरà¥\81री आहे.',
 'api-error-mustbeposted' => 'अंतर्गत चूक: मागणी पूर्ण करण्यासाठी HTTP POST असायला हवे',
 'api-error-noimageinfo' => 'डाटा अपलोड यशस्वी झाले आहे पण सर्व्हर कडून तशी माहिती अजून मिळाली नाही',
 'api-error-nomodule' => 'अंतर्गत चूक: module set चढवलेला नाही',
 'api-error-ok-but-empty' => 'आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं',
 'api-error-overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
-'api-error-stashfailed' => 'à¤\87नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¤¾ à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\8dया à¤¸à¥\8dवरà¥\81पाच्या संचिका जमा करण्यात अयशस्वी',
+'api-error-stashfailed' => 'à¤\87नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¤¾ à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\8dया à¤¸à¥\8dवरà¥\82पाच्या संचिका जमा करण्यात अयशस्वी',
 'api-error-timeout' => 'अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.',
 'api-error-unclassified' => 'एक अज्ञात चूक उद्भवली.',
 'api-error-unknown-code' => 'अज्ञात त्रुटी: "$1"',
@@ -3880,7 +3865,7 @@ $5
 'api-error-unknown-warning' => 'अज्ञात इशारा : $1',
 'api-error-unknownerror' => 'अज्ञात चूक $1',
 'api-error-uploaddisabled' => 'चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे',
-'api-error-verification-error' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤­à¥\8dरषà¥\8dà¤\9f(à¤\95रपà¥\8dà¤\9f) à¤\9dालà¥\80 à¤\95िà¤\82वा à¤\9aà¥\81à¤\95िचा विस्तार(एक्सटेंशन) असलेली असू शकते.',
+'api-error-verification-error' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤­à¥\8dरषà¥\8dà¤\9f(à¤\95रपà¥\8dà¤\9f) à¤\9dालà¥\80 à¤\95िà¤\82वा à¤\9aà¥\81à¤\95à¥\80चा विस्तार(एक्सटेंशन) असलेली असू शकते.',
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}',
index 60fedcc..56065c7 100644 (file)
@@ -220,8 +220,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
 'tog-oldsig' => 'Tanda tangan yang sedia ada:',
 'tog-fancysig' => 'Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)',
-'tog-externaleditor' => 'Utamakan penyunting luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-externaldiff' => 'Utamakan pembeza luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
 'tog-showjumplinks' => 'Bolehkan pautan ketercapaian "lompat ke"',
 'tog-uselivepreview' => 'Gunakan pralihat langsung (JavaScript) (dalam percubaan)',
 'tog-forceeditsummary' => 'Tanya saya jika ringkasan suntingan kosong',
@@ -236,6 +234,7 @@ $messages = array(
 'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
 'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
 'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
+'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
 
 'underline-always' => 'Sentiasa',
 'underline-never' => 'Jangan',
@@ -668,9 +667,8 @@ mengelak penyalahgunaan, anda tidak dibenarkan menggunakan ciri pemulihan kata l
 'eauthentsent' => 'Sebuah e-mel pengesahan telah dikirim kepada alamat e-mel tersebut.
 Sebelum e-emel lain boleh dikirim kepada alamat tersebut, anda perlu mengikuti segala arahan dalam e-mel tersebut
 untuk membuktikan bahawa alamat tersebut memang milik anda.',
-'throttled-mailpassword' => 'Sebuah pengingat kata laluan telah pun
-dikirim dalam $1 jam yang lalu. Untuk mengelak penyalahgunaan, hanya satu
-pengingat kata laluan akan dikirim pada setiap $1 jam.',
+'throttled-mailpassword' => 'E-mel set semula kata laluan telah dihantar dalam tempoh $1 jam yang lalu.
+Untuk mencegah salah guna, hanya sepucuk e-mel set semula kata laluan dihantar setiap {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Ralat ketika mengirim e-mel: $1',
 'acct_creation_throttle_hit' => 'Pengunjung wiki ini yang menggunakan alamat IP anda telah membuka sebanyak $1 akaun semenjak sehari lepas, iaitu merupakan had maksimum yang dibenarkan dalam tempoh tersebut.
 Akibatknya, pengunjung dari alamat IP ini tidak boleh membuka akaun lagi pada masa sekarang.',
@@ -722,7 +720,7 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
 
 # Special:PasswordReset
 'passwordreset' => 'Set semula kata laluan',
-'passwordreset-text' => 'Isikan borang ini untuk menerima peringatan butiran akaun anda melalui e-mel.',
+'passwordreset-text' => 'Lengkapkan borang ini untuk mengeset semula kata laluan.',
 'passwordreset-legend' => 'Set semula kata laluan',
 'passwordreset-disabled' => 'Ciri set semula kata laluan telah dimatikan di wiki ini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Isikan data di bawah}}',
@@ -732,21 +730,23 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
 'passwordreset-capture-help' => 'Jika anda menandai ruang ini, e-mel (yang membawa kata laluan sementara) akan ditunjukkan kepada anda dan juga dihantar kepada pengguna itu.',
 'passwordreset-email' => 'Alamat e-mel:',
 'passwordreset-emailtitle' => 'Butiran akaun di {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada orang (mungkin anda, dari alamat IP $1) yang memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4).  {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+'passwordreset-emailtext-ip' => 'Seseorang (mungkin anda, dari alamat IP $1) telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut
+dikaitkan dengan alamat e-mel ini:
 
 $2
 
-{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
-'passwordreset-emailtext-user' => 'Pengguna $1 di {{SITENAME}} memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
+'passwordreset-emailtext-user' => 'Pengguna $1 telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut
+dikaitkan dengan alamat e-mel ini:
 
 $2
 
-{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
+{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
 'passwordreset-emailelement' => 'Nama pengguna: $1
 Kata laluan sementara: $2',
-'passwordreset-emailsent' => 'E-mel peringatan telah dihantar.',
-'passwordreset-emailsent-capture' => 'E-mel peringatan (seperti di bawah) telah dihantar.',
-'passwordreset-emailerror-capture' => 'E-mel peringatan (seperti di bawah) telah dihasilkan tetapi tidak dapat dihantar kepada pengguna: $1',
+'passwordreset-emailsent' => 'E-mel set semula kata laluan telah dihantar.',
+'passwordreset-emailsent-capture' => 'E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.',
+'passwordreset-emailerror-capture' => 'E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada pengguna: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Tukar alamat e-mel',
@@ -957,6 +957,8 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
 'invalid-content-data' => 'Data kandungan tidak sah',
 'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan anda kehilangan sebarang perubahan yang telah anda lakukan.
+Anda boleh melumpuhkan amaran in di bahagian "{{int:prefs-editing}}" dalam keutamaan anda.',
 
 # Content models
 'content-model-wikitext' => 'wikiteks',
@@ -1241,15 +1243,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'powersearch-togglenone' => 'Tiada',
 'search-external' => 'Carian luar',
 'searchdisabled' => 'Ciri pencarian dalam {{SITENAME}} dimatikan. Anda boleh mencari melalui Google. Sila ambil perhatian bahawa indeks dalam Google mungkin bukan yang terkini.',
-
-# Quickbar
-'qbsettings' => 'Bar pantas',
-'qbsettings-none' => 'Tiada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Berubah-ubah sebelah kiri',
-'qbsettings-floatingright' => 'Berubah-ubah sebelah kanan',
-'qbsettings-directionality' => 'Tetap, bergantung pada kearahan tulisan bahasa anda',
+'search-error' => 'Berlakunya ralat ketika mencari: $1',
 
 # Preferences page
 'preferences' => 'Keutamaan',
@@ -1800,7 +1794,6 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
 'http-read-error' => 'Ralat baca HTTP.',
 'http-timed-out' => 'Permintaan HTTP melebihi waktu tamat.',
 'http-curl-error' => 'Ralat mendapatkan URL: $1',
-'http-host-unreachable' => 'URL tidak dapat dicapai.',
 'http-bad-status' => 'Berlaku masalah ketika permintaan HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2124,15 +2117,6 @@ Memerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. "*.org".<br />
 'listusers-noresult' => 'Tiada pengguna dijumpai.',
 'listusers-blocked' => '(disekat)',
 
-# Special:ActiveUsers
-'activeusers' => 'Senarai pengguna aktif',
-'activeusers-intro' => 'Yang berikut ialah senarai pengguna yang bergiat sejak {{PLURAL:$1|semalam|$1 hari lalu}}.',
-'activeusers-count' => '$1 tindakan sejak {{PLURAL:$3|semalam|$3 hari lalu}}',
-'activeusers-from' => 'Tunjukkan pengguna bermula pada:',
-'activeusers-hidebots' => 'Sorokkan bot',
-'activeusers-hidesysops' => 'Sorokkan pentadbir',
-'activeusers-noresult' => 'Tiada pengguna dijumpai.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Hak kumpulan pengguna',
 'listgrouprights-summary' => 'Yang berikut ialah senarai kumpulan pengguna yang ditubuhkan di wiki ini dengan hak-hak masing-masing.
@@ -2623,6 +2607,7 @@ Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal da
 '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',
 'cant-block-while-blocked' => 'Anda tidak boleh menyekat orang lain sedangkan anda disekat.',
 'cant-see-hidden-user' => 'Pengguna yang anda cuba sekat telahpun disekat dan tersorok.
 Memandangkan anda tidak mempunyai hak untuk menyorokkan pengguna, anda tidak boleh melihat atau menyunting sekatan pengguna tersebut.',
@@ -2939,13 +2924,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
-'standard.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Klasik */',
-'nostalgia.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Nostalgia */',
 'cologneblue.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Cologne Blue */',
 'monobook.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */',
-'myskin.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit MySkin */',
-'chick.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Chick */',
-'simple.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Ringkas */',
 'modern.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */',
 'vector.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */',
 
@@ -3020,13 +3000,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'pageinfo-category-files' => 'Bilangan fail',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Ringkas',
 'skinname-modern' => 'Moden',
 'skinname-vector' => 'Vector',
 
@@ -3843,17 +3818,17 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'sqlite-no-fts' => '$1 tanpa sokongan carian teks penuh',
 
 # New logging system
-'logentry-delete-delete' => '$1 menghapuskan laman $3',
-'logentry-delete-restore' => '$1 memulihkan laman $3',
-'logentry-delete-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3: $4',
-'logentry-delete-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3',
-'logentry-delete-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3',
-'logentry-suppress-delete' => '$1 menyekat laman $3',
-'logentry-suppress-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3 secara rahsia: $4',
-'logentry-suppress-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3 secara rahsia: $4',
-'logentry-suppress-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3 secara rahsia',
-'logentry-suppress-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3 secara rahsia',
+'logentry-delete-delete' => '$1 telah {{GENDER:$2|menghapuskan}} halaman $3',
+'logentry-delete-restore' => '$1 telah {{GENDER:$2|memulihkan}} halaman $3',
+'logentry-delete-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4',
+'logentry-delete-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3',
+'logentry-delete-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3',
+'logentry-suppress-delete' => '$1 telah {{GENDER:$2|menyekat}} halaman $3',
+'logentry-suppress-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3 secara senyap: $4',
+'logentry-suppress-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3 secara senyap: $4',
+'logentry-suppress-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3 secara senyap',
+'logentry-suppress-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3 secara senyap',
 'revdelete-content-hid' => 'kandungan tersorok',
 'revdelete-summary-hid' => 'ringkasan suntingan tersorok',
 'revdelete-uname-hid' => 'nama pengguna tersorok',
@@ -3862,20 +3837,20 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'revdelete-uname-unhid' => 'nama pengguna terdedah',
 'revdelete-restricted' => 'mengenakan sekatan pada penyelia',
 'revdelete-unrestricted' => 'menarik sekatan daripada penyelia',
-'logentry-move-move' => '$1 memindahkan laman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 mengalihkan laman $3 ke $4 tanpa meninggalkan lencongan',
-'logentry-move-move_redir' => '$1 mengalihkan laman $3 ke $4 pada lencongan',
-'logentry-move-move_redir-noredirect' => '$1 mengalihkan laman $3 ke $4 pada satu lencongan tanpa meninggalkan lencongan',
-'logentry-patrol-patrol' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda',
-'logentry-patrol-patrol-auto' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda secara automatik',
-'logentry-newusers-newusers' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create2' => 'Akaun pengguna $3 dibuka oleh $1',
-'logentry-newusers-byemail' => 'Akaun pengguna $3 dibuka oleh $1 dan kata laluannya dihantar melalui e-mel',
-'logentry-newusers-autocreate' => 'Akaun $1 dibuka secara automatik',
-'logentry-rights-rights' => '$1 menukar keahlian kumpulan untuk $3 dari $4 ke $5',
-'logentry-rights-rights-legacy' => '$1 menukar keahlian kumpulan untuk $3',
-'logentry-rights-autopromote' => '$1 dinaik pangkat secara automatik dari $4 ke $5',
+'logentry-move-move' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan',
+'logentry-move-move_redir' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan',
+'logentry-move-move_redir-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan',
+'logentry-patrol-patrol' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda',
+'logentry-patrol-patrol-auto' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik',
+'logentry-newusers-newusers' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create2' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1',
+'logentry-newusers-byemail' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1 dan kata laluannya dihantar melalui e-mel',
+'logentry-newusers-autocreate' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}} secara automatik',
+'logentry-rights-rights' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3 dari $4 ke $5',
+'logentry-rights-rights-legacy' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3',
+'logentry-rights-autopromote' => '$1 telah {{GENDER:$2|dinaik pangkat}} secara automatik dari $4 ke $5',
 'rightsnone' => '(tiada)',
 
 # Feedback
index 05f5854..405cd8e 100644 (file)
@@ -460,6 +460,8 @@ $messages = array(
 'page-rss-feed' => '«$1» RSS максовкс',
 'page-atom-feed' => '«$1» Atom максовкс',
 'red-link-title' => '$1 (истямо лопа арась)',
+'sort-descending' => 'Аравтомс лувс Я-А',
+'sort-ascending' => 'Аравтомс лувс А-Я',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Лопа',
@@ -546,7 +548,7 @@ $messages = array(
 'gotaccount' => "Совамотаркат ули? '''$1'''.",
 'gotaccountlink' => 'Совамс',
 'userlogin-resetlink' => 'Совамо эрявикстнэнь стувтыть?',
-'createaccountmail' => 'е-Ñ\81Ñ\91Ñ\80маÑ\81о',
+'createaccountmail' => 'ТейÑ\82Ñ\8c ÐºÐ¾Ð´Ð°Ð¼Ð¾ Ð¿Ð¾Ð½Ð³Ñ\81Ñ\8c Ñ\81алаванÑ\8c Ð²Ð°Ð», ÐºÑ\83Ñ\87ик Ñ\81онзÑ\8d Ð°Ð»Ð¾ Ð¼Ð°ÐºÑ\81озÑ\8c Ðµ-Ñ\81Ñ\91Ñ\80мапаÑ\80гонÑ\82енÑ\8c',
 'createaccountreason' => 'Тувталось:',
 'badretype' => 'Сёрмадыть салава валот кавксть: сынь аволь вейкеть.',
 'userexists' => 'Те лемесь уш саезь.
@@ -593,7 +595,7 @@ $messages = array(
 'accountcreatedtext' => '$1-нь совицянь таркась теевсь-шкавсь.',
 'loginlanguagelabel' => 'Кель: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => 'Терявтыть кучомс е-сёрма е-сёрмапарговтомо.',
 
 # Change password dialog
@@ -698,6 +700,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 Мусак [[Special:Search/{{PAGENAME}}|вешнемс  файлань те коняксонть]] лия сёрмадовкстнэстэ эли
 <span class="plainlinks">
 [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешнемс малавикс журналтнэстэ]</span>. Ялатеке тонеть а мерить шкамс те лопанть.',
+'userpage-userdoesnotexist-view' => 'Совамотарка  "$1" апак сёрмадсто.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
 'previewnote' => "'''Кирдтяя мельсэ, те ансяк васнянь невтевкс.'''
@@ -774,6 +777,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'history-feed-title' => 'Лиякстомтомань тевде',
 'history-feed-description' => 'Викинь тевате лопанть лиякстомтомань тевдензэ',
 'history-feed-item-nocomment' => '$1 $2-зэ',
+'history-feed-empty' => 'Лопа, кона вешнить, арась. Кизды нардавсь wikiстэ эли одов лемдявсь. Варчак [[Special:Search|wiki-ва вешнема]] эрявикс од лопанть муемга.',
 
 # Revision deletion
 'rev-deleted-comment' => '(витнемадо-петнемадо арсемась-мелесь нардазь)',
@@ -881,40 +885,34 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'search-nonefound' => 'Те вешнема лангс мезеяк эзь муеве.',
 'powersearch' => 'Седеяк вешнемс',
 'powersearch-legend' => 'Седе келейстэ вешнема',
-'powersearch-ns' => 'Вешнемс не лем потмотнестэ:',
-'powersearch-redir' => 'Лия таркав йутавтоматнень сёрмалема',
+'powersearch-ns' => 'Вешнемс не лемпотмотнестэ:',
+'powersearch-redir' => 'Лия таркав ютавтоматнень сёрмалема',
 'powersearch-field' => 'Вешнемс',
 'powersearch-toggleall' => 'Весе',
 'powersearch-togglenone' => 'Арась мезе невтемс',
 'search-external' => 'Ушо йондонь вешнема',
 
-# Quickbar
-'qbsettings' => 'Навигациянь лазнэ',
-'qbsettings-none' => 'Арась мезе невтемс',
-'qbsettings-fixedleft' => 'Керш ёндо кирдезь',
-'qbsettings-fixedright' => 'Вить ёндо кирдезь',
-'qbsettings-floatingleft' => 'Керш ёнга уи',
-'qbsettings-floatingright' => 'Вить ёнга уи',
-
 # Preferences page
-'preferences' => 'Ð\9bиÑ\8f Ñ\8eÑ\82кÑ\81Ñ\82о Ñ\8fвома',
+'preferences' => 'Ð\90Ñ\80авÑ\82омаÑ\82',
 'mypreferences' => 'Аравтомат',
 'prefs-edits' => 'Зяроксть витнезь-петнезь:',
 'prefsnologin' => 'Эзить сова',
+'prefsnologintext' => 'Эряви <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} совамс]</span> аравтоматнень ладсемга.',
 'changepassword' => 'Салавань валонь полавтома',
 'prefs-skin' => 'Неемань ладсема',
 'skin-preview' => 'Васнянь неевтезэ',
 'datedefault' => 'Икелькс вешема арась',
 'prefs-beta' => 'Бета ёнкст-мезть',
-'prefs-datetime' => 'Чи ды шка',
+'prefs-datetime' => 'Чить-шкат',
+'prefs-labs' => 'Варчамонь ёнкст-тевть',
 'prefs-user-pages' => 'Теицянть лопанзо',
 'prefs-personal' => 'Теицядо',
-'prefs-rc' => 'Чиень полавтнемат',
+'prefs-rc' => 'Чиень полавтнемат-лиякстомтомат',
 'prefs-watchlist' => 'Ванома лемрисьме',
 'prefs-watchlist-days-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
 'prefs-watchlist-edits-max' => 'Весемеде покш цётось: 1000',
 'prefs-misc' => 'Минеть-сюнот',
-'prefs-resetpass' => 'Салава валонь полавтома',
+'prefs-resetpass' => 'Салавань валонь полавтома',
 'prefs-changeemail' => 'Полавтомс е-сёрмапаргот',
 'prefs-setemail' => 'Путомс е-сёрмапарго',
 'prefs-email' => 'Е-сёрмат-мезть',
@@ -924,13 +922,18 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'restoreprefs' => 'Велявтомс мекев весе ушодкс ладсематнень',
 'prefs-editing' => 'Витнема-петнема',
 'prefs-edit-boxsize' => 'Витнема-петнема вальманть сэрензэ-келензэ.',
-'rows' => 'Вал чилькстнэ (строкатне):',
+'rows' => 'Валчилькстнэ (строкатне):',
 'columns' => 'Палманть:',
-'searchresultshead' => 'Вешнэма',
+'searchresultshead' => 'Вешнема',
 'resultsperpage' => 'Зяроксть вастневи ве лопасо:',
-'recentchangesdays-max' => '(максимумось $1 {{PLURAL:$1|чи|чить}})',
+'recentchangesdays' => 'Зяро чить невтемс чиень полавтнематнесэ-лиякстомтоматнесэ:',
+'recentchangesdays-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
+'recentchangescount' => 'Васень аравтоматнень коряс зяро витнемат-петнемат невтемс:',
+'prefs-help-recentchangescount' => 'Тезэнь совавтозь чиень полавтнемат-лиякстомтомат, лопань лувт-путовкст, журналт.',
 'timezonelegend' => 'Шкань зонась:',
 'localtime' => 'Теицянь шкась:',
+'timezoneuseserverdefault' => 'Нолдамс тевс викинь ($1) аравтнематнень',
+'timezoneoffset' => 'Офсет¹:',
 'servertime' => 'Серверэнь шкась:',
 'guesstimezone' => 'Пештемс интернет икельксстэть',
 'timezoneregion-africa' => 'Африка',
@@ -969,7 +972,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'prefs-dateformat' => 'Ков чинь форматозо',
 'prefs-diffs' => 'Мейсэ явовить верзиятне',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Е-сёрмапаргот маряви маштови',
 
 # User rights
@@ -1402,12 +1405,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'listusers-noresult' => 'Совицязо а муеви',
 'listusers-blocked' => '(саймас саезь)',
 
-# Special:ActiveUsers
-'activeusers' => 'Активной теицятнеде списка',
-'activeusers-hidebots' => 'Кекшемс ботатнень',
-'activeusers-hidesysops' => 'Кекшемс администратортнэнь',
-'activeusers-noresult' => 'Якинзэ-пакинзэ арасть',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Теиця куронть видечинзэ',
 'listgrouprights-group' => 'Куро',
@@ -1416,7 +1413,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'listgrouprights-addgroup-all' => 'Поладомс весе куротнень',
 'listgrouprights-removegroup-all' => 'Весе куротнень нардамс',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Кучомс сёрма парго арась',
 'emailuser' => 'Кучомс е-сёрма те теицянтень',
 'emailpage' => 'Кучт э-сёрма теицянтень',
@@ -1845,10 +1842,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'pageinfo-authors' => 'Весемезэ зяро авторонзо',
 
 # Skin names
-'skinname-standard' => 'Классикань',
-'skinname-nostalgia' => 'ОдПингеньМазы',
-'skinname-myskin' => 'ЭсьМелемКоряс',
-'skinname-simple' => 'Шожда',
 'skinname-modern' => 'НееньШкань',
 
 # Patrolling
@@ -2105,7 +2098,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'monthsall' => 'весе',
 'limitall' => 'весе',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Кемекстамс е-почтань сёрмапаргот',
 'confirmemail_send' => 'Кучомс е-сёрмасо кемекстамонь код',
 'confirmemail_loggedin' => 'Е-сёрма паргот апак кемекста.',
index 1cd2025..958004c 100644 (file)
@@ -628,9 +628,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'powersearch-togglenone' => 'Ahtlein',
 'search-external' => 'Tlatēmotiliztli calāmpa',
 
-# Quickbar
-'qbsettings-none' => 'Ahtlein',
-
 # Preferences page
 'preferences' => 'Tlaēlēhuiliztli',
 'mypreferences' => 'Notlaēlēhuiliz',
@@ -671,9 +668,9 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'default' => 'ic default',
 'prefs-files' => 'Tlahcuilōlli',
 'youremail' => 'Maltzinteyōtl netitlanizyeyāntli:',
-'username' => 'Tlatequitiltilīltōcāitl:',
-'uid' => 'Tlatequitiltilīlli ID:',
-'prefs-memberingroups' => 'Tlācatl {{PLURAL:$1|olōlco|olōlco}}:',
+'username' => '{{GENDER:$1|Tlatequitiltilīltōcāitl}}:',
+'uid' => '{{GENDER:$1|Tlatequitiltilīlli}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Tlacotōncayōtl}} in {{PLURAL:$1|tēolōlolli|tēolōloltin}}',
 'yourrealname' => 'Melāhuac motōcā:',
 'yourlanguage' => 'Tlâtòlli:',
 'yournick' => 'Motōcātlaliz:',
@@ -1030,32 +1027,31 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 
 'enotif_impersonal_salutation' => 'tlatequitiltilīlli īpan {{SITENAME}}',
 'enotif_anon_editor' => 'ahtōcātlatequitiltilīlli $1',
-'enotif_body' => 'Māhuizzoh $WATCHINGUSERNAME,
+'enotif_body' => 'Māhuiztic $WATCHINGUSERNAME,
 
-In {{SITENAME}} āmatl "$PAGETITLE" $CHANGEDORCREATED in tlatequitiltilīlli $PAGEEDITOR īpan $PAGEEDITDATE.
-In āxcān tlachiyaliztli onca īpan $PAGETITLE_URL
+$PAGEINTRO $NEWPAGE
 
-$NEWPAGE
+Tlapatlani ītlahtōlpehuallo:  $PAGESUMMARY $PAGEMINOREDIT
 
-In tlapatlaliztli īxtlamatiliztli cah: $PAGESUMMARY $PAGEMINOREDIT
 Xicnotzāz in tlapatlani:
-Correo electrónico: {{canonicalurl:Special:Emailuser|target=$PAGEEDITOR}}
-Huiqui: {{canonicalurl:User:$PAGEEDITOR}}
+īnetitlanizyeyān:$PAGEEDITOR_EMAIL
+īhuiqui:$PAGEEDITOR_WIKI
+
+Ahmo occēppa mitztlamachiztīz intlā yancuīc tlapatlaliztli, zā mā tiquittaz inīn āmatl. Tihueliti ticcencahulīz in tēmachiztīlizpāmitl in mochintin motlachixāmatl in motlachiyaliz.
+
+In {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.
 
-Ahmo onyez occē tēmachitīliztli ītech occē tlapatlaliztli, zan mā tiquihitta inīn āmoxtli yancuīcān.
-Nō tihuelīti quitlahtlālīz, in tēmachitīliztli in mochi tlachixqui mozāzanilhuīc in motlachiyaliz āmatl.
+Intlā ticnequi ticpatlaz in maltzinteyōtl monetitlanizyeyān, xiquihitta:
+{{canonicalurl:{{#special:Preferences}}}}
 
-       In {{SITENAME}} tēmachitīliztli sistema.
 
---
-Ic ticpatlaz in tlachiyaliztli motlapōhualāma, xiquihitta:
+Intlā ticnequi ticpatlaz in motlachiyaliz tlaēlēhuiliztli, xiquihitta:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Ic ticpolōz in āmatl in tlachiyaliztli motlapōhualāma, xiquihitta:
+Intlā ticnequi ticpolōz in āmatl ītech motlachiyaliz, xiquihitta:
 $UNWATCHURL
 
-Tētlamachītīliztli īhuān oc yeh tēpalehuiliztli:
+Motlahtōlcaquiliztīlōni īhuān ocachi tēpalēhuiliztli, xiquihitta:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'ōmochīuh',
 'changed' => 'ōmotlacuep',
@@ -1089,9 +1085,9 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'protectexpiry' => 'Tlamiliztli:',
 'protect_expiry_invalid' => 'Ahcualli tlamiliztli cāhuitl.',
 'protect-default' => 'Ticmācāhuaz mochintin in tlatequitiltilīltin',
-'protect-fallback' => 'Tiquihuīquilia tlahuelītiliztli "$1"',
-'protect-level-autoconfirmed' => 'Tiquinquīxtīz yancuīc tlatequitiltilīltin īhuan in ahmo ōmocalacqueh',
-'protect-level-sysop' => 'Zan tētlamahmacanih',
+'protect-fallback' => 'Zan momācāhuazqueh tlatequitiltilīltin in tēmācāhualiztica «$1»',
+'protect-level-autoconfirmed' => 'Zan momācāhuaz moneltilīlli tlatequitiltilīltin',
+'protect-level-sysop' => 'Zan momācāhuaz tētlamahmacanimeh',
 'protect-expiring' => 'motlamīz $1 (UTC)',
 'protect-expiry-options' => '1 hora:1 hour,1 tōnalli:1 day,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite',
 'restriction-type' => 'Mācāhualiztli:',
@@ -1121,7 +1117,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'blanknamespace' => '(Tāchcāuh)',
 
 # Contributions
-'contributions' => 'Ītlahcuilōl',
+'contributions' => 'In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl',
 'contributions-title' => 'Tlatequitiltilīlli $1 ītlahcuilōl',
 'mycontris' => 'Notlahcuilōl',
 'contribsub2' => '$1 ($2)',
index 092f063..0d6fb25 100644 (file)
@@ -361,6 +361,7 @@ $messages = array(
 'tog-diffonly' => 'Ikke vis sideinnhold under differ',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
+'tog-useeditwarning' => 'Si ifra dersom jeg forlater en side jeg har gjort redigeringer på men ikke har lagret siden.',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
@@ -1094,6 +1095,8 @@ Slette- og flytteloggen vises nedenfor.',
 'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+'editwarning-warning' => 'Ved å forlate siden vil du miste alle endringer du har utført.
+Denne advarselen kan slås av under {{int:prefs-editing}} i instillingene dine.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1376,15 +1379,6 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'search-external' => 'Eksternt søk',
 'searchdisabled' => 'Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.',
 
-# Quickbar
-'qbsettings' => 'Brukerinnstillinger for hurtigmeny.',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast høyre',
-'qbsettings-floatingleft' => 'Flytende venstre',
-'qbsettings-floatingright' => 'Flytende til høyre',
-'qbsettings-directionality' => '"Låst", f. eks. i posisjon "låst til venstre eller til høyre". For venstre-mot-høyre-språk vil hurtigvelgeren være satt til venstre, for høyre-mot-venstre-språk til høyre.',
-
 # Preferences page
 'preferences' => 'Innstillinger',
 'mypreferences' => 'Innstillinger',
@@ -1937,7 +1931,6 @@ For best mulig sikkerhet er img_auth.php slått av.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrudd på HTTP-forespørsel.',
 'http-curl-error' => 'Feil under henting av adresse: $1',
-'http-host-unreachable' => 'Kunne ikke nå adressen.',
 'http-bad-status' => 'Det var et problem under HTTP-forespørselen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2093,6 +2086,9 @@ En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[
 
 'pageswithprop' => 'Sider med sideverdi',
 'pageswithprop-legend' => 'Sider med en sideverdi',
+'pageswithprop-text' => 'Denne siden lister opp sider som bruker en viss sideverdi.',
+'pageswithprop-prop' => 'Verdinavn:',
+'pageswithprop-submit' => 'Gå',
 
 'doubleredirects' => 'Doble omdirigeringer',
 'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
@@ -2256,15 +2252,6 @@ Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
 'listusers-noresult' => 'Ingen brukere funnet.',
 'listusers-blocked' => '(konto blokkert)',
 
-# Special:ActiveUsers
-'activeusers' => 'Liste over aktive brukere',
-'activeusers-intro' => 'Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}',
-'activeusers-from' => 'Vis brukere fra og med:',
-'activeusers-hidebots' => 'Skjul roboter',
-'activeusers-hidesysops' => 'Skjul administratorer',
-'activeusers-noresult' => 'Ingen brukere funnet.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rettigheter for brukergrupper',
 'listgrouprights-summary' => 'Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.
@@ -2742,6 +2729,7 @@ Skjulingsloggen vises nedenfor.',
 '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',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
 'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
 'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
@@ -3055,24 +3043,14 @@ Du kan se på kildeteksten',
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */',
 'monobook.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Modern */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */',
-'myskin.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta MySkin */',
-'chick.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Chick */',
-'simple.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Simple */',
 'modern.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Modern */',
 
 # Metadata
@@ -3117,6 +3095,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-robot-noindex' => 'Ikke indekserbar',
 'pageinfo-views' => 'Antall visninger',
 'pageinfo-watchers' => 'Antall overvåkere av siden',
+'pageinfo-few-watchers' => 'Færre enn $1 {{PLURAL:$1|overvåker|overvåkere}}',
 'pageinfo-redirects-name' => 'Omdirigeringer til siden',
 'pageinfo-subpages-name' => 'Undersider av siden',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})',
@@ -3146,12 +3125,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-category-files' => 'Antall filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Eget utseende',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -4086,4 +4061,7 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'duration-centuries' => '$1 {{PLURAL:$1|århundre|århundrer}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
 
+# Image rotation
+'rotate-comment' => 'Bildet snudd $1{{PLURAL:°}} med klokka',
+
 );
index d155c76..4beb139 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Geitost
+ * @author Joachim Mos
  * @author Kaganer
  * @author Purodha
  * @author Slomox
@@ -245,8 +246,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wies de Tall vun Brukers, de op disse Siet oppasst',
 'tog-oldsig' => 'Gellen Ünnerschrift',
 'tog-fancysig' => 'Signatur as Wikitext behanneln (ahn automaatsch Lenk)',
-'tog-externaleditor' => 'Extern Editor as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-externaldiff' => 'Extern Warktüüch to’n Wiesen vun Ünnerscheden as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
 'tog-showjumplinks' => '„Wesseln-na“-Lenken tolaten',
 'tog-uselivepreview' => 'Live-Vörschau bruken (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Segg mi bescheid, wenn ik keen Tosamenfaten geven heff, wat ik allens ännert heff',
@@ -710,9 +709,14 @@ Villicht hest du dien Passwoord al ännert oder noch wedder en nee temporär Pas
 # Special:PasswordReset
 'passwordreset' => 'Passwoord torüchsetten',
 'passwordreset-legend' => 'Passwoord torüchsetten',
+'passwordreset-username' => 'Brukernaam:',
+'passwordreset-domain' => 'Domään',
+'passwordreset-email' => 'E-Mail-Adress:',
 
 # Special:ChangeEmail
 'changeemail' => 'E-Mail-Adress ännern',
+'changeemail-newemail' => 'Nee E-Mail-Adress:',
+'changeemail-cancel' => 'Afbreken',
 
 # Edit page toolbar
 'bold_sample' => 'Fetten Text',
@@ -892,6 +896,11 @@ Schient so, as wenn se wegdaan worrn is.',
 'edit-no-change' => 'Dien Ännern is nich afspiekert worrn, denn dor hett sik nix an’n Text ännert.',
 'edit-already-exists' => 'Kunn keen ne’e Sied opstellen, dat gifft ehr al.',
 
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Wohrschau: Disse Sied bruukt to veel opwännige Parserfunkschonen.
 
@@ -1120,14 +1129,6 @@ Du kannst dat Woord ''all:'' vör dien Söökwoord setten, dat all Naamrüüm (o
 'searchdisabled' => '<p>De Vulltextsöök is wegen Överlast en Stoot deaktiveert. In disse Tied kannst du disse Google-Söök verwennen,
 de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 
-# Quickbar
-'qbsettings' => 'Siedenliest',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Links, fast',
-'qbsettings-fixedright' => 'Rechts, fast',
-'qbsettings-floatingleft' => 'Links, sweven',
-'qbsettings-floatingright' => 'Rechts, sweven',
-
 # Preferences page
 'preferences' => 'Instellen',
 'mypreferences' => 'För mi Instellen',
@@ -1270,12 +1271,12 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'group-suppress' => 'Oversights',
 'group-all' => '(all)',
 
-'group-user-member' => 'Bruker',
-'group-autoconfirmed-member' => 'Bestätigt Bruker',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Admin',
-'group-bureaucrat-member' => 'Bürokraat',
-'group-suppress-member' => 'Oversight',
+'group-user-member' => '{{GENDER:$1|Bruker}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Bestätigt Bruker}}',
+'group-bot-member' => '{{GENDER:$1|Bot}}',
+'group-sysop-member' => '{{GENDER:$1|Admin}}',
+'group-bureaucrat-member' => '{{GENDER:$1|Bürokraat}}',
+'group-suppress-member' => '{{GENDER:$1|Översicht}}',
 
 'grouppage-user' => '{{ns:project}}:Brukers',
 'grouppage-autoconfirmed' => '{{ns:project}}:Bestätigte Brukers',
@@ -1414,6 +1415,7 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|Een Bruker|$1 Brukers}}, de oppasst]',
 'rc_categories' => 'Blot Sieden ut de Kategorien (trennt mit „|“):',
 'rc_categories_any' => 'All',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} achter Ännern',
 'newsectionsummary' => '/* $1 */ nee Afsnitt',
 'rc-enhanced-expand' => 'Details wiesen (bruukt JavaScript)',
 'rc-enhanced-hide' => 'Details versteken',
@@ -1502,6 +1504,7 @@ Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en anne
 'sourceurl' => 'Born-URL:',
 'destfilename' => 'Dateinaam, so as dat hier spiekert warrn schall:',
 'upload-maxfilesize' => 'Maximale Dateigrött: $1',
+'upload-description' => 'Dateibeschrieven',
 'watchthisupload' => 'Op disse Datei oppassen',
 'filewasdeleted' => 'En Datei mit dissen Naam hett dat al mal geven un is denn wegsmeten worrn. Kiek doch toeerst in dat $1 na, ehrdat du de Datei afspiekerst.',
 'filename-bad-prefix' => "De Naam vun de Datei fangt mit '''„$1“''' an. Dat is normalerwies en Naam, den de Datei automaatsch vun de Digitalkamera kriggt. De Naam beschrievt de Datei nich un seggt dor ok nix över ut. Söök di doch en Naam för de Datei ut, de ok wat över den Inholt seggt.",
@@ -1637,6 +1640,7 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
 'statistics-header-edits' => 'Änner-Statistik',
 'statistics-header-views' => 'Siedenweddergaav-Statistik',
 'statistics-header-users' => 'Brukerstatistik',
+'statistics-header-hooks' => 'Annere Statistiken',
 'statistics-articles' => 'Inholtssieden',
 'statistics-pages' => 'Sieden',
 'statistics-pages-desc' => 'All Sieden in dit Wiki, tohoop mit all Diskuschoonssieden, Redirects usw.',
@@ -1654,6 +1658,8 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
 'disambiguationspage' => 'Template:Mehrdüdig_Begreep',
 'disambiguations-text' => 'Disse Sieden wist na Sieden för mehrdüdige Begrepen. Se schöölt lever op de Sieden wiesen, de egentlich meent sünd.<br />Ene Siet warrt as Siet för en mehrdüdigen Begreep ansehn, wenn [[MediaWiki:Disambiguationspage]] na ehr wiest.<br />Lenken ut annere Naamrüüm sünd nich mit in de List.',
 
+'pageswithprop-submit' => 'Los',
+
 'doubleredirects' => 'Dubbelte Wiederleiden',
 'doubleredirectstext' => '<b>Wohrscho:</b> Disse List kann „falsche Positive“ bargen.
 Dat passeert denn, wenn en Wiederleiden blangen de Wiederleiden-Verwies noch mehr Text mit annere Verwiesen hett.
@@ -1799,15 +1805,6 @@ Kiek ok bi de [[Special:WantedCategories|wünschten Kategorien]].',
 'listusers-noresult' => 'Keen Bruker funnen.',
 'listusers-blocked' => '(sperrt)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktive Brukers',
-'activeusers-intro' => 'Dit is en List von Brukers, de {{PLURAL:$1|den verleden Dag|de verleden $1 Daag}} aktiv wesen sünd.',
-'activeusers-count' => '$1 {{PLURAL:$1|Ännern|Ännern}} {{PLURAL:$3|den verleden Dag|in de verleden $3 Daag}}',
-'activeusers-from' => 'Brukers wiesen vanaf:',
-'activeusers-hidebots' => 'Bots nich wiesen',
-'activeusers-hidesysops' => 'Administraters nich wiesen',
-'activeusers-noresult' => 'Keen Brukers funnen.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Brukergruppen-Rechten',
 'listgrouprights-summary' => 'Dit is en List vun de Brukergruppen, de in dit Wiki defineert sünd, un de Rechten, de dor mit verbunnen sünd.
@@ -1831,6 +1828,8 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'mailnologin' => 'Du büst nich anmellt.',
 'mailnologintext' => 'Du musst [[Special:UserLogin|anmellt wesen]] un in diene [[Special:Preferences|Instellungen]] en güllige E-Mail-Adress hebben, dat du annere Brukers E-Mails tostüren kannst.',
 'emailuser' => 'E-Mail an dissen Bruker',
+'emailuser-title-target' => 'Email düss {{GENDER:$1|user}}',
+'emailuser-title-notarget' => 'E-Mail an Bruker',
 'emailpage' => 'E-Mail an Bruker',
 'emailpagetext' => 'Du kannst dissen Bruker mit dit Formular en E-Mail tostüren. As Afsenner warrt de E-Mail-Adress ut dien [[Special:Preferences|Instellen]] indragen, dat de Bruker di antern kann.',
 'usermailererror' => 'Dat Mail-Objekt hett en Fehler trüchgeven:',
@@ -1841,6 +1840,8 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'noemailtext' => 'Disse Bruker hett kene güllige E-Mail-Adress angeven.',
 'nowikiemailtitle' => 'E-Mails sünd nich verlöövt',
 'nowikiemailtext' => 'Disse Bruker will vun annere Brukers keen E-Mails tostüürt kriegen.',
+'emailusername' => 'Brukernaam:',
+'emailusernamesubmit' => 'Wedder',
 'email-legend' => 'en annern Bruker op {{SITENAME}} en E-Mail tostüren',
 'emailfrom' => 'Vun:',
 'emailto' => 'An:',
@@ -2126,6 +2127,9 @@ De jüngste Indrag in dat Sperr-Logbook wart ünnen wiest:',
 'whatlinkshere-filters' => 'Filters',
 
 # Block/unblock
+'autoblockid' => 'Autoblock #$1',
+'block' => 'Bruker blocken',
+'unblock' => 'Bruker freegeven',
 'blockip' => 'IP-Adress blocken',
 'blockip-title' => 'Bruker sperren',
 'blockip-legend' => 'Bruker blocken',
@@ -2167,6 +2171,7 @@ Op de [[Special:BlockList|IP-Blocklist]] is en List vun alle Blocks to finnen.',
 'ipusubmit' => 'Disse Sperr opheven',
 'unblocked' => '[[User:$1|$1]] freegeven',
 'unblocked-id' => 'Sperr $1 freegeven',
+'blocklist' => 'Sparrte Brukers',
 'ipblocklist' => 'Sparrte Brukers',
 'ipblocklist-legend' => 'Blockten Bruker finnen',
 'ipblocklist-submit' => 'Söken',
@@ -2337,6 +2342,8 @@ Wenn du blot de aktuelle hebben wist, kannst du ok en Lenk bruken, to’n Bispee
 'allmessagescurrent' => 'Text nu',
 'allmessagestext' => 'Dit is de List vun de Systemnarichten, de dat in den MediaWiki-Naamruum gifft.',
 'allmessagesnotsupportedDB' => '{{ns:special}}:Allmessages is nich ünnerstütt, vun wegen dat wgUseDatabaseMessages utstellt is.',
+'allmessages-filter-all' => 'All',
+'allmessages-language' => 'Spraak:',
 'allmessages-filter-submit' => 'Los',
 
 # Thumbnails
@@ -2474,10 +2481,12 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 # Attribution
 'anonymous' => '{{PLURAL:$1|Anonym Bruker|Anonyme Brukers}} vun {{SITENAME}}',
 'siteuser' => '{{SITENAME}}-Bruker $1',
+'anonuser' => '{{SITENAME}} anonym  Bruker user $1',
 'lastmodifiedatby' => 'Disse Siet weer dat letzte Maal $2, $1 vun $3 ännert.',
 'othercontribs' => 'Grünnt op Arbeid vun $1.',
 'others' => 'annere',
 'siteusers' => '{{SITENAME}}-{{PLURAL:$2|Bruker|Brukers}} $1',
+'anonusers' => '{{SITENAME}} anonym {{PLURAL:$2|user|users}} $1',
 'creditspage' => 'Sieten-Autoren',
 'nocredits' => 'Dor is keen Autorenlist för disse Siet verfögbor.',
 
@@ -2489,11 +2498,18 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 'spam_reverting' => 'Trüchdreiht na de letzte Version ahn Lenken na $1.',
 'spam_blanking' => 'All Versionen harrn Lenken na $1, rein maakt.',
 
+# Info page
+'pageinfo-title' => 'Informatschoon för "$1"',
+'pageinfo-article-id' => 'Sied-ID',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-category-info' => 'Kategorieinformatschoon',
+'pageinfo-category-pages' => 'Tall vun Sied',
+'pageinfo-category-subcats' => 'TAll vun Ünnerkategorien',
+
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölsch Blau',
-'skinname-chick' => 'Küken',
 
 # Patrolling
 'markaspatrolleddiff' => 'As nakeken marken',
@@ -2536,6 +2552,7 @@ $1',
 'file-nohires' => 'Gifft dat Bild nich grötter.',
 'svg-long-desc' => 'SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3',
 'show-big-image' => 'Dat Bild wat grötter',
+'show-big-image-size' => '$1 × $2 Pixels',
 'file-info-gif-looped' => 'löppt as Slööp',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
 'file-info-png-looped' => 'löppt as Slööp',
@@ -2694,6 +2711,10 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-gpsareainformation' => 'Naam vun dat GPS-Rebeet',
 'exif-gpsdatestamp' => 'GPS-Datum',
 'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
+'exif-source' => 'Born',
+'exif-writer' => 'Schriever',
+'exif-languagecode' => 'Spraak',
+'exif-iimcategory' => 'Kategorie',
 
 # EXIF attributes
 'exif-compression-1' => 'Unkomprimeert',
@@ -2843,6 +2864,18 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-gpsdirection-t' => 'Wohre Richtung',
 'exif-gpsdirection-m' => 'Magneetsch Richtung',
 
+'exif-dc-publisher' => 'Verleger',
+
+'exif-iimcategory-clj' => 'Kriminalität un Recht',
+'exif-iimcategory-edu' => 'Uptucht',
+'exif-iimcategory-hth' => 'Gesundheit',
+'exif-iimcategory-lab' => 'Arbeit',
+'exif-iimcategory-pol' => 'Politik',
+'exif-iimcategory-rel' => 'Religion un Gloov',
+'exif-iimcategory-sci' => 'Wetenschap un Technologie',
+'exif-iimcategory-spo' => 'Sport',
+'exif-iimcategory-wea' => 'Wedder',
+
 # External editor support
 'edit-externally' => 'Änner disse Datei mit en extern Programm',
 'edit-externally-help' => '(Lees de [//www.mediawiki.org/wiki/Manual:External_editors Installatschoonshelp] wenn du dor mehr to weten wullt)',
@@ -2901,6 +2934,12 @@ Wist du de Siet würklich nee anleggen?",
 'confirm-purge-top' => 'Den Cache vun disse Siet leddig maken?',
 'confirm-purge-bottom' => 'Maakt den Cache vun en Sied leddig un sorgt dor för dat de aktuelle Version wiest warrt.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Jo',
+'confirm-watch-top' => 'Disse Siet to de Oppasslist hentofögen',
+'confirm-unwatch-button' => 'Jo',
+'confirm-unwatch-top' => 'Disse Siet vun de Oppasslist löschen',
+
 # Multipage image navigation
 'imgmultipageprev' => '← vörige Siet',
 'imgmultipagenext' => 'nächste Siet →',
@@ -2961,6 +3000,9 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'watchlisttools-edit' => 'Oppasslist ankieken un ännern',
 'watchlisttools-raw' => 'Oppasslist as Textlist ännern',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskusschoon]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Unbekannt Extension-Tag „$1“',
 'duplicate-defaultsort' => 'Wohrschau: De DEFAULTSORTKEY „$2“ överschrifft den vörher bruukten Slötel „$1“.',
@@ -2986,6 +3028,7 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'version-software' => 'Installeerte Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dateipadd',
index e9f518f..cac0764 100644 (file)
@@ -43,6 +43,7 @@
  * @author Trijnstel
  * @author Troefkaart
  * @author Tvdm
+ * @author User555
  * @author Wiki13
  * @author לערי ריינהארט
  */
@@ -383,8 +384,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
 'tog-oldsig' => 'Bestaande ondertekening:',
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-showjumplinks' => '"ga naar"-toegankelijkheidskoppelingen inschakelen',
 'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
@@ -399,6 +398,7 @@ $messages = array(
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
 'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
 'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
+'tog-useeditwarning' => 'Waarschuw mij als ik een bewerkte pagina die nog niet is opgeslagen wil verlaten',
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
@@ -579,7 +579,7 @@ $messages = array(
 'jumptosearch' => 'zoeken',
 'view-pool-error' => 'De servers zijn op het moment helaas overbelast.
 Te veel gebruikers proberen deze pagina te bekijken.
-Wacht alstublieft even voordat u opnieuw toegang probeert te krijgen tot deze pagina.
+Wacht even voordat u opnieuw toegang probeert te krijgen tot deze pagina.
 
 $1',
 'pool-timeout' => 'De maximaal te wachten tijd voor het wachten op een lock is verstreken',
@@ -719,7 +719,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
 'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
 Er is geen toelichting beschikbaar.',
 'badtitle' => 'Ongeldige paginanaam',
-'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
+'badtitletext' => 'De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
 Wellicht bevat de paginanaam niet toegestane tekens.',
 'perfcached' => 'Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.',
 'perfcachedts' => 'Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.',
@@ -820,7 +820,7 @@ Controleer de schrijfwijze.',
 'nouserspecified' => 'Geef een gebruikersnaam op.',
 'login-userblocked' => 'Deze gebruiker is geblokkeerd.
 Aanmelden is niet mogelijk.',
-'wrongpassword' => 'Het ingegeven wachtwoord is onjuist.
+'wrongpassword' => 'Het opgegeven wachtwoord is onjuist.
 Probeer het opnieuw.',
 'wrongpasswordempty' => 'Het opgegeven wachtwoord was leeg.
 Probeer het opnieuw.',
@@ -1158,6 +1158,8 @@ Deze bestaat al.',
 'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
 'invalid-content-data' => 'Ongeldige inhoudsgegevens',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
+Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1267,12 +1269,12 @@ U kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{ful
 'rev-showdeleted' => 'weergeven',
 'revisiondelete' => 'Versies verwijderen of terugplaatsen',
 'revdelete-nooldid-title' => 'Ongeldige doelversie',
-'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
+'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De opgegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
 'revdelete-nologtype-title' => 'Er is geen logboektype opgegeven',
 'revdelete-nologtype-text' => 'U hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
 'revdelete-nologid-title' => 'Ongeldige logboekregel',
-'revdelete-nologid-text' => 'U hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
-'revdelete-no-file' => 'Het aangegeven bestand bestaat niet.',
+'revdelete-nologid-text' => 'U hebt ofwel geen doellogboekregel opgegeven of de opgegeven logboekregel bestaat niet.',
+'revdelete-no-file' => 'Het opgegeven bestand bestaat niet.',
 'revdelete-show-file-confirm' => 'Weet u zeker dat u de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
 'revdelete-show-file-submit' => 'Ja',
 'revdelete-selected' => "'''Geselecteerde {{PLURAL:$2|bewerking|bewerkingen}} van [[:$1]]:'''",
@@ -1315,7 +1317,7 @@ U hebt geen toegang tot dit object.',
 'revdelete-modify-no-access' => 'Er is een fout opgetreden tijdens het wijzigen van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
 U hebt geen toegang tot dit object.',
 'revdelete-modify-missing' => 'Er is een fout opgetreden bij het wijzigen van versienummer $1: het komt niet voor in de database!',
-'revdelete-no-change' => "'''Waarschuwing:''' het object van $1 om $2 uur had al de aangegeven zichtbaarheidsinstellingen.",
+'revdelete-no-change' => "'''Waarschuwing:''' het object van $1 om $2 uur had al de opgegeven zichtbaarheidsinstellingen.",
 'revdelete-concurrent-change' => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2: de status is inmiddels gewijzigd door iemand anders.
 Controleer de logboeken.',
 'revdelete-only-restricted' => 'Er is een fout opgetreden tijdens het verbergen van het item van $1, $2: u kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
@@ -1342,8 +1344,8 @@ Zorg dat deze wijziging de geschiedenisdoorlopendheid van de pagina behoudt.',
 'mergehistory-from' => 'Bronpagina:',
 'mergehistory-into' => 'Bestemmingspagina:',
 'mergehistory-list' => 'Samenvoegbare bewerkingsgeschiedenis',
-'mergehistory-merge' => 'De volgende versies van [[:$1]] kunnen samengevoegd worden naar [[:$2]].
-Gebruik de kolom met keuzerondjes om alleen de versies gemaakt op en voor de aangegeven tijd samen te voegen.
+'mergehistory-merge' => 'De volgende versies van [[:$1]] kunnen worden samengevoegd naar [[:$2]].
+Gebruik de kolom met keuzerondjes om alleen de versies gemaakt op en voor de opgegeven tijd samen te voegen.
 Let op dat het gebruiken van de navigatiekoppelingen deze kolom opnieuw instelt.',
 'mergehistory-go' => 'Samenvoegbare bewerkingen bekijken',
 'mergehistory-submit' => 'Versies samenvoegen',
@@ -1413,7 +1415,7 @@ Probeer een andere zoekopdracht.',
 'searchprofile-project-tooltip' => 'Zoeken in $1',
 'searchprofile-images-tooltip' => 'Zoeken naar bestanden',
 'searchprofile-everything-tooltip' => "Alle inhoud doorzoeken (inclusief overlegpagina's)",
-'searchprofile-advanced-tooltip' => 'Zoeken in aangegeven naamruimten',
+'searchprofile-advanced-tooltip' => 'Zoeken in opgegeven naamruimten',
 'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorden}})',
 'search-result-category-size' => '{{PLURAL:$1|1 categorielid|$1 categorieleden}} ({{PLURAL:$2|1 ondercategorie|$2 ondercategorieën}}, {{PLURAL:$3|1 bestand|$3 bestanden}})',
 'search-result-score' => 'Relevantie: $1%',
@@ -1447,15 +1449,7 @@ U kunt ook een naamruimte als voorvoegsel gebruiken.",
 'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
 U kunt gebruik maken van Google.
 De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
-
-# Quickbar
-'qbsettings' => 'Menubalk',
-'qbsettings-none' => 'Uitgeschakeld',
-'qbsettings-fixedleft' => 'Links vast',
-'qbsettings-fixedright' => 'Rechts vast',
-'qbsettings-floatingleft' => 'Links zwevend',
-'qbsettings-floatingright' => 'Rechts zwevend',
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van uw taal',
+'search-error' => 'Er is een fout opgetreden tijdens het zoeken: $1',
 
 # Preferences page
 'preferences' => 'Voorkeuren',
@@ -1507,7 +1501,7 @@ Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
 'timezonelegend' => 'Tijdzone:',
 'localtime' => 'Plaatselijke tijd:',
 'timezoneuseserverdefault' => 'Wikistandaard gebruiken ($1)',
-'timezoneuseoffset' => 'Anders (tijdverschil aangeven)',
+'timezoneuseoffset' => 'Anders (tijdverschil opgeven)',
 'timezoneoffset' => 'Tijdsverschil¹:',
 'servertime' => 'Servertijd:',
 'guesstimezone' => 'Vanuit de browser toevoegen',
@@ -1550,7 +1544,7 @@ De tildes worden omgezet in uw ondertekening en een datum en tijd van de bewerki
 'badsiglength' => 'Uw ondertekening is te lang.
 Deze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.',
 'yourgender' => 'Geslacht:',
-'gender-unknown' => 'Niet aangegeven',
+'gender-unknown' => 'Niet opgegeven',
 'gender-male' => 'Man',
 'gender-female' => 'Vrouw',
 'prefs-help-gender' => 'Optioneel: dit wordt gebruikt om gebruikers correct aan te spreken in de software.
@@ -1775,7 +1769,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
 'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
 'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
-'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of op pagina's in een aangegeven categorie.
+'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.
 Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
 'recentchangeslinked-page' => 'Paginanaam:',
 'recentchangeslinked-to' => "Wijzigingen aan pagina's met koppelingen naar deze pagina bekijken",
@@ -2007,7 +2001,7 @@ De veiligheid kan niet worden gecontroleerd.',
 Uw server is niet ingesteld om deze gegevens door te geven.
 Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
 Zie https://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.',
-'img-auth-notindir' => 'Het opgevraagde pad is niet de ingestelde uploadmap.',
+'img-auth-notindir' => 'Het opgegeven pad is niet de ingestelde uploadmap.',
 'img-auth-badtitle' => 'Het was niet mogelijk een geldige paginanaam te maken van "$1".',
 'img-auth-nologinnWL' => 'U bent niet aangemeld en "$1" staat niet op de witte lijst.',
 'img-auth-nofile' => 'Bestand "$1" bestaat niet.',
@@ -2027,7 +2021,6 @@ Om beveiligingsreden is img_auth.php uitgeschakeld.',
 'http-read-error' => 'Fout bij het lezen van HTTP.',
 'http-timed-out' => 'Timeout bij het HTTP-verzoek.',
 'http-curl-error' => 'Fout bij het ophalen van URL: $1',
-'http-host-unreachable' => 'De URL is niet bereikbaar.',
 'http-bad-status' => 'Er is een probleem opgetreden bij het HTTP-verzoek: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2124,7 +2117,7 @@ U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'filedelete-success' => "'''$1''' is verwijderd.",
 'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is verwijderd.",
 'filedelete-nofile' => "'''$1''' bestaat niet.",
-'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de aangegeven eigenschappen.",
+'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de opgegeven eigenschappen.",
 'filedelete-otherreason' => 'Andere reden:',
 'filedelete-reason-otherlist' => 'Andere reden',
 'filedelete-reason-dropdown' => '*Veel voorkomende redenen voor verwijderen
@@ -2292,7 +2285,7 @@ Een bestand kan hier dus ten onrechte opgenomen zijn.',
 'booksources-search-legend' => 'Bronnen en gegevens over een boek zoeken',
 'booksources-go' => 'OK',
 'booksources-text' => 'Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat u zoekt hebben:',
-'booksources-invalid-isbn' => 'Het ingegeven ISBN lijkt niet geldig te zijn.
+'booksources-invalid-isbn' => 'Het opgegeven ISBN lijkt niet geldig te zijn.
 Controleer of u wellicht een fout hebt gemaakt bij de invoer.',
 
 # Special:Log
@@ -2361,15 +2354,6 @@ Heeft tenminste een topleveldomein nodig, zoals bijvoorbeeld "*.org".<br />
 'listusers-noresult' => 'Geen gebruiker gevonden.',
 'listusers-blocked' => '(geblokkeerd)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aanwezige gebruikers',
-'activeusers-intro' => 'Dit is een lijst met gebruikers die enige activiteit hebben laten zien in de afgelopen {{PLURAL:$1|dag|$1 dagen}}.',
-'activeusers-count' => '$1 recente {{PLURAL:$1|handeling|handelingen}} in de {{PLURAL:$3|afgelopen dag|laatste $3 dagen}}',
-'activeusers-from' => 'Gebruikers worden weergegeven vanaf:',
-'activeusers-hidebots' => 'Bots verbergen',
-'activeusers-hidesysops' => 'Beheerders verbergen',
-'activeusers-noresult' => 'Geen actieve gebruikers gevonden.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rechten van gebruikersgroepen',
 'listgrouprights-summary' => 'Op deze pagina staan de gebruikersgroepen in deze wiki beschreven, met hun bijbehorende rechten.
@@ -2584,7 +2568,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'protect-legend' => 'Beveiliging bevestigen',
 'protectcomment' => 'Reden:',
 'protectexpiry' => 'Duur:',
-'protect_expiry_invalid' => 'De aangegeven duur is ongeldig.',
+'protect_expiry_invalid' => 'De opgegeven duur is ongeldig.',
 'protect_expiry_old' => 'Vervaldatum is in het verleden.',
 'protect-unchain-permissions' => 'Overige beveiligingsinstellingen beschikbaar maken',
 'protect-text' => "Hier kunt u het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
@@ -2870,6 +2854,7 @@ Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte
 '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.',
+'xffblockreason' => 'Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1',
 'cant-block-while-blocked' => 'U kunt andere gebruikers niet blokkeren terwijl u zelf geblokkeerd bent.',
 'cant-see-hidden-user' => 'De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.
 Omdat u het recht "hideuser" niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.',
@@ -3087,7 +3072,7 @@ Een tijdelijke map is niet aanwezig.',
 'xml-error-string' => '$1 op regel $2, kolom $3 (byte $4): $5',
 'import-upload' => 'XML-gegevens uploaden',
 'import-token-mismatch' => 'De sessiegegevens zijn verloren gegaan. Probeer het opnieuw.',
-'import-invalid-interwiki' => 'Het is niet mogelijk van de aangegeven wiki te importeren.',
+'import-invalid-interwiki' => 'Het is niet mogelijk van de opgegeven wiki te importeren.',
 'import-error-edit' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die te bewerken.',
 'import-error-create' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die aan te maken.',
 'import-error-interwiki' => 'De pagina "$1" is niet geïmporteerd omdat deze naam is gereserveerd voor externe koppelingen (interwiki).',
@@ -3188,13 +3173,8 @@ U kunt wel de broncode bekijken.',
 
 # Stylesheets
 'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
-'standard.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Standard */',
-'nostalgia.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Nostalgie */',
 'cologneblue.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Keuls blauw */',
 'monobook.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */',
-'myskin.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin MijnSkin */',
-'chick.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Chick */',
-'simple.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Eenvoudig */',
 'modern.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Modern */',
 'vector.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */',
 'print.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */',
@@ -3207,13 +3187,8 @@ U kunt wel de broncode bekijken.',
 
 # Scripts
 'common.js' => "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-'standard.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Standaard gebruiken */',
-'nostalgia.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Nostalgie gebruiken */',
 'cologneblue.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Keuls blauw gebruiken */',
 'monobook.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */',
-'myskin.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin MijnSkin gebruiken */',
-'chick.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Chick gebruiken */',
-'simple.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Eenvoudig gebruiken */',
 'modern.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Modern gebruiken */',
 'vector.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */',
 'group-autoconfirmed.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
@@ -3293,13 +3268,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 'pageinfo-category-files' => 'Aantal bestanden',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MijnSkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3328,8 +3298,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 
 $1',
 'filedelete-missing' => 'Het bestand "$1" kan niet verwijderd worden, omdat het niet bestaat.',
-'filedelete-old-unregistered' => 'De aangegeven bestandsversie "$1" staat niet in de database`.',
-'filedelete-current-unregistered' => 'Het aangegeven bestand "$1" staat niet in de database.',
+'filedelete-old-unregistered' => 'De opgegeven bestandsversie "$1" staat niet in de database`.',
+'filedelete-current-unregistered' => 'Het opgegeven bestand "$1" staat niet in de database.',
 'filedelete-archive-read-only' => 'De webserver kan niet in de archiefmap "$1" schrijven.',
 
 # Browsing diffs
@@ -3814,7 +3784,7 @@ Andere velden worden verborgen.
 
 # Email address confirmation
 'confirmemail' => 'E-mailadres bevestigen',
-'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
+'confirmemail_noemail' => 'U hebt geen geldig e-mailadres opgegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
 'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
 Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
 Dit bericht bevat een koppeling met een code.
@@ -4112,16 +4082,18 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'dberr-cachederror' => 'Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.',
 
 # HTML forms
-'htmlform-invalid-input' => 'Er zijn problemen met enkele ingegeven waarden',
-'htmlform-select-badoption' => 'De ingegeven waarde is ongeldig.',
-'htmlform-int-invalid' => 'De ingegeven waarde is geen geheel getal.',
+'htmlform-invalid-input' => 'Er zijn problemen met enkele opgegeven waarden',
+'htmlform-select-badoption' => 'De opgegeven waarde is ongeldig.',
+'htmlform-int-invalid' => 'De opgegeven waarde is geen geheel getal.',
 'htmlform-float-invalid' => 'De waarde die u hebt opgegeven is geen getal.',
-'htmlform-int-toolow' => 'De ingegeven waarde ligt onder de minimumwaarde van $1',
-'htmlform-int-toohigh' => 'De ingegeven waarde ligt boven de maximumwaarde van $1',
+'htmlform-int-toolow' => 'De opgegeven waarde ligt onder de minimumwaarde van $1',
+'htmlform-int-toohigh' => 'De opgegeven waarde ligt boven de maximumwaarde van $1',
 'htmlform-required' => 'Deze waarde is verplicht',
 'htmlform-submit' => 'Opslaan',
 'htmlform-reset' => 'Wijzigingen ongedaan maken',
 'htmlform-selectorother-other' => 'Anders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
index 62483f9..ef507f0 100644 (file)
@@ -557,7 +557,7 @@ $1',
 'currentevents-url' => 'Project:Aktuelt',
 'disclaimers' => 'Atterhald',
 'disclaimerpage' => 'Project:Atterhald',
-'edithelp' => 'Hjelp til endring',
+'edithelp' => 'Endringshjelp',
 'edithelppage' => 'Help:Endring',
 'helppage' => 'Help:Innhald',
 'mainpage' => 'Hovudside',
@@ -1337,15 +1337,6 @@ For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, m
 I mellomtida kan du søkje gjennom Google.
 Ver merksam på at registra deira kan vera utdaterte.',
 
-# Quickbar
-'qbsettings' => 'Snøggmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Venstre',
-'qbsettings-fixedright' => 'Høgre',
-'qbsettings-floatingleft' => 'Flytande venstre',
-'qbsettings-floatingright' => 'Flytande høgre',
-'qbsettings-directionality' => 'Fast, avhengig av kva retning språket ditt vert lese',
-
 # Preferences page
 'preferences' => 'Innstillingar',
 'mypreferences' => 'Innstillingar',
@@ -1891,7 +1882,6 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrot på HTTP-førespurnad.',
 'http-curl-error' => 'Feil under henting av nettadressa: $1',
-'http-host-unreachable' => 'Kunne ikkje nå nettadressa',
 'http-bad-status' => 'Det var eit problem under HTTP-førespurnaden: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2210,15 +2200,6 @@ Det er påkravt med eit toppnivådomene, til dømes «*.org».<br />
 'listusers-noresult' => 'Ingen brukarnamn vart funne.',
 'listusers-blocked' => '(konto blokkert)',
 
-# Special:ActiveUsers
-'activeusers' => 'Liste over aktive brukarar',
-'activeusers-intro' => 'Dette er ei liste over brukarar som har hatt ei eller anna form for aktivitet innanfor {{PLURAL:$1|den siste dagen|dei siste dagane}}.',
-'activeusers-count' => '{{PLURAL:$1|Éi handling|$1 handlingar}} {{PLURAL:$3|det siste døgeret|dei siste $3 døgra}}',
-'activeusers-from' => 'Vis brukarar frå og med:',
-'activeusers-hidebots' => 'Skjul botar',
-'activeusers-hidesysops' => 'Skjul administratorar',
-'activeusers-noresult' => 'Ingen brukarar funne.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rettar for brukargrupper',
 'listgrouprights-summary' => 'Detter ei liste som viser brukargruppene som er definerte på wikien, og kva rettar dei har. Det kan finnast [[{{MediaWiki:Listgrouprights-helppage}}|meir informasjon]]  om dei ulike rettane.',
@@ -2525,7 +2506,7 @@ $1',
 'tooltip-invert' => 'Hak av boksen for å gøyma endringar på sider i det valde namnerommet (og det tilknytte namnerommet om det er haka av)',
 'namespace_association' => 'Tilknytt namnerom',
 'tooltip-namespace_association' => 'Hak av boksen for at diskusjonssida eller emnenamnerommet knytt til det valde namnerommet skal vera med òg',
-'blanknamespace' => '(Hovud)',
+'blanknamespace' => '(hovud)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|Brukarbidrag}}',
@@ -2989,26 +2970,16 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utsjånader. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Kølnerblå */',
 'monobook.css' => '/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Modern */',
 'print.css' => '/* CSS i denne fila vil påverke utskriftsversjonen */',
 'handheld.css' => '/* CSS i denne fila vil gjelde alle handheldte innretnigar konfigurert i $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */',
-'myskin.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta MySkin */',
-'chick.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Chick */',
-'simple.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Simple */',
 'modern.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Modern */',
 
 # Metadata
@@ -3082,13 +3053,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-category-files' => 'Tal filer',
 
 # Skin names
-'skinname-standard' => 'Klassisk',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kölnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MiDrakt',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3751,7 +3717,7 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Ukjend tilleggsmerking «$1»',
-'duplicate-defaultsort' => 'Åtvaring: Standarsorteringa «$2» tar over for den tidlegare sorteringa «$1».',
+'duplicate-defaultsort' => 'Åtvaring: Standardsorteringa «$2» tar over for den tidlegare sorteringa «$1».',
 
 # Special:Version
 'version' => 'Versjon',
@@ -3916,7 +3882,7 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 'logentry-newusers-create' => 'Brukarkontoen $1 vart oppretta',
 'logentry-newusers-create2' => 'Brukarkontoen $3 vart oppretta av $1',
 'logentry-newusers-byemail' => 'Brukarkontoen $3 vart oppretta av $1 og passord vart sendt med e-post',
-'logentry-newusers-autocreate' => 'Kontoen $1 vart oppretta av seg sjølv',
+'logentry-newusers-autocreate' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}} av seg sjølv',
 'logentry-rights-rights' => '$1 endra gruppemedlemskap for $3 frå $4 til $5',
 'logentry-rights-rights-legacy' => '$1 endra gruppemedlemskap for $3',
 'logentry-rights-autopromote' => '$1 vart automatisk forfremja frå $4 til $5',
index 9c35059..ff44208 100644 (file)
@@ -2226,15 +2226,6 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'listusers-noresult' => 'ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।',
 'listusers-blocked' => '(ଅଟକାଯାଇଥିବା)',
 
-# Special:ActiveUsers
-'activeusers' => 'ସଚଳ ସଭ୍ୟଙ୍କ ତାଲିକା',
-'activeusers-intro' => 'ବିଗତ $1 {{PLURAL:$1|ଦିନ|ଦିନ}} ଭିତରେ କିଛି ପ୍ରକାରର କାମ କରିଥିବା ସଭ୍ୟମାନଙ୍କର ତାଲିକା ।',
-'activeusers-count' => 'ବିଗତ {{PLURAL:$3|ଦିନ|$3 ଦିନରେ}}ରେ $1ଟି {{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାଗୁଡିକ}}',
-'activeusers-from' => 'ଏହି ନାମରେ ଆରମ୍ଭ ହେଉଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ:',
-'activeusers-hidebots' => 'ଆପେଆପେ ଚାଳିତ ସଭ୍ୟମାନଙ୍କୁ ଲୁଚାନ୍ତୁ',
-'activeusers-hidesysops' => 'ପରିଚାଳକମାନଙ୍କୁ ଲୁଚାଇବେ',
-'activeusers-noresult' => 'ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।',
-
 # Special:ListGroupRights
 'listgrouprights' => 'ସଭ୍ୟ ଗୋଠ ଅଧିକାରସମୂହ',
 'listgrouprights-summary' => 'ତଳେ ଉଇକି ସ୍ଥିର କରାଯାଇଥିବା ଏକ ଏକ ବ୍ୟବହାରକାରୀ ଗୋଠର ତାଲିକା ଦିଆଯାଇଛି, ସେଥିରେ ସେମାନଙ୍କ ବ୍ୟବହାର ଅଧିକାର ବାବଦରେ ମଧ୍ୟ ଦିଆଯାଇଛି ।
index 932c13a..94ff21a 100644 (file)
@@ -710,7 +710,7 @@ $2
 ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।',
 'passwordreset-emailelement' => 'ਮੈਂਬਰ-ਨਾਂ: $1
 ਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2',
-'passwordreset-emailsent' => 'à¨\87ੱà¨\95 à¨¯à¨¾à¨¦-ਦਹਾਨà©\80 ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
+'passwordreset-emailsent' => 'à¨\87ੱà¨\95 à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨®à©\81à©\9c-ਸà©\88ੱà¨\9f ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
 'passwordreset-emailsent-capture' => 'ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
 
 # Special:ChangeEmail
@@ -721,6 +721,7 @@ $2
 'changeemail-oldemail' => 'ਚਾਲੂ ਈ-ਮੇਲ ਪਤਾ:',
 'changeemail-newemail' => 'ਨਵਾਂ ਈ-ਮੇਲ ਪਤਾ:',
 'changeemail-none' => '(ਕੋਈ ਨਹੀਂ)',
+'changeemail-password' => 'ਤੁਹਾਡਾ {{SITENAME}} ਪਾਸਵਰਡ:',
 'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
 'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
 
@@ -1071,14 +1072,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'powersearch-togglenone' => 'ਕੋਈ ਨਹੀਂ',
 'search-external' => 'ਬਾਹਰੀ ਖੋਜ',
 
-# Quickbar
-'qbsettings' => 'ਤੁਰੰਤ ਬਾਰ',
-'qbsettings-none' => 'ਕੋਈ ਨਹੀਂ',
-'qbsettings-fixedleft' => 'ਕਾਬ੍ਬ੍ਹੇ ਨੂ ਸਥਾਪਿਤ',
-'qbsettings-fixedright' => 'ਸੱਜੇ ਨੂ ਸਥਾਪਿਤ',
-'qbsettings-floatingleft' => 'ਕਾਬ੍ਬ੍ਹੇ ਨੂ ਰੁਲਦੀ',
-'qbsettings-floatingright' => 'ਸੱਜੇ ਨੂ ਰੁਲਦੀ',
-
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
 'mypreferences' => 'ਪਸੰਦਾਂ',
@@ -1141,12 +1134,13 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਤਸਦੀਕ:',
 'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'youremail' => 'ਈ-ਮੇਲ:',
-'username' => 'ਵਰਤੋਂਕਾਰਨਾਮ:',
-'uid' => 'ਵਰਤੋਂਕਾਰ ID:',
+'username' => '{{GENDER:$1|ਯੂਜ਼ਰਨਾਂ}}:',
+'uid' => '{{GENDER:$1|User}} ਆਈਡੀ:',
 'prefs-memberingroups' => '{{PLURAL:$1|ਗਰੁੱਪ|ਗਰੁੱਪਾਂ}} ਦਾ ਮੈਂਬਰ:',
 'prefs-registration' => 'ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਦਾ ਵਕਤ:',
 'yourrealname' => 'ਅਸਲੀ ਨਾਮ:',
 'yourlanguage' => 'ਭਾਸ਼ਾ:',
+'yourvariant' => 'ਸਮੱਗਰੀ ਭਾਸ਼ਾ ਰੂਪ:',
 'yournick' => 'ਛੋਟਾ ਨਾਂ:',
 'prefs-help-signature' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਉੱਤੇ ਟਿੱਪਣੀਆਂ ਦੇ ਆਖ਼ਰ ਵਿਚ "<nowiki>~~~~</nowiki>" ਲਾਓ ਜੋ ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ ਅਤੇ ਵਕਤ ਦੀ ਮੋਹਰ ਵਿਚ ਤਬਦੀਲ ਹੋ ਜਾਵੇਗਾ।',
 'badsiglength' => 'ਦਸਤਖ਼ਤ ਬਹੁਤ ਲੰਬਾ ਹੋ ਗਿਆ ਹੈ। ਇਹ {{PLURAL:$1|ਅੱਖਰ|ਅੱਖਰਾਂ}} ਤੋਂ ਲੰਬਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ।',
@@ -1161,6 +1155,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 ਜਦੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।',
 'prefs-help-email-required' => 'ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।',
 'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
+'prefs-i18n' => 'ਅੰਤਰਰਾਸ਼ਟਰੀਕਰਨ',
 'prefs-signature' => 'ਦਸਤਖ਼ਤ',
 'prefs-dateformat' => 'ਤਾਰੀਖ਼ ਅੰਦਾਜ਼',
 'prefs-advancedediting' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
@@ -1168,6 +1163,9 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedsearchoptions' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedwatchlist' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
+'prefs-displayrc' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
+'prefs-displaysearchoptions' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
+'prefs-displaywatchlist' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
 'prefs-diffs' => 'ਫ਼ਰਕ',
 
 # User preference: email validation using jQuery
@@ -1179,7 +1177,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'userrights-lookup-user' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਦੇਖਭਾਲ',
 'userrights-user-editname' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ:',
 'editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
-'editinguser' => '<b>$1</b> ਵਰਤੋਂਕਾਰ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
+'editinguser' => "'''[[User:$1|$1]]''' $2 ਯੂਜ਼ਰ ਦੇ ਯੂਜ਼ਰ ਹੱਕ ਬਦਲੇ ਜਾ ਰਹੇ ਹਨ",
 'userrights-editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
 'saveusergroups' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੰਭਾਲੋ',
 'userrights-groupsmember' => 'ਇਸ ਦਾ ਮੈਂਬਰ:',
@@ -1193,6 +1191,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'group-user' => 'ਮੈਂਬਰ',
 'group-autoconfirmed' => 'ਖ਼ੁਦ-ਤਸਦੀਕਸ਼ੁਦਾ ਮੈਂਬਰ',
 'group-bot' => 'ਬੋਟ',
+'group-sysop' => 'ਪਰਸ਼ਾਸ਼ਕ',
 'group-all' => '(ਸਭ)',
 
 'group-user-member' => '{{GENDER:$1|ਮੈਂਬਰ}}',
@@ -1210,6 +1209,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-move' => 'ਸਫ਼ੇ ਭੇਜਣਾ',
 'right-movefile' => 'ਫ਼ਾਈਲਾਂ ਦੇ ਨਾਂ ਬਦਲਣਾ',
 'right-upload' => 'ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨਾ',
+'right-upload_by_url' => 'URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
 'right-autoconfirmed' => 'ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ',
 'right-delete' => 'ਸਫ਼ੇ ਹਟਾਓ',
 'right-bigdelete' => 'ਵੱਡੇ ਅਤੀਤਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਮਿਟਾਉਣੇ',
@@ -1334,15 +1334,22 @@ to upload files.',
 'overwroteimage' => '"[[$1]]" ਦਾ ਨਵਾਂ ਰੂਪ ਅੱਪਲੋਡ ਕਰੋ',
 'uploaddisabled' => 'ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ',
 'uploadvirus' => 'ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1',
+'upload-source' => 'ਸਰੋਤ ਫਾਇਲ',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
+'sourceurl' => 'ਸਰੋਤ URL:',
+'destfilename' => 'ਟਿਕਾਣਾ ਫਾਇਲ-ਨਾਂ:',
 'upload-maxfilesize' => 'ਫ਼ਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
 'upload-description' => 'ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ',
+'upload-options' => 'ਅੱਪਲੋਡ ਚੋਣਾਂ',
 'watchthisupload' => 'ਇਸ ਫ਼ਾਈਲ ’ਤੇ ਨਜ਼ਰ ਰੱਖੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
+'upload-failure-subj' => 'ਅੱਪਲੋਡ ਸਮੱਸਿਆ',
 'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
 
+'upload-proto-error' => 'ਗਲਤ ਪਰੋਟੋਕਾਲ',
 'upload-file-error' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'upload-misc-error' => 'ਅਣਜਾਣ ਅੱਪਲੋਡ ਗਲਤੀ',
+'upload-unknown-size' => 'ਅਣਜਾਣ ਆਕਾਰ',
 
 # File backend
 'backend-fail-notexists' => 'ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
@@ -1478,6 +1485,8 @@ to upload files.',
 
 'disambiguationspage' => 'Template:ਗੁੰਝਲ ਖੋਲ੍ਹ',
 
+'pageswithprop-submit' => 'ਜਾਉ',
+
 'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
 
 'brokenredirectstext' => 'ਇਹ ਰਿਡਿਰੈਕਟ ਨਾ-ਮੌਜੂਦ ਸਫ਼ਿਆਂ ’ਤੇ ਜੋੜਦੇ ਹਨ:',
@@ -1586,15 +1595,6 @@ to upload files.',
 'listusers-noresult' => 'ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਲੱਭਿਆ।',
 'listusers-blocked' => '(ਪਾਬੰਦੀਸ਼ੁਦਾ)',
 
-# Special:ActiveUsers
-'activeusers' => 'ਚੁਸਤ ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ',
-'activeusers-intro' => 'ਇਹ ਓਹਨਾਂ ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਆਖ਼ਰੀ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਵਿਚ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦਾ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
-'activeusers-count' => 'ਆਖ਼ਰੀ {{PLURAL:$3|ਦਿਨ|$3 ਦਿਨਾਂ}} ਵਿਚ $1 {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}',
-'activeusers-from' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਮੈਂਬਰ ਵਖਾਓ:',
-'activeusers-hidebots' => 'ਬੋਟਾਂ ਨੂੰ ਲੁਕਾਓ',
-'activeusers-hidesysops' => 'ਐਡਮਨਿਸਟ੍ਰੇਟਰ ਲੁਕਾਓ',
-'activeusers-noresult' => 'ਕੋਈ ਮੈਂਬਰ ਨਹੀਂ ਲੱਭਿਆ।',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'ਗਰੁੱਪ',
 'listgrouprights-rights' => 'ਹੱਕ',
@@ -1632,7 +1632,7 @@ to upload files.',
 'emailuserfooter' => 'ਇਹ ਈ-ਮੇਲ $1 ਨੇ {{SITENAME}} ’ਤੇ "ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ" ਸਹੂਲਤ ਜ਼ਰੀਏ $2 ਨੂੰ ਭੇਜੀ ਸੀ।',
 
 # Watchlist
-'watchlist' => 'ਮà©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸੂਚੀ',
+'watchlist' => 'ਨਿà¨\97ਰਾਨ-ਸੂਚੀ',
 'mywatchlist' => 'ਧਿਆਨਸੂਚੀ',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
@@ -1648,6 +1648,7 @@ to upload files.',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
 'unwatch' => 'ਧਿਆਨ ਹਟਾਓ',
 'unwatchthispage' => 'ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ',
+'notanarticle' => 'ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ',
 'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ',
 'watchnochange' => 'ਵਖਾਏ ਜਾ ਰਹੇ ਸਮੇਂ ਅੰਦਰ ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲਾ ਕੋਈ ਵੀ ਸਫ਼ਾ ਸੋਧਿਆ ਨਹੀਂ ਗਿਆ।',
 'watchlist-details' => 'ਚਰਚਾ ਪੰਨੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ{{PLURAL:$1|$1 ਪੰਨਾ ਹੈ|$1 ਪੰਨੇ ਹਨ}}।',
@@ -1721,7 +1722,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-default' => 'ਸਭ ਯੂਜ਼ਰ ਮਨਜ਼ੂਰ',
 'protect-fallback' => '"$1" ਅਧਿਕਾਰ ਲੋੜੀਦਾ ਹੈ',
 'protect-level-autoconfirmed' => 'ਨਵੇਂ ਤੇ ਗੈਰ-ਰਜਿਸਟਰ ਵਰਤੋਂਕਾਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ',
-'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà©\8dਰਬੰਧà¨\95',
+'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà¨°à¨¸à¨¼à¨¾à¨¸à¨¼à¨\95 à¨¹à©\80 à¨®à¨¨à¨\9c਼à©\82ਰ',
 'protect-summary-cascade' => 'ਕਾਸਕੇਡਿੰਗ',
 'protect-cascade' => 'ਇਸ ਸਫ਼ੇ ਵਿਚ ਸ਼ਾਮਲ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਕਰੋ (ਕਾਸਕੇਡਿੰਗ ਸੁਰੱਖਿਆ)',
 'protect-cantedit' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਨਹੀਂ ਬਦਲ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਸੋਧਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
@@ -1733,6 +1734,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-edit-reasonlist' => 'ਸੁਰੱਖਿਆ ਦੇ ਕਾਰਨ ਸੋਧੋ',
 'protect-expiry-options' => '੧ ਘੰਟਾ:1 hour,੧ ਦਿਨ:1 day,੧ ਹਫ਼ਤਾ:1 week,੨ ਹਫ਼ਤੇ:2 weeks,੧ ਮਹੀਨਾ:1 month,੩ ਮਹੀਨੇ:3 months,੬ ਮਹੀਨੇ:6 months,੧ ਸਾਲ:1 year,ਬੇਹੱਦ:infinite',
 'restriction-type' => 'ਅਧਿਕਾਰ:',
+'restriction-level' => 'ਪਾਬੰਦੀ ਪੱਧਰ:',
 'minimum-size' => 'ਘੱਟੋ-ਘੱਟ ਆਕਾਰ',
 'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ',
 'pagesize' => '(ਬਾਈਟ)',
@@ -1758,7 +1760,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'undeletelink' => 'ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ',
 'undeleteviewlink' => 'ਵੇਖੋ',
 'undeletereset' => 'ਰੀ-ਸੈੱਟ',
-'undeletecomment' => 'à¨\9fਿੱਪਣà©\80:',
+'undeletecomment' => 'à¨\95ਾਰਨ:',
 'undelete-header' => 'ਤਾਜ਼ੇ ਹਟਾਏ ਗਏ ਪੰਨਿਆਂ ਲਈ [[Special:Log/
 delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'undelete-search-title' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
@@ -2029,11 +2031,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'pageinfo-edits' => 'ਕੁੱਲ ਸੋਧਾਂ',
 
 # Skin names
-'skinname-standard' => 'ਕਲਾਸਿਕ',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
-'skinname-myskin' => 'ਮੇਰੀਸਕਿਨ',
-'skinname-chick' => 'ਚੀਚਕ',
-'skinname-simple' => 'ਸੈਂਪਲ',
 
 # Browsing diffs
 'previousdiff' => '← ਇਸ ਤੋਂ ਪੁਰਾਣਾ ਬਦਲਾਵ',
index e5e57aa..cf9148b 100644 (file)
@@ -12,6 +12,7 @@
  * @author BdgwksxD
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Cysioland
  * @author Derbeth
  * @author Equadus
@@ -328,8 +329,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokaż liczbę użytkowników obserwujących stronę',
 'tog-oldsig' => 'Twój obecny podpis',
 'tog-fancysig' => 'Traktuj podpis jako wikikod (nie linkuj automatycznie całości)',
-'tog-externaleditor' => 'Domyślnie używaj zewnętrznego edytora (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-externaldiff' => 'Domyślnie używaj zewnętrznego programu pokazującego zmiany (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
 'tog-showjumplinks' => 'Włącz odnośniki „skocz do”',
 'tog-uselivepreview' => 'Używaj dynamicznego podglądu (JavaScript; eksperymentalny)',
 'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
@@ -344,6 +343,7 @@ $messages = array(
 'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
 'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
 'tog-norollbackdiff' => 'Pomiń pokazywanie zmian po użyciu funkcji „cofnij”',
+'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
 
 'underline-always' => 'zawsze',
 'underline-never' => 'nigdy',
@@ -516,7 +516,7 @@ $messages = array(
 'otherlanguages' => 'W innych językach',
 'redirectedfrom' => '(Przekierowano z $1)',
 'redirectpagesub' => 'Strona przekierowująca',
-'lastmodifiedat' => 'Tę stronę ostatnio zmodyfikowano $2, $1.',
+'lastmodifiedat' => 'Tę stronę ostatnio zmodyfikowano $2, $1.',
 'viewcount' => 'Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.',
 'protectedpage' => 'Strona zabezpieczona',
 'jumpto' => 'Skocz do:',
@@ -590,6 +590,7 @@ $1',
 'site-atom-feed' => 'Kanał Atom {{GRAMMAR:D.lp|$1}}',
 'page-rss-feed' => 'Kanał RSS „$1”',
 'page-atom-feed' => 'Kanał Atom „$1”',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (strona nie istnieje)',
 'sort-descending' => 'Sortuj malejąco',
 'sort-ascending' => 'Sortuj rosnąco',
@@ -782,7 +783,7 @@ Po otrzymaniu go zaloguj się ponownie.',
 'eauthentsent' => 'Potwierdzenie zostało wysłane na adres e‐mail.
 Zanim jakiekolwiek inne wiadomości zostaną wysłane na ten adres, należy wykonać zawarte w mailu instrukcje. Potwierdzisz w ten sposób, że ten adres e‐mail należy do Ciebie.',
 'throttled-mailpassword' => 'Przypomnienie hasła zostało już wysłane w ciągu {{PLURAL:$1|ostatniej godziny|ostatnich $1 godzin}}.
-W celu powstrzymania nadużyć możliwość wysyłania przypomnień została ograniczona do jednego na {{PLURAL:$1|godzinę|$1 godziny|$1 godzin}}.',
+Aby zapobiec nadużyciom nadużyć możliwość wysyłania przypomnień została ograniczona do jednego na {{PLURAL:$1|godzinę|$1 godziny|$1 godzin}}.',
 'mailerror' => 'W trakcie wysyłania wiadomości e‐mail wystąpił błąd: $1',
 'acct_creation_throttle_hit' => 'Z adresu IP, z którego korzystasz {{PLURAL:$1|ktoś już utworzył dziś konto|utworzono dziś $1 konta|utworzono dziś $1 kont}}, co jest maksymalną dopuszczalną liczbą w tym czasie.
 W związku z tym, osoby korzystające z tego adresu IP w chwili obecnej nie mogą założyć kolejnego.',
@@ -1083,6 +1084,8 @@ Strona już istnieje.',
 'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
 'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
 'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+'editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
+Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce {{int:prefs-editing}} w swoich preferencjach.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1366,15 +1369,6 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 W międzyczasie możesz skorzystać z wyszukiwania Google.
 Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.',
 
-# Quickbar
-'qbsettings' => 'Pasek szybkiego dostępu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stały, z lewej',
-'qbsettings-fixedright' => 'Stały, z prawej',
-'qbsettings-floatingleft' => 'Unoszący się, z lewej',
-'qbsettings-floatingright' => 'Unoszący się, z prawej',
-'qbsettings-directionality' => 'Ustawione na stałe, zgodnie z kierunkiem zapisywania w wybranym języku',
-
 # Preferences page
 'preferences' => 'Preferencje',
 'mypreferences' => 'Preferencje',
@@ -1563,7 +1557,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-autoconfirmed' => 'Edycja stron częściowo zabezpieczonych',
 'right-bot' => 'Oznaczanie edycji jako wykonanych automatycznie',
 'right-nominornewtalk' => 'Drobne zmiany na stronach dyskusji użytkowników nie włączają powiadomienia o nowej wiadomości',
-'right-apihighlimits' => 'Zwiększony limit w zapytaniach, wykonywanych poprzez interfejs API',
+'right-apihighlimits' => 'Zwiększony limit w zapytaniach wykonywanych poprzez interfejs API',
 'right-writeapi' => 'Zapis poprzez interfejs API',
 'right-delete' => 'Usuwanie stron',
 'right-bigdelete' => 'Usuwanie stron z długą historią edycji',
@@ -1934,7 +1928,6 @@ Ponieważ ta wiki została skonfigurowana jako publiczna dla zapewnienia optymal
 'http-read-error' => 'Błąd odczytu HTTP.',
 'http-timed-out' => 'Przekroczony czas żądania HTTP.',
 'http-curl-error' => 'Błąd pobierania z adresu $1',
-'http-host-unreachable' => 'Adres jest nieosiągalny.',
 'http-bad-status' => 'Wystąpił problem z realizacją żądania HTTP $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2096,6 +2089,8 @@ Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany p
 'pageswithprop' => 'Strony z właściwościami',
 'pageswithprop-legend' => 'Strony z właściwościami',
 'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+'pageswithprop-prop' => 'Nazwa właściwości:',
+'pageswithprop-submit' => 'Pokaż',
 
 'doubleredirects' => 'Podwójne przekierowania',
 'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
@@ -2259,15 +2254,6 @@ Wymaga podania co najmniej domeny najwyższego poziomu np. „*.org”.<br />
 'listusers-noresult' => 'Nie znaleziono żadnego użytkownika.',
 'listusers-blocked' => '({{GENDER:$1|zablokowany|zablokowana|zablokowany}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista aktywnych użytkowników',
-'activeusers-intro' => 'Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.',
-'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|edycję|edycje|edycji}}',
-'activeusers-from' => 'Pokaż użytkowników zaczynając od',
-'activeusers-hidebots' => 'Ukryj boty',
-'activeusers-hidesysops' => 'Ukryj administratorów',
-'activeusers-noresult' => 'Nie odnaleziono żadnego użytkownika.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Uprawnienia grup użytkowników',
 'listgrouprights-summary' => 'Poniżej znajduje się spis zdefiniowanych na tej wiki grup użytkowników, z wyszczególnieniem przydzielonych im uprawnień.
@@ -2463,8 +2449,8 @@ Naciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wyd
 'protectlogpage' => 'Zabezpieczone',
 'protectlogtext' => 'Poniżej znajduje się lista zmian w zabezpieczeniu pojedynczych stron.
 Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages|zabezpieczonych stron]].',
-'protectedarticle' => '{{GENDER:$2|zabezpieczył|zabezpieczyła}} [[$1]]',
-'modifiedarticleprotection' => '{{GENDER:$2|zmienił|zmieniła}} poziom zabezpieczenia [[$1]]',
+'protectedarticle' => 'zabezpieczono "[[$1]]"',
+'modifiedarticleprotection' => 'zmieniono stopień zabezpieczenia "[[$1]]"',
 'unprotectedarticle' => 'odbezpieczył [[$1]]',
 'movedarticleprotection' => 'przeniósł ustawienia zabezpieczeń z [[$2]] do [[$1]]',
 'protect-title' => 'Zmiana poziomu zabezpieczenia „$1”',
@@ -2480,15 +2466,15 @@ Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages
 'protect_expiry_invalid' => 'Podany czas automatycznego odbezpieczenia jest nieprawidłowy.',
 'protect_expiry_old' => 'Podany czas automatycznego odblokowania znajduje się w przeszłości.',
 'protect-unchain-permissions' => 'Odblokuj dodatkowe opcje zabezpieczania',
-'protect-text' => "Możesz tu sprawdzić i zmienić poziom zabezpieczenia strony '''$1'''.",
+'protect-text' => "Możesz tu sprawdzić i zmienić stopień zabezpieczenia strony '''$1'''.",
 'protect-locked-blocked' => "Nie możesz zmienić poziomów zabezpieczenia, ponieważ jesteś zablokowany.
 Obecne ustawienia dla strony '''$1''' to:",
 'protect-locked-dblock' => "Nie można zmienić poziomu zabezpieczenia z powodu działającej blokady bazy danych. Obecne ustawienia dla strony '''$1''' to:",
 'protect-locked-access' => "Nie masz uprawnień do zmiany poziomu zabezpieczenia strony. Obecne ustawienia dla strony '''$1''' to:",
-'protect-cascadeon' => 'Ta strona jest zabezpieczona przed edycją, ponieważ jest używana przez {{PLURAL:$1|następującą stronę, która została zabezpieczona|następujące strony, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Możesz zmienić poziom zabezpieczenia strony, ale nie wpłynie to na dziedziczenie zabezpieczenia.',
+'protect-cascadeon' => 'Ta strona jest zabezpieczona przed edycją, ponieważ jest używana przez {{PLURAL:$1|następującą stronę, która została zabezpieczona|następujące strony, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Możesz zmienić stopień zabezpieczenia strony, ale nie wpłynie to na dziedziczenie zabezpieczenia.',
 'protect-default' => 'Dostęp mają wszyscy użytkownicy',
 'protect-fallback' => 'Wymaga uprawnień „$1”',
-'protect-level-autoconfirmed' => 'Blokuj nowych i niezarejestrowanych użytkowników',
+'protect-level-autoconfirmed' => 'Dozwolone dla wszystkich poza nowymi i niezalogowanymi użytkownikami',
 'protect-level-sysop' => 'Dozwolone tylko dla administratorów',
 'protect-summary-cascade' => 'dziedziczenie',
 'protect-expiring' => 'wygasa $1 (UTC)',
@@ -2509,7 +2495,7 @@ Obecne ustawienia dla strony '''$1''' to:",
 'protect-edit-reasonlist' => 'Edytuj listę przyczyn zabezpieczenia',
 'protect-expiry-options' => '1 godzina:1 hour,1 dzień:1 day,1 tydzień:1 week,2 tygodnie:2 weeks,1 miesiąc:1 month,3 miesiące:3 months,6 miesięcy:6 months,1 rok:1 year,na zawsze:infinite',
 'restriction-type' => 'Ograniczenia',
-'restriction-level' => 'Poziom',
+'restriction-level' => 'Stopień',
 'minimum-size' => 'Minimalny rozmiar',
 'maximum-size' => 'Maksymalny rozmiar',
 'pagesize' => '(bajtów)',
@@ -2523,7 +2509,7 @@ Obecne ustawienia dla strony '''$1''' to:",
 # Restriction levels
 'restriction-level-sysop' => 'całkowite zabezpieczenie',
 'restriction-level-autoconfirmed' => 'częściowe zabezpieczenie',
-'restriction-level-all' => 'dowolny poziom',
+'restriction-level-all' => 'dowolny stopień',
 
 # Undelete
 'undelete' => 'Odtwórz usuniętą stronę',
@@ -2729,7 +2715,7 @@ Przyczyna blokady $1 to: „$2”',
 'blocklogtext' => 'Poniżej znajduje się lista blokad założonych i zdjętych z poszczególnych adresów IP.
 Na liście nie znajdą się adresy IP, które zablokowano w sposób automatyczny.
 By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:BlockList|zablokowanych adresów i użytkowników]].',
-'unblocklogentry' => '{{GENDER:$2|zdjął|zdjęła}} blokadę $1',
+'unblocklogentry' => 'zdjęto blokadę z $1',
 'block-log-flags-anononly' => 'tylko anonimowi',
 'block-log-flags-nocreate' => 'blokada tworzenia konta',
 'block-log-flags-noautoblock' => 'automatyczne blokowanie wyłączone',
@@ -2759,6 +2745,7 @@ O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dost
 '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',
+'xffblockreason' => 'Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1',
 'cant-block-while-blocked' => 'Nie możesz zablokować innych użytkowników, kiedy sam jesteś zablokowany.',
 'cant-see-hidden-user' => 'Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.',
 'ipbblocked' => 'Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany',
@@ -3011,7 +2998,7 @@ Brak katalogu dla plików tymczasowych.',
 'tooltip-pt-login' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.',
 'tooltip-pt-anonlogin' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe',
 'tooltip-pt-logout' => 'Wyloguj',
-'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony.',
+'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony',
 'tooltip-ca-edit' => 'Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.',
 'tooltip-ca-addsection' => 'Dodaj nowy wątek.',
 'tooltip-ca-viewsource' => 'Ta strona jest zabezpieczona. Możesz zobaczyć tekst źródłowy.',
@@ -3072,13 +3059,8 @@ Pozwala na wpisanie powodu w opisie zmian.',
 
 # Stylesheets
 'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
-'standard.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Standardowa */',
-'nostalgia.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Tęsknota */',
 'cologneblue.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Błękit */',
 'monobook.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */',
-'myskin.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Moja skórka */',
-'chick.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Kurczaczek */',
-'simple.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Prosta */',
 'modern.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Nowoczesna */',
 'vector.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */',
 'print.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */',
@@ -3086,16 +3068,13 @@ Pozwala na wpisanie powodu w opisie zmian.',
 'noscript.css' => '/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */',
 'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */',
 'group-bot.css' => '/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */',
+'group-sysop.css' => '/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */',
+'group-bureaucrat.css' => '/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */',
 
 # Scripts
 'common.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */',
-'standard.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Standardowa */',
-'nostalgia.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Tęsknota */',
 'cologneblue.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Błękit */',
 'monobook.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */',
-'myskin.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Moja skórka */',
-'chick.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Kurczaczek */',
-'simple.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Prosta */',
 'modern.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Nowoczesna */',
 'vector.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */',
 
@@ -3171,13 +3150,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-category-files' => 'Liczba plików',
 
 # Skin names
-'skinname-standard' => 'Standardowa',
-'skinname-nostalgia' => 'Tęsknota',
 'skinname-cologneblue' => 'Błękit',
 'skinname-monobook' => 'Książka',
-'skinname-myskin' => 'Moja skórka',
-'skinname-chick' => 'Kurczaczek',
-'skinname-simple' => 'Prosta',
 'skinname-modern' => 'Nowoczesna',
 'skinname-vector' => 'Wektor',
 
@@ -4048,11 +4022,11 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'logentry-delete-revision' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
-'logentry-suppress-delete' => '$1 ukrywa stronę $3',
-'logentry-suppress-event' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
-'logentry-suppress-revision' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
-'logentry-suppress-event-legacy' => '$1 potajemnie zmienia widoczność zdarzenia w rejestrze $3',
-'logentry-suppress-revision-legacy' => '$1 potajemnie zmienia widoczność wersji strony $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ukrył|ukryła}} stronę $3',
+'logentry-suppress-event' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
+'logentry-suppress-revision' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
+'logentry-suppress-event-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzenia w rejestrze dla strony $3',
+'logentry-suppress-revision-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
 'revdelete-content-hid' => 'treść została ukryta',
 'revdelete-summary-hid' => 'opis zmian został ukryty',
 'revdelete-uname-hid' => 'nazwa użytkownika została ukryta',
@@ -4067,11 +4041,11 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
 'logentry-patrol-patrol-auto' => '$1 automatycznie {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
-'logentry-newusers-newusers' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create2' => 'Konto użytkownika $3 zostało utworzone przez użytkownika $1',
+'logentry-newusers-newusers' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'logentry-newusers-create' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|utworzył|utworzyła}} konto użytkownika $3',
 'logentry-newusers-byemail' => 'Konto $3 zostało utworzone przez użytkownika $1, hasło wysłano e-mailem',
-'logentry-newusers-autocreate' => '$1 automatycznie tworzy konto użytkownika',
+'logentry-newusers-autocreate' => '$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika',
 'logentry-rights-rights' => '$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup ($4 → $5)',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup',
 'logentry-rights-autopromote' => '$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)',
index b343e58..5252bc8 100644 (file)
@@ -44,38 +44,36 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Anliure con la sotliniadura',
 'tog-justify' => 'Paràgraf: giustificà',
-'tog-hideminor' => 'Stërma le modìfiche cite<br />ant sla pàgina "Ùltime Modìfiche"',
-'tog-hidepatrolled' => "Stërma le modìfiche verificà ant j'ùltime modìfiche",
-'tog-newpageshidepatrolled' => 'Stërma le pàgine verificà da la lista dle pàgine neuve',
-'tog-extendwatchlist' => 'Slarga la funsion "ten sot euj" an manera che a la smon-a tute le modìfiche, nen mach l\'ùltima',
-'tog-usenewrc' => "Deuvra j'ùltime modìfiche ameliorà (a-i và JavaScript)",
+'tog-hideminor' => "Stërmé le modìfiche cite ant sla pàgina dj'ùltime modìfiche",
+'tog-hidepatrolled' => "Stërmé le modìfiche dzorvejà ant j'ùltime modìfiche",
+'tog-newpageshidepatrolled' => 'Stërmé le pàgine dzorvejà da la lista dle pàgine neuve',
+'tog-extendwatchlist' => "Slarghé la lista ëd ròba che as ten sot-euj an manera che a la smon-a tute le modìfiche, nen mach j'ùltime",
+'tog-usenewrc' => "Argropré le modìfiche për pàgina ant j'ùltime modìfiche e ant la lista dla ròba ch'as ten sot-euj (a-i và JavaScript)",
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
-'tog-showtoolbar' => "Mostra la bara dj'utiss (a-i va Javascript)",
-'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol<br />(a-i va JavaScript)",
-'tog-editsection' => "Abìlita la modìfica dle session con j'anliure [modìfica]",
-'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima<br />  al tìtol col tast drit dël rat (a-i va Javascript)',
-'tog-showtoc' => "Buta le tàole dij contnù<br />(për j'artìcoj che l'han pì che 3 session)",
-'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di|di}})",
-'tog-watchcreations' => "Gionta le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot euj",
-'tog-watchdefault' => "Gionta le pàgine che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
-'tog-watchmoves' => "Gionta le pàgine e j'archivi che i tramudo a lòn che im ten-o sot euj",
-'tog-watchdeletion' => "Gionta le pàgine e j'archivi che i scancelo via a la lista ëd lòn che im ten-o sot euj",
-'tog-minordefault' => 'Marca tute le modìfice coma cite<br />(mach coma predefinission dla casela)',
+'tog-showtoolbar' => "Smon-e la bara dj'utiss ëd modìfica (a-i va Javascript)",
+'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol (a-i va JavaScript)",
+'tog-editsection' => "Abilité le modìfiche ëd session con j'anliure [modifiché]",
+'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima al tìtol col tast drit dël rat (a-i va Javascript)',
+'tog-showtoc' => "Smon-e la tàula dij contnù (për le pàgine che l'han pì che 3 session)",
+'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
+'tog-watchcreations' => "Gionté le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot-euj",
+'tog-watchdefault' => "Gionté le pàgine e j'archivi che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
+'tog-watchmoves' => "Gionté le pàgine e j'archivi che i tramudo a lòn che im ten-o sot-euj",
+'tog-watchdeletion' => "Gionté le pàgine e j'archivi che i scancelo via a la lista ëd lòn che im ten-o sot-euj",
+'tog-minordefault' => 'Marché tute le modìfiche coma cite coma predefinission',
 'tog-previewontop' => 'Smon-e la preuva dzora al quàder ëd modìfica dël test e nen sota',
-'tog-previewonfirst' => 'Smon na preuva la prima vira che as fa na modìfica',
+'tog-previewonfirst' => 'Smon-e na preuva la prima vira che as fa na modìfica',
 'tog-nocache' => 'Disabilité la memòria local ëd le pàgine dël navigador',
-'tog-enotifwatchlistpages' => "Mandeme un mëssagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot euj",
-'tog-enotifusertalkpages' => 'Mand-me un messagi ëd pòsta eletrònica quand a-i son dle modìfiche a mia pàgina dle ciaciarade',
+'tog-enotifwatchlistpages' => "Mandeme un mëssagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot-euj",
+'tog-enotifusertalkpages' => 'Mandeme un mëssagi ëd pòsta eletrònica quand a-i son dle modìfiche a mia pàgina dle ciaciarade',
 'tog-enotifminoredits' => "Mandeme un mëssagi an pòsta eletrònica bele che për le modìfiche cite dle pàgine o dj'archivi",
-'tog-enotifrevealaddr' => 'Lassa che a së s-ciàira mia adrëssa ëd pòsta eletrònica ant ij messagi ëd notìfica',
-'tog-shownumberswatching' => "Smon ël nùmer d'utent che as ten-o la pàgina sot euj",
+'tog-enotifrevealaddr' => 'Lassé che a së s-ciàira mia adrëssa ëd pòsta eletrònica ant ij mëssagi ëd notìfica',
+'tog-shownumberswatching' => "Smon-e ël nùmer d'utent che as ten-o la pàgina sot-euj",
 'tog-oldsig' => 'Firma esistenta:',
-'tog-fancysig' => "Trata la firma com test wiki (sensa n'anliura automàtica)",
-'tog-externaleditor' => "Dovré coma stàndard n'editor estern (mach për espert, a-i é dabzògn d'ampostassion speciaj dzora a sò ordinator. [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-externaldiff' => "Dovré për stàndard un programa comparator estern (mach për espert, a-i é dabzògn d'ampostassion speciaj ansima a sò ordinator [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-showjumplinks' => 'Dovré j\'anliure d\'acessibilità dla sòrt "Va a"',
+'tog-fancysig' => "Traté la firma com dël test wiki (sensa n'anliura automàtica)",
+'tog-showjumplinks' => "Dovré j'anliure d'acessibilità dla sòrt «Andé a»",
 'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (a-i va JavaScript) (sperimental)",
-'tog-forceeditsummary' => "Ciama conferma se ël somari dla modìfica a l'é veujd",
+'tog-forceeditsummary' => "Ciamé conferma se ël resumé dla modìfica a l'é veujd",
 'tog-watchlisthideown' => 'Stërma mie modìfiche ant la ròba che im ten-o sot euj',
 'tog-watchlisthidebots' => 'Stërma le modìfiche fàite daj trigomiro ant la lista dle ròbe che im ten-o sot euj',
 'tog-watchlisthideminor' => "Stërma le modìfiche cite da 'nt lòn che im ten-o sot euj",
@@ -87,6 +85,7 @@ $messages = array(
 'tog-showhiddencats' => 'Smon le categorìe stërmà',
 'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
 'tog-norollbackdiff' => "Fa nen vëdde le diferense apress d'avèj ripristinà",
+'tog-useeditwarning' => 'Avisme quand che i lasso na pàgina ëd modìfiche con modìfiche nen salvà',
 
 'underline-always' => 'Sempe',
 'underline-never' => 'Mai',
@@ -811,6 +810,8 @@ A esist già.',
 'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
 'invalid-content-data' => 'Dat dël contnù pa bon',
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+'editwarning-warning' => "Lassé sta pàgina-sì a peul fé an manera che it perde tute le modìfiche ch'it l'has fàit.
+S'it ses logà, it peule disabilité st'avis-sì ant la session \"{{int:prefs-editing}}\" dij tò gust.",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -1094,15 +1095,6 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'search-external' => 'Arserca esterna',
 'searchdisabled' => "L'arserca anterna ëd {{SITENAME}} a l'é nen abilità; për adess a peul prové a dovré un motor d'arserca estern coma Google. (Però che a ten-a da ment che ij contnù ëd {{SITENAME}} listà ant ij motor pùblich a podrìo ëdcò esse nen d'autut agiornà)",
 
-# Quickbar
-'qbsettings' => 'Regolassion dla bara dij menù',
-'qbsettings-none' => 'Gnun',
-'qbsettings-fixedleft' => 'Fissà a la man ësnista',
-'qbsettings-fixedright' => 'Fissà a la man drita',
-'qbsettings-floatingleft' => 'Flotant a la man ësnista',
-'qbsettings-floatingright' => 'Flotant a la man drita',
-'qbsettings-directionality' => 'A pòst, an dipendensa dla diressionalità dë scritura ëd soa lenga',
-
 # Preferences page
 'preferences' => 'Mè gust',
 'mypreferences' => 'Gust',
@@ -1664,7 +1656,6 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
 'http-read-error' => 'Eror ëd letura HTTP.',
 'http-timed-out' => "L'arcesta HTTP a l'ha finì sò temp.",
 'http-curl-error' => "Eror an sërcand d'arcuperé l'adrëssa dl'aragnà: $1.",
-'http-host-unreachable' => "L'anliura a rispond pa.",
 'http-bad-status' => "A l'é staje un problema durant l'arcesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1983,15 +1974,6 @@ A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
 'listusers-noresult' => 'Gnun utent përparèj.',
 'listusers-blocked' => '(blocà)',
 
-# Special:ActiveUsers
-'activeusers' => "Lista dj'utent ativ",
-'activeusers-intro' => "Costa a l'é na lista d'utent ch'a l'han avù n'atività qualsëssìa ant j'ùltim $1 {{PLURAL:$1|di|di}}.",
-'activeusers-count' => "$1 {{PLURAL:$1|modìfica neuva|modìfiche neuve}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
-'activeusers-from' => "Smon-me j'utent a parte da:",
-'activeusers-hidebots' => 'Stërmé ij trigomiro',
-'activeusers-hidesysops' => "Stërmé j'aministrator",
-'activeusers-noresult' => 'Pa gnun utent trovà.',
-
 # Special:ListGroupRights
 'listgrouprights' => "Drit dël grup d'utent",
 'listgrouprights-summary' => "Ambelessì a-i é na lista dle partìe d'utent definìe ansima a costa wiki, con ij sò drit d'acess associà.
index 490e4ce..bdacefc 100644 (file)
@@ -654,7 +654,7 @@ $1',
 'passwordreset-emailtitle' => 'د {{SITENAME}} د ګڼون څرګندنې',
 'passwordreset-emailelement' => 'کارن-نوم: $1
 لنډمهاله پټنوم: $2',
-'passwordreset-emailsent' => 'يو يادښتي برېښليک ولېږل شو.',
+'passwordreset-emailsent' => 'د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.',
 'passwordreset-emailsent-capture' => 'د يادونې لپاره يو برېښليک ولېږل شو، برېښليک په لاندې توګه ښودل شوی.',
 
 # Special:ChangeEmail
@@ -986,14 +986,6 @@ $1',
 'powersearch-togglenone' => 'هېڅ',
 'search-external' => 'باندنۍ پلټنه',
 
-# Quickbar
-'qbsettings' => 'چټک پټه',
-'qbsettings-none' => 'هېڅ',
-'qbsettings-fixedleft' => 'ثابته کيڼ',
-'qbsettings-fixedright' => 'ثابته ښي',
-'qbsettings-floatingleft' => 'کيڼه لامبا',
-'qbsettings-floatingright' => 'ښي لامبا',
-
 # Preferences page
 'preferences' => 'غوره توبونه',
 'mypreferences' => 'غوره توبونه',
@@ -1578,15 +1570,6 @@ $1',
 'listusers-noresult' => 'هېڅ کوم کارن و نه موندل شو.',
 'listusers-blocked' => '(بنديز لګېدلی)',
 
-# Special:ActiveUsers
-'activeusers' => 'د فعالو کارنانو لړليک',
-'activeusers-intro' => 'دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.',
-'activeusers-count' => 'په {{PLURAL:$3|تېرې ورځ|تېرو $3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}',
-'activeusers-from' => 'هغه کارنان کتل چې نومونه يې پېلېږي په:',
-'activeusers-hidebots' => 'روباټونه پټول',
-'activeusers-hidesysops' => 'پازوالان پټول',
-'activeusers-noresult' => 'کارن و نه موندل شو.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'د کارن ډلو رښتې',
 'listgrouprights-group' => 'ډله',
@@ -2165,13 +2148,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'pageinfo-protect-cascading-yes' => 'هو',
 
 # Skin names
-'skinname-standard' => 'کلاسيک',
-'skinname-nostalgia' => 'نوستالژي',
 'skinname-cologneblue' => 'شين کلون',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'زمابڼه',
-'skinname-chick' => 'شيک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'نوی',
 'skinname-vector' => 'وېکټور',
 
index 21aa249..c51fe22 100644 (file)
@@ -2277,15 +2277,6 @@ Veja também as [[Special:WantedCategories|categorias desejadas]].',
 'listusers-noresult' => 'Não foram encontrados utilizadores.',
 'listusers-blocked' => '(bloqueado)',
 
-# Special:ActiveUsers
-'activeusers' => 'Utilizadores activos',
-'activeusers-intro' => 'Esta é uma lista dos utilizadores com qualquer tipo de actividade {{PLURAL:$1|no último dia|nos últimos $1 dias}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}',
-'activeusers-from' => 'Mostrar utilizadores começando por:',
-'activeusers-hidebots' => 'Esconder robôs',
-'activeusers-hidesysops' => 'Esconder administradores',
-'activeusers-noresult' => 'Nenhum utilizador encontrado.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios dos grupos de utilizadores',
 'listgrouprights-summary' => 'A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.
index 51107c8..3dbe7a2 100644 (file)
@@ -28,6 +28,7 @@
  * @author GKnedo
  * @author Giro720
  * @author GoEThe
+ * @author Gusta
  * @author Hamilton Abreu
  * @author Helder.wiki
  * @author Jaideraf
@@ -316,7 +317,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar linques:',
+'tog-underline' => 'Sublinhar links:',
 'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
@@ -345,8 +346,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
-'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
@@ -361,6 +360,7 @@ $messages = array(
 'tog-showhiddencats' => 'Exibir categorias ocultas',
 'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças depois de desfazer edições em bloco',
+'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -1098,6 +1098,8 @@ Ela já existia.',
 'content-failed-to-parse' => 'Falha ao analisar o conteúdo $2 para o modelo $1: $3',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
+Se você estiver autenticado, você pode desabilitar este aviso na seção "{{int:prefs-editing}}" de suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1382,15 +1384,6 @@ Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os cont
 Você poderá pesquisar através do Google enquanto isso.
 Note que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.',
 
-# Quickbar
-'qbsettings' => 'Configurações da Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixo à esquerda',
-'qbsettings-fixedright' => 'Fixo à direita',
-'qbsettings-floatingleft' => 'Flutuando à esquerda',
-'qbsettings-floatingright' => 'Flutuando à direita',
-'qbsettings-directionality' => 'Fixado, dependendo da direcionalidade do seu alfabeto e da sua língua',
-
 # Preferences page
 'preferences' => 'Preferências',
 'mypreferences' => 'Preferências',
@@ -1958,7 +1951,6 @@ Para melhor segurança, o img_auth.php está desativado.',
 'http-read-error' => 'Erro de leitura HTTP.',
 'http-timed-out' => 'Esgotado o tempo de espera da requisição HTTP.',
 'http-curl-error' => 'Erro ao requisitar a URL: $1',
-'http-host-unreachable' => 'Não foi possível atingir a URL.',
 'http-bad-status' => 'Ocorreu um problema durante a requisição HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2282,15 +2274,6 @@ Necessário no mínimo um domínio de nível superior, por exemplo "*.org".<br /
 'listusers-noresult' => 'Não foram encontrados usuários para a forma pesquisada.',
 'listusers-blocked' => '({{GENDER:$1|bloqueado|bloqueada}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista de usuários ativos',
-'activeusers-intro' => 'Esta é uma lista de usuários com algum tipo de atividade nos últimos $1 {{PLURAL:$1|dia|dias}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}',
-'activeusers-from' => 'Mostrar usuários começando em:',
-'activeusers-hidebots' => 'Esconder robôs',
-'activeusers-hidesysops' => 'Esconder administradores',
-'activeusers-noresult' => 'Nenhum usuário encontrado.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios de grupo de usuários',
 'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
@@ -3093,13 +3076,8 @@ Permite colocar uma justificativa no sumário da edição.',
 
 # Scripts
 'common.js' => '/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */',
-'standard.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Clássico */',
-'nostalgia.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Nostalgia */',
 'cologneblue.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Azul colonial */',
 'monobook.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */',
-'myskin.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MySkin */',
-'chick.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Chique */',
-'simple.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Simples */',
 'modern.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */',
 'vector.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */',
 
@@ -3175,13 +3153,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-category-files' => 'Número de arquivos',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 
 # Patrolling
@@ -4015,7 +3988,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redirecionamento',
 'logentry-patrol-patrol' => '$1 marcou a revisão $4 da página $3 como patrulhada',
 'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisão $4 da página $3 como patrulhada',
-'logentry-newusers-newusers' => 'A conta de usuário $1 foi criada',
+'logentry-newusers-newusers' => 'A conta de usuário $1 foi {{GENDER:$2|criada}}',
 'logentry-newusers-create' => 'A conta de usuário $1 foi criada',
 'logentry-newusers-create2' => 'A conta de usuário $3 foi criada por $1',
 'logentry-newusers-byemail' => 'A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail',
index 14f8b25..9280f37 100644 (file)
@@ -185,8 +185,6 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-shownumberswatching' => 'Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages. {{Gender}}',
 'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile. {{Gender}}',
 'tog-fancysig' => 'In user preferences under the signature box.  {{Gender}}',
-'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
-'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
 'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
 'tog-uselivepreview' => 'Toggle option used in [[Special:Preferences]]. Live preview is an experimental feature (unavailable by default) to use edit preview without loading the page again. {{Gender}}',
 'tog-forceeditsummary' => "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
@@ -204,6 +202,7 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 ''(the message is considered optional because it is only used in wikis with language variants)''",
 'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
 {{Identical|Rollback}}",
+'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
 
 'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
 
@@ -384,7 +383,8 @@ Used as link title in your personal toolbox.
 See also:
 * {{msg-mw|Mytalk}}
 * {{msg-mw|Accesskey-pt-mytalk}}
-* {{msg-mw|Tooltip-pt-mytalk}}',
+* {{msg-mw|Tooltip-pt-mytalk}}
+{{Identical|Talk}}',
 'anontalk' => 'Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.
 
 See also:
@@ -458,9 +458,8 @@ See also:
 * {{msg-mw|Accesskey-n-help}}
 * {{msg-mw|Tooltip-n-help}}
 {{Identical|Help}}',
-'search' => 'Noun. Text of menu section shown on every page of the wiki above the search form.
-
-Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
+'search' => '{{doc-special|Search}}
+Noun. Text of menu section shown on every page of the wiki above the search form.
 
 See also:
 * {{msg-mw|Search}}
@@ -550,6 +549,9 @@ See also:
 {{Identical|Talk}}',
 'specialpage' => '{{Identical|Special page}}',
 'personaltools' => 'Heading for a group of links to your user page, talk page, preferences, watchlist, and contributions. This heading is visible in the sidebar in some skins. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].',
+'postcomment' => 'Used as link text.
+
+The link points to the talk page and has the parameters "action=edit&section=new".',
 'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespace and this message is only used in skins Nostalgia, Cologneblue and Standard in the bottomLinks part.
 
 {{Identical|Content page}}",
@@ -607,7 +609,8 @@ For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
 'pool-queuefull' => 'Part of {{msg-mw|view-pool-error}}
 
 "Pool" refers to a pool of processes.',
-'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.',
+'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.
+{{Identical|Unknown error}}',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.
@@ -1038,18 +1041,24 @@ Parameters:
 'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
 In user preferences.
 {{Identical|Username}}",
+'userlogin-yourname' => "In new vertical user login & create account forms, label for username field",
+'userlogin-yourname-ph' => "Placeholder text in new userlogin/create account form field.",
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
+'userlogin-yourpassword' => "In new vertical user login & create account forms, label for password field",
+'userlogin-yourpassword-ph' => "Placeholder text in new userlogin form for password field.",
 'yourpasswordagain' => 'In user preferences',
 'remembermypassword' => 'A check box in [[Special:UserLogin]]
 
 {{Identical|Remember my login on this computer}}',
+'userlogin-remembermypassword' => 'The text for a check box in the new-style [[Special:UserLogin]]',
+'userlogin-signwithsecure'   => 'Text of link to HTTPS login form',
 'securelogin-stick-https' => 'Used as label for checkbox.',
 'yourdomainname' => 'Used as label for listbox.',
 'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
 'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
-'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).
+'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there). Also the title of the new login special page, which does not combine Log in & Create account.
 
 See also:
 * {{msg-mw|Login}}
@@ -1072,15 +1081,21 @@ See also:
 * {{msg-mw|Tooltip-pt-logout}}
 {{Identical|Log out}}',
 'userlogout' => '{{Doc-actionlink}}
+{{doc-special|UserLogout|unlisted=1}}
 {{Identical|Log out}}',
 'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
 
 {{Identical|Not logged in}}',
+'userlogin-noaccount' => 'In the new-style [[Special:Userlogin]] form, this is the text prior to button inviting user to join project',
+'userlogin-joinproject' => 'Text of button inviting user to create an account',
 'nologin' => 'A message shown in the log in form. Parameters:
 * $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}',
 'nologinlink' => 'Text of the link to the account creation form. Before that link, the message {{msg-mw|Nologin}} appears.
 {{Identical|Create an account}}',
-'createaccount' => 'The title of [[Special:CreateAccount]], where users can register a new account. Used on [[Special:SpecialPages]] and on the submit button in the form where you register a new account.
+'createaccount' => '{{doc-special|CreateAccount}}
+The special page enables users to register a new account.
+
+Used on the submit button in the form where you register a new account.
 
 It is also used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 {{Identical|Create account}}',
@@ -1089,6 +1104,8 @@ It is also used on the top of the page for logged out users, where it appears ne
 'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
 {{Identical|Log in}}',
 'userlogin-resetlink' => 'Used on the login page.',
+'helplogin-url' => 'Page that provides information about logging into the wiki.',
+'userlogin-helplink' => 'Wikitext linking to login help.',
 'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
 'createaccountreason' => '{{Identical|Reason}}',
 'badretype' => 'Used as error message when the new password and its retype do not match.',
@@ -1116,8 +1133,10 @@ Parameters:
 'nosuchusershort' => "Displayed when trying to log in with a non-existant username. This message is only shown when you can't create an account, otherwise the message {{msg-mw|nosuchusershort}} is displayed.",
 'nouserspecified' => 'Used as error message when username to fetch is not specified.',
 'login-userblocked' => 'This message supports GENDER, username is available in $1.',
-'wrongpassword' => 'Used as error message when the provided password is wrong.',
-'wrongpasswordempty' => 'Error message displayed when entering a blank password',
+'wrongpassword' => 'Used as error message when the provided password is wrong.
+{{Identical|Please try again}}',
+'wrongpasswordempty' => 'Error message displayed when entering a blank password.
+{{Identical|Please try again}}',
 'passwordtooshort' => 'This message is shown at
 
 * [[Special:Preferences]]
@@ -1138,7 +1157,7 @@ $1 is the minimum number of characters in the password.',
 
 Parameters:
 * $1 is a user name. This parameter can be used with GENDER.',
-'noemailcreate' => 'Error message.',
+'noemailcreate' => 'Used as error message in [[Special:UserLogin]].',
 'passwordsent' => '* $1 - username',
 'blocked-mailpassword' => 'Used as error message in password recovery.',
 'eauthentsent' => "This message appears after entering an e-mail address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on '{{int:saveprefs}}'.",
@@ -1218,6 +1237,7 @@ See also:
 'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
 'passwordreset-legend' => '{{Identical|Reset password}}',
 'passwordreset-disabled' => 'Used as error message in changing password.',
+'passwordreset-emaildisabled' => 'Used as error message in changing password when site\'s email feature is disabled.',
 'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
 "One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
 * $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
@@ -1342,7 +1362,8 @@ See also:
 See also:
 * {{msg-mw|Savearticle}}
 * {{msg-mw|Accesskey-save}}
-* {{msg-mw|Tooltip-save}}',
+* {{msg-mw|Tooltip-save}}
+{{Identical|Save page}}',
 'preview' => 'The title of the Preview page shown after clicking the "Show preview" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.
 
 {{Identical|Preview}}',
@@ -1592,6 +1613,9 @@ See also:
 'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
 * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
 * $2 - the title of the page in question',
+'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
+
+but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -1755,7 +1779,8 @@ Used in History and [[Special:Contributions]].',
 It is followed by the message {{msg-mw|Viewprevnext}}.',
 'histlast' => 'This is part of the navigation message on the top and bottom of Page History pages which are lists of things in date order, e.g. [{{canonicalurl:Support|action=history}} Page History of Support].
 
-It is followed by the message {{msg-mw|Viewprevnext}}.',
+It is followed by the message {{msg-mw|Viewprevnext}}.
+{{Identical|Latest}}',
 'historysize' => '* $1 - byte count',
 'historyempty' => 'Text in page history for empty page revisions
 
@@ -1805,7 +1830,8 @@ See [{{canonicalurl:x|feed=atom&action=history}} example].',
 'rev-showdeleted' => 'Link in page history for oversight (see also {{msg-mw|rev-delundel}})
 {{Identical|Show}}',
 'revisiondelete' => '{{RevisionDelete}}
-It is the page title of [[Special:RevisionDelete]].',
+
+{{doc-special|RevisionDelete|unlisted=1}}',
 'revdelete-nooldid-title' => '{{RevisionDelete}}',
 'revdelete-nooldid-text' => '{{RevisionDelete}}',
 'revdelete-nologtype-title' => 'See also:
@@ -1999,6 +2025,7 @@ Title of the suppression log. Shown in the drop down menu at [[Special:log]] and
 'suppressionlogtext' => 'Description text of the suppression log. Shown at top of [[Special:log/suppress]].',
 
 # History merging
+'mergehistory' => '{{doc-special|MergeHistory}}',
 'mergehistory-header' => 'Used as header for Merge form in [[Special:MergeHistory]].
 
 See also:
@@ -2101,6 +2128,7 @@ A revision row in the merge history page. Parameters:
 
 # Merge log
 'mergelog' => '{{doc-logpage}}
+
 This is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.',
 'pagemerge-logentry' => "This log message is used in a merge log entry.
 
@@ -2313,15 +2341,8 @@ See also:
 In this sentence, "their indexes" refers to "Google\'s indexes".
 
 Shown on [[Special:Search]] when the internal search is disabled.',
-
-# Quickbar
-'qbsettings' => 'The title of the section in [[Special:Preferences]], only shown when using the skins "Standard/Classic" or "Cologne Blue". The quicbar is the same as the sidebar.',
-'qbsettings-none' => '{{Identical|None}}',
-'qbsettings-fixedleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-fixedright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
+'search-error' => 'Shown when an error has occurred when performing a search
+* $1 is the localized error that was returned',
 
 # Preferences page
 'preferences' => 'Title of the [[Special:Preferences]] page.
@@ -2400,7 +2421,8 @@ When changing this message, please also update {{msg-mw|vector-editwarning-warni
 {{Identical|Search}}',
 'resultsperpage' => "Option on the 'Search options' tab of [[Special:Preferences]]",
 'stub-threshold' => 'Used in [[Special:Preferences]], tab "Misc".',
-'stub-threshold-disabled' => 'Used in [[Special:Preferences]].',
+'stub-threshold-disabled' => 'Used in [[Special:Preferences]].
+{{Identical|Disabled}}',
 'recentchangesdays' => 'Used in [[Special:Preferences]], tab "Recent changes".',
 'recentchangesdays-max' => 'Shown as hint in [[Special:Preferences]], tab "Recent changes"',
 'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
@@ -2451,6 +2473,8 @@ This option lets your time zone setting use the one that is used on the wiki (of
 'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
 'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
 'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
+Also used on create account form.
+
 {{Identical|E-mail}}',
 'username' => 'Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
 
@@ -2687,7 +2711,8 @@ If you are in that group, you have (by default) the '''right \"autoconfirmed\"''
 If someone with this right (bots by default) edits a user talk page and marks it as minor (requires {{msg-mw|right-minoredit}}), the user will not get a notification "You have new messages".',
 'right-apihighlimits' => '{{doc-right|apihighlimits}}',
 'right-writeapi' => '{{doc-right|writeapi}}',
-'right-delete' => '{{doc-right|delete}}',
+'right-delete' => '{{doc-right|delete}}
+{{Identical|Delete page}}',
 'right-bigdelete' => '{{doc-right|bigdelete}}',
 'right-deletelogentry' => '{{doc-right|deletelogentry}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
@@ -2779,6 +2804,7 @@ Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newuse
 
 # User rights log
 'rightslog' => '{{doc-logpage}}
+
 In [[Special:Log]]',
 'rightslogtext' => 'Text in [[Special:Log/rights]].',
 
@@ -2913,15 +2939,25 @@ Does not work under $wgMiserMode ([[mwr:48986|r48986]]).',
 'rc-old-title' => 'Text that shows the original title of a page, $1 is the original title text',
 
 # Recent changes linked
-'recentchangeslinked' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].
-
+'recentchangeslinked' => '{{doc-special|RecentChangesLinked}}
 See also:
 * {{msg-mw|Recentchangeslinked}}
 * {{msg-mw|Accesskey-t-recentchangeslinked}}
 * {{msg-mw|Tooltip-t-recentchangeslinked}}',
-'recentchangeslinked-feed' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-toolbox' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-title' => 'Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like "/Main Page"). Related changes are all recent change to pages that are linked from \'\'this page\'\'. "$1" is the name of the page for which related changes are shown.',
+'recentchangeslinked-feed' => 'Used in the feed object.
+
+This message follows the message {{msg-mw|Recentchangeslinked-title}}.',
+'recentchangeslinked-toolbox' => 'Used as link text, and also used as link text in the common toolbox.
+
+These links point to [[Special:RecentChangesLinked]].',
+'recentchangeslinked-title' => "Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like \"/Main Page\").
+
+Related changes are all recent change to pages that are linked from ''this page''.
+
+This message is followed by {{msg-mw|Recentchangeslinked-feed}}.
+
+Parameters:
+* \$1 - the name of the page for which related changes are shown",
 'recentchangeslinked-noresult' => 'Used in [[Special:RecentChangesLinked]], when there are no changes.',
 'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
 'recentchangeslinked-page' => '{{Identical|Page name}}',
@@ -2974,6 +3010,7 @@ Text displayed when uploading a file using [[Special:Upload]].",
 'upload-preferred' => 'Used in [[Special:Upload]].',
 'upload-prohibited' => 'Used in [[Special:Upload]].',
 'uploadlogpage' => '{{doc-logpage}}
+
 Page title of [[Special:Log/upload]].',
 'uploadlogpagetext' => 'Appears on top of [[Special:Log/upload]].',
 'filename' => '{{Identical|Filename}}',
@@ -3005,6 +3042,7 @@ See also:
 * {{msg-mw|upload-tryagain|Submit button text}}
 * {{msg-mw|reuploaddesc|button text}}',
 'ignorewarnings' => 'In [[Special:Upload]]',
+'minlength1' => 'Used as error message in [[Special:Upload]].',
 'illegalfilename' => '* $1 - filename',
 'filename-toolong' => 'Error message when uploading a file with a filename longer than the hard-coded limit of 240 bytes. This limit will never change and is hard-coded in the message.
 
@@ -3556,12 +3594,6 @@ See also:
 Known messages are:
 * {{msg-mw|http-host-unreachable}}
 * {{msg-mw|http-timed-out}}',
-'http-host-unreachable' => 'Used as error message when executing HTTP request.
-
-See also:
-* {{msg-mw|Http-request-error}}
-* {{msg-mw|Http-read-error}}
-* {{msg-mw|Http-timed-out|28}}',
 'http-bad-status' => 'Parameters:
 * $1 - an HTTP error code (e.g. 404)
 * $2 - the HTTP error message (e.g. File Not Found)',
@@ -3756,6 +3788,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * $3 is a hour
 * $4 is an URL and must follow square bracket: [$4
 {{Identical|Revert}}',
+'filerevert-badversion' => 'Used as error message.',
 
 # File deletion
 'filedelete' => 'Used as page title. Parameters:
@@ -3806,23 +3839,26 @@ See also:
 
 See also:
 * {{msg-mw|Mimesearch|page title}}
-* {{msg-mw|Ilsubmit|Submit button text}}',
+* {{msg-mw|Ilsubmit|Submit button text}}
+{{Identical|MIME type}}',
 'download' => 'Direct download link in each line returned by [[Special:MIMESearch]]. Points to the actual file, rather than the image description page.
 {{Identical|Download}}',
 
 # Unwatched pages
-'unwatchedpages' => 'Name of special page displayed in [[Special:SpecialPages]] for admins',
+'unwatchedpages' => '{{doc-special|UnwatchedPages}}',
 
 # List redirects
-'listredirects' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'listredirects' => '{{doc-special|ListRedirects}}',
 
 # Unused templates
-'unusedtemplates' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'unusedtemplates' => '{{doc-special|UnusedTemplates}}',
 'unusedtemplatestext' => 'Shown on top of [[Special:Unusedtemplates]]',
+'unusedtemplateswlh' => 'Used as link text in [[Special:UnusedTemplates]].
 
-# Random page
-'randompage' => 'Name of special page displayed in [[Special:SpecialPages]].
+The link points to the "What links here" page.',
 
+# Random page
+'randompage' => '{{doc-special|RandomPage}}
 See also:
 * {{msg-mw|Randompage}}
 * {{msg-mw|Accesskey-n-randompage}}
@@ -3832,12 +3868,11 @@ See also:
 * $2 - number of namespaces',
 
 # Random redirect
-'randomredirect' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'randomredirect' => '{{doc-special|RandomRedirect}}',
 'randomredirect-nopages' => '* $1 - namespace name',
 
 # Statistics
-'statistics' => 'Name of special page displayed in [[Special:SpecialPages]].
-
+'statistics' => '{{doc-special|Statistics}}
 {{Identical|Statistics}}',
 'statistics-header-pages' => 'Used in [[Special:Statistics]]',
 'statistics-header-edits' => 'Used in [[Special:Statistics]]',
@@ -3859,6 +3894,7 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 'statistics-edits' => 'Used in [[Special:Statistics]]',
 'statistics-edits-average' => 'Used in [[Special:Statistics]]',
 'statistics-views-total' => 'Used in [[Special:Statistics]]',
+'statistics-views-total-desc' => 'This message follows the message {{msg-mw|statistics-views-total}}, in [[Special:Statistics]].',
 'statistics-views-peredit' => 'Used in [[Special:Statistics]]',
 'statistics-users' => '{{doc-important|Do not translate "Special:ListUsers"}}
 Used in [[Special:Statistics]].',
@@ -3867,7 +3903,7 @@ Used in [[Special:Statistics]].',
 * \$1 - Value of <code>\$wgRCMaxAge</code> in days",
 'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
 
-'disambiguations' => 'Name of a special page displayed in [[Special:SpecialPages]].',
+'disambiguations' => '{{doc-special|Disambiguations}}',
 'disambiguationspage' => 'This message is the name of the template used for marking disambiguation pages. It is used by [[Special:Disambiguations]] to find all pages which link to disambiguation pages.
 
 {{doc-important|Don\'t translate the "Template:" part!}}',
@@ -3876,7 +3912,7 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 \'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
 
-'pageswithprop' => 'Title for [[Special:PagesWithProp]].
+'pageswithprop' => '{{doc-special|PagesWithProp}}
 {{Identical|Page with page property}}',
 'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
 {{Identical|Page with page property}}',
@@ -3886,13 +3922,13 @@ This block of text is shown on [[:Special:Disambiguations]].
 'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
 {{Identical|Go}}',
 
-'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
+'doubleredirects' => '{{doc-special|DoubleRedirects}}',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
 'double-redirect-fixed-move' => 'This is the message in the log when the software (under the username {{msg|double-redirect-fixer}}) updates the redirects after a page move. See also {{msg|fix-double-redirects}}.',
 'double-redirect-fixed-maintenance' => 'This is the message in the log when the software (under the username {{msg-mw|double-redirect-fixer}}) updates the redirects after running maintenance/fixDoubleRedirects.php. Compare with {{msg-mw|double-redirect-fixed-move}}.',
 'double-redirect-fixer' => "This is the '''username''' of the user who updates the double redirects after a page move. A user is created with this username, so it is perhaps better to not change this message too often. See also {{msg|double-redirect-fixed-move}} and {{msg|fix-double-redirects}}.",
 
-'brokenredirects' => 'Name of [[Special:BrokenRedirects]] displayed in [[Special:SpecialPages]]',
+'brokenredirects' => '{{doc-special|BrokenRedirects}}',
 'brokenredirectstext' => 'Shown on top of [[Special:BrokenRedirects]].',
 'brokenredirects-edit' => 'Link in [[Special:BrokenRedirects]]
 
@@ -3901,12 +3937,12 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 {{Identical|Delete}}',
 
-'withoutinterwiki' => 'The title of the special page [[Special:WithoutInterwiki]].',
+'withoutinterwiki' => '{{doc-special|WithoutInterwiki}}',
 'withoutinterwiki-summary' => 'Summary of [[Special:WithoutInterwiki]].',
 'withoutinterwiki-legend' => 'Used on [[Special:WithoutInterwiki]] as title of fieldset.',
 'withoutinterwiki-submit' => '{{Identical|Show}}',
 
-'fewestrevisions' => 'Name of a special page displayed in [[Special:SpecialPages]].',
+'fewestrevisions' => '{{doc-special|FewestRevisions}}',
 
 # Miscellaneous special pages
 'nbytes' => 'Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.',
@@ -3920,45 +3956,47 @@ This block of text is shown on [[:Special:Disambiguations]].
 'nimagelinks' => 'Used on [[Special:MostLinkedFiles]] to indicate how often a specific file is used.',
 'ntransclusions' => 'Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.',
 'specialpage-empty' => 'Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.',
-'lonelypages' => 'Name of [[Special:LonelyPages]] displayed in [[Special:SpecialPages]]',
+'lonelypages' => '{{doc-special|LonelyPages}}',
 'lonelypagestext' => 'Text displayed in [[Special:LonelyPages]]',
-'uncategorizedpages' => 'Name of a special page displayed in [[Special:SpecialPages]].',
-'uncategorizedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'uncategorizedimages' => 'The title of the special page [[Special:UncategorizedImages]].',
-'uncategorizedtemplates' => 'The title of the special page [[Special:UncategorizedTemplates]].',
-'unusedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'unusedimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'popularpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'wantedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'wantedpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'uncategorizedpages' => '{{doc-special|UncategorizedPages}}',
+'uncategorizedcategories' => '{{doc-special|UncategorizedCategories}}',
+'uncategorizedimages' => '{{doc-special|UncategorizedImages}}',
+'uncategorizedtemplates' => '{{doc-special|UncategorizedTemplates}}',
+'unusedcategories' => '{{doc-special|UnusedCategories}}',
+'unusedimages' => '{{doc-special|UnusedImages}}',
+'popularpages' => '{{doc-special|PopularPages}}',
+'wantedcategories' => '{{doc-special|WantedCategories}}',
+'wantedpages' => '{{doc-special|WantedPages}}',
 'wantedpages-badtitle' => "Error message shown when [[Special:WantedPages]] is listing a page with a title that shouldn't exist.
 
 $1 is a page title",
-'wantedfiles' => 'Name of special page displayed in [[Special:SpecialPages]] and title of [[Special:WantedFiles]].',
+'wantedfiles' => '{{doc-special|WantedFiles}}',
 'wantedfiletext-cat' => 'Message displayed at top of [[special:WantedFiles]]. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.',
 'wantedfiletext-nocat' => 'Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled. See {{msg-mw|wantedfiletext-cat}}.',
-'wantedtemplates' => 'The page name of [[Special:WantedTemplates]].',
-'mostlinked' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostlinkedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostlinkedtemplates' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostinterwikis' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostrevisions' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'prefixindex' => 'The page title of [[Special:PrefixIndex]]. When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
+'wantedtemplates' => '{{doc-special|WantedTemplates}}',
+'mostlinked' => '{{doc-special|MostLinked}}',
+'mostlinkedcategories' => '{{doc-special|MostLinkedCategories}}',
+'mostlinkedtemplates' => '{{doc-special|MostLinkedTemplates}}',
+'mostcategories' => '{{doc-special|MostCategories}}',
+'mostimages' => '{{doc-special|MostImages}}',
+'mostinterwikis' => '{{doc-special|MostInterwikis}}',
+'mostrevisions' => '{{doc-special|MostRevisions}}',
+'prefixindex' => '{{doc-special|PrefixIndex}}
+When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
 'prefixindex-namespace' => 'The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace',
-'shortpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'longpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'deadendpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'shortpages' => '{{doc-special|ShortPages}}',
+'longpages' => '{{doc-special|LongPages}}',
+'deadendpages' => '{{doc-special|DeadendPages}}',
 'deadendpagestext' => 'Introductory text for [[Special:DeadendPages]]',
-'protectedpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'protectedpages' => '{{doc-special|ProtectedPages}}',
 'protectedpages-indef' => 'Option in [[Special:ProtectedPages]]',
 'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
 'protectedpagestext' => 'Shown on top of [[Special:ProtectedPages]]',
-'protectedtitles' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'protectedpagesempty' => 'Used in [[Special:ProtectedPages]], when there are no protected pages with the specified parameters.',
+'protectedtitles' => '{{doc-special|ProtectedTitles}}',
 'protectedtitlestext' => 'Shown on top of list of titles on [[Special:ProtectedTitles]]. If the list is empty the message [[MediaWiki:Protectedtitlesempty]] appears instead of this. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
 'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
-'listusers' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'listusers' => '{{doc-special|ListUsers}}',
 'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
 'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
 'usereditcount' => 'Shown behind every username on [[Special:ListUsers]].',
@@ -3966,10 +4004,11 @@ $1 is a page title",
 * $1 - a date
 * $2 - a time
 * $3 - the name of the user, for use in GENDER',
-'newpages' => 'Name of special page displayed in [[Special:SpecialPages]]
+'newpages' => '{{doc-special|NewPages}}
 {{Identical|New page}}',
 'newpages-username' => '{{Identical|Username}}',
-'ancientpages' => 'The page title of [[Special:Ancientpages]]. [[mw:Manual:Interface/Special pages title|mw manual]]',
+'ancientpages' => '{{doc-special|AncientPages}}
+See [[mw:Manual:Interface/Special pages title|manual]].',
 'move' => 'Name of Move tab. Should be in the imperative mood.
 
 See also:
@@ -3979,6 +4018,7 @@ See also:
 {{Identical|Move}}',
 'movethispage' => '{{Identical|Move this page}}',
 'unusedimagestext' => 'Header message of [[Special:UnusedFiles]]',
+'unusedcategoriestext' => 'Used as page header in [[Special:UnusedCategories]].',
 'notargettitle' => 'Used as title of error message.
 
 See also:
@@ -4010,8 +4050,7 @@ See also:
 'querypage-disabled' => "On special pages that use expensive database queries but are not cacheable, this message is displayed when 'miser mode' is on (i.e. no expensive queries allowed).",
 
 # Book sources
-'booksources' => 'Name of special page displayed in [[Special:SpecialPages]]
-
+'booksources' => '{{doc-special|BookSources}}
 See also:
 * {{msg-mw|Booksources|title}}
 * {{msg-mw|Booksources-text|text}}',
@@ -4032,17 +4071,19 @@ See also:
 # Special:Log
 'specialloguserlabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions \'\'performed\'\' by the specified user.  "Carried out" and "done" are possible alternatives for "performed".',
 'speciallogtitlelabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.',
-'log' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'log' => '{{doc-special|Log}}',
 'all-logs-page' => '{{doc-logpage}}
 Title of [[Special:Log]].',
 'alllogstext' => 'Header of [[Special:Log]]',
+'logempty' => 'Used as warning when there are no items to show.',
 'log-title-wildcard' => '* Appears in: [[Special:Log]]
 * Description: A check box to enable prefix search option',
 'showhideselectedlogentries' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].',
 
 # Special:AllPages
-'allpages' => 'First part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
-
+'allpages' => '{{doc-special|AllPages}}
+First part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].
+The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
 {{Identical|All pages}}',
 'alphaindexline' => 'Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. "from page $1 to page $2". $1 is the source page name. $1 is the target page name.',
 'nextpage' => 'Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.
@@ -4072,6 +4113,7 @@ Title of [[Special:Log]].',
 
 {{Identical|Go}}',
 'allpagesprefix' => "Used for the label of the input box of [[Special:PrefixIndex]]. On this page you can either write 'Name of namespace:string from which to begin display in alphabetical order' in the top box, or you can choose a namespace in the bottom box and put 'string from which to begin display in alphabetical order' in the top box. The result will be the same.",
+'allpagesbadtitle' => 'Used in [[Special:AllPages]], [[Special:PrefixIndex]] and [[Special:RecentChangesLinked]].',
 'allpages-bad-ns' => '* $1 - namespace name',
 'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].',
 
@@ -4088,7 +4130,21 @@ Title of [[Special:Log]].',
 Text displayed in [[Special:Categories]].
 
 In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|unusedcategories}} and {{msg|wantedcategories}}.",
-'special-categories-sort-count' => 'This message is used on [[Special:Categories]] to sort the list by the number of members in the categories.',
+'categoriesfrom' => 'Used as label for the input box in [[Special:Categories]].
+
+This message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.',
+'special-categories-sort-count' => 'Commented out at this time.
+
+This message is used on [[Special:Categories]] to sort the list by the number of members in the categories.
+
+See also:
+* {{msg-mw|Special-categories-sort-abc}}',
+'special-categories-sort-abc' => 'Commented out at this time.
+
+This message is used on [[Special:Categories]] to sort the list by the category name.
+
+See also:
+* {{msg-mw|Special-categories-sort-count}}',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'The message is shown as a link on user contributions page (like [[Special:Contributions/User]]) to the corresponding [[Special:DeletedContributions]] page.
@@ -4131,36 +4187,6 @@ You can apparently use 'URL' instead of 'hostname'.",
 'listusers-blocked' => 'Used on [[Special:ActiveUsers]] when a user has been blocked.
 * $1 is a user name for use with GENDER (optional)',
 
-# Special:ActiveUsers
-'activeusers' => 'Title of [[Special:ActiveUsers]]',
-'activeusers-intro' => 'Used as introduction in [[Special:ActiveUsers]]. Parameters:
-* $1 - number of days (<code>$wgActiveUserDays</code>)',
-'activeusers-count' => "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).
-* $1 is the number of recent actions
-* $2 is the user's name for use with GENDER (optional)
-* $3 is the maximum number of days of the RecentChangesList",
-'activeusers-from' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
-
-identical with {{msg-mw|listusersfrom}}
-
-See also:
-* {{msg-mw|activeusers|legend for the form}}
-* {{msg-mw|activeusers-hidebots|label for checkbox}}
-* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
-'activeusers-hidebots' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
-
-See also:
-* {{msg-mw|activeusers|legend for the form}}
-* {{msg-mw|activeusers-from|label for input box}}
-* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
-'activeusers-hidesysops' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
-
-See also:
-* {{msg-mw|activeusers|legend for the form}}
-* {{msg-mw|activeusers-from|label for input box}}
-* {{msg-mw|activeusers-hidebots|label for checkbox}}',
-'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
-
 # Special:ListGroupRights
 'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
 'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].',
@@ -4216,9 +4242,11 @@ See also:
 * {{msg-mw|Emailuser}}
 * {{msg-mw|Accesskey-t-emailuser}}
 * {{msg-mw|Tooltip-t-emailuser}}',
-'emailuser-title-target' => 'Title of [[Special:EmailUser|special page]] when a user was given to e-mail. Parameters:
-* $1 is a plain text username, used for GENDER.',
-'emailuser-title-notarget' => 'Title of [[Special:EmailUser|special page]] when no user given to e-mail yet',
+'emailuser-title-target' => '{{doc-special|EmailUser|unlisted=1}}
+Used when a user was given to e-mail. Parameters:
+* $1 - a plain text username, used for GENDER.',
+'emailuser-title-notarget' => '{{doc-special|EmailUser|unlisted=1}}
+Used when no user given to e-mail yet.',
 'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
 'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
 
@@ -4282,11 +4310,25 @@ Parameters:
 {{Identical|For $1}}',
 'nowatchlist' => 'Displayed when there is no pages in the watchlist.',
 'watchlistanontext' => '* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
-'watchnologin' => '{{Identical|Not logged in}}',
-'addwatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.',
+'watchnologin' => 'Used as error page title.
+
+The error message for this title is:
+* {{msg-mw|Watchnologintext}}
+{{Identical|Not logged in}}',
+'watchnologintext' => 'Used as error message.
+
+The title for this error is {{msg-mw|Watchnologin}}.',
+'addwatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.
+
+See also:
+* {{msg-mw|Removewatch}}',
 'addedwatchtext' => 'Explanation shown when clicking on the {{msg-mw|watch}} tab.
 
 See also {{msg-mw|addedwatch}}.',
+'removewatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.
+
+See also:
+* {{msg-mw|Addwatch}}',
 'removedwatchtext' => "After a page has been removed from a user's watchlist by clicking the {{msg|unwatch}} tab at the top of an article, this message appears just below the title of the article. $1 is the title of the article. See also {{msg|removedwatch}} and {{msg|addedwatchtext}}.",
 'watch' => '{{doc-actionlink}}
 Name of the Watch tab. Should be in the imperative mood.
@@ -4455,6 +4497,8 @@ Possible value for $CHANGEDORCREATED in the following messages:
 * {{msg|enotif_body}}',
 
 # Delete
+'deletepage' => 'Used as Submit button text.
+{{Identical|Delete page}}',
 'confirm' => 'Submit button text for protection confirmation
 
 {{Identical|Confirm}}',
@@ -4480,8 +4524,8 @@ See also:
 * $1 is a page that was deleted
 * $2 is {{msg-mw|deletionlog}}',
 'dellogpage' => '{{doc-logpage}}
-The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
 
+The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
 {{Identical|Deletion log}}',
 'dellogpagetext' => 'Text in [[Special:Log/delete]].',
 'deletionlog' => 'This message is used to link to the deletion log:
@@ -4567,6 +4611,7 @@ The title for this error message is {{msg-mw|Sessionfailure-title}}.',
 
 # Protect
 'protectlogpage' => '{{doc-logpage}}
+
 Title of [[Special:Log/protect]].',
 'protectlogtext' => 'Text in [[Special:Log/protect]].',
 'protectedarticle' => 'Text describing an action on [[Special:Log]]. $1 is a page title.',
@@ -4621,14 +4666,18 @@ Also used in [[Special:ProtectedPages]] when a page is cascade protected. See ex
 See also:
 *{{msg-mw|Restriction-level-sysop}}
 *{{msg-mw|Restriction-level-autoconfirmed}}',
-'protect-expiring' => 'Used in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
-* $1 is a date and time
-* $2 is a date (optional)
-* $3 is a time (optional)
-
+'protect-expiring' => 'Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
+* $1 - a date and time
+* $2 - a date (optional)
+* $3 - a time (optional)
+If the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.
 {{Identical|Expires $1 (UTC)}}',
 'protect-expiring-local' => '$1 is a timestamp like "22:51, 23 July 2011 (UTC)" depending on the wiki content language.',
+'protect-expiry-indefinite' => 'Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
+
+If the expiry is definite, {{msg-mw|protect-expiring}} is used.',
 'protect-cascade' => 'See [[meta:Protect]] for more information.',
+'protect-cantedit' => 'Used as error message when changing the protection levels of the page.',
 'protect-othertime' => 'Used on the page protection form as label for the following input field (text)
 {{Identical|Other time}}',
 'protect-othertime-op' => 'Used on the page protection form in the drop down menu
@@ -4691,8 +4740,7 @@ See also:
 *{{msg-mw|Restriction-level-autoconfirmed}}",
 
 # Undelete
-'undelete' => 'Name of special page for admins as displayed in [[Special:SpecialPages]].
-
+'undelete' => '{{doc-special|Undelete}}
 See also:
 * {{msg-mw|Undelete}}
 * {{msg-mw|Accesskey-ca-undelete}}
@@ -4734,6 +4782,7 @@ Parameters:
 * $5 - time of the revision
 Example:
 * Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
+'undeleterevision-missing' => 'Used as warning when undeleting the revision.',
 'undelete-nodiff' => 'Used in [[Special:Undelete]].',
 'undeletebtn' => 'Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).
 
@@ -4860,7 +4909,10 @@ See also:
 'nocontribs' => 'Optional parameter: $1 is the user name',
 'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)',
 'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.',
-'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a inputbox to select a specific year to view the edits made in that year, and the earlier years. See also {{msg-mw|month}}.',
+'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.
+
+See also:
+* {{msg-mw|month}}',
 
 'sp-contributions-newbies' => 'Text of radio button on special page [[Special:Contributions]].',
 'sp-contributions-newbies-sub' => "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
@@ -5010,8 +5062,8 @@ See also:
 # Block/unblock
 'autoblockid' => 'Used as name of autoblock, instead of autoblocked IPs. Parameters:
 * $1 - autoblock ID',
-'block' => 'Name of the special page on [[Special:SpecialPages]]',
-'unblock' => 'Name of the special page on [[Special:SpecialPages]]',
+'block' => '{{doc-special|Block}}',
+'unblock' => '{{doc-special|Unblock}}',
 'blockip' => 'The title of the special page [[Special:BlockIP]].
 
 {{Identical|Block user}}',
@@ -5019,6 +5071,12 @@ See also:
 'blockip-legend' => 'Legend/Header for the fieldset around the input form of [[Special:Block]].
 
 {{Identical|Block user}}',
+'blockiptext' => 'Used in the {{msg-mw|Blockip}} form in [[Special:Block]].
+
+This message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.
+
+See also:
+* {{msg-mw|Unblockiptext}}',
 'ipadressorusername' => '{{Identical|IP address or username}}',
 'ipbexpiry' => '{{Identical|Expiry}}',
 'ipbreason' => 'Label of the block reason dropdown in [[Special:BlockIP]] and the unblock reason textfield in [{{fullurl:Special:IPBlockList|action=unblock}} Special:IPBlockList?action=unblock].
@@ -5100,13 +5158,33 @@ The title (subject) for this message is {{msg-mw|Blockipsuccesssub}}.
 
 Parameters:
 * $1 - username, can be used for GENDER',
+'ipb-blockingself' => 'Used as confirmation message in [[Special:Block]].
+
+See also:
+* {{msg-mw|Ipb-confirmhideuser}}',
+'ipb-confirmhideuser' => 'Used as confirmation message in [[Special:Block]].
+
+See also:
+* {{msg-mw|Ipb-blockingself}}',
 'ipb-edit-dropdown' => 'Shown beneath the user block form on the right side. It is a link to {{msg-mw|Ipbreason-dropdown|notext=1}}.
 
 See also:
 * {{msg-mw|Delete-edit-reasonlist}}
 * {{msg-mw|Protect-edit-reasonlist}}',
-'ipb-unblock-addr' => 'Used in [[Special:Block]].
-* $1 - target username',
+'ipb-unblock-addr' => 'Used as page title in [[Special:Block]], if the target user is specified.
+
+Parameters:
+* $1 - target username
+
+See also:
+* {{msg-mw|Ipb-unblock}}',
+'ipb-unblock' => 'Used as page title in [[Special:Block]], if the target user is not specified.
+
+See also:
+* {{msg-mw|Ipb-unblock-addr}}',
+'ipb-blocklist' => 'Used as link text in [[Special:Block]].
+
+The link points to Specil:BlockList.',
 'ipb-blocklist-contribs' => 'Used in [[Special:Block]].
 * $1 - target username',
 'unblockip' => 'Used as legend for the form in [[Special:Unblock]].',
@@ -5131,6 +5209,7 @@ See also:
 See also:
 * {{msg-mw|Unblocked}}
 * {{msg-mw|Unblocked-range}}',
+'blocklist' => '{{doc-special|BlockList}}',
 'ipblocklist' => 'Title of [[Special:Ipblocklist]].',
 'ipblocklist-legend' => 'Used as legend of the form in [[Special:BlockList]].
 
@@ -5216,7 +5295,14 @@ See also {{msg-mw|Block-log-flags-nousertalk}}.
 Part of the log entry of user block in [[Special:BlockList]].
 
 {{Related|Blocklist}}',
-'ipblocklist-empty' => 'Shown on page [[Special:Blocklist]], if no blocks are to be shown.',
+'ipblocklist-empty' => 'Used in [[Special:BlockList]], if the target is not specified.
+
+See also:
+* {{msg-mw|Ipblocklist-no-results}}',
+'ipblocklist-no-results' => 'Used in [[Special:BlockList]], if the target is specified.
+
+See also:
+* {{msg-mw|Ipblocklist-empty}}',
 'blocklink' => "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".
 
 Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
@@ -5241,7 +5327,8 @@ See also:
 * {{msg-mw|sp-contributions-uploads}}
 * {{msg-mw|sp-contributions-logs}}
 * {{msg-mw|sp-contributions-deleted}}
-* {{msg-mw|sp-contributions-userrights}}',
+* {{msg-mw|sp-contributions-userrights}}
+{{Identical|Unblock}}',
 'change-blocklink' => 'Used to name the link on [[Special:Log]].
 
 Also used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
@@ -5315,7 +5402,9 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
+'ipb_expiry_invalid' => 'Used as error message in [[Special:Block]].',
 'ipb_expiry_temp' => 'Warning message displayed on [[Special:BlockIP]] if the option "hide username" is selected but the expiry time is not infinite.',
+'ipb_hide_invalid' => 'Used as error message in [[Special:Block]].',
 'ipb_already_blocked' => '{{Identical|$1 is already blocked}}',
 'ipb-needreblock' => 'Used in [[Special:Block]].
 * $1 - target username',
@@ -5338,7 +5427,8 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
-'blockme' => 'The page title of [[Special:Blockme]], a feature which is disabled by default.',
+'blockme' => '{{doc-special|BlockMe|unlisted=1}}
+This feature is disabled by default.',
 'proxyblocker' => 'Used in [[Special:BlockMe]].
 
 See also:
@@ -5373,6 +5463,8 @@ See also:
 See also:
 * {{msg-mw|Sorbsreason}}
 * {{msg-mw|Sorbs create account_reason}}',
+'xffblockreason' => "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:
+* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
 'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.',
 'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
 'ipbnounblockself' => 'Error message shown when a user without the <tt>unblockself</tt> right tries to unblock themselves.',
@@ -5644,6 +5736,7 @@ See also:
 * $2 - new page title',
 'movepage-max-pages' => 'PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.',
 'movelogpage' => '{{doc-logpage}}
+
 Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
 'movelogpagetext' => "Text on the special page 'Move log'.",
 'movesubpage' => "This is a section header on [[Special:MovePage]], below is a list of subpages.
@@ -5842,6 +5935,7 @@ The reason $1 is one of the following messages:
 * {{msg-mw|Thumbnail-dest-create}}
 * {{msg-mw|Thumbnail dest directory}}
 * {{msg-mw|Thumbnail invalid params}}
+* {{msg-mw|Thumbnail image-missing}}
 * {{msg-mw|Djvu no xml}}
 * {{msg-mw|Djvu page error}}
 * {{msg-mw|Svg-long-error}}
@@ -6173,6 +6267,13 @@ See also:
 * {{msg-mw|Viewsource}}
 * {{msg-mw|Accesskey-ca-viewsource}}
 * {{msg-mw|Tooltip-ca-viewsource}}',
+'tooltip-ca-history' => 'Used as tooltip for {{msg-mw|Vector-view-history}}.
+
+See for example {{canonicalurl:Main_Page|useskin=vector}}Main page?useskin=vector]
+
+See also:
+* {{msg-mw|Vector-view-history}}
+* {{msg-mw|Accesskey-ca-history}}',
 'tooltip-ca-protect' => 'Used as tooltip for {{msg-mw|Protect}}.
 
 See also:
@@ -6492,14 +6593,9 @@ See also:
 # Stylesheets
 'common.css' => '{{optional}}
 CSS applied to all users.',
-'standard.css' => '{{optional}}',
-'nostalgia.css' => '{{optional}}',
 'cologneblue.css' => '{{optional}}',
 'monobook.css' => '{{optional}}
 CSS applied to users using Monobook skin.',
-'myskin.css' => '{{optional}}',
-'chick.css' => '{{optional}}',
-'simple.css' => '{{optional}}',
 'modern.css' => '{{optional}}',
 'vector.css' => '{{optional}}',
 'print.css' => '{{optional}}',
@@ -6514,14 +6610,9 @@ Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobil
 # Scripts
 'common.js' => '{{optional}}
 JS for all users.',
-'standard.js' => '{{optional}}',
-'nostalgia.js' => '{{optional}}',
 'cologneblue.js' => '{{optional}}',
 'monobook.js' => '{{optional}}
 JS for users using Monobook skin.',
-'myskin.js' => '{{optional}}',
-'chick.js' => '{{optional}}',
-'simple.js' => '{{optional}}',
 'modern.js' => '{{optional}}',
 'vector.js' => '{{optional}}',
 'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
@@ -6664,7 +6755,9 @@ Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]
 'pageinfo-firsttime' => 'The date and time the page was created.',
 'pageinfo-lastuser' => 'The last user who edited the page.',
 'pageinfo-lasttime' => 'The date and time the page was last edited.',
-'pageinfo-edits' => 'The total number of times the page has been edited.',
+'pageinfo-edits' => 'Used as label in info page. See [{{canonicalurl:Support|action=info}} example].
+
+This message is followed by the total number of times the page has been edited.',
 'pageinfo-authors' => 'The total number of users who have edited the page.',
 'pageinfo-recent-edits' => 'The number of times the page has been edited recently. $1 is a localised duration (e.g. 9 days).',
 'pageinfo-recent-authors' => 'The number of users who have edited the page recently.',
@@ -6705,14 +6798,8 @@ See also:
 * {{msg-mw|Pageinfo-category-subcats}}',
 
 # Skin names
-'skinname-standard' => '{{optional}}
-{{Identical|Classic}}',
-'skinname-nostalgia' => '{{optional}}',
 'skinname-cologneblue' => '{{optional}}',
 'skinname-monobook' => '{{optional}}',
-'skinname-myskin' => '{{optional}}',
-'skinname-chick' => '{{optional}}',
-'skinname-simple' => '{{optional}}',
 'skinname-modern' => '{{optional}}',
 'skinname-vector' => '{{optional}}',
 
@@ -7031,6 +7118,7 @@ Varient Option for wikis with variants conversion enabled.',
 # Metadata
 'metadata' => 'The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].
 {{Identical|Metadata}}',
+'metadata-help' => 'This message is followed by a table with metadata.',
 'metadata-expand' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.',
 'metadata-collapse' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.',
 'metadata-fields' => '{{doc-important|Do not translate list items, only translate the text! So leave "<code>* make</code>" and the other items exactly as they are.}}
@@ -7215,11 +7303,7 @@ See [[w:Metering_mode|Wikipedia article]] on metering mode.
 'exif-flash' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 See this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.
-
-See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}
+{{Related|Exif-flash}}
 {{Identical|Flash}}',
 'exif-focallength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
@@ -7422,7 +7506,9 @@ This is taken from IPTC-iim 2:135 and XMP's dc:language.
 {{Identical|Category}}',
 'exif-iimsupplementalcategory' => 'Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.',
 'exif-datetimeexpires' => 'Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.',
-'exif-datetimereleased' => 'Earliest date the image (media) can be used. See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
+'exif-datetimereleased' => 'Earliest date the image (media) can be used.
+
+See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
 'exif-originaltransmissionref' => 'This is basically a job id. This could help an individual keep track of for what reason the image was created. See Job Id on page 19 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf',
 'exif-identifier' => 'A formal identifier for the image. Often this is a URL.',
 'exif-lens' => 'Description of lens used. This is taken from aux:Lens XMP property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf',
@@ -7500,6 +7586,18 @@ Lempel-Ziv & Welch algorithm',
 'exif-photometricinterpretation-2' => '{{optional}}',
 'exif-photometricinterpretation-6' => '{{optional}}',
 
+'exif-unknowndate' => 'Used if the Exif date and time is "<code>0000:00:00 00:00:00</code>".
+
+Related Exif attributes:
+* {{msg-mw|Exif-datetime}}
+* {{msg-mw|Exif-datetimeoriginal}}
+* {{msg-mw|Exif-datetimedigitized}}
+* {{msg-mw|Exif-datetimereleased}}
+* {{msg-mw|Exif-datetimeexpires}}
+* {{msg-mw|Exif-gpsdatestamp}}
+* {{msg-mw|Exif-dc-date}}
+* {{msg-mw|Exif-datetimemetadata}}',
+
 'exif-orientation-1' => '0th row: top; 0th column: left
 {{Related|Exif-orientation}}
 {{Identical|Normal}}',
@@ -7626,55 +7724,28 @@ See also:
 'exif-lightsource-255' => '{{Related|Exif-lightsource}}',
 
 # Flash modes
-'exif-flash-fired-0' => 'See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}',
-'exif-flash-fired-1' => 'See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}',
+'exif-flash-fired-0' => '{{Related|Exif-flash}}',
+'exif-flash-fired-1' => '{{Related|Exif-flash}}',
 'exif-flash-return-0' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-return-2' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-return-3' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-mode-1' => 'This is when you have chosen that your camera must use a flash for this picture.
-
-See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-mode-2' => "This is when you have chosen that your camera must ''not'' use a flash for this picture.
-
-See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}",
-'exif-flash-mode-3' => 'See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}',
-'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+{{Related|Exif-flash}}",
+'exif-flash-mode-3' => '{{Related|Exif-flash}}',
+'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+{{Related|Exif-flash}}',
+'exif-flash-redeye-1' => '{{Related|Exif-flash}}',
 
 'exif-focalplaneresolutionunit-2' => 'See also:
 * {{msg-mw|Exif-focalplaneresolutionunit}}',
@@ -7823,7 +7894,8 @@ See also:
 {{Related|Exif-gpsdop}}',
 'exif-gpsdop-moderate' => 'Parameters:
 * $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
-{{Related|Exif-gpsdop}}',
+{{Related|Exif-gpsdop}}
+{{Identical|Moderate}}',
 'exif-gpsdop-fair' => 'Parameters:
 * $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
 {{Related|Exif-gpsdop}}',
@@ -8333,8 +8405,7 @@ Parameters:
 'duplicate-defaultsort' => 'See definition of [[w:Sorting|sort key]] on Wikipedia.',
 
 # Special:Version
-'version' => 'Name of special page displayed in [[Special:SpecialPages]]
-
+'version' => '{{doc-special|Version}}
 {{Identical|Version}}',
 'version-extensions' => 'Header on [[Special:Version]].',
 'version-specialpages' => 'Part of [[Special:Version]].
@@ -8418,7 +8489,8 @@ $1 is the name of the requested file.',
 * $1 - file name',
 
 # Special:SpecialPages
-'specialpages' => 'Display name of link to [[Special:SpecialPages]] shown on all pages in the toolbox, as well as the page title and header of [[Special:SpecialPages]].
+'specialpages' => '{{doc-special|SpecialPages|unlisted=1}}
+Display name of link to [[Special:SpecialPages]] shown on all pages in the toolbox.
 
 See also:
 * {{msg-mw|Specialpages}}
@@ -8426,22 +8498,22 @@ See also:
 * {{msg-mw|Tooltip-t-specialpages}}
 {{Identical|Special page}}',
 'specialpages-note' => 'Footer note for the [[Special:SpecialPages]] page',
-'specialpages-group-maintenance' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-other' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-login' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-changes' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-media' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-users' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-highuse' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-pages' => 'Used on [[Special:SpecialPages]]. Title of the special pages group, containing pages like [[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], [[Special:Disambiguations]], etc.',
-'specialpages-group-pagetools' => 'Title of the special pages group containing special pages like [[Special:MovePage]], [[Special:Undelete]], [[Special:WhatLinksHere]], [[Special:Export]] etc.',
-'specialpages-group-wiki' => 'Title of the special pages group, containing special pages like [[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc.',
-'specialpages-group-redirects' => 'Title of the special pages group, containing special pages that redirect to another location, like [[Special:Randompage]], [[Special:Mypage]], [[Special:Mytalk]], etc.',
-'specialpages-group-spam' => 'Title of the special pages group, containing special pages like (...), etc.',
+'specialpages-group-maintenance' => '{{doc-special-group|like=[[Special:DoubleRedirects]], [[Special:LonelyPages]] and [[Special:WantedPages]]}}',
+'specialpages-group-other' => '{{doc-special-group|like=[[Special:AdminLinks]] and [[Special:BookSources]]}}',
+'specialpages-group-login' => '{{doc-special-group|like=[[Special:UserLogin]]}}',
+'specialpages-group-changes' => '{{doc-special-group|like=[[Special:Log]], [[Special:NewPages]] and [[Special:RecentChanges]]}}',
+'specialpages-group-media' => '{{doc-special-group|like=[[Special:FilePath]], [[Special:MIMESearch]] and [[Special:Upload]]}}',
+'specialpages-group-users' => '{{doc-special-group|like=[[Special:ActiveUsers]], [[Special:Contributions]] and [[Special:ListGroupRights]]}}',
+'specialpages-group-highuse' => '{{doc-special-group|like=[[Special:MostCategories]], [[Special:MostLinked]] and [[Special:MostRevisions]]}}',
+'specialpages-group-pages' => '{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], 
+[[Special:Disambiguations]], etc}}',
+'specialpages-group-pagetools' => '{{doc-special-group|like=[[Special:MovePage]], [[Special:Undelete]], [[Special:WhatLinksHere]], [[Special:Export]] etc}}',
+'specialpages-group-wiki' => '{{doc-special-group|like=[[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc}}',
+'specialpages-group-redirects' => '{{doc-special-group|that=redirect to another location|like=[[Special:Randompage]], [[Special:Mypage]], [[Special:Mytalk]], etc}}',
+'specialpages-group-spam' => '{{doc-special-group}}',
 
 # Special:BlankPage
-'blankpage' => 'Used as page title in [[Special:BlankPage]].
-
+'blankpage' => '{{doc-special|BlankPage|unlisted=1}}
 See also:
 * {{msg-mw|Intentionallyblankpage|text}}',
 'intentionallyblankpage' => 'Text displayed in [[Special:BlankPage]].
@@ -8570,6 +8642,10 @@ See also:
 * stub threshold (appearance tab)
 
 {{Identical|Other}}',
+'htmlform-no' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|No}}',
+'htmlform-yes' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|Yes}}',
 
 # SQLite database support
 'sqlite-has-fts' => 'Shown on [[Special:Version]].
@@ -8580,17 +8656,17 @@ Parameters:
 * $1 - version',
 
 # New logging system
-'logentry-delete-delete' => '{{Logentry}}',
-'logentry-delete-restore' => '{{Logentry}}',
-'logentry-delete-event' => '{{Logentry}}
+'logentry-delete-delete' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-restore' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-event' => '{{Logentry|[[Special:Log/delete]]}}
 {{Logentryparam}}
-* $3 is the name of the log page inside parenthesis',
-'logentry-delete-revision' => '{{Logentry}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision' => '{{Logentry|[[Special:Log/delete]]}}
 {{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
-'logentry-delete-event-legacy' => '{{Logentry}}
-$3 is the name of the log page inside parenthesis',
-'logentry-delete-revision-legacy' => '{{Logentry}}',
+* $5 - the number of affected revisions of the page $3.',
+'logentry-delete-event-legacy' => '{{Logentry|[[Special:Log/delete]]}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision-legacy' => '{{Logentry|[[Special:Log/delete]]}}',
 'logentry-suppress-delete' => "{{Logentry}}
 
 'Hid' is a possible alternative to 'suppressed' in this message.",
@@ -8599,7 +8675,7 @@ $3 is the name of the log page inside parenthesis',
 $3 is the name of the log page inside parenthesis',
 'logentry-suppress-revision' => '{{Logentry}}
 {{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
+* $5 - the number of affected revisions of the page $3.',
 'logentry-suppress-event-legacy' => '{{Logentry}}
 $3 is the name of the log page inside parenthesis',
 'logentry-suppress-revision-legacy' => '{{Logentry}}',
@@ -8643,52 +8719,51 @@ $3 is the name of the log page inside parenthesis',
 * {{msg-mw|logentry-delete-revision}}
 * {{msg-mw|logentry-suppress-event}}
 * {{msg-mw|logentry-suppress-event}}',
-'logentry-move-move' => '{{Logentry}}
+'logentry-move-move' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move-noredirect' => '{{Logentry}}
+'logentry-move-move-noredirect' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir' => '{{Logentry}}
+'logentry-move-move_redir' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir-noredirect' => '{{Logentry}}
+'logentry-move-move_redir-noredirect' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-patrol-patrol' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.',
-'logentry-patrol-patrol-auto' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.
+'logentry-patrol-patrol' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.',
+'logentry-patrol-patrol-auto' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.
 "Automatically" refers to users with autopatrol right who mark revisions automatically patrolled when editing.',
-'logentry-newusers-newusers' => 'Parameters:
-* $1 - user name',
-'logentry-newusers-create' => '{{Logentry}}
+'logentry-newusers-newusers' => '{{Logentry|[[Special:Log/newusers]]}}',
+'logentry-newusers-create' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the gender of the target user.',
-'logentry-newusers-create2' => '{{Logentry}}
+'logentry-newusers-create2' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the name of the user that was created.',
-'logentry-newusers-byemail' => '{{Logentry}}
+'logentry-newusers-byemail' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the name of the user that was created.',
-'logentry-newusers-autocreate' => '{{Logentry}}
+'logentry-newusers-autocreate' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the gender of the target user.',
-'logentry-rights-rights' => '*$1 - username
-*$2 - (see below)
-*$3 - username
-*$4 - list of user groups or {{msg-mw|Rightsnone}}
-*$5 - list of user groups or {{msg-mw|Rightsnone}}
+'logentry-rights-rights' => '* $1 - username
+* $2 - (see below)
+* $3 - username
+* $4 - list of user groups or {{msg-mw|Rightsnone}}
+* $5 - list of user groups or {{msg-mw|Rightsnone}}
 ----
-{{Logentry}}',
-'logentry-rights-rights-legacy' => '*$1 - username
-*$2 - (see below)
-*$3 - username
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-rights-legacy' => '* $1 - username
+* $2 - (see below)
+* $3 - username
 ----
-{{Logentry}}',
-'logentry-rights-autopromote' => '*$1 - username
-*$2 - (see below)
-*$3 - (see below)
-*$4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
-*$5 - comma separated list of new user groups
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-autopromote' => '* $1 - username
+* $2 - (see below)
+* $3 - (see below)
+* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
+* $5 - comma separated list of new user groups
 ----
-{{Logentry}}',
+{{Logentry|[[Special:Log/rights]]}}',
 'rightsnone' => 'Default rights for registered users.
 
 {{Identical|None}}',
index 17fcdef..2fc25b2 100644 (file)
@@ -535,7 +535,7 @@ $1",
 'newmessageslinkplural' => '{{PLURAL:$1|Musuq willaymi|Musuq willaykunam}}',
 'newmessagesdifflinkplural' => 'qayna {{PLURAL:$1|hukchasqapi|hukchasqakunapi}} wakin kaynin',
 'youhavenewmessagesmulti' => 'Musuq willaykunam qhawanayki kachkan $1-pi',
-'editsection' => 'allichay',
+'editsection' => "llamk'apuy",
 'editold' => "llamk'apuy",
 'viewsourceold' => 'pukyu qillqata qhaway',
 'editlink' => "llamk'apuy",
@@ -738,7 +738,7 @@ Huk runa kay willayta mañakurqaptinqa icha yaykuna rimaykita hukchayta manaña
 Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'blocked-mailpassword' => "IP tiyayniykiqa hark'asqam, chayrayku manam saqillanchu yaykuna rimata musuqmanta chaskiyta, millay rurayta hark'anapaq.",
 'eauthentsent' => 'Takyachina e-chaskiqa qusqayki e-chaski imamaytaman kachamusqam. Manaraq huk e-chaskikuna kachamusqa kaptinqa, ñawpaqta e-chaskipi kamachisqakunata qatinaykim tiyan, chiqap e-chaski imamaytaykita takyachinaykipaq.',
-'throttled-mailpassword' => "Huk yaykuna rima yuyachinañam qayna {{PLURAL:$1|huk ura|$1 ura}} mit'api kachamusqam. {{PLURAL:$1|Huk ura|$1 ura}} mit'apiqa hukllam yaykuna rima yuyachina kachasqa kachun millay rurayta hark'anapaq.",
+'throttled-mailpassword' => "Huk yaykuna rima kutichinapaq yuyachina qayna {{PLURAL:$1|huk ura|$1 ura}} mit'api kachamusqañam. {{PLURAL:$1|Huk ura|$1 ura}} mit'apiqa hukllam yaykuna rima yuyachina kachasqa kachun millay rurayta hark'anapaq.",
 'mailerror' => 'E-chaskita kachaspa pantasqa: $1',
 'acct_creation_throttle_hit' => "Qampa IP huchhaykiyuq kachkaq ruraqkunaqa kay wikita watukuspa ñaqha 24 urapi {{PLURAL:$1|rakiqunaykim|$1 rakiqunaykim}} kamarirqanña. Manam atinkichikchu astawan kichayta huklla p'unchawpi chay IP huchhallayuq kaspa.",
 'emailauthenticated' => "E-chaski imamaytaykiqa $2 p'unchawpi, $3 pachapi chiqapchasqañam.",
@@ -785,7 +785,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 
 # Special:PasswordReset
 'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, rakiqunaykipaq willakunayuq e-chaskita chaskinaykipaq.",
+'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
 'passwordreset-legend' => 'Yaykuna rimata kutichiy',
 'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.',
 'passwordreset-pretext' => '{{PLURAL:$1||Qatiqpi kaq willa rakikunamanta huktam yaykuchiy}}',
@@ -796,7 +796,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 'passwordreset-email' => 'E-chaski imamayta:',
 'passwordreset-emailtitle' => '{{SITENAME}}-paq rakiqunamanta willakuna',
 'passwordreset-emailtext-ip' => "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)
-rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
+rakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
 kay e-chaski imamaytayuq kachkan:
 
 $2
@@ -806,7 +806,7 @@ Yaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqa
 icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
 kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
 'passwordreset-emailtext-user' => "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{SITENAME}}-paq ($4)
-rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
+rakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
 kay e-chaski imamaytayuq kachkan:
 
 $2
@@ -817,9 +817,9 @@ icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
 kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
 'passwordreset-emailelement' => "Ruraqpa sutin: $1
 Mit'alla yaykuna rima: $2",
-'passwordreset-emailsent' => 'Yuyachina e-chaskiqa kachasqañam.',
-'passwordreset-emailsent-capture' => 'Yuyachina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
-'passwordreset-emailerror-capture' => 'Yuyachina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
+'passwordreset-emailsent' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam.',
+'passwordreset-emailsent-capture' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
+'passwordreset-emailerror-capture' => 'Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-chaski imamaytata wakinchay',
@@ -2155,15 +2155,6 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayq
 'listusers-noresult' => 'Ruraqqa manam tarisqachu.',
 'listusers-blocked' => "(hark'asqa)",
 
-# Special:ActiveUsers
-'activeusers' => "Llamk'achkaq ruraqkuna",
-'activeusers-intro' => "Kay qatiqpiqa ruraqkunatam rikunki, qhipaq $1 {{PLURAL:$1|p'unchawpi|p'unchawkunapi}} kay wikipi imatapas ruraq.",
-'activeusers-count' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}} ñaqha {{PLURAL:$3|p'unchawpi|$3 p'unchawkunapi}}",
-'activeusers-from' => 'Ruraqkunata rikuchiy, kaywan qallarispa:',
-'activeusers-hidebots' => 'Rurana antachakunata pakay',
-'activeusers-hidesysops' => 'Kamachiqkunata pakay',
-'activeusers-noresult' => 'Ruraqkunataqa manam tarinichu.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Ruraq huñup hayñinkuna',
 'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
@@ -3081,7 +3072,7 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'file-info-gif-looped' => 'muyupayachisqa',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
 'file-info-png-looped' => 'muyupayachisqa',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|kuti|kuti}} pukllasqa',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|kuti}} pukllasqa',
 'file-info-png-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
 'file-no-thumb-animation' => "'''Paqtataq: Saywachasqa allwiyaraykuqa, kay willañiqimanta rikch'achakuna manam kuyuchisqa kanqachu.'''",
 'file-no-thumb-animation-gif' => "'''Paqtataq: Saywachasqa allwiyaraykuqa, kay rikch'a hina k'awchi huyakuyuq GIF rikch'akunamanta rikch'achakuna manam kuyuchisqa kanqachu.'''",
@@ -3813,17 +3804,17 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'sqlite-no-fts' => "$1 mana hunt'a qillqa maskana yanapawan",
 
 # New logging system
-'logentry-delete-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
-'logentry-delete-restore' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
-'logentry-delete-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-delete-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-suppress-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
-'logentry-suppress-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
-'logentry-suppress-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-delete-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
+'logentry-delete-restore' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
+'logentry-delete-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-delete-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-suppress-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
+'logentry-suppress-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
 'revdelete-content-hid' => 'samiq pakasqa',
 'revdelete-summary-hid' => "llamk'apuypa pisichaynin pakasqa",
 'revdelete-uname-hid' => 'ruraqpa sutin pakasqa',
@@ -3832,17 +3823,20 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'revdelete-uname-unhid' => 'ruraqpa sutin rikuchisqa',
 'revdelete-restricted' => "kamachiqkunaman llamk'achisqa saywachanakuna",
 'revdelete-unrestricted' => 'kamachiqkunamanta qichusqa saywachanakuna',
-'logentry-move-move' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
-'logentry-move-move-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
-'logentry-move-move_redir' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
-'logentry-move-move_redir-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
-'logentry-patrol-patrol' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
-'logentry-patrol-patrol-auto' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
-'logentry-newusers-newusers' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create2' => '$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
-'logentry-newusers-byemail' => '$3 sutiyuq rakiqunataqa $1 kamarirqañam, yaykuna rimataq kachasqañam.',
-'logentry-newusers-autocreate' => '$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'logentry-move-move' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
+'logentry-move-move-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
+'logentry-move-move_redir' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
+'logentry-move-move_redir-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
+'logentry-patrol-patrol' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
+'logentry-newusers-newusers' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create2' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
+'logentry-newusers-byemail' => '$3 sutiyuq rakiqunataqa $1 {{GENDER:$2|kamarirqañam}}, yaykuna rimataq kachasqañam.',
+'logentry-newusers-autocreate' => '{{GENDER:$2|}}$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'logentry-rights-rights' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan $4-manta $5-man',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan',
+'logentry-rights-autopromote' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man',
 'rightsnone' => '(-)',
 
 # Feedback
index 5aacdd2..d61739c 100644 (file)
@@ -328,8 +328,6 @@ pe titlul secțiunii (JavaScript)',
 'tog-shownumberswatching' => 'Arată numărul utilizatorilor care urmăresc',
 'tog-oldsig' => 'Semnătură actuală:',
 'tog-fancysig' => 'Tratează semnătura ca wikitext (fără o legătură automată)',
-'tog-externaleditor' => 'Utilizează, în mod implicit, un editor extern (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-externaldiff' => 'Utilizează, în mod implicit, un program extern pentru diferențele între versiuni (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
 'tog-showjumplinks' => 'Activează legăturile de accesibilitate „sari la”',
 'tog-uselivepreview' => 'Folosește previzualizarea în timp real (JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avertizează-mă când uit să descriu modificările',
@@ -344,6 +342,7 @@ pe titlul secțiunii (JavaScript)',
 'tog-showhiddencats' => 'Arată categoriile ascunse',
 'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
 'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
+'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
 
 'underline-always' => 'Întotdeauna',
 'underline-never' => 'Niciodată',
@@ -1080,6 +1079,8 @@ Ea există deja.',
 'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
 'invalid-content-data' => 'Date de conținut invalide',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
+'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
+Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1361,15 +1362,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'powersearch-togglenone' => 'Nimic',
 'search-external' => 'Căutare externă',
 'searchdisabled' => '<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>',
-
-# Quickbar
-'qbsettings' => 'Setări pentru bara rapidă',
-'qbsettings-none' => 'Fără',
-'qbsettings-fixedleft' => 'Fixă, în stânga',
-'qbsettings-fixedright' => 'Fixă, în dreapta',
-'qbsettings-floatingleft' => 'Liberă',
-'qbsettings-floatingright' => 'Plutire la dreapta',
-'qbsettings-directionality' => 'Fixat, în funcție de direcția în care se face scrierea în limba dumneavoastră',
+'search-error' => 'A apărut o eroare în timpul căutării: $1',
 
 # Preferences page
 'preferences' => 'Preferințe',
@@ -1915,7 +1908,6 @@ Pentru securitate optimă, img_auth.php este dezactivat.',
 'http-read-error' => 'S-a produs o eroare în timpul citirii HTTP.',
 'http-timed-out' => 'Cererea HTTP a expirat.',
 'http-curl-error' => 'Eroare la preluarea adresei URL: $1',
-'http-host-unreachable' => 'Adresa URL nu a putut fi accesată.',
 'http-bad-status' => 'A apărut o problemă în timpul solicitării HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2253,15 +2245,6 @@ Necesită cel puțin un domeniu de nivel superior, cum ar fi „*.org”.<br />
 'listusers-noresult' => 'Nici un utilizator găsit.',
 'listusers-blocked' => '(blocat{{GENDER:$1||ă|}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Listă utilizatori activi',
-'activeusers-intro' => 'Aceasta este o listă cu utilizatorii care au avut orice fel de activitate în {{PLURAL:$1|ultima zi|ultimele $1 zile}}.',
-'activeusers-count' => '{{PLURAL:$1|o acțiune|$1 acțiuni|$1 de acțiuni}} în {{PLURAL:$3|ultima zi|ultimele $3 zile|ultimele $3 de zile}}',
-'activeusers-from' => 'Afișează utilizatori începând cu:',
-'activeusers-hidebots' => 'Ascunde roboții',
-'activeusers-hidesysops' => 'Ascunde administratorii',
-'activeusers-noresult' => 'Niciun utilizator găsit.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Permisiuni grupuri de utilizatori',
 'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definite în acest wiki, împreună cu permisiunile de acces asociate.
@@ -2750,6 +2733,7 @@ Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii I
 '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',
+'xffblockreason' => 'O adresă IP prezentă în antetul X-Forwarded-For — fie a dumneavoastră, fie a serverului proxy pe care îl folosiți — a fost blocată. Motivul original al blocării a fost: $1',
 'cant-block-while-blocked' => 'Nu puteți bloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
 'cant-see-hidden-user' => 'Utilizatorul pe care încercați să îl blocați este deja blocat și ascuns. Atata timp cât nu aveți drept de hideuser, nu puteți vedea sau modifica blocarea acestuia.',
 'ipbblocked' => 'Nu puteți bloca sau debloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
@@ -3068,13 +3052,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Stylesheets
 'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
-'standard.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Standard */',
-'nostalgia.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Nostalgia  */',
 'cologneblue.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Cologne Blue */',
 'monobook.css' => '/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/',
-'myskin.css' => '/* CSS plasate aici vor afecta utilizatorii stilului MySkin */',
-'chick.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Chick */',
-'simple.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Simple */',
 'modern.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Modern */',
 'vector.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Vector */',
 'print.css' => '/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */',
@@ -3150,13 +3129,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-category-files' => 'Număr de fișiere',
 
 # Skin names
-'skinname-standard' => 'Clasic',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Albastru de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'StilulMeu',
-'skinname-chick' => 'Șic',
-'skinname-simple' => 'Simplu',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3952,6 +3926,8 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'htmlform-submit' => 'Trimite',
 'htmlform-reset' => 'Anulează modificările',
 'htmlform-selectorother-other' => 'Altul',
+'htmlform-no' => 'Nu',
+'htmlform-yes' => 'Da',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
index 12057d0..0fe019d 100644 (file)
@@ -54,10 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
 'tog-oldsig' => 'Firme esistende:',
 'tog-fancysig' => "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
-'tog-externaleditor' => "Ause n'editore esterne pe default (sulamende pe l'esperte, abbesogne de 'na configurazione speciele sus a 'u combiuter tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors Pe cchiù 'mbormaziune.])",
-'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => 'Abbilite "zumbe a" pe scè sus a le collegaminde',
 'tog-uselivepreview' => "Ause l'andeprime da 'u vive (JavaScript) (Sperimendale)",
 'tog-forceeditsummary' => "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
@@ -72,6 +68,7 @@ $messages = array(
 'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
 'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
 'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
+'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
 
 'underline-always' => 'Sembre',
 'underline-never' => 'Maje',
@@ -835,6 +832,8 @@ Pare proprie ca l'onne scangellete.",
 'content-failed-to-parse' => "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
 'invalid-content-data' => "Condenute d'u date invalide",
 'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
+'editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
+Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
 
 # Content models
 'content-model-wikitext' => 'Uicchiteste',
@@ -1124,15 +1123,7 @@ Prueve mettènne nnande a l'inderrogaziona toje 'u prefisse '''all:''' pe cercà
 'searchdisabled' => "'A ricerche sus a {{SITENAME}} ha state disabbilitete.
 Tu puè cercà ausanne Google.
 Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
-
-# Quickbar
-'qbsettings' => 'Barra veloce',
-'qbsettings-none' => 'Ninde',
-'qbsettings-fixedleft' => 'Fissete a sinistre (Fixed left)',
-'qbsettings-fixedright' => 'Fissete a destre (Fixed right)',
-'qbsettings-floatingleft' => 'Volanne a sinistre (Floating left)',
-'qbsettings-floatingright' => 'Volanne a destre (Floating right)',
-'qbsettings-directionality' => "Corrette, depende da 'a direzionalità d'u script tune e da 'a lènga toje",
+'search-error' => "S'ha verificate 'n'errore mendre ste cercave: $1",
 
 # Preferences page
 'preferences' => 'Me piece accussì',
@@ -1702,7 +1693,6 @@ Pe 'na securezze a uerre proprie, img_auth.php jè disabbilitate.",
 'http-read-error' => "Errore jndr'à letture de l' HTTP",
 'http-timed-out' => 'Richieste HTTP fore timbe.',
 'http-curl-error' => "Errore analizzanne l'URL: $1",
-'http-host-unreachable' => "Non ge riesche a raggiungere l'URL",
 'http-bad-status' => "Ha state 'nu probbleme duranne 'a richieste HTTP: $1, $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2034,15 +2024,6 @@ Onne abbesogne almene de \'nu dominie de levèlle ierte, pe esembie "*.org". <br
 'listusers-noresult' => 'Nisciune utende acchiete.',
 'listusers-blocked' => '(bloccate)',
 
-# Special:ActiveUsers
-'activeusers' => "Liste de l'utinde attive",
-'activeusers-intro' => "Queste jè 'n'elenghe de utinde ca avene fatte certe tipe de attività fine a l'urteme $1 {{PLURAL:$1|sciurne|sciurne}}.",
-'activeusers-count' => "$1 {{PLURAL:$1|cangiamende|cangiaminde}} jndr'à l'urteme {{PLURAL:$3|sciurne}}",
-'activeusers-from' => "Fà vedè l'utinde partenne da:",
-'activeusers-hidebots' => 'Scunne le bot',
-'activeusers-hidesysops' => 'Scunne le amministrature',
-'activeusers-noresult' => 'Nisciune utende acchiate.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Deritte de le gruppe utinde',
 'listgrouprights-summary' => "'A liste ca ste vide ète 'na liste de le gruppe utinde ccreiate sus a sta Uicchi, cu le lore deritte d'accesse associate.
@@ -2550,6 +2531,7 @@ Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbor
 '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}}.
 Tu nonge puè ccrejà 'nu cunde utende",
+'xffblockreason' => "'N'indirizze IP presende jndr'à testate X-Forwarded-For, tutte e doje le tune o 'nu server proxy ca ste ause, onne state bloccate. 'U mutive d'u blocche origgenale ere: $1",
 'cant-block-while-blocked' => 'Tu non ge puè bloccà otre utinde quanne tu si blocchete.',
 'cant-see-hidden-user' => "L'utende ca tu ste pruève a bloccà ha state già bloccate e scunnute. Ce tu non ge tine le deritte ''hideuser'', tu non ge puè vedè o cangià 'u blocche de l'utende.",
 'ipbblocked' => 'Tu non ge puè bloccà o sbloccà otre utinde, purcé tu sì ppure bloccate',
@@ -2870,13 +2852,8 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Stylesheets
 'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
-'standard.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Standard */",
-'nostalgia.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Nostalgie */",
 'cologneblue.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Blu Cologne */",
 'monobook.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
-'myskin.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Personalizzate */",
-'chick.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Purecine */",
-'simple.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Semblice */",
 'modern.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Moderne */",
 'vector.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
 'print.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
@@ -2889,12 +2866,8 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Scripts
 'common.js' => '/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */',
-'standard.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Standard */",
-'nostalgia.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Nostalgie */",
 'cologneblue.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Blu Cologne */",
 'monobook.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
-'myskin.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Personalizzate */",
-'chick.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Purecine */",
 'modern.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Moderne */",
 'vector.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
 'group-autoconfirmed.js' => '/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */',
@@ -2975,13 +2948,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-category-files' => 'Numere de file',
 
 # Skin names
-'skinname-standard' => 'Classeche',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Blu Cologne',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Personalizzate',
-'skinname-chick' => 'Purecine',
-'skinname-simple' => 'Semblice',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vettore',
 
@@ -3981,6 +3949,8 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'htmlform-submit' => 'Conferme',
 'htmlform-reset' => 'Annulle le cangiaminde',
 'htmlform-selectorother-other' => 'Otre',
+'htmlform-no' => 'None',
+'htmlform-yes' => 'Sìne',
 
 # SQLite database support
 'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
index 95b30c3..045f0a7 100644 (file)
@@ -30,6 +30,7 @@
  * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
+ * @author Ekulikovdo
  * @author Eleferen
  * @author Erdemaslancan
  * @author EugeneZelenko
@@ -433,8 +434,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
 'tog-oldsig' => 'Текущая подпись:',
 'tog-fancysig' => 'Собственная вики-разметка подписи (без автоматической ссылки)',
-'tog-externaleditor' => 'Использовать по умолчанию внешний редактор (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'Использовать по умолчанию внешнюю программу сравнения (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
 'tog-showjumplinks' => 'Включить вспомогательные ссылки «перейти к»',
 'tog-uselivepreview' => 'Использовать быстрый предварительный просмотр (JavaScript, экспериментально)',
 'tog-forceeditsummary' => 'Предупреждать, когда не заполнено поле описания правки',
@@ -449,6 +448,7 @@ $messages = array(
 'tog-showhiddencats' => 'Показывать скрытые категории',
 'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
+'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
 
 'underline-always' => 'Всегда',
 'underline-never' => 'Никогда',
@@ -525,7 +525,7 @@ $messages = array(
 'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.',
 'category-article-count' => '{{#ifeq:$2|1|Эта категория содержит только следующую страницу.|Эта категория содержит следующ{{PLURAL:$1|ую $1 страницу|ие $1 страницы|ие $1 страниц}} из $2.}}',
 'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц}}.',
-'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|В этой категории {{PLURAL:$1|показан $1 файл|показано $1 файла|показано $1 файлов}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
+'category-file-count' => '{{#ifeq:$2|1|Эта категория содержит только один файл.|Следующ{{PLURAL:$1|ий $1 файл|ие $1 файла|ие $1 файлов}} из $2 имеющ{{PLURAL:$2|его|их}}ся принадлеж{{PLURAL: ит|ат}} к этой категории.}}',
 'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов}}.',
 'listingcontinuesabbrev' => '(продолжение)',
 'index-category' => 'Индексируемые страницы',
@@ -884,7 +884,7 @@ $2',
 'blocked-mailpassword' => 'Редактирование с вашего IP-адреса запрещено, поэтому заблокирована и функция восстановления пароля.',
 'eauthentsent' => 'На указанный адрес электронной почты отправлено письмо. 
 Следуйте изложенным там инструкциям для подтверждения того, что этот адрес действительно принадлежит вам.',
-'throttled-mailpassword' => 'Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|последнего $1 часа|последних $1 часов|последних $1 часов}} .
+'throttled-mailpassword' => 'Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|последнего часа|последних $1 часов}}.
 Для предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания за $1 {{PLURAL:$1|час|часа|часов}}.',
 'mailerror' => 'Ошибка при отправке почты: $1',
 'acct_creation_throttle_hit' => 'За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|было создано $1 учётных записей участников}}, что является пределом для данного отрезка времени.
@@ -937,7 +937,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Сброс пароля',
-'passwordreset-text' => 'Ð\97аполниÑ\82е Ñ\8dÑ\82Ñ\83 Ñ\84оÑ\80мÑ\83, Ñ\87Ñ\82обÑ\8b Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ð² Ð¿Ð¸Ñ\81Ñ\8cме Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ðµ Ð¾ Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\85 Ð\92аÑ\88ей Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и.',
+'passwordreset-text' => 'ЧÑ\82обÑ\8b Ñ\81бÑ\80оÑ\81иÑ\82Ñ\8c Ñ\81вой Ð¿Ð°Ñ\80олÑ\8c, Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸Ñ\82е Ñ\8dÑ\82Ñ\83 Ñ\84оÑ\80мÑ\83.',
 'passwordreset-legend' => 'Сбросить пароль',
 'passwordreset-disabled' => 'Сбросы пароля отключены на этой вики.',
 'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из частей данных, показанных ниже}}',
@@ -947,33 +947,29 @@ $2',
 'passwordreset-capture-help' => 'Если вы установите данную отметку, то вам будет показано письмо с временным паролем, отправляемое участнику.',
 'passwordreset-email' => 'Адрес электронной почты:',
 'passwordreset-emailtitle' => 'Сведения об учётной записи {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, с IP-адреса $1) запросил напоминание о вашей
-учётной записи в проекте {{SITENAME}} ($4).
-{{PLURAL:$3|Следующая учётная запись связана|Следующие учётные записи связаны}} с этим адресом электронной почты:
+'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).
+С этим адресом электронной почты {{PLURAL:$3|связана следующая учётная запись|связаны следующие учётные записи}}:
 
 $2
 
 {{PLURAL:$3|Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней}}.
-Вы должны представиться системе и выбрать новый пароль.
-Если вы не делали этого запроса или вспомнили свой исходный пароль
-и не желаете его менять, то можете проигнорировать это сообщение
-и продолжить использовать свой старый пароль.',
-'passwordreset-emailtext-user' => 'Участник $1 из проекта {{SITENAME}} запросил напоминание о вашей
-учётной записи в проекте {{SITENAME}} ($4).
-{{PLURAL:$3|Следующая учётная запись связана|Следующие учётные записи связаны}} с этим адресом электронной почты:
+Вы должны представиться системе и выбрать новый пароль. 
+Если вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, 
+то можете проигнорировать это сообщение и продолжить использовать свой старый пароль.',
+'passwordreset-emailtext-user' => 'Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).
+С этим адресом электронной почты {{PLURAL:$3|связана следующая учётная запись|связаны следующие учётные записи}}:
 
 $2
 
 {{PLURAL:$3|Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней}}.
 Вы должны представиться системе и выбрать новый пароль.
-Если вы не делали этого запроса или вспомнили свой исходный пароль
-и не желаете его менять, то можете проигнорировать это сообщение
-и продолжить использовать свой старый пароль.',
+Если вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, 
+то можете проигнорировать это сообщение и продолжить использовать свой старый пароль.',
 'passwordreset-emailelement' => 'Имя участника: $1
 Временный пароль: $2',
-'passwordreset-emailsent' => 'Ð\9fо Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82е Ð±Ñ\8bло Ð¾Ñ\82пÑ\80авлено Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ðµ.',
-'passwordreset-emailsent-capture' => 'Ð\9dиже Ð¿Ñ\80иведено Ð¾Ñ\82пÑ\80авленное Ð¿Ð¸Ñ\81Ñ\8cмо-напоминание.',
-'passwordreset-emailerror-capture' => 'Ð\9dиже Ð¿Ñ\80иведено Ñ\81озданное Ð¿Ð¸Ñ\81Ñ\8cмо-напоминание, ÐµÐ³Ð¾ Ð¾Ñ\82пÑ\80авка Ð½Ðµ Ñ\83далаÑ\81Ñ\8c Ð¿Ð¾ причине: $1',
+'passwordreset-emailsent' => 'Ð\9eÑ\82пÑ\80авлено Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f.',
+'passwordreset-emailsent-capture' => 'Ð\9eÑ\82пÑ\80авлено Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f, Ñ\82екÑ\81Ñ\82 ÐºÐ¾Ñ\82оÑ\80ого Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83видеÑ\82Ñ\8c Ð½Ð¸Ð¶е.',
+'passwordreset-emailerror-capture' => 'Ð\91Ñ\8bло Ñ\81оздано Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f, Ñ\82екÑ\81Ñ\82 ÐºÐ¾Ñ\82оÑ\80ого Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83видеÑ\82Ñ\8c Ð½Ð¸Ð¶Ðµ. Ð\9eднако ÐµÐ³Ð¾ Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82пÑ\80авиÑ\82Ñ\8c Ð¿Ð¾ Ñ\81ледÑ\83Ñ\8eÑ\89ей причине: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Изменить адрес электронной почты',
@@ -1194,6 +1190,8 @@ $2
 'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
 'invalid-content-data' => 'Недопустимые данные',
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
+Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «{{int:prefs-editing}}» ваших настроек.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1474,15 +1472,7 @@ $1",
 'powersearch-togglenone' => 'Ничего',
 'search-external' => 'Внешний поиск',
 'searchdisabled' => 'Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.',
-
-# Quickbar
-'qbsettings' => 'Панель навигации',
-'qbsettings-none' => 'Не показывать',
-'qbsettings-fixedleft' => 'Неподвижная слева',
-'qbsettings-fixedright' => 'Неподвижная справа',
-'qbsettings-floatingleft' => 'Плавающая слева',
-'qbsettings-floatingright' => 'Плавающая справа',
-'qbsettings-directionality' => 'Закреплённая, в зависимости от направления письменности вашего языка',
+'search-error' => 'Произошла ошибка при поиске: $1',
 
 # Preferences page
 'preferences' => 'Настройки',
@@ -2039,7 +2029,6 @@ $1',
 'http-read-error' => 'Ошибка чтения HTTP.',
 'http-timed-out' => 'Истекло время ожидания HTTP-запроса.',
 'http-curl-error' => 'Ошибка обращения к URL: $1',
-'http-host-unreachable' => 'Невозможно обратиться по указанному URL.',
 'http-bad-status' => 'Во время обработки HTTP-запроса обнаружена проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2364,15 +2353,6 @@ $1',
 'listusers-noresult' => 'Не найдено участников.',
 'listusers-blocked' => '(заблокирован{{GENDER:$1||а}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Список активных участников',
-'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|правка|правки|правок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней}}',
-'activeusers-from' => 'Показать участников, начиная с:',
-'activeusers-hidebots' => 'Скрыть ботов',
-'activeusers-hidesysops' => 'Скрыть администраторов',
-'activeusers-noresult' => 'Не найдено участников.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права групп участников',
 'listgrouprights-summary' => 'Ниже представлен список определённых в этой вики групп участников, указаны соответствующие им права доступа.
@@ -2859,6 +2839,7 @@ $1',
 'proxyblocksuccess' => 'Выполнено.',
 'sorbsreason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL.',
 'sorbs_create_account_reason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.',
+'xffblockreason' => 'Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1',
 'cant-block-while-blocked' => 'Вы не можете блокировать других участников, пока вы сами заблокированы.',
 'cant-see-hidden-user' => 'Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас нет разрешения на работу по сокрытию участников, вы не можете просмотреть или изменить данную блокировку.',
 'ipbblocked' => 'Вы не можете блокировать или разблокировать других участников, так как вы сами заблокированы',
@@ -3173,13 +3154,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Размещённый здесь CSS будет применяться ко всем темам оформления */',
-'standard.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Standard */',
-'nostalgia.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Nostalgia */',
 'cologneblue.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Cologne Blue */',
 'monobook.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Monobook */',
-'myskin.css' => '/* Размещённый здесь CSS будет применяться к теме оформления MySkin */',
-'chick.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Chick */',
-'simple.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Simple */',
 'modern.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Modern */',
 'vector.css' => '/* Размещённый здесь CSS будет применяться к векторной теме оформления  */',
 'print.css' => '/* Размещённый здесь CSS будет применяться к версии для печати */',
@@ -3192,13 +3168,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */',
-'standard.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Standard */',
-'nostalgia.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Nostalgia */',
 'cologneblue.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Cologne Blue */',
 'monobook.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */',
-'myskin.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MySkin  */',
-'chick.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Chick */',
-'simple.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Simple */',
 'modern.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Modern */',
 'vector.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */',
 'group-autoconfirmed.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */',
@@ -3280,12 +3251,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Количество файлов',
 
 # Skin names
-'skinname-standard' => 'Классическое',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльнская тоска',
-'skinname-myskin' => 'Своё',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простое',
 'skinname-modern' => 'Современное',
 'skinname-vector' => 'Векторное',
 
@@ -4175,6 +4141,8 @@ MediaWiki распространяется в надежде, что она бу
 'htmlform-submit' => 'Отправить',
 'htmlform-reset' => 'Отменить изменения',
 'htmlform-selectorother-other' => 'Иное',
+'htmlform-no' => 'Нет',
+'htmlform-yes' => 'Да',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддержкой полнотекстового поиска',
@@ -4182,16 +4150,16 @@ MediaWiki распространяется в надежде, что она бу
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} страницу $3',
-'logentry-delete-restore' => '$1 {{GENDER:$1|восстановил|восстановила}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
-'logentry-delete-event-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
-'logentry-delete-revision-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
-'logentry-suppress-delete' => '$1 {{GENDER:$1|подавил|подавила}} страницу $3',
-'logentry-suppress-event' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-suppress-revision' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
-'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
-'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|восстановил|восстановила}} страницу $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавил|подавила}} страницу $3',
+'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
+'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
 'revdelete-content-hid' => 'содержание скрыто',
 'revdelete-summary-hid' => 'описание правки скрыто',
 'revdelete-uname-hid' => 'имя участника скрыто',
@@ -4200,19 +4168,19 @@ MediaWiki распространяется в надежде, что она бу
 'revdelete-uname-unhid' => 'имя участника раскрыто',
 'revdelete-restricted' => 'ограничения применяются к администраторам',
 'revdelete-unrestricted' => 'ограничения сняты для администраторов',
-'logentry-move-move' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4',
-'logentry-move-move-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 без оставления перенаправления',
-'logentry-move-move_redir' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления',
-'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
-'logentry-patrol-patrol' => '$1 {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
-'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
-'logentry-newusers-newusers' => 'Создана учётная запись $1',
-'logentry-newusers-create' => 'Создана учётная запись $1',
+'logentry-move-move' => '$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 без оставления перенаправления',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'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' => 'Автоматически создана учётная запись $1',
-'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
+'logentry-newusers-autocreate' => 'Автоматически создана учётная запись {{GENDER:$2|участника|участницы}} $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3 с $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3',
 'logentry-rights-autopromote' => '$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5',
 'rightsnone' => '(нет)',
 
@@ -4290,6 +4258,6 @@ MediaWiki распространяется в надежде, что она бу
 'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
 
 # Image rotation
-'rotate-comment' => 'Изображение повернуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
+'rotate-comment' => 'Изображение повёрнуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
 
 );
index 1f04880..25f1bef 100644 (file)
@@ -148,8 +148,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Вказати кілько хоснователїв придало сторінку до свого списку слїдованых',
 'tog-oldsig' => 'Існуючій підпис:',
 'tog-fancysig' => 'Хосновати про підпис вікітекст (без автоматічного одказу)',
-'tog-externaleditor' => 'Імпліцітно хосновати екстерный едітор (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-externaldiff' => 'Імпліцітно хосновати проґрам про порівнаваня (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
 'tog-showjumplinks' => 'Актівізовати помічны одказы "перейти дo"',
 'tog-uselivepreview' => 'Хосновати швыдкый нагляд (JavaScript, експеріментално)',
 'tog-forceeditsummary' => 'Упозорнити ня, кідь не є выповнене згорнутя едітованя',
@@ -163,6 +161,7 @@ $messages = array(
 'tog-diffonly' => 'Не вказовати обсяг сторінкы під роздїлом  верзій',
 'tog-showhiddencats' => 'Вказати схованы катеґорії',
 'tog-norollbackdiff' => 'По вернутю зміны не вказовати порівнаня роздїлів',
+'tog-useeditwarning' => 'Упозорнити ня, кідь буду опущати сторінку без уложіня змін',
 
 'underline-always' => 'Все',
 'underline-never' => 'Нїґда',
@@ -251,6 +250,7 @@ $messages = array(
 'newwindow' => '(отворить ся в новім окнї)',
 'cancel' => 'Зрушыти',
 'moredotdotdot' => 'Детайлнїше…',
+'morenotlisted' => 'Дале не є ніч ...',
 'mypage' => 'Сторінка',
 'mytalk' => 'Діскузія',
 'anontalk' => 'Діскузія к тїй IP-адресї',
@@ -550,7 +550,7 @@ $2',
 'gotaccount' => "Уж сьте реґістрованы? '''$1'''.",
 'gotaccountlink' => 'Приголошіня',
 'userlogin-resetlink' => 'Забыли сьте вашы даны на приголошіня?',
-'createaccountmail' => 'елекÑ\82Ñ\80ониÑ\87нов Ð¿Ð¾Ñ\88Ñ\82ов',
+'createaccountmail' => 'СÑ\85оÑ\81новаÑ\82и Ð´Ð¾Ñ\87аÑ\81не Ð³ÐµÑ\81ло Ñ\82а Ð·Ð°Ð³Ð½Ð°Ñ\82и Ð³Ð¾ Ð½Ð° Ð½Ð¸Ð¶Ðµ Ð½Ð°Ð¿Ð¸Ñ\81анÑ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83',
 'createaccountreason' => 'Причіна:',
 'badretype' => 'Вами написаны гесла не сугласять.',
 'userexists' => 'Уведжене імя хоснователя ся уж хоснує.
@@ -593,8 +593,8 @@ $2',
 'blocked-mailpassword' => 'Вашій IP адресї была заблокована можность едітації і сучасно з тым є заблокована функція про засланя нового гесла.',
 'eauthentsent' => 'На задану адресу електронічной пошты было послане потверджіня,
 Передтым як вам на тоту адресу буде мочі быти засылана далша пошта, слїдуйте інштрукції в ел. пошті, жебы сьте потвердили, же тота адреса справды належыть вам.',
-'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð±Ñ\96гом Ñ\83плÑ\8bнÑ\83лÑ\8bÑ\85 $1 Ð³Ð¾Ð´Ð¸Ð½.
\93есло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
+'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð¿Ñ\96д Ñ\87аÑ\81 {{PLURAL:$1|оÑ\81Ñ\82аÑ\82нÑ\91й Ð³Ð¾Ð´Ð¸Ð½Ñ\8b|оÑ\81Ñ\82аÑ\82нÑ\97Ñ\85 $1 Ð³Ð¾Ð´Ð¸Ð½}}.
\96ебÑ\8b Ñ\81Ñ\8f Ñ\82о Ð½Ðµ Ð·Ð»Ð¾Ð²Ð¶Ñ\8bвало Ñ\82а Ð³есло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
 'mailerror' => 'Хыба засыланя ел. пошты: $1',
 'acct_creation_throttle_hit' => 'Хоснователї приходячі з вашой IP адресы уж днесь створили {{PLURAL:$1|конто|конта|конт}}, што є дозволене максімум. Зато теперь не є дозволено з той IP адресы закладати далшы конта.',
 'emailauthenticated' => 'Адреса вашой ел. пошты была овірена дня $2 о $3.',
@@ -621,6 +621,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'Незнама хыба у PHP mail() функції',
 'user-mail-no-addy' => 'Проба одослати електронічну пошту без імейловой адресы.',
+'user-mail-no-body' => 'Спроба послати порожнїй або барз куртый імейл.',
 
 # Change password dialog
 'resetpass' => 'Змінити гесло',
@@ -641,7 +642,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Ресет гесла',
-'passwordreset-text' => 'Ð\92Ñ\8bповнÑ\8cÑ\82е Ñ\82оÑ\82 Ñ\84оÑ\80мÑ\83лаÑ\80Ñ\8c, Ð¶ÐµÐ±Ñ\8b Ð¾Ð±Ñ\82Ñ\80имаÑ\82и  Ð¿Ñ\80ипомÑ\8fнÑ\83Ñ\82Ñ\8f Ð´ÐµÑ\82айлÑ\96в Ð²Ð°Ñ\88ого ÐºÐ¾Ð½Ñ\82а',
+'passwordreset-text' => 'Ð\92Ñ\8bпиÑ\88Ñ\82е Ñ\82оÑ\82 Ñ\84оÑ\80мÑ\83лаÑ\80Ñ\8c, Ð¶ÐµÐ±Ñ\8b Ñ\81Ñ\8f Ð²Ð°Ð¼ Ð¼Ð¾Ð³Ð»Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82и Ð³ÐµÑ\81ло',
 'passwordreset-legend' => 'Знову наставити гесло',
 'passwordreset-disabled' => 'Зновунаставлїня гесла є на тій вікі заказане',
 'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
@@ -877,6 +878,8 @@ $2
 'content-failed-to-parse' => 'Не вдало ся проаналізовати $2 як тіп $1: $3',
 'invalid-content-data' => 'Неприпустны даны',
 'content-not-allowed-here' => 'Обсяг «$1» недозволеный на сторінцї [[$2]]',
+'editwarning-warning' => 'Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.
+Кідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1159,15 +1162,6 @@ $1",
 'search-external' => 'Екстерне гляданя',
 'searchdisabled' => '<p>Перебачте. Повнотекстове гляданя є дочасно недоступне. Затля можете спробовати гляданя Google; є але можне, же ёго резултаты не мусять быти актуалны.</p>',
 
-# Quickbar
-'qbsettings' => 'Панел навіґації',
-'qbsettings-none' => 'Жадный',
-'qbsettings-fixedleft' => 'Лежыть влїво',
-'qbsettings-fixedright' => 'Лежыть вправо',
-'qbsettings-floatingleft' => 'Плаваюча влїво',
-'qbsettings-floatingright' => 'Плаваюча вправо',
-'qbsettings-directionality' => 'Певный, в залежности на напрями вашого письма',
-
 # Preferences page
 'preferences' => 'Наставлїня',
 'mypreferences' => 'Наставлїня',
@@ -1702,7 +1696,6 @@ $1',
 'http-read-error' => 'Хыба чітаня HTTP.',
 'http-timed-out' => 'Час про HTTP пожадавкы уплинув.',
 'http-curl-error' => 'Хыба при чітаню з URL: $1',
-'http-host-unreachable' => 'Не вдало ся досягнути URL.',
 'http-bad-status' => 'Під час HTTP пожадавкы притрафив ся проблем: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2019,15 +2012,6 @@ $1',
 'listusers-noresult' => 'Ненайдженый жаден хоснователь.',
 'listusers-blocked' => '({{GENDER:$1|заблокованый|заблокована|заблокованый}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Список актівных хоснователїв',
-'activeusers-intro' => 'Тото є список хоснователїв, котры были даяк актівны за {{plural:$1|остатнїй день|остатных $1 днїв}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|едітованя|едітованя|едітовань}} бігом {{PLURAL:$3|остатнёго дня|остатнїх  $3 днїв}}',
-'activeusers-from' => 'Вказати хоснователїв, што ся зачінають на:',
-'activeusers-hidebots' => 'Сховати ботів',
-'activeusers-hidesysops' => 'Сховати адміністраторів',
-'activeusers-noresult' => 'Ненайдженый жаден хоснователь.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права ґруп хоснователїв',
 'listgrouprights-summary' => 'Тото є список ґруп хоснователїв дефінованых на тій вікіi і&nbsp;їх приступовых прав.
index 6f30d2a..10337e8 100644 (file)
@@ -786,6 +786,7 @@ You may ignore this message, if this account was created in error.',
 # Email sending
 'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
 'user-mail-no-addy' => 'ईपत्रसङ्केतं विना ईपत्रप्रेषणस्य प्रयासः कृतः ।',
+'user-mail-no-body' => 'भवता खलु विद्युत्पत्रं रिक्ततया अथवा अतिलघुरूपेण प्रेषितुं चेष्टितम्।',
 
 # Change password dialog
 'resetpass' => 'कूटशब्दः परिवर्त्यताम्',
@@ -1855,7 +1856,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'http-read-error' => 'HTTP पठनदोषः।',
 'http-timed-out' => 'HTTP अभ्यर्थनं कालातीतम् ।',
 'http-curl-error' => 'दोषाहरणस्य URL: $1',
-'http-host-unreachable' => 'URL प्राप्तुं न शक्यते ।',
 'http-bad-status' => 'HTTP : $1 $2अभ्यर्थने समस्या आसीत् ।',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2014,6 +2014,9 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 एतानि यथार्थविषैः योजनीयानि । <br />
 यदि कोऽपि पुटेन प्रकृतिं प्रयोजयति यः  [[MediaWiki:Disambiguationspage]] इत्यनेन अनुबद्धः  ससन्दिग्धपुटम् इति उच्यते ।',
 
+'pageswithprop' => 'प्रगुणविशेषयुतानि पृष्ठानि',
+'pageswithprop-legend' => 'प्रगुणविशेषयुतानि पृष्ठानि',
+
 'doubleredirects' => 'दुगुनी-अनुप्रेषिते',
 'doubleredirectstext' => 'एतत्पुटं तेषां पुटानां सूची अस्ति यानि अन्यपुनर्निदेशितपुटानि प्रति पुनरिदेशितानि सन्ति । 
 प्रत्येकं पङ्क्तिः प्रथमद्वितीयपुनर्निदेशम् अन्तर्गता । द्वितीयपुनर्निदेशः लक्ष्यं यत् वास्तवं लक्ष्यपुटं प्रथमं प्रदर्शितम् । 
@@ -2177,15 +2180,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'listusers-noresult' => 'योजकः न प्राप्तः ।',
 'listusers-blocked' => 'अवरुद्धम् ।',
 
-# Special:ActiveUsers
-'activeusers' => 'सक्रिययोजकानाम् आवली ।',
-'activeusers-intro' => 'एषा तु गतेषु $1 {{PLURAL:$1|दिनेषु}} कृतकार्याणां योजकाना आवली ।',
-'activeusers-count' => '$1 {{PLURAL:$1|सम्पादनानि}} गतेषु $3 {{PLURAL:$3|दिनेषु}} कृतानि  ।',
-'activeusers-from' => 'एतस्मात् आरभमाणान् योजकान् दर्शयतु ।',
-'activeusers-hidebots' => 'स्वयं चालकान् गोपयतु ।',
-'activeusers-hidesysops' => 'प्रशासकान् गोपयतु ।',
-'activeusers-noresult' => 'योजकः न प्राप्तः ।',
-
 # Special:ListGroupRights
 'listgrouprights' => 'योजकसमूहाधिकाराः ।',
 'listgrouprights-summary' => 'अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]',
@@ -3043,14 +3037,11 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'pageinfo-category-info' => 'वर्गविषयकसूचना',
 'pageinfo-category-pages' => 'पृष्ठानां सङ्ख्या',
 'pageinfo-category-subcats' => 'उपवर्गानां सङ्ख्या',
+'pageinfo-category-files' => 'सञ्चिकानां सङ्ख्या',
 
 # Skin names
-'skinname-standard' => 'पूर्व',
-'skinname-nostalgia' => 'पुराण',
 'skinname-cologneblue' => 'नील',
 'skinname-monobook' => 'पुस्तक',
-'skinname-myskin' => 'मे चर्मन्',
-'skinname-chick' => 'Chick',
 
 # Patrolling
 'markaspatrolleddiff' => 'आरक्षितमिति अङ्कयतु ।',
index 1474df1..c7480d1 100644 (file)
@@ -1219,7 +1219,7 @@ $1",
 'search-interwiki-default' => '$1 වෙතින් ප්‍රතිඵල:',
 'search-interwiki-more' => '(තවත්)',
 'search-relatedarticle' => 'සහසම්බන්ධිත',
-'mwsuggest-disable' => 'AJAX ඇඟවිලි අක්‍රීය කරන්න',
+'mwsuggest-disable' => 'සෙවුම් යෝජනා අක්‍රීය කරන්න',
 'searcheverything-enable' => 'සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න',
 'searchrelated' => 'ආශ්‍රිත',
 'searchall' => 'සියල්ල',
@@ -1242,14 +1242,6 @@ $1",
 මේ අතරතුර ඔබ හට ගූගල් ඔස්සේ ගවේෂණය කල හැක.
 {{SITENAME}} අන්තර්ගතය පිළිබඳ ඔවුන්ගේ සූචි යල් පැන ගොස් ඇතිවා විය හැකි බව සටහන් කර ගන්න.',
 
-# Quickbar
-'qbsettings' => 'යුහුතීරුව',
-'qbsettings-none' => 'කිසිවක් නොමැත',
-'qbsettings-fixedleft' => 'ස්ථාවර වම',
-'qbsettings-fixedright' => 'ස්ථාවර දකුණ',
-'qbsettings-floatingleft' => 'ප්ලාවක වම',
-'qbsettings-floatingright' => 'ප්ලාවක දකුණ',
-
 # Preferences page
 'preferences' => 'අභිරුචි',
 'mypreferences' => 'අභිරුචීන්',
@@ -1799,7 +1791,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
 'http-read-error' => 'HTTP කියැවුම් දෝෂය.',
 'http-timed-out' => 'HTTP අයැදුම සඳහා වූ කාලය ඉක්මව ඇත.',
 'http-curl-error' => 'අන්තර්ජාල ලිපිනය පමුණුවාගෙන ඒමේ දෝෂය : $1',
-'http-host-unreachable' => 'අන්තර්ජාල ලිපිනය වෙත සේන්දු විය නොහැකි විය',
 'http-bad-status' => 'HTTP ආයාචනයෙහිදී ගැටළුවක් පැන නැගුනි: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2110,15 +2101,6 @@ When filtered by user, only files where that user uploaded the most recent versi
 'listusers-noresult' => 'පරිශීලකයෙකු සොයාගත නොහැකි විය.',
 'listusers-blocked' => '(වාරණය කොට)',
 
-# Special:ActiveUsers
-'activeusers' => 'සක්‍රීය පරිශීලකයන් ලැයිස්තුව',
-'activeusers-intro' => 'මෙය පසුගිය $1 {{PLURAL:$1|දිනය|දින}}තුළ යම් ක්‍රියාකාරකමක් කළ පරිශීලකයන්ගේ ලැයිස්තුවකි.',
-'activeusers-count' => '{{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1 ක්}} අවසන් {{PLURAL:$3|දිනය|දින $3}} තුළ',
-'activeusers-from' => 'මෙයින් ඇරඹෙන පරිශීලකයන් පෙන්වන්න:',
-'activeusers-hidebots' => ' bots සඟවන්න',
-'activeusers-hidesysops' => 'පරිපාලකයින් සඟවන්න',
-'activeusers-noresult' => 'කිසිදු පරිශීලකයෙකු හමුනොවිණි.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'පරිශීලක කාණ්ඩ හිමිකම්',
 'listgrouprights-summary' => 'මෙම විකියේ අර්ථදක්වා ඇති පරිශීලක කාණ්ඩ ලැයිස්තුවක් ඔවුනට අදාළ ප්‍රවේශ හිමිකම්ද සමගින් මෙහි පහත ලැයිස්තුගත කොට ඇත.
@@ -2174,7 +2156,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'usermessage-editor' => 'පද්ධති පණිවුඩ කරු',
 
 # Watchlist
-'watchlist' => 'මà\9cà·\9a à¶¸à·\94ර-ලැයිස්තුව',
+'watchlist' => 'මà·\94රලැයිස්තුව',
 'mywatchlist' => 'මුර-ලැයිස්තුව',
 'watchlistfor2' => '$1 සඳහා ($2)',
 'nowatchlist' => 'ඔබගේ මුර-ලැයිස්තුවේ කිසිදු අයිතමයක් නොමැත.',
@@ -2915,26 +2897,16 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 
 # Stylesheets
 'common.css' => '/* මෙහි CSS  බහාලීම සියළු ඡවියයන් භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'standard.css' => '/* මෙහි CSS  බහාලීම සම්මත ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'nostalgia.css' => '/* මෙහි CSS  බහාලීම පිළිසැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'cologneblue.css' => '/* මෙහි CSS  බහාලීම "Cologne Blue" ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'monobook.css' => '/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'myskin.css' => '/* මෙහි CSS  බහාලීම මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'chick.css' => '/* මෙහි CSS  බහාලීම හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'simple.css' => '/* මෙහි CSS  බහාලීම සරල ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'modern.css' => '/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'print.css' => '/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */',
 'handheld.css' => '/* මෙහි බහාලන CSS විසින් $wgHandheldStyle හි වින්‍යාසකෙරෙන ජවිය මත පදනම් වූ අතේ ගෙන යා හැකි උපකරණ වලට බලපෑම් කල හැක*/',
 
 # Scripts
 'common.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */',
-'standard.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සම්මත ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'nostalgia.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් පිළි සැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'cologneblue.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'monobook.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'myskin.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'chick.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'simple.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සරල ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'modern.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 
 # Metadata
index 06b5763..3e6e677 100644 (file)
@@ -1264,15 +1264,6 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 Medtem lahko iščete preko Googla.
 Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.',
 
-# Quickbar
-'qbsettings' => 'Nastavitve hitre vrstice',
-'qbsettings-none' => 'Brez',
-'qbsettings-fixedleft' => 'Levo nepomično',
-'qbsettings-fixedright' => 'Desno nepomično',
-'qbsettings-floatingleft' => 'Levo leteče',
-'qbsettings-floatingright' => 'Desno leteče',
-'qbsettings-directionality' => 'Stalno, odvisno od usmerjenosti pisave vašega jezika',
-
 # Preferences page
 'preferences' => 'Nastavitve',
 'mypreferences' => 'Nastavitve',
@@ -1838,7 +1829,6 @@ Za optimalno varnost je img_auth.php onemogočen.',
 'http-read-error' => 'Napaka branja HTTP.',
 'http-timed-out' => 'Zahteva HTTP je potekla.',
 'http-curl-error' => 'Napaka pri doseganju URL: $1',
-'http-host-unreachable' => 'Ni mogoče doseči URL.',
 'http-bad-status' => 'Med zahtevo HTTP je prišlo do težave: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2167,15 +2157,6 @@ Zahtevana je vsaj najvišja domena, na primer »*.org«.<br />
 'listusers-noresult' => 'Ni najdenih uporabnikov.',
 'listusers-blocked' => '(blokiran)',
 
-# Special:ActiveUsers
-'activeusers' => 'Seznam aktivnih uporabnikov',
-'activeusers-intro' => 'Seznam uporabnikov, ki so bili kakor koli aktivni v {{PLURAL:$1|zadnjem $1 dnevu|zadnjih $1 dneh}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}',
-'activeusers-from' => 'Prikaži uporabnike začenši z:',
-'activeusers-hidebots' => 'Skrij bote',
-'activeusers-hidesysops' => 'Skrij administratorje',
-'activeusers-noresult' => 'Noben uporabnik ni bil najden.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Pravice uporabniških skupin',
 'listgrouprights-summary' => 'Tu je na razpolago seznam uporabniških skupin na tem wikiju z navedbo dodeljenih pravic dostopa.
@@ -2672,6 +2653,7 @@ Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnik
 '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.',
+'xffblockreason' => 'IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1',
 'cant-block-while-blocked' => 'Ne morete blokirati drugih uporabnikove, medtem ko ste sami blokirani.',
 'cant-see-hidden-user' => 'Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.
 Ker nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.',
index 1a9216a..72743f9 100644 (file)
@@ -626,8 +626,8 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
 'editing' => 'Waxaad badalaysaa $1',
 'creating' => 'Sameyta $1',
-'editingsection' => 'Waxaa wax ka badaleysaa $1 (qeyb yar)',
-'editingcomment' => 'Waxaa wax ka badaleysaa $1 (qeyb yar)',
+'editingsection' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
+'editingcomment' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
 'editconflict' => 'Isku dhac badalaadka: $1',
 'yourtext' => 'Qoraalkaaga',
 'editingold' => "'''DIGNIIN: Waxaad wax ka bedeli rabtaa boggan caddadkiisa duqoobay.
index 7be0c36..84a2763 100644 (file)
@@ -489,8 +489,7 @@ $1",
 'viewsourceold' => 'shiko tekstin',
 'editlink' => 'redakto',
 'viewsourcelink' => 'Shiko tekstin',
-'editsectionhint' => 'Redaktoni seksionin:
-Edit section: $1',
+'editsectionhint' => 'Redaktoni seksionin: $1',
 'toc' => 'Përmbajtje',
 'showtoc' => 'trego',
 'hidetoc' => 'fshih',
@@ -1796,7 +1795,6 @@ Për siguri optimale, img_auth.php është çaktivizuar.',
 'http-read-error' => 'Gabim në leximin e HTTP.',
 'http-timed-out' => 'Kërkesës HTTP i kaloi koha.',
 'http-curl-error' => 'Gabim gjatë gjetjes së URL-së: $1',
-'http-host-unreachable' => 'Nuk mund të lidheni me adresën URL.',
 'http-bad-status' => 'Ndodhi një problem gjatë kërkesës HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2112,15 +2110,6 @@ Protokolle të mbështetura: <code>$1<code> (mos shtoni ndonjërin nga këta në
 'listusers-noresult' => "Asnjë përdorues s'u gjet.",
 'listusers-blocked' => '(Bllokuar)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista e përdoruesve aktivë',
-'activeusers-intro' => 'Kjo është një listë e përdoruesve që kanë qenë aktivë për $1 {{PLURAL:$1|ditë|ditë}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|redaktim|redaktime}} në {{PLURAL:$3|ditën|$3 ditët}} e fundit',
-'activeusers-from' => 'Trego përdoruesit duke filluar prej te:',
-'activeusers-hidebots' => 'Fshih robotët',
-'activeusers-hidesysops' => 'Fshih administratorët',
-'activeusers-noresult' => 'Asnjë përdorues nuk u gjet.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Grupime përdoruesish me privilegje',
 'listgrouprights-summary' => 'Më poshtë jepet grupimi i përdoruesve sipas privilegjeve që ju janë dhënë në këtë wiki. Më shumë informacion rreth privilegjeve në veçanti mund të gjendet [[{{MediaWiki:Listgrouprights-helppage}}|këtu]].',
@@ -2959,8 +2948,6 @@ Ju lutemi provoni përsëri.',
 'pageinfo-authors' => 'Numri i autorëve të veçantë',
 
 # Skin names
-'skinname-standard' => 'Standarte',
-'skinname-nostalgia' => 'Nostalgjike',
 'skinname-cologneblue' => 'Kolonjë Blu',
 
 # Patrolling
index 3b2b042..8058926 100644 (file)
@@ -556,7 +556,7 @@ $messages = array(
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
 'vector-view-view' => 'Читај',
-'vector-view-viewsource' => 'Изворник',
+'vector-view-viewsource' => 'Изворни код',
 'actions' => 'Радње',
 'namespaces' => 'Именски простори',
 'variants' => 'Варијанте',
@@ -670,7 +670,7 @@ $1',
 'editsection' => 'уреди',
 'editsection-brackets' => '[$1]',
 'editold' => 'уреди',
-'viewsourceold' => 'изворник',
+'viewsourceold' => 'изворни код',
 'editlink' => 'уреди',
 'viewsourcelink' => 'Извор',
 'editsectionhint' => 'Уредите одељак „$1“',
@@ -774,7 +774,7 @@ $1',
 'wrong_wfQuery_params' => 'Неисправни параметри за wfQuery()<br />
 Функција: $1<br />
 Упит: $2',
-'viewsource' => 'Изворник',
+'viewsource' => 'Изворни код',
 'viewsource-title' => 'Приказ извора странице $1',
 'actionthrottled' => 'Радња је успорена',
 'actionthrottledtext' => 'У циљу борбе против непожељних порука, ограничене су вам измене у одређеном времену, а управо сте прешли то ограничење. Покушајте поново за неколико минута.',
@@ -2385,15 +2385,6 @@ $1',
 'listusers-noresult' => 'Корисник није пронађен.',
 'listusers-blocked' => '({{GENDER:$1|блокиран|блокирана|блокиран}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Списак активних корисника',
-'activeusers-intro' => 'Ово је списак корисника који су били активни {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|измена|измене|измена}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}',
-'activeusers-from' => 'Прикажи кориснике почев од:',
-'activeusers-hidebots' => 'Сакриј ботове',
-'activeusers-hidesysops' => 'Сакриј администраторе',
-'activeusers-noresult' => 'Корисник није пронађен.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права корисничких група',
 'listgrouprights-summary' => 'Следи списак корисничких група на овом викију, заједно с правима приступа.
index e6ce2c8..70f3748 100644 (file)
@@ -350,9 +350,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Visa antalet användare som bevakar',
 'tog-oldsig' => 'Nuvarande signatur:',
 'tog-fancysig' => 'Rå signatur som wikitext (utan en automatisk länk)',
-'tog-externaleditor' => 'Använd extern editor som standard (endast för avancerade användare, speciella inställningar på din dator krävs. [//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-externaldiff' => 'Använd externt diff-verktyg som förval (endast för avancerade användare, kräver speciella inställningar i din dator.
-[//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
 'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
 'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (Javascript, på försöksstadiet)',
 'tog-forceeditsummary' => 'Påminn mig om jag inte fyller i en redigeringskommentar',
@@ -367,6 +364,7 @@ $messages = array(
 'tog-showhiddencats' => 'Visa dolda kategorier',
 'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
+'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldrig',
@@ -1092,6 +1090,8 @@ Den finns redan.',
 'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
 'invalid-content-data' => 'Ogiltig innehållsdata',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
+Om du är inloggad kan du slå av den här varningen under "{{int:prefs-editing}}" i dina inställningar.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1377,15 +1377,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchdisabled' => 'Sökfunktionen på {{SITENAME}} är avstängd.
 Du kan istället göra sökningar med hjälp av Google.
 Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
-
-# Quickbar
-'qbsettings' => 'Snabbmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast vänster',
-'qbsettings-fixedright' => 'Fast höger',
-'qbsettings-floatingleft' => 'Flytande vänster',
-'qbsettings-floatingright' => 'Flytande höger',
-'qbsettings-directionality' => 'Fast, beroende på riktningen av ditt skript och språk',
+'search-error' => 'Ett fel uppstod under sökningen: $1',
 
 # Preferences page
 'preferences' => 'Inställningar',
@@ -1942,7 +1934,6 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'http-read-error' => 'HTTP-läsfel.',
 'http-timed-out' => 'Time out för HTTP-begäran.',
 'http-curl-error' => 'Fel vid hämtning av URL: $1',
-'http-host-unreachable' => 'URL:en kunde inte nås.',
 'http-bad-status' => 'Det uppstod ett problem under HTTP-begäran: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2265,15 +2256,6 @@ Det krävs åtminstone en toppdomän, t.ex. "*.org".<br />
 'listusers-noresult' => 'Ingen användare hittades.',
 'listusers-blocked' => '(blockerad)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista över aktiva användare',
-'activeusers-intro' => 'Detta är en lista på användare som har haft någon form av aktivitet inom de senaste $1 {{PLURAL:$1|dygnet|dygnen}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|handling|handlingar}} {{PLURAL:$3|det senaste dygnet|de senaste $3 dygnen}}',
-'activeusers-from' => 'Visa användare från och med:',
-'activeusers-hidebots' => 'Göm botar',
-'activeusers-hidesysops' => 'Dölj administratörer',
-'activeusers-noresult' => 'Inga användare funna.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Behörigheter för användargrupper',
 'listgrouprights-summary' => 'Följande lista visar vilka användargrupper som är definierade på den här wikin och vilka behörigheter grupperna har.
@@ -2762,6 +2744,7 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
 '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',
+'xffblockreason' => 'En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1',
 'cant-block-while-blocked' => 'Du kan inte blockera andra användare medan du är blockerad.',
 'cant-see-hidden-user' => 'Användaren du försöker blockera är redan blockerad och gömd. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.',
 'ipbblocked' => 'Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad',
@@ -3074,13 +3057,8 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 
 # Stylesheets
 'common.css' => '/* CSS som skrivs här påverkar alla skal */',
-'standard.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Standard */',
-'nostalgia.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Nostalgi */',
 'cologneblue.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Cologne blå */',
 'monobook.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */',
-'myskin.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Mitt utseende */',
-'chick.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Chick */',
-'simple.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Enkel */',
 'modern.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Modern */',
 'vector.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */',
 'print.css' => '/* CSS som skrivs här kommer att påverka utskriftsversionen */',
@@ -3093,13 +3071,8 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 
 # Scripts
 'common.js' => '/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */',
-'standard.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Standard */',
-'nostalgia.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Nostalgi */',
 'cologneblue.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Cologne blå */',
 'monobook.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Monobook */',
-'myskin.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Mitt utseende */',
-'chick.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Chick */',
-'simple.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Enkel */',
 'modern.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Modern */',
 'vector.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Vector */',
 'group-autoconfirmed.js' => '/* JavaScript här kommer att laddas för bekräftade användare */',
@@ -3179,13 +3152,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Cologne blå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mitt utseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3989,6 +3957,8 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'htmlform-submit' => 'Spara',
 'htmlform-reset' => 'Ogör ändringar',
 'htmlform-selectorother-other' => 'Andra',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
index 2a7c956..30279d0 100644 (file)
@@ -1915,15 +1915,6 @@ Itifaki zinazoungwa mkono: <code>$1</code> (usiongeza hizi unapotafuta).',
 'listusers-noresult' => 'Mtumiaji hakupatikana.',
 'listusers-blocked' => '(imezuiwa)',
 
-# Special:ActiveUsers
-'activeusers' => 'Orodha ya watumiaji hai',
-'activeusers-intro' => 'Hii ni orodha ya watumiaji walioshughulika jambo fulani ndani ya siku $1 {{PLURAL:$1|iliyopita|zilizopita}}.',
-'activeusers-count' => '{{PLURAL:$1|haririo|maharirio}} $1 katika siku $3 {{PLURAL:$3|iliyopita|zilizopita}}',
-'activeusers-from' => 'Onyesha watumiaji kuanzia:',
-'activeusers-hidebots' => 'Ficha boti',
-'activeusers-hidesysops' => 'Ficha wakabidhi',
-'activeusers-noresult' => 'Watumiaji hawakupatikana.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Wezo za kundi za watumiaji',
 'listgrouprights-summary' => 'Inafuata orodha ya kundi za watumiaji wa wiki hii, pamoja na maelezo ya wezo zao za kushughulika mambo.
@@ -2243,7 +2234,7 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
 'whatlinkshere-hideredirs' => '$1 maelekezo',
 'whatlinkshere-hidetrans' => '$1 majumuisho',
 'whatlinkshere-hidelinks' => '$1 viungo',
-'whatlinkshere-hideimages' => 'viungo $1 vya faili',
+'whatlinkshere-hideimages' => 'Viungo vya faili $1',
 'whatlinkshere-filters' => 'Machujio',
 
 # Block/unblock
index 2fae26a..ae64fbd 100644 (file)
@@ -112,8 +112,6 @@ $messages = array(
 'tog-shownumberswatching' => 'கவனிக்கும் பயனர்களின் எண்ணிக்கையைக் காட்டவும்',
 'tog-oldsig' => 'நடப்பு கையொப்பம்:',
 'tog-fancysig' => 'வெற்றுக் கையொப்பம் (தானியங்கி இணைப்பின்றி)',
-'tog-externaleditor' => 'இயல்பிருப்பாக வெளித் தொகுப்பு மென்பொருளைப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும், உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-externaldiff' => 'வெளி வேறுபாட்டை இயல்பிருப்பாகப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும்; உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
 'tog-showjumplinks' => '"தாவிச் செல்லவும்" இணைப்புகளை செயலாக்கவும்',
 'tog-uselivepreview' => 'நேரடி முன்தோற்றத்தைப் பயன்படுத்து (ஜாவாஸ்கிரிப்ட் தேவை) (சோதனையிலுள்ளது)',
 'tog-forceeditsummary' => 'தொகுப்புச் சுருக்கம் வெற்றாக இருக்கும் போது எனக்கு நினைவூட்டு',
@@ -127,6 +125,7 @@ $messages = array(
 'tog-diffonly' => 'மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே',
 'tog-showhiddencats' => 'மறைக்கப்பட்ட பகுப்புகளைக் காட்டு',
 'tog-norollbackdiff' => 'முன்பிருந்த நிலைக்குக் கொண்டுவந்தபின் வித்தியாசங்களை விட்டுவிடவும் (காட்டத்தேவையில்லை).',
+'tog-useeditwarning' => 'தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்',
 
 'underline-always' => 'எப்பொழுதும்',
 'underline-never' => 'எப்போதுமில்லை',
@@ -1105,15 +1104,6 @@ $1",
 'search-external' => 'வெளித்தேடல்',
 'searchdisabled' => '{{SITENAME}} தளத்தின் தேடல் வசதிகள் தற்காலிகமாக முடக்கப்பட்டுள்ளது. அதுவரை நீங்கள் கீழேயுள்ள கூகிள் தேடலைப் பயன்படுத்தலாம். இது சில சமயம் இற்றைப்படுத்தப்படாததாய் இருக்கக்கூடும்.',
 
-# Quickbar
-'qbsettings' => 'விரைவுச் சட்ட அமைவுகள்',
-'qbsettings-none' => 'எதுவுமில்லை',
-'qbsettings-fixedleft' => 'நிலைத்த இடது',
-'qbsettings-fixedright' => 'நிலைத்த வலது',
-'qbsettings-floatingleft' => 'மிதப்பு இடது',
-'qbsettings-floatingright' => 'மிதப்பு வலது',
-'qbsettings-directionality' => 'உங்கள் மொழியைப் படிக்கும் திசைக்கு ஏற்ப, நிறுவப்பட்டது',
-
 # Preferences page
 'preferences' => 'விருப்பங்கள்',
 'mypreferences' => 'விருப்பத்தேர்வுகள்',
@@ -1635,7 +1625,6 @@ $1',
 'http-read-error' => 'HTTP படிப்பதில் பிழை.',
 'http-timed-out' => 'HTTP கோரியதற்கான நேரம் முடிவடைந்துவிட்டது.',
 'http-curl-error' => '$1 உரலியை பெறுவதில் பிழை நேரிட்டது',
-'http-host-unreachable' => 'இணைய முகவரியை (URL) சென்றடைய முடியவில்லை',
 'http-bad-status' => 'HTTP கோரிக்கையில் பிரச்சினை ஏற்பட்டுள்ளது:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1783,6 +1772,7 @@ $1',
 'disambiguationspage' => 'Template:பக்கவழி நெறிப்படுத்தல்',
 'disambiguations-text' => "பின்வரும் பக்கங்கள் '''பக்கவழி நெறிப்படுத்தல் பக்கத்துக்கு''' இணைக்கப்பட்டுள்ளன. மாறாக இவை பொருத்தமன தலைப்பிற்கு இணைக்கப்பட வேண்டும். <br />[[MediaWiki:Disambiguationspage|பக்கவழி நெறிப்படுத்தல் பக்கங்கத்தில்]] உள்ள வார்ப்புரு இணைக்கப்பட்ட பக்கங்கள்  பக்கவழி நெறிப்படுத்தல் பக்கங்கள் என் கருதப்படும்.",
 
+'pageswithprop' => 'பக்கப் பண்புடைய பக்கங்கள்',
 'pageswithprop-submit' => 'செல்க',
 
 'doubleredirects' => 'இரட்டை வழிமாற்றுகள்',
@@ -1936,15 +1926,6 @@ $1',
 'listusers-noresult' => 'ஒரு பயனரும் இல்லை.',
 'listusers-blocked' => '(தடை செய்யப்பட்டுள்ளது)',
 
-# Special:ActiveUsers
-'activeusers' => 'தொடர்பங்களிப்பாளர்களின் பட்டியல்',
-'activeusers-intro' => 'கடைசி $1 {{PLURAL:$1|நாள்|நாட்கள்}} ஏதேனும் செயலை செய்த பயனர்களின் பட்டியல் இது.',
-'activeusers-count' => '$1 {{PLURAL:$1|திருத்தம்|திருத்தங்கள்}} கடைசி {{PLURAL:$3|நாள்|$3 நாட்கள்}}',
-'activeusers-from' => 'பின்வரும் எழுத்துடன் தொடங்கும் பயனர்களைக் காட்டு:',
-'activeusers-hidebots' => 'தானியங்கிகளை மறை',
-'activeusers-hidesysops' => 'நிர்வாகிகளை மறை',
-'activeusers-noresult' => 'எந்தவொரு பயனர்களும் காணப்படவில்லை.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'பயனர் குழு உரிமைகள்',
 'listgrouprights-key' => '<span class="listgrouprights-granted">உரிமை வழங்கப்பட்டது</span>
@@ -2002,7 +1983,7 @@ $1',
 'usermessage-editor' => 'அமைப்பு தூதன்(messenger).',
 
 # Watchlist
-'watchlist' => 'à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\8d',
+'watchlist' => 'கவனிப்புப் பட்டியல்',
 'mywatchlist' => 'கவனிப்புப் பட்டியல்',
 'watchlistfor2' => '$1 பயனரின் ($2)',
 'nowatchlist' => 'உங்களுடைய கவனிப்புப் பட்டியலில் ஒரு விடயமும் இல்லை.',
@@ -2151,7 +2132,7 @@ $NEWPAGE
 'protect-default' => 'அனைத்துப் பயனரையும் உள்ளிடு',
 'protect-fallback' => '"$1" அனுமதி தேவை',
 'protect-level-autoconfirmed' => 'புதிய, பதிவு செய்யாத பயனர்களைத் தடை செய்',
-'protect-level-sysop' => 'நிரà¯\81வாà®\95ிà®\95ளà¯\8d à®®à®\9fà¯\8dà®\9fும்',
+'protect-level-sysop' => 'நிரà¯\81வாà®\95ிà®\95ளà¯\88 à®®à®\9fà¯\8dà®\9fà¯\81à®®à¯\8d à®\85னà¯\81மதிà®\95à¯\8dà®\95வும்',
 'protect-summary-cascade' => 'படிநிலை',
 'protect-expiring' => '$1 (UTC) மணிக்கு காலாவதியாகிறது',
 'protect-expiring-local' => 'காலாவதியாகும்$1',
@@ -2216,7 +2197,7 @@ $NEWPAGE
 'undeletedrevisions' => '{{PLURAL:$1|1 திருத்தம் மீட்கப்பட்டது|$1 திருத்தங்கள் மீட்கப்பட்டன}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 திருத்தம்|$1 திருத்தங்கள்}} மற்றும் {{PLURAL:$2|1 கோப்பு|$2 கோப்புகள்}} மீட்கப்பட்டன.',
 'undeletedfiles' => '{{PLURAL:$1|ஒரு கோப்பு மீட்டெடுக்கப்பட்டது|$1 கோப்புகள் மீட்டெடுக்கப்பட்டன}}',
-'cannotundelete' => 'நà¯\80à®\95à¯\8dà®\95à®®à¯\8d à®¤à¯\8bலà¯\8dவி; à®µà¯\87à®±à¯\81 à®¯à®¾à®°à®¾à®µà®¤à¯\81 à®®à¯\81னà¯\8dனதாà®\95 à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®¨à¯\80à®\95à¯\8dà®\95ியிரà¯\81à®\95à¯\8dà®\95லாமà¯\8d.',
+'cannotundelete' => 'à®®à¯\80ளà¯\8dவிதà¯\8dதலà¯\8d à®¤à¯\8bலà¯\8dவி: $1',
 'undeletedpage' => "'''$1 மீட்கப்பட்டது'''
 
 அண்மைய நீக்கல்களுக்கும் மீட்புக்களுக்கும் [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்கவும்.",
@@ -2765,8 +2746,6 @@ $1',
 'pageinfo-category-files' => 'கோப்புகளின் எண்ணிக்கை',
 
 # Skin names
-'skinname-standard' => 'இயல்பான',
-'skinname-nostalgia' => 'பசுமை நினைவு (Nostalgia)',
 'skinname-cologneblue' => 'கொலோன் (Cologne) நீலம் Blue',
 
 # Patrolling
index 7dbcac1..05f81b7 100644 (file)
@@ -1659,7 +1659,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'http-read-error' => 'HTTP చదువుటలో పొరపాటు.',
 'http-timed-out' => 'HTTP అభ్యర్థనకి కాలం చెల్లింది.',
 'http-curl-error' => 'URLని తేవడంలో పొరపాటు: $1',
-'http-host-unreachable' => 'URLని చేరలేకపోయాం.',
 'http-bad-status' => 'HTTP అభ్యర్ధన చేస్తున్నప్పుడు సమస్య ఉంది: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1808,6 +1807,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'disambiguationspage' => 'Template:అయోమయ నివృత్తి',
 'disambiguations-text' => "కింది పేజీలు '''అయోమయ నివృత్తి''' పేజీకి లింకవుతున్నాయి. కానీ అవి సంబంధిత పేజీకి నేరుగా లింకు అవాలి. <br /> [[MediaWiki:Disambiguationspage]] నుంది లింకు ఉన్న మూసను వాడే పేజీని అయోమయ నివృత్తి పేజీగా భావిస్తారు.",
 
+'pageswithprop-submit' => 'వెళ్ళు',
+
 'doubleredirects' => 'జంట దారిమార్పులు',
 'doubleredirectstext' => 'ఇతర దారిమార్పు పుటలకి తీసుకెళ్ళే దారిమార్పులని ఈ పుట చూపిస్తుంది.
 ప్రతీ వరుసలో మొదటి మరియు రెండవ దారిమార్పులకు లంకెలు, ఆలానే రెండవ దారిమార్పు పుట యొక్క లక్ష్యం ఉన్నాయి. సాధారణంగా ఈ రెండవ దారిమార్పు యొక్క లక్ష్యమే "అసలైనది", అదే మొదటి దారిమార్పు యొక్క లక్ష్యంగా ఉండాలి.
@@ -1962,15 +1963,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listusers-noresult' => 'వాడుకరి దొరకలేదు.',
 'listusers-blocked' => '(నిరోధించారు)',
 
-# Special:ActiveUsers
-'activeusers' => 'క్రియాశీల వాడుకరుల జాబితా',
-'activeusers-intro' => 'ఇది గత $1 {{PLURAL:$1|రోజులో|రోజులలో}} ఏదైనా కార్యకలాపం చేసిన వాడుకరుల జాబితా.',
-'activeusers-count' => 'గడచిన {{PLURAL:$3|ఒక రోజు|$3 రోజుల}}లో $1 {{PLURAL:$1|మార్పు|మార్పులు}}',
-'activeusers-from' => 'వాడుకరులను ఇక్కడ నుండి చూపించు:',
-'activeusers-hidebots' => 'బాట్లను దాచు',
-'activeusers-hidesysops' => 'నిర్వాహకులను దాచు',
-'activeusers-noresult' => 'వాడుకరులెవరూ లేరు.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'వాడుకరి గుంపుల హక్కులు',
 'listgrouprights-summary' => 'కింది జాబితాలో ఈ వికీలో నిర్వచించిన వాడుకరి గుంపులు, వాటికి సంబంధించిన హక్కులు ఉన్నాయి.
@@ -2026,7 +2018,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'usermessage-editor' => 'వ్యవస్థ సందేశకులు',
 
 # Watchlist
-'watchlist' => 'నా à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా',
+'watchlist' => 'వీక్షణ జాబితా',
 'mywatchlist' => 'వీక్షణ జాబితా',
 'watchlistfor2' => '$1 కొరకు $2',
 'nowatchlist' => 'మీ వీక్షణ జాబితా ఖాళీగా ఉంది.',
@@ -2750,15 +2742,12 @@ $UNWATCHURL కి వెళ్ళండి.
 'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
 'pageinfo-contentpage-yes' => 'అవును',
 'pageinfo-protect-cascading-yes' => 'అవును',
+'pageinfo-category-info' => 'వర్గపు సమాచారం',
+'pageinfo-category-pages' => 'పేజీల సంఖ్య',
 
 # Skin names
-'skinname-standard' => 'సంప్రదాయ',
-'skinname-nostalgia' => 'నాస్టాల్జియా',
 'skinname-cologneblue' => 'కలోన్ నీలం',
 'skinname-monobook' => 'మోనోబుక్',
-'skinname-myskin' => 'నాఅలంకారం',
-'skinname-chick' => 'చిక్',
-'skinname-simple' => 'సరళ',
 'skinname-modern' => 'ఆధునిక',
 'skinname-vector' => 'వెక్టర్',
 
index 4104810..60926e3 100644 (file)
@@ -630,10 +630,6 @@ Ita-nia mudansa la armazenadu seidauk!",
 # Special:ListUsers
 'listusers-submit' => 'Hatudu',
 
-# Special:ActiveUsers
-'activeusers-hidebots' => 'Subar bot sira',
-'activeusers-hidesysops' => 'Subar administradór sira',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grupu',
 'listgrouprights-rights' => 'Priviléjiu',
index dd7fd4a..8e619ae 100644 (file)
@@ -226,8 +226,6 @@ $messages = array(
 'tog-shownumberswatching' => 'แสดงจำนวนผู้ใช้ที่เฝ้าดู',
 'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
 'tog-fancysig' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
-'tog-externaleditor' => 'ใช้โปรแกรมแก้ไขภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-externaldiff' => 'ใช้โปรแกรมเปรียบเทียบภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
 'tog-showjumplinks' => 'เปิดใช้งาน "กระโดด" อัตโนมัติไปตามลิงก์',
 'tog-uselivepreview' => 'แสดงตัวอย่างการแก้ไขแบบทันที (จาวาสคริปต์) (ทดลอง)',
 'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
@@ -242,6 +240,7 @@ $messages = array(
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
 'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
+'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
 
 'underline-always' => 'เสมอ',
 'underline-never' => 'ไม่เคย',
@@ -320,7 +319,7 @@ $messages = array(
 'category-article-count-limited' => '$1 หน้าต่อไปนี้อยู่ในหมวดหมู่นี้',
 'category-file-count' => '{{PLURAL:$2|หมวดหมู่นี้มีเพียงไฟล์เดียว|ในหมวดหมู่นี้มี $1 ไฟล์ จากทั้งหมด $2 ไฟล์}}',
 'category-file-count-limited' => '{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้อยู่ในหมวดหมู่นี้',
-'listingcontinuesabbrev' => '(ต่อ)',
+'listingcontinuesabbrev' => 'ต่อ',
 'index-category' => 'หน้าที่มีดัชนี',
 'noindex-category' => 'หน้าที่ไม่มีดัชนี',
 'broken-file-category' => 'หน้าที่มีลิงก์ไฟล์เสีย',
@@ -375,7 +374,7 @@ $messages = array(
 'searcharticle' => 'ไป',
 'history' => 'ประวัติหน้า',
 'history_short' => 'ประวัติ',
-'updatedmarker' => 'à¸\81ารปรับตั้งแต่การเข้าชมครั้งล่าสุดของฉัน',
+'updatedmarker' => 'à¸\96ูà¸\81ปรับตั้งแต่การเข้าชมครั้งล่าสุดของฉัน',
 'printableversion' => 'รุ่นพร้อมพิมพ์',
 'permalink' => 'ลิงก์ถาวร',
 'print' => 'พิมพ์',
@@ -391,8 +390,8 @@ $messages = array(
 'protect' => 'ล็อก',
 'protect_change' => 'เปลี่ยน',
 'protectthispage' => 'ล็อกหน้านี้',
-'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99',
-'unprotectthispage' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99หน้านี้',
+'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารลà¹\87อà¸\81',
+'unprotectthispage' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารลà¹\87อà¸\81หน้านี้',
 'newpage' => 'หน้าใหม่',
 'talkpage' => 'อภิปรายหน้านี้',
 'talkpagelinktext' => 'พูดคุย',
@@ -402,7 +401,7 @@ $messages = array(
 'articlepage' => 'ดูหน้าเนื้อหา',
 'talk' => 'อภิปราย',
 'views' => 'ดู',
-'toolbox' => 'เครื่องมือ',
+'toolbox' => 'à¸\81ลà¹\88อà¸\87à¹\80à¸\84รืà¹\88อà¸\87มือ',
 'userpage' => 'ดูหน้าผู้ใช้',
 'projectpage' => 'ดูหน้าโครงการ',
 'imagepage' => 'ดูหน้าไฟล์',
@@ -421,8 +420,8 @@ $messages = array(
 'jumptonavigation' => 'นำทาง',
 'jumptosearch' => 'ค้นหา',
 'view-pool-error' => 'ขออภัย ขณะนี้เซิร์ฟเวอร์มีภาระเกิน
-à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9eยายามà¹\80à¸\82à¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89มาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9b
-à¸\81รุà¸\93ารอสัà¸\81à¸\84รูà¹\88à¸\81à¹\88อà¸\99à¸\97ีà¹\88à¸\88ะà¹\80à¸\82à¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89อีà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88
+ผู้ใช้พยายามดูหน้านี้มากเกินไป
+à¸\81รุà¸\93ารอสัà¸\81à¸\84รูà¹\88à¸\81à¹\88อà¸\99à¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89อีà¸\81à¸\84รัà¹\89
 
 $1',
 'pool-timeout' => 'เกินเวลารอการล็อก',
@@ -451,10 +450,10 @@ $1',
 
 'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
 'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ',
-'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่มหนึ่งกลุ่มใด ดังนี้}}: $1',
+'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่ม}}: $1',
 
 'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
-'versionrequiredtext' => 'à¸\95à¹\89อà¸\87à¸\81ารมีà¹\80à¸\94ียวิà¸\81ิรุà¹\88à¸\99 $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¹\83à¸\8aà¹\89à¸\87าà¸\99หà¸\99à¹\89าà¸\99ีà¹\89 ดู[[Special:Version|หน้ารุ่น]]',
+'versionrequiredtext' => 'à¸\81ารà¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95à¹\89อà¸\87à¸\81ารมีà¹\80à¸\94ียวิà¸\81ิรุà¹\88à¸\99 $1  ดู[[Special:Version|หน้ารุ่น]]',
 
 'ok' => 'ตกลง',
 'retrievedfrom' => 'รับข้อมูลจาก "$1"',
@@ -478,7 +477,7 @@ $1',
 'collapsible-collapse' => 'ยุบ',
 'collapsible-expand' => 'ขยาย',
 'thisisdeleted' => 'ดูหรือกู้คืน $1 หรือไม่',
-'viewdeleted' => 'ดู $1',
+'viewdeleted' => 'ดู $1 หรือไม่',
 'restorelink' => '$1 การแก้ไขที่ถูกลบ',
 'feedlinks' => 'ฟีด',
 'feed-invalid' => 'ฟีดที่สมัครไม่ถูกชนิด',
@@ -553,13 +552,13 @@ $1',
 'fileexistserror' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เนื่องจากมีไฟล์อยู่แล้ว',
 'unexpected' => 'ผลที่ไม่คาดคิด: "$1"="$2"',
 'formerror' => 'ผิดพลาด: ไม่สามารถส่งแบบได้',
-'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89à¹\83à¸\99หà¸\99à¹\89าà¸\99ี้',
+'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94้',
 'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1" 
 อาจมีผู้อื่นลบไปแล้ว',
 'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
 'delete-hook-aborted' => 'การลบถูกฮุกยกเลิก
 โดยไม่มีคำอธิบาย',
-'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88อหัวà¸\82à¹\89อนี้ไม่ได้',
+'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87นี้ไม่ได้',
 'badtitletext' => 'ชื่อหน้าที่ขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อข้ามภาษาหรือข้ามวิกิที่เชื่อมโยงไม่ถูกต้อง
 อาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้',
 'perfcached' => 'ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช',
@@ -716,7 +715,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'à¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อรัà¸\9aà¸\95ัวà¹\80à¸\95ือà¸\99อีà¹\80มลรายละà¹\80อียà¸\94à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93',
+'passwordreset-text' => 'à¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\9fอรà¹\8cมà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88',
 'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
 'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
 'passwordreset-username' => 'ชื่อผู้ใช้:',
@@ -760,18 +759,18 @@ $2
 'italic_tip' => 'ทำตัวเอน',
 'link_sample' => 'ลิงก์เชื่อมโยง',
 'link_tip' => 'ลิงก์ภายในเว็บ',
-'extlink_sample' => 'http://www.example.com à¸\8aืà¹\88อà¸\84ำอà¸\98ิà¸\9aายลิงก์',
+'extlink_sample' => 'http://www.example.com à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\82อà¸\87ลิงก์',
 'extlink_tip' => 'ลิงก์ภายนอก (อย่าลืมใส่ http:// นำหน้าเสมอ)',
-'headline_sample' => 'หัวà¸\82à¹\89อ',
-'headline_tip' => 'หัวà¸\82à¹\89อ',
+'headline_sample' => 'à¸\82à¹\89อà¸\84วามà¸\9eาà¸\94หัว',
+'headline_tip' => 'à¸\9eาà¸\94หัวระà¸\94ัà¸\9a 2',
 'nowiki_sample' => 'แทรกข้อความที่ไม่จัดรูปแบบที่นี่',
 'nowiki_tip' => 'ไม่สนใจการจัดรูปแบบวิกิ',
 'image_sample' => 'ตัวอย่าง.jpg',
 'image_tip' => 'ใส่ไฟล์',
 'media_sample' => 'ตัวอย่าง.ogg',
-'media_tip' => 'เชื่อมโยงไฟล์สื่อ',
+'media_tip' => 'เชื่อมโยงไฟล์',
 'sig_tip' => 'ลายเซ็นของคุณพร้อมตราเวลา',
-'hr_tip' => 'เส้นนอน',
+'hr_tip' => 'เส้นนอน (โปรดใช้อย่างจำกัด)',
 
 # Edit pages
 'summary' => 'คำอธิบายโดยย่อ:',
@@ -789,7 +788,7 @@ $2
 'missingcommenttext' => 'กรุณาใส่ความเห็นด้านล่าง',
 'missingcommentheader' => "'''ประกาศเตือน:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นนี้ ถ้าคุณกด \"{{int:savearticle}}\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีหัวข้อ",
 'summary-preview' => 'ตัวอย่างคำอธิบายการแก้ไข:',
-'subject-preview' => 'ตัวอย่างหัวข้อ:',
+'subject-preview' => 'ตัวอย่างหัวข้อ/พาดหัว:',
 'blockedtitle' => 'ผู้ใช้ถูกบล็อกอยู่',
 'blockedtext' => "'''ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก'''
 
@@ -905,25 +904,25 @@ $2
 ถ้าคุณไม่ต้องการให้งานของคุณถูกแก้ไข หรือไม่ต้องการให้งานเผยแพร่ตามที่กล่าวไว้ อย่าส่งข้อความของคุณเข้ามาที่นี่<br />
 นอกจากนี้คุณแน่ใจว่าข้อความที่ส่งเข้ามาคุณได้เขียนด้วยตัวเอง ไม่ได้คัดลอก ทำซ้ำส่วนหนึ่งส่วนใดหรือทั้งหมดจากแหล่งอื่น (ดูรายละเอียดที่ $1)
 '''อย่าส่งงานที่มีลิขสิทธิ์เข้ามาก่อนได้รับอนุญาตจากเจ้าของ!'''",
-'longpageerror' => "'''ผิดพลาด: ข้อความที่คุณส่งเข้ามามีขนาด $1 กิโลไบต์
-à¸\8bึà¹\88à¸\87à¹\80à¸\81ิà¸\99à¸\81วà¹\88าà¸\82à¸\99าà¸\94à¸\97ีà¹\88กำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
-'readonlywarning' => "'''à¸\84ำà¹\80à¸\95ือà¸\99: à¸\90าà¸\99à¸\82à¹\89อมูลà¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eืà¹\88อà¸\9aำรุà¸\87รัà¸\81ษา à¸\89ะà¸\99ัà¹\89à¸\99à¸\84ุà¸\93à¸\88ึà¸\87à¹\84มà¹\88สามารà¸\96à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\83à¸\99à¸\82à¸\93ะà¸\99ีà¹\89'''
+'longpageerror' => "'''à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87à¹\80à¸\82à¹\89ามามีà¸\82à¸\99าà¸\94 $1 à¸\81ิà¹\82ลà¹\84à¸\9aà¸\95à¹\8c
+à¸\8bึà¹\88à¸\87à¹\80à¸\81ิà¸\99à¸\81วà¹\88าà¸\82à¸\99าà¸\94สูà¸\87สุà¸\94à¸\8bึà¹\88à¸\87กำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
+'readonlywarning' => "'''คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้'''
 คุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ใช้ภายหลัง
 
 ผู้ดูแลระบบที่ล็อกฐานข้อมูลได้ให้คำอธิบายดังนี้: $1",
 'protectedpagewarning' => "'''คำเตือน: หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น'''
-ปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
+รายà¸\81ารà¸\9bูมลà¹\88าสุà¸\94à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¸\81ารอà¹\89าà¸\87อิà¸\87:",
 'semiprotectedpagewarning' => "'''หมายเหตุ:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้น
 รายการแก้ไขล่าสุดได้ถูกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง",
 'cascadeprotectedwarning' => "'''คำเตือน:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
-'titleprotectedwarning' => "'''คำเตือน: หน้านี้ได้รับการป้องกันไว้ให้สร้างได้เฉพาะโดย[[Special:ListGroupRights|ผู้ใช้ที่ได้รับสิทธิ]]เท่านั้น'''
-รายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94à¹\84à¸\94à¹\89à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89เพื่อการอ้างอิง",
+'titleprotectedwarning' => "'''คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น'''
+รายà¸\81ารà¸\9bูมลà¹\88าสุà¸\94à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87เพื่อการอ้างอิง",
 'templatesused' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:',
 'templatesusedpreview' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในการแสดงตัวอย่าง:',
 'templatesusedsection' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในส่วนนี้:',
-'template-protected' => '(ล็อก)',
-'template-semiprotected' => '(กึ่งล็อก)',
-'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}} :',
+'template-protected' => '(à¸\96ูà¸\81ลà¹\87อà¸\81)',
+'template-semiprotected' => '(à¸\96ูà¸\81à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81)',
+'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}}:',
 'edittools' => '<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->',
 'nocreatetext' => '{{SITENAME}} จำกัดการสร้างหน้าใหม่
 คุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]',
@@ -949,6 +948,8 @@ $2
 'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
 เพราะมีหน้านี้แล้ว',
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
+'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
+ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
 
 # Content models
 'content-model-wikitext' => 'ข้อความวิกิ',
@@ -1223,14 +1224,7 @@ $1",
 'powersearch-togglenone' => 'ไม่เลือก',
 'search-external' => 'ค้นหาภายนอก',
 'searchdisabled' => 'การค้นหา {{SITENAME}} ปิดใช้งาน คุณสามารถค้นหาผ่านกูเกิลหรือเซิร์ชเอนจินอื่นในเวลาไม่นาน โปรดทราบว่าดัชนีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
-
-# Quickbar
-'qbsettings' => 'แถบพิเศษ',
-'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'ตรึงไว้ทางซ้าย',
-'qbsettings-fixedright' => 'ตรึงไว้ทางขวา',
-'qbsettings-floatingleft' => 'ด้านซ้าย',
-'qbsettings-floatingright' => 'ด้านขวา',
+'search-error' => 'เกิดข้อผิดพลาดขณะกำลังค้นหา: $1',
 
 # Preferences page
 'preferences' => 'ตั้งค่าส่วนตัว',
@@ -1319,7 +1313,7 @@ $1",
 'yourvariant' => 'อักษรต่างรูปของเนื้อหา:',
 'yournick' => 'ลายเซ็น:',
 'prefs-help-signature' => 'ความเห็นในหน้าพูดคุยควรลงลายเซ็นด้วย "<nowiki>~~~~</nowiki>" ซึ่งจะถูกแปลงเป็นลายเซ็นของคุณและตราเวลา',
-'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล à¸\95รวà¸\88สอà¸\9aà¸\9bà¹\89ายระà¸\9aุเอชทีเอ็มแอล',
+'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\83หà¹\89à¸\95รวà¸\88สอà¸\9aà¹\81à¸\97à¹\87à¸\81เอชทีเอ็มแอล',
 'badsiglength' => 'ลายเซ็นของคุณยาวเกินไป ต้องยาวไม่เกิน $1 ตัวอักษร',
 'yourgender' => 'เพศ:',
 'gender-unknown' => 'ไม่ระบุ',
@@ -1393,7 +1387,7 @@ $1",
 'grouppage-user' => '{{ns:project}}:ผู้ใช้',
 'grouppage-autoconfirmed' => '{{ns:project}}:ผู้ใช้ทั่วไป',
 'grouppage-bot' => '{{ns:project}}:บอต',
-'grouppage-sysop' => '{{ns:project}}:ผู้ดูแล',
+'grouppage-sysop' => '{{ns:project}}:ผู้ดูแลระบบ',
 'grouppage-bureaucrat' => '{{ns:project}}:ผู้ดูแลสิทธิแต่งตั้ง',
 'grouppage-suppress' => '{{ns:project}}:ผู้ดูแลประวัติ',
 
@@ -1465,7 +1459,7 @@ $1",
 
 # User rights log
 'rightslog' => 'ปูมสิทธิผู้ใช้',
-'rightslogtext' => 'สà¹\88วà¸\99à¸\99ีà¹\89คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้',
+'rightslogtext' => 'à¸\99ีà¹\88คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'อ่านหน้านี้',
@@ -1694,10 +1688,17 @@ $1',
 'backend-fail-closetemp' => 'ไม่สามารถปิดไฟล์ชั่วคราวได้',
 'backend-fail-read' => 'ไม่สามารถอ่านไฟล์ "$1" ได้',
 'backend-fail-create' => 'ไม่สามารถเขียนไฟล์ "$1" ได้',
+'backend-fail-maxsize' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เพราะมีขนาดใหญ่เกิน $2 ไบต์',
+
+# Lock manager
+'lockmanager-notlocked' => 'ไม่สามารถปลดล็อก "$1" เพราะยังไม่ถูกล็อก',
 
 # ZipDirectoryReader
-'zip-unsupported' => 'ไฟล์ดังกล่าวเป็นไฟล์ ZIP ซึ่งใช้คุณสมบัติ ZIP ที่ไม่ได้รับการสนับสนุนโดย MediaWiki.
-ไฟล์ดังกล่าวนี้ไม่สามารถตรวจสอบเกี่ยวกับการรักษาความปลอดภัยได้อย่างเหมาะสม.',
+'zip-wrong-format' => 'ไฟล์ที่ระบุมิใช่ไฟล์ซิป',
+'zip-bad' => 'ไฟล์วิบัติ หรือมิฉะนั้นก็เป็นไฟล์ซิปที่อ่านไม่ได้ 
+จึงไม่สามารถตรวจสอบความปลอดภัยได้อย่างเหมาะสม',
+'zip-unsupported' => 'ไฟล์ดังกล่าวเป็นไฟล์ซิป ซึ่งใช้คุณสมบัติในการซิปที่ไม่ได้รับการสนับสนุนจากมีเดียวิกิ
+ทำให้ไม่สามารถตรวจสอบความปลอดภัยได้อย่างเหมาะสม',
 
 # Special:UploadStash
 'uploadstash' => 'อัปโหลดไฟล์ซ่อน',
@@ -1728,18 +1729,17 @@ $1',
 'img-auth-bad-query-string' => 'ที่อยู่ URL ดังกล่าวมีชุดข้อความสตริงก์ที่ร้องขอไม่ถูกต้อง',
 
 # HTTP errors
-'http-invalid-url' => 'URL ไม่ถูกต้อง: $1',
-'http-invalid-scheme' => 'ไม่สนับสนุน URL ที่มีรูปแบบ "$1"',
+'http-invalid-url' => 'ยูอาร์แอลไม่ถูกต้อง: $1',
+'http-invalid-scheme' => 'ไม่สนับสนุนยูอาร์แอลที่มีรูปแบบ "$1"',
 'http-request-error' => 'คำขอข้อมูล HTTP ผิดพลาดโดยไม่ทราบสาเหตุ',
 'http-read-error' => 'การอ่านข้อมูล HTTP ผิดพลาด',
 'http-timed-out' => 'คำขอข้อมูล HTTP เกินเวลาที่กำหนด',
 'http-curl-error' => 'เกิดข้อผิดพลาดในการเรียกข้อมูลจาก URL: $1',
-'http-host-unreachable' => 'ไม่สามารถเข้าถึง URL',
 'http-bad-status' => 'พบปัญหาในระหว่างการข้อข้อมูล HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'ไม่สามารถติดต่อยูอาร์แอลได้',
-'upload-curl-error6-text' => 'ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¹\83สà¹\88à¸\84à¹\88ามาà¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อà¹\84à¸\94à¹\89 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aอีà¸\81à¸\84รัà¹\89à¸\87วà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\81ละà¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ัà¹\89à¸\99ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89à¸\95ามà¸\9bà¸\81à¸\95ิ',
+'upload-curl-error6-text' => 'à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¹\83สà¹\88มาà¹\84à¸\94à¹\89 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aอีà¸\81à¸\84รัà¹\89à¸\87วà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\81ละà¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ัà¹\89à¸\99ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89',
 'upload-curl-error28' => 'เวลาอัปโหลดถูกตัด',
 'upload-curl-error28-text' => 'เว็บไซต์นี้ใช้เวลานานเกินไปในการเชื่อมต่อ กรุณาตรวจสอบว่าเว็บนี้ยังใช้งานได้ตามปกติ หรืออาจจะรอสักครู่แล้วลองอัปโหลดใหม่',
 
@@ -1936,6 +1936,8 @@ $1',
 'wantedpages' => 'หน้าที่ต้องการ',
 'wantedpages-badtitle' => 'ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1',
 'wantedfiles' => 'ไฟล์ที่ต้องการ',
+'wantedfiletext-cat' => 'ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del> ยิ่งไปกว่านั้น หน้าที่ฝังตัวไฟล์ที่ไม่มีอยู่จะแสดงรายการใน [[:$1]]',
+'wantedfiletext-nocat' => 'ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del>',
 'wantedtemplates' => 'แม่แบบที่ต้องการ',
 'mostlinked' => 'หน้าที่มีการเชื่อมโยงหามากที่สุด',
 'mostlinkedcategories' => 'หมวดหมู่ที่มีการเชื่อมโยงหามากที่สุด',
@@ -2016,6 +2018,9 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซ "$1"',
 'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ดูล่าสุด',
+
 # Special:Categories
 'categories' => 'หมวดหมู่',
 'categoriespagetext' => '{{PLURAL:$1|หมวดหมู่นี้|หมวดหมู่ต่อไปนี้}}มีหน้าหรือสื่อต่าง ๆ
@@ -2047,15 +2052,6 @@ $1',
 'listusers-noresult' => 'ไม่พบผู้ใช้',
 'listusers-blocked' => '(ถูกบล็อก)',
 
-# Special:ActiveUsers
-'activeusers' => 'รายการผู้ใช้ที่มีความเคลื่อนไหว',
-'activeusers-intro' => 'นี่คือรายการผู้ใช้ที่มีกิจกรรมใด ๆ ในช่วง $1 วันที่ผ่านมา',
-'activeusers-count' => '{{PLURAL:$1|ปฏิบัติการล่าสุด|ปฏิบัติการล่าสุด $1 รายการ}} ในช่วง $3 วันที่ผ่านมา',
-'activeusers-from' => 'แสดงผู้ใช้เริ่มจาก:',
-'activeusers-hidebots' => 'ซ่อนบอต',
-'activeusers-hidesysops' => 'ซ่อนผู้ดูแลระบบ',
-'activeusers-noresult' => 'ไม่พบผู้ใช้',
-
 # Special:ListGroupRights
 'listgrouprights' => 'สิทธิกลุ่มผู้ใช้',
 'listgrouprights-summary' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
@@ -2149,7 +2145,7 @@ $1',
 
 'enotif_mailer' => 'แจ้งการแก้ไขจาก {{SITENAME}}',
 'enotif_reset' => 'ทำเครื่องหมายว่าชมทุกหน้าแล้ว',
-'enotif_impersonal_salutation' => 'ผู้ใช้งาน {{SITENAME}}',
+'enotif_impersonal_salutation' => 'ผู้ใช้{{SITENAME}}',
 'enotif_subject_deleted' => 'หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}',
 'enotif_subject_created' => 'หน้า $1 บน {{SITENAME}} ถูกสร้างโดย {{gender:$2|$2}}',
 'enotif_subject_moved' => 'หน้า $1 บน {{SITENAME}} ถูกย้ายโดย {{gender:$2|$2}}',
@@ -2342,7 +2338,7 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 รุ่นการแก้ไขถูกกู้คืน',
 'undeletedrevisions-files' => '$1 รุ่น และ $2 ไฟล์ถูกกู้คืน',
 'undeletedfiles' => '$1 ไฟล์ถูกกู้คืน',
-'cannotundelete' => 'กู้คืนล้มเหลว:
+'cannotundelete' => 'à¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99ลà¹\89มà¹\80หลว:
 $1',
 'undeletedpage' => "'''$1 ถูกกู้คืน'''
 
@@ -2451,15 +2447,15 @@ $1',
 'ipboptions' => '2 ชั่วโมง:2 hours,1 วัน:1 day,3 วัน:3 days,1 สัปดาห์:1 week,2 สัปดาห์:2 weeks,1 เดือน:1 month,3 เดือน:3 months,6 เดือน:6 months,1 ปี:1 year,ไม่มีกำหนด:infinite',
 'ipbotheroption' => 'เลือกเวลา',
 'ipbotherreason' => 'เหตุผลอื่น',
-'ipbhidename' => 'à¸\8bà¹\88อà¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\9bูมà¸\81ารà¸\9aลà¹\87อà¸\81 à¹\81ละรายà¸\81ารà¸\9cูà¹\89à¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81',
+'ipbhidename' => 'à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\9bูมà¹\81ละรายà¸\81ารà¸\95à¹\88าà¸\87 à¹\86',
 'ipbwatchuser' => 'เฝ้าดูหน้าผู้ใช้และหน้าคุยกับผู้ใช้ของผู้ใช้รายนี้',
 'ipb-disableusertalk' => 'ป้องกันไม่ให้ผู้ใช้นี้แก้ไขหน้าคุยกับผู้ใช้ของตัวเองขณะถูกบล็อก',
 'ipb-change-block' => 'บล็อกผู้ใช้อีกครั้งด้วยการตั้งค่าเหล่านี้',
 'ipb-confirm' => 'ยืนยันการบล็อก',
 'badipaddress' => 'เลขที่อยู่ไอพีไม่ถูกต้อง',
-'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81à¹\80รียà¸\9aรà¹\89อย',
+'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81สำà¹\80รà¹\87à¸\88',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ได้ถูกบล็อกแล้ว<br />
-ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อกดังกล่าว',
+ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
 'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
 'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
@@ -2516,31 +2512,33 @@ $1',
 ดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน',
 'unblocklogentry' => 'เลิกบล็อก $1',
 'block-log-flags-anononly' => 'ผู้ใช้นิรนามเท่านั้น',
-'block-log-flags-nocreate' => 'หà¹\89ามสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'block-log-flags-noautoblock' => 'ยà¸\81à¹\80ลิà¸\81การบล็อกอัตโนมัติ',
-'block-log-flags-noemail' => 'à¸\9aลà¹\87อà¸\81à¸\81ารสà¹\88à¸\87อีเมล',
-'block-log-flags-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าอภิà¸\9bรายของตนเอง',
+'block-log-flags-nocreate' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี',
+'block-log-flags-noautoblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99การบล็อกอัตโนมัติ',
+'block-log-flags-noemail' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมล',
+'block-log-flags-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยของตนเอง',
 'block-log-flags-angry-autoblock' => 'การบล็อกอัตโนมัติขั้นสูงเปิดใช้งาน',
 'block-log-flags-hiddenname' => 'ชื่อผู้ใช้ถูกซ่อน',
-'range_block_disabled' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aà¹\88วà¸\87à¹\84อà¸\9eีà¸\82อà¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a',
-'ipb_expiry_invalid' => 'à¸\84à¹\88าวัà¸\99หมà¸\94อายุà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87',
-'ipb_expiry_temp' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¸\88ะà¸\8bà¹\88อà¸\99à¹\82à¸\94ยถาวร',
-'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\9eราะอาà¸\88มีการแก้ไขมากเกินไป',
+'range_block_disabled' => 'à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aà¹\88วà¸\87à¹\84อà¸\9eีà¸\82อà¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
+'ipb_expiry_invalid' => 'วันหมดอายุไม่ถูกต้อง',
+'ipb_expiry_temp' => 'à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\8bà¹\88อà¸\99à¸\95à¹\89อà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¸\9aลà¹\87อà¸\81ถาวร',
+'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸­à¸²à¸\88à¹\80à¸\9eราะมีการแก้ไขมากเกินไป',
 'ipb_already_blocked' => '"$1" ถูกบล็อกแล้วก่อนหน้านี้',
-'ipb-needreblock' => '$1 à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หรือไม่',
+'ipb-needreblock' => '$1 à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าหรือไม่',
 'ipb-otherblocks-header' => '{{PLURAL:$1|การบล็อก}}อื่น ๆ',
-'unblock-hideuser' => 'คุณไม่สามารถยกเลิกการบล็อคผู้ใช้งานรายนี้ได้, เนื่องจากชื่อผู้ใช้ของผู้ใช้งานถูกซ่อนอยู่',
-'ipb_cant_unblock' => 'ปัญหา: หมายเลขบล็อก $1 ไม่พบ อาจเกิดจากได้ถูกยกเลิกการบล็อกแล้ว',
-'ipb_blocked_as_range' => 'มีข้อผิดพลาด: เลขที่อยู่ไอพี $1 ไม่ได้ถูกระงับโดยตรงและไม่สามารถยกเลิกการระงับโดยตรงได้.  อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถยกเลิกการระงับได้',
+'unblock-hideuser' => 'คุณไม่สามารถยกเลิกการบล็อกผู้ใช้งานรายนี้ได้ เพราะชื่อผู้ใช้ถูกซ่อนอยู่',
+'ipb_cant_unblock' => 'ข้อผิดพลาด: ไม่พบหมายเลขบล็อก $1 การบล็อกดังกล่าวอาจถูกปลดบล็อกแล้ว',
+'ipb_blocked_as_range' => 'ข้อผิดพลาด: เลขที่อยู่ไอพี $1 มิได้ถูกบล็อกโดยตรงและไม่สามารถปลดบล็อกได้
+อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้',
 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง',
-'ip_range_toolarge' => 'à¸\82à¸\99าà¸\94à¸\9aลà¹\87อà¸\81มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า / $1 จะไม่ได้รับอนุญาต',
+'ip_range_toolarge' => 'à¸\9eิสัยà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า /$1 จะไม่ได้รับอนุญาต',
 'blockme' => 'บล็อกฉัน',
 'proxyblocker' => 'บล็อกพร็อกซี',
-'proxyblocker-disabled' => 'ฟังก์ชั่นนี้ไม่สามารถใช้ได้',
-'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตที่คุณใช้งานอยู่เกี่ยวกับปัญหานี้',
-'proxyblocksuccess' => 'บล็อกสำเร็จ',
-'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ถูกใช้งานในเว็บไซต์',
-'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ถูกใช้งานในเว็บไซต์ ดังนั้นคุณไม่สามารถสร้างชื่อบัญชีผู้ใช้ได้',
+'proxyblocker-disabled' => 'ฟังก์ชันนี้ถูกปิดใช้งาน',
+'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้',
+'proxyblocksuccess' => 'สำเร็จ',
+'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้',
+'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ 
+คุณไม่สามารถสร้างบัญชีได้',
 'cant-block-while-blocked' => 'คุณไม่สามารถบล็อกผู้ใช้อื่นในขณะที่คุณกำลังถูกบล็อก',
 'cant-see-hidden-user' => 'ผู้ใช้ที่คุณกำลังพยายามระงับนั้นได้ถูกระงับหรือซ่อนเดิมอยู่แล้ว เนื่องจากคุณไม่มีสิทธิซ่อนผู้ใช้ คุณจึงไม่สามารถดูหรือแก้ไขการระงับผู้ใช้ได้',
 'ipbblocked' => 'คุณไม่สามารถบล็อกหรือปลดบล็อกผู้ใช้คนอื่น เนื่องจากคุณกำลังถูกบล็อก',
@@ -2603,16 +2601,16 @@ $1',
 'movenotallowedfile' => 'คุณไม่มีสิทธิย้ายไฟล์',
 'cant-move-user-page' => 'คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)',
 'cant-move-to-user-page' => 'คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)',
-'newtitle' => 'à¸\8aืà¹\88อà¹\83หมà¹\88',
-'move-watch' => 'à¹\80à¸\9dà¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89',
+'newtitle' => 'à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88:',
+'move-watch' => 'à¹\80à¸\9dà¹\89าà¸\94ูหà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87à¹\81ละหà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87',
 'movepagebtn' => 'เปลี่ยนชื่อ',
 'pagemovedsub' => 'เปลี่ยนชื่อสำเร็จ',
 'movepage-moved' => '\'\'\'"$1" ถูกเปลี่ยนชื่อเป็น "$2"\'\'\'',
 'movepage-moved-redirect' => 'หน้าเปลี่ยนทางถูกสร้างขึ้น',
 'movepage-moved-noredirect' => 'การสร้างหน้าเปลี่ยนทางถูกระงับ',
 'articleexists' => 'หน้าที่ต้องการมีอยู่แล้ว หรือชื่อที่เลือกไม่ถูกต้อง กรุณาเลือกชื่อใหม่',
-'cantmove-titleprotected' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\8aืà¹\88อà¹\83หมà¹\88à¸\99ีà¹\89à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¹\84มà¹\88à¹\83หà¹\89สรà¹\89าà¸\87à¹\83หมà¹\88',
-'talkexists' => "'''à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าสำà¹\80รà¹\87à¸\88 à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\84มà¹\88สามารà¸\96à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\83à¸\99à¸\8aืà¹\88อà¹\83หมà¹\88à¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94รวมà¹\80อà¸\87à¸\94à¹\89วยมือ'''",
+'cantmove-titleprotected' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89สรà¹\89าà¸\87',
+'talkexists' => "'''à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าสำà¹\80รà¹\87à¸\88 à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\84มà¹\88สามารà¸\96à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\83à¸\99à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94รวมหà¸\99à¹\89าà¹\80หลà¹\88าà¸\99ัà¹\89à¸\99à¹\80อà¸\87'''",
 'movedto' => 'เปลี่ยนชื่อเป็น',
 'movetalk' => 'เปลี่ยนชื่อหน้าพูดคุยพร้อมกัน',
 'move-subpages' => 'ย้ายหน้าย่อยทั้งหมด (มากถึง $1 หน้า)',
@@ -2622,7 +2620,7 @@ $1',
 'movepage-page-unmoved' => 'หน้า $1 ไม่สามารถเปลี่ยนชื่อเป็น $2 ได้',
 'movepage-max-pages' => 'หน้า $1 หน้าถูกย้ายไป ซึ่งมากสุดแล้ว และจะไม่มีหน้าใดย้ายอัตโนมัติเพิ่ม',
 'movelogpage' => 'ปูมการเปลี่ยนชื่อ',
-'movelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\97ุà¸\81หà¸\99à¹\89า',
+'movelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\97ัà¹\89à¸\87หมà¸\94',
 'movesubpage' => '{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}',
 'movesubpagetext' => 'หน้านี้มีหน้าย่อย $1 หน้า ดังด้านล่าง',
 'movenosubpage' => 'หน้านี้ไม่มีหน้าย่อย',
@@ -2640,7 +2638,7 @@ $1',
 'immobile-target-namespace-iw' => 'ไม่สามารถย้ายไปยังหน้าปลายทางที่เป็นลิงก์ interwiki ได้',
 'immobile-source-page' => 'หน้านี้ไม่สามารถเปลี่ยนชื่อได้',
 'immobile-target-page' => 'ไม่สามารถเปลี่ยนไปยังชื่อที่ต้องการได้',
-'imagenocrossnamespace' => 'à¹\84มà¹\88สามารà¸\96ยà¹\89ายà¹\84à¸\9fลà¹\8cà¹\84à¸\9bยัà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ีà¹\88à¹\84มà¹\88รอà¸\87รัà¸\9a',
+'imagenocrossnamespace' => 'à¹\84มà¹\88สามารà¸\96ยà¹\89ายà¹\84à¸\9fลà¹\8cà¹\84à¸\9bยัà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bอืà¹\88à¸\99',
 'nonfile-cannot-move-to-file' => 'ไม่สามารถย้ายจากเนมสเปซอื่นมาเป็นเนมสเปซไฟล์',
 'imagetypemismatch' => 'นามสกุลของไฟล์ใหม่ไม่ตรงกับชนิดของไฟล์',
 'imageinvalidfilename' => 'ชื่อไฟล์เป้าหมายไม่ถูกต้อง',
@@ -2665,9 +2663,10 @@ $1',
 'exportall' => 'ส่งออกข้อมูลทุกหน้า',
 'exportcuronly' => 'เอาเฉพาะรุ่นปัจจุบันเท่านั้น ไม่เอาประวัติทั้งหมด',
 'exportnohistory' => "----
-'''หมายเหตุ:''' การส่งออกประวัติหน้าทั้งหมดผ่านช่องทางนี้ได้ถูกปิดไว้ เนื่องจากปัญหาทางเทคนิคในด้านประสิทธิภาพ",
-'export-submit' => 'ส่งออกมา',
-'export-addcattext' => 'รวมหน้าจากหมวดหมู่:',
+'''หมายเหตุ:''' การส่งออกประวัติหน้าทั้งหมดผ่านแบบนี้ถูกปิดใช้งาน เนื่องจากปัญหาด้านประสิทธิภาพ",
+'exportlistauthors' => 'รวมรายการผู้ร่วมเขียนเต็มของแต่ละหน้า',
+'export-submit' => 'ส่งออก',
+'export-addcattext' => 'เพิ่มหน้าจากหมวดหมู่:',
 'export-addcat' => 'เพิ่ม',
 'export-addnstext' => 'เพิ่มหน้าจากเนมสเปซ:',
 'export-addns' => 'เพิ่ม',
@@ -2827,13 +2826,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */',
-'standard.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
@@ -2846,13 +2840,8 @@ $1',
 
 # Scripts
 'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */',
-'standard.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'group-autoconfirmed.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */',
@@ -2879,7 +2868,7 @@ $1',
 'spamprotectiontitle' => 'ตัวกรองป้องกันสแปม',
 'spamprotectiontext' => 'ข้อความที่คุณต้องการบันทึกถูกตัวกรองสแปมบล็อก
 อาจเกิดจากลิงก์ไปยังเว็บไซต์ภายนอกที่ถูกขึ้นบัญชีดำ',
-'spamprotectionmatch' => 'à¸\82à¹\89อà¸\84วามà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\81ระà¸\95ุà¹\89à¸\99ให้ตัวกรองสแปมของเราทำงาน: $1',
+'spamprotectionmatch' => 'à¸\82à¹\89อà¸\84วามà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\97ำให้ตัวกรองสแปมของเราทำงาน: $1',
 'spambot_username' => 'กวาดล้างมีเดียวิกิสแปม',
 'spam_reverting' => 'ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1',
 'spam_blanking' => 'รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)',
@@ -2925,13 +2914,8 @@ $1',
 'pageinfo-category-files' => 'จำนวนไฟล์',
 
 # Skin names
-'skinname-standard' => 'คลาสสิก',
-'skinname-nostalgia' => 'นอสตัลเจีย',
 'skinname-cologneblue' => 'โคโลญจ์บลู',
 'skinname-monobook' => 'โมโนบุ๊ก',
-'skinname-myskin' => 'มายสกิน',
-'skinname-chick' => 'ชิก',
-'skinname-simple' => 'ซิมเปิล',
 'skinname-modern' => 'โมเดิร์น',
 'skinname-vector' => 'เวกเตอร์',
 
@@ -3342,24 +3326,24 @@ $1',
 เปิดใช้งานปุ่มด้านล่างเพื่อส่งเมลยืนยันไปยังที่อยู่ของคุณ
 เมลจะรวมลิงก์ซึ่งมีรหัส
 โหลดลิงก์ในเบราว์เซอร์ของคุณเพื่อยืนยันว่าที่อยู่อีเมลของคุณสมเหตุสมผล',
-'confirmemail_pending' => 'รหัสยืà¸\99ยัà¸\99à¸\96ูà¸\81อีà¹\80มลà¹\84à¸\9bหาคุณแล้ว 
-à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9eิà¹\88à¸\87สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี à¸\84ุà¸\93อาà¸\88อยาà¸\81รอสัà¸\81à¸\84รูà¹\88à¹\83หà¹\89สà¹\88à¸\87à¹\84à¸\9bà¸\96ึà¸\87à¸\81à¹\88อà¸\99à¸\9eยายามà¸\82อรหัสà¹\83หมà¹\88',
+'confirmemail_pending' => 'รหัสยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89สà¹\88à¸\87à¹\84à¸\9bยัà¸\87อีà¹\80มลà¸\82อà¸\87คุณแล้ว 
+à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9eิà¹\88à¸\87สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี à¸\84ุà¸\93อาà¸\88à¸\95à¹\89อà¸\87รอสัà¸\81à¸\84รูà¹\88à¹\83หà¹\89รหัสสà¹\88à¸\87à¹\84à¸\9bà¸\96ึà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\84ุà¸\93 à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\88ะà¸\82อรหัสยืà¸\99ยัà¸\99à¹\83หมà¹\88à¸\97ัà¸\99à¸\97ี',
 'confirmemail_send' => 'ส่งรหัสยืนยันทางอีเมล',
 'confirmemail_sent' => 'ส่งอีเมลยืนยันแล้ว',
 'confirmemail_oncreate' => 'รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ
 รหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้',
-'confirmemail_sendfailed' => '{{SITENAME}} ไม่สามารถส่งเมลยืนยันได้
-à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล
+'confirmemail_sendfailed' => '{{SITENAME}}ไม่สามารถส่งอีเมลยืนยันได้
+à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87
 
 ข้อความตีกลับ: $1',
 'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง 
 รหัสอาจหมดอายุแล้ว',
-'confirmemail_needlogin' => 'ต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ',
+'confirmemail_needlogin' => 'à¸\84ุà¸\93à¸\95à¹\89อà¸\87 $1 à¹\80à¸\9eืà¹\88อยืà¸\99ยัà¸\99à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93',
 'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว
 คุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ',
 'confirmemail_loggedin' => 'อีเมลคุณได้รับการยืนยันแล้ว',
 'confirmemail_error' => 'เกิดปัญหาขณะบันทึกการยืนยันของคุณ',
-'confirmemail_subject' => 'การยืนยันที่อยู่อีเมล {{SITENAME}}',
+'confirmemail_subject' => 'การยืนยันที่อยู่อีเมลของ{{SITENAME}}',
 'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
 
 เพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:
index 9084776..905fffb 100644 (file)
@@ -385,8 +385,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показувати число користувачів, які додали сторінку до свого списку спостереження',
 'tog-oldsig' => 'Існуючий підпис:',
 'tog-fancysig' => 'Власна вікі-розмітка підпису (без автоматичного посилання)',
-'tog-externaleditor' => "Використовувати зовнішній редактор за умовчанням (тільки для досвідчених користувачів, вимагає спеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-externaldiff' => "Використовувати зовнішню програму порівняння версій за умовчанням (тільки для експертів, вимагає спеціальних налаштувань вашого комп'ютера. [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
 'tog-showjumplinks' => 'Активізувати допоміжні посилання «перейти до»',
 'tog-uselivepreview' => 'Використовувати швидкий попередній перегляд (JavaScript, експериментально)',
 'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий опис редагування',
@@ -401,6 +399,7 @@ $messages = array(
 'tog-showhiddencats' => 'Показувати приховані категорії',
 'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
 'tog-norollbackdiff' => 'Не показувати різницю версій після виконання відкоту',
+'tog-useeditwarning' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
 
 'underline-always' => 'Завжди',
 'underline-never' => 'Ніколи',
@@ -920,7 +919,7 @@ $2
 'passwordreset-emailelement' => "Ім'я користувача: $1
 Тимчасовий пароль: $2",
 'passwordreset-emailsent' => 'Електронний лист для відновлення пароля відправлений.',
-'passwordreset-emailsent-capture' => 'Електронний лист-нагадування був надісланий, як показано нижче.',
+'passwordreset-emailsent-capture' => 'Електронний лист скидання паролю було надіслано, як показано нижче.',
 'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання користувачеві $1 не вдалося.',
 
 # Special:ChangeEmail
@@ -1146,6 +1145,8 @@ $2
 'content-failed-to-parse' => 'Не вдалось проаналізувати $2 як тип $1: $3',
 'invalid-content-data' => 'Неприпустимі дані',
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
+'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
+Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «{{int:prefs-editing}}» ваших налаштувань.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1386,7 +1387,7 @@ $1",
 'shown-title' => 'Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці',
 'viewprevnext' => 'Переглянути ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Параметри пошуку',
-'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[$1]]»'''",
+'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у цій вікі!'''",
 'searchhelp-url' => 'Help:Довідка',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показати сторінки з цим префіксом]]',
@@ -1430,15 +1431,6 @@ $1",
 'search-external' => 'Зовнішній пошук',
 'searchdisabled' => '<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>',
 
-# Quickbar
-'qbsettings' => 'Панель навігації',
-'qbsettings-none' => 'Не показувати панель',
-'qbsettings-fixedleft' => 'Фіксована ліворуч',
-'qbsettings-fixedright' => 'Фіксована праворуч',
-'qbsettings-floatingleft' => 'Плаваюча ліворуч',
-'qbsettings-floatingright' => 'Плаваюча праворуч',
-'qbsettings-directionality' => 'Фіксована, залежно від напрямку письма вашої мови',
-
 # Preferences page
 'preferences' => 'Налаштування',
 'mypreferences' => 'Налаштування',
@@ -1460,7 +1452,7 @@ $1",
 'prefs-watchlist-days-max' => 'Максимум $1 {{PLURAL:$1|день|дні|днів}}',
 'prefs-watchlist-edits' => 'Кількість редагувань для відображення у розширеному списку спостереження:',
 'prefs-watchlist-edits-max' => 'Максимально: 1000',
-'prefs-watchlist-token' => 'Ð\9fознаÑ\87ка списку спостереження:',
+'prefs-watchlist-token' => 'Ð\9cÑ\96Ñ\82ка списку спостереження:',
 'prefs-misc' => 'Інші налаштування',
 'prefs-resetpass' => 'Змінити пароль',
 'prefs-changeemail' => 'Змінити адресу електронної пошти',
@@ -2006,7 +1998,6 @@ $1',
 'http-read-error' => 'Помилка читання HTTP.',
 'http-timed-out' => 'Перевищення часу очікування HTTP-запиту.',
 'http-curl-error' => 'Помилка звертання до URL: $1',
-'http-host-unreachable' => 'Неможливо досягнути вказану URL-адресу.',
 'http-bad-status' => 'Під час HTTP-запиту виникла проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2334,15 +2325,6 @@ $1',
 'listusers-noresult' => 'Не знайдено користувачів.',
 'listusers-blocked' => '({{GENDER:$1|заблокований|заблокована|заблокований}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Список активних користувачів',
-'activeusers-intro' => 'Це список користувачів, які здійснювали які-небудь дії за {{PLURAL:$1|останній $1 день|останні $1 дні|останні $1 днів}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|дія|дії|дій}} за {{PLURAL:$3|останній $3 день|останні $3 дні|останні $3 днів}}',
-'activeusers-from' => 'Показувати користувачів, починаючи з:',
-'activeusers-hidebots' => 'Приховати ботів',
-'activeusers-hidesysops' => 'Приховати адміністраторів',
-'activeusers-noresult' => 'Не знайдено користувачів.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Права груп користувачів',
 'listgrouprights-summary' => 'Нижче наведений список груп користувачів у цій вікі і права для кожної групи.
@@ -2521,8 +2503,8 @@ $UNWATCHURL
 'rollback' => 'Відкинути редагування',
 'rollback_short' => 'Відкинути',
 'rollbacklink' => 'відкинути',
-'rollbacklinkcount' => 'скасування $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
-'rollbacklinkcount-morethan' => 'скасування більш, ніж $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
+'rollbacklinkcount' => 'відкинути $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
+'rollbacklinkcount-morethan' => 'відкинути понад $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
 'rollbackfailed' => 'Відкинути зміни не вдалося',
 'cantrollback' => 'Неможливо відкинути редагування, оскільки останній дописувач сторінки є її автором.',
 'alreadyrolled' => 'Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), оскільки хтось інший уже змінив чи відкинув редагування цієї статті.
@@ -3140,8 +3122,6 @@ $1',
 
 # Stylesheets
 'common.css' => '/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */',
-'standard.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Стандартне */',
-'nostalgia.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Ностальгія */',
 'cologneblue.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Кельнське блакитне */',
 'monobook.css' => '/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */
 
@@ -3156,9 +3136,6 @@ $1',
     padding-right: 0em;
     font-weight: bold;
 }',
-'myskin.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Власне */',
-'chick.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Курча */',
-'simple.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Просте */',
 'modern.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Сучасне */',
 'vector.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */',
 'print.css' => '/* Розміщений тут CSS-код буде використаний для друкованої версії */',
@@ -3171,13 +3148,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */',
-'standard.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують стандартну тему оформлення */',
-'nostalgia.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Ностальгія */',
 'cologneblue.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Кельнське синє */',
 'monobook.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */',
-'myskin.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують власну тему оформлення */',
-'chick.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Курча */',
-'simple.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують просту тему оформлення */',
 'modern.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Сучасне */',
 'vector.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */',
 'group-autoconfirmed.js' => '/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */',
@@ -3258,13 +3230,8 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Кількість файлів',
 
 # Skin names
-'skinname-standard' => 'Стандартне',
-'skinname-nostalgia' => 'Ностальгія',
 'skinname-cologneblue' => 'Кельнське синє',
 'skinname-monobook' => 'Моно-книга',
-'skinname-myskin' => 'Своє',
-'skinname-chick' => 'Курча',
-'skinname-simple' => 'Просте',
 'skinname-modern' => 'Сучасне',
 'skinname-vector' => 'Векторне',
 
@@ -4245,15 +4212,15 @@ MediaWiki поширюється в надії, що вона буде кори
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|відновив|відновила}} сторінку $3',
-'logentry-delete-event' => '$1 змінив видимість {{PLURAL:$5 запису журнала|$5 записів журналу}} на $3: $4',
-'logentry-delete-revision' => '$1 змінив видимість {{PLURAL:$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 записів}} журналу на $3: $4',
-'logentry-suppress-revision' => '$1 приховано змінив видимість для {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
-'logentry-suppress-event-legacy' => '$1 приховано змінив видимість записів журналу $3',
-'logentry-suppress-revision-legacy' => '$1 приховано змінив видимість версій на сторінці $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видимість записів журналу подій $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видимість версій на сторінці $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавив|подавила}} сторінку $3',
+'logentry-suppress-event' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість для {{PLURAL:$5|$5 запису|$5 записів}} журналу на $3: $4',
+'logentry-suppress-revision' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість для {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
+'logentry-suppress-event-legacy' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість записів журналу $3',
+'logentry-suppress-revision-legacy' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість версій на сторінці $3',
 'revdelete-content-hid' => 'вміст приховано',
 'revdelete-summary-hid' => 'опис редагування приховано',
 'revdelete-uname-hid' => "ім'я користувача приховано",
@@ -4266,8 +4233,8 @@ MediaWiki поширюється в надії, що вона буде кори
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 без створення перенаправлення',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 поверх перенаправлення',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку $3 на $4 поверх перенаправлення і без залишення перенаправлення',
-'logentry-patrol-patrol' => '$1 відпатрулював версію $4 сторінки $3',
-'logentry-patrol-patrol-auto' => '$1 автоматично відпатрулював версію $4 сторінки $3',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|відпатрулював|відпатрулювала}} версію $4 сторінки $3',
+'logentry-patrol-patrol-auto' => '$1 автоматично {{GENDER:$2|відпатрулював|відпатрулювала}} версію $4 сторінки $3',
 'logentry-newusers-newusers' => 'Створено обліковий запис $1',
 'logentry-newusers-create' => '$1 — створено обліковий запис',
 'logentry-newusers-create2' => '$1 {{GENDER:$2|створив|створила}} обліковий запис {{GENDER:$4|користувача|користувачки}} $3',
index 668fca2..b420a2b 100644 (file)
@@ -133,8 +133,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish',
 'tog-oldsig' => 'Joriy imzo:',
 'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
-'tog-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
 'tog-showjumplinks' => 'yordamchi "tez oʻtish" havolalarini yoqish',
 'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
 'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
@@ -403,14 +401,14 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Maqola',
-'nstab-user' => 'Foydalanuvchi sahifasi',
+'nstab-user' => 'Foydalanuvchi',
 'nstab-media' => 'Media sahifasi',
 'nstab-special' => 'Maxsus sahifa',
-'nstab-project' => 'Loyiha sahifasi',
+'nstab-project' => 'Vikipediya',
 'nstab-image' => 'Fayl',
 'nstab-mediawiki' => 'Xabar',
 'nstab-template' => 'Andoza',
-'nstab-help' => 'Yordam sahifasi',
+'nstab-help' => 'Yordam',
 'nstab-category' => 'Turkum',
 
 # Main script and global functions
@@ -429,7 +427,7 @@ $1',
 'viewsource' => 'Manbasini koʻrish',
 'viewsource-title' => "$1 sahifasining manbasini ko'rish",
 'actionthrottled' => "Tezlik bo'yicha cheklov",
-'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
+'protectedpagetext' => 'Bu sahifa tahrirlash va boshqa oʻzgartirishlar kiritishdan himoyalangan.',
 'viewsourcetext' => 'Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:',
 'editinginterface' => "'''Diqqat:''' Siz dasturiy ta'minot interfeysi matni mavjud bo'lgan sahifani tahrirlamoqdasiz.
 Uning o'zgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeysning tashqi ko'rinishiga ta'sir qiladi.
@@ -615,7 +613,7 @@ Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga k
 'sectioneditnotsupported-title' => "Bo'limlarni tahrirlash imkoniyati yo'q",
 'sectioneditnotsupported-text' => "Ushbu sahifada bo'limlarni tahrirlash imkoniyati yo'q.",
 'permissionserrors' => 'Ruxsat huquqida xato',
-'permissionserrorstext-withaction' => "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga ko'ra '''$2'''ga ruxsat mavjud emas:",
+'permissionserrorstext-withaction' => "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
 'recreate-moveddeleted-warn' => "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''
 
 Bu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan qiziqib koʻring.
@@ -769,14 +767,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'powersearch-togglenone' => 'Hech qaysini',
 'search-external' => 'Tashqi qidiruv',
 
-# Quickbar
-'qbsettings' => 'Saytda harakatlanish darchasi',
-'qbsettings-none' => "Ko'rsatmaslik",
-'qbsettings-fixedleft' => "Qo'zg'almas chap",
-'qbsettings-fixedright' => "Qo'zg'almas o'ng",
-'qbsettings-floatingleft' => 'Suzuvchi chap',
-'qbsettings-floatingright' => "Suzuvchi o'ng",
-
 # Preferences page
 'preferences' => 'Moslamalar',
 'mypreferences' => 'Moslamalarim',
@@ -1128,13 +1118,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusers-noresult' => 'Foydalanuvchilar topilmadi.',
 'listusers-blocked' => '(chetlashtirilgan)',
 
-# Special:ActiveUsers
-'activeusers' => 'Faol foydalanuvchilar roʻyxati',
-'activeusers-from' => 'Quyidagidan boshlanuvchi foydalanuvchilarni koʻrsatish:',
-'activeusers-hidebots' => 'Botlarni yashirish',
-'activeusers-hidesysops' => 'Maʼmurlarni yashirish',
-'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
 'listgrouprights-group' => 'Guruh',
@@ -1531,14 +1514,14 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
 'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
 'tooltip-ca-nstab-main' => 'Sahifani ko‘rish',
-'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
-'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
+'tooltip-ca-nstab-user' => 'Foydalanuvchi sahifasini koʻrish',
+'tooltip-ca-nstab-media' => 'Media sahifasini koʻrish',
 'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
-'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
-'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
-'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
+'tooltip-ca-nstab-project' => 'Loyiha sahifasini koʻrish',
+'tooltip-ca-nstab-image' => 'Rasm sahifasini koʻrish',
+'tooltip-ca-nstab-mediawiki' => 'MediaWiki tizimining xabarini koʻrish',
 'tooltip-ca-nstab-template' => 'Andozani koʻrish',
-'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
+'tooltip-ca-nstab-help' => 'Yordam sahifasini koʻrish',
 'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
 'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
 'tooltip-save' => 'Oʻzgarishlarni saqlash',
@@ -1564,12 +1547,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => "Sog'inch",
 'skinname-cologneblue' => "Kyolncha sog'inch",
-'skinname-myskin' => "O'zimniki",
-'skinname-chick' => "Jo'ja",
-'skinname-simple' => 'Oddiy',
 'skinname-modern' => 'Zamonaviy',
 'skinname-vector' => 'Vektor',
 
index 2847cfe..24cbba7 100644 (file)
@@ -330,8 +330,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Hiển thị số người đang xem',
 'tog-oldsig' => 'Chữ ký hiện tại:',
 'tog-fancysig' => 'Xem chữ ký là mã wiki (không có liên kết tự động)',
-'tog-externaleditor' => 'Mặc định dùng trình soạn thảo bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-externaldiff' => 'Mặc định dùng trình so sánh bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
 'tog-showjumplinks' => 'Bật liên kết “bước tới” trên đầu trang cho bộ trình duyệt thuần văn bản hay âm thanh',
 'tog-uselivepreview' => 'Xem thử trực tiếp (JavaScript; chưa ổn định)',
 'tog-forceeditsummary' => 'Nhắc tôi khi tôi quên tóm lược sửa đổi',
@@ -346,6 +344,7 @@ $messages = array(
 'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
 'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tựa đề',
 'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
+'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
 
 'underline-always' => 'Luôn luôn',
 'underline-never' => 'Không bao giờ',
@@ -984,9 +983,9 @@ Nó chưa được lưu!'''",
 Các thay đổi của bạn vẫn chưa được lưu!",
 'continue-editing' => 'Đi đến hộp sửa đổi',
 'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
-'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
+'session_fail_preview' => "'''Rất tiếc, những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.'''
 Xin hãy thử lần nữa.
-Nếu vẫn không thành công, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.'''",
+Nếu vẫn không thành công, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.",
 'session_fail_preview_html' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.'''
 
 ''Do {{SITENAME}} cho phép dùng mã HTML, trang xem thử được ẩn đi để đề phòng bị tấn công bằng JavaScript.''
@@ -1064,6 +1063,8 @@ Nó đã tồn tại.',
 'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
 'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
 'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
+'editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
+Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “{{int:prefs-editing}}” trong tùy chọn cá nhân.',
 
 # Content models
 'content-model-wikitext' => 'mã wiki',
@@ -1345,15 +1346,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Không',
 'search-external' => 'Tìm kiếm từ bên ngoài',
 'searchdisabled' => 'Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thời gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lỗi thời.',
-
-# Quickbar
-'qbsettings' => 'Thanh công cụ',
-'qbsettings-none' => 'Không có',
-'qbsettings-fixedleft' => 'Cố định trái',
-'qbsettings-fixedright' => 'Cố định phải',
-'qbsettings-floatingleft' => 'Nổi bên trái',
-'qbsettings-floatingright' => 'Nổi bên phải',
-'qbsettings-directionality' => 'Cố định, tùy theo hướng viết ngôn ngữ của bạn',
+'search-error' => 'Đã xuất hiện lỗi khi tìm kiếm: $1',
 
 # Preferences page
 'preferences' => 'Tùy chọn',
@@ -1911,7 +1904,6 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
 'http-read-error' => 'Lỗi đọc HTTP.',
 'http-timed-out' => 'Hết thời gian yêu cầu HTTP.',
 'http-curl-error' => 'Có lỗi khi truy xuất URL: $1',
-'http-host-unreachable' => 'Không thể truy cập URL',
 'http-bad-status' => 'Có vấn đề khi yêu cầu HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2232,15 +2224,6 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
 'listusers-noresult' => 'Không thấy thành viên.',
 'listusers-blocked' => '(bị cấm)',
 
-# Special:ActiveUsers
-'activeusers' => 'Danh sách thành viên tích cực',
-'activeusers-intro' => 'Dánh sách này liệt kê các thành viên đã hoạt động cách nào đó trong $1 ngày qua.',
-'activeusers-count' => '$1 tác vụ trong {{PLURAL:$3|ngày|$3 ngày}} qua',
-'activeusers-from' => 'Hiển thị thành viên bắt đầu từ:',
-'activeusers-hidebots' => 'Ẩn robot',
-'activeusers-hidesysops' => 'Ẩn bảo quản viên',
-'activeusers-noresult' => 'Không thấy thành viên.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Nhóm thành viên',
 'listgrouprights-summary' => 'Dưới đây là danh sách nhóm thành viên được định nghĩa tại wiki này, với mức độ truy cập của từng nhóm.
@@ -2727,6 +2710,7 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 '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',
 'cant-block-while-blocked' => 'Bạn không thể cấm thành viên khác trong khi bạn đang bị cấm.',
 'cant-see-hidden-user' => 'Thành viên bạn muốn cấm đã bị cấm trước đây hoặc đã bị ẩn đi. Vì bạn không có quyền hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.',
 'ipbblocked' => 'Bạn không thể cấm hay bỏ cấm người dùng khác vì chính bạn đang bị cấm.',
@@ -3038,13 +3022,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Stylesheets
 'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */',
-'standard.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */',
-'myskin.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cá nhân */',
-'chick.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Chick */',
-'simple.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Đơn giản */',
 'modern.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Hiện đại */',
 'vector.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */',
 'print.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */',
@@ -3057,13 +3036,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Scripts
 'common.js' => '/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */',
-'standard.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */',
-'myskin.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Cá nhân */',
-'chick.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Chick */',
-'simple.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Đơn giản */',
 'modern.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Hiện đại */',
 'vector.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */',
 'group-autoconfirmed.js' => '/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */',
@@ -3144,11 +3118,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'pageinfo-category-files' => 'Số tập tin',
 
 # Skin names
-'skinname-standard' => 'Cổ điển',
-'skinname-nostalgia' => 'Vọng cổ',
 'skinname-cologneblue' => 'Xanh Cologne',
-'skinname-myskin' => 'Cá nhân',
-'skinname-simple' => 'Đơn giản',
 'skinname-modern' => 'Hiện đại',
 'skinname-vector' => 'Vectơ',
 
@@ -3795,7 +3765,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 'recreate' => 'Tạo ra lại',
 
 # action=purge
-'confirm_purge_button' => 'Làm mới',
+'confirm_purge_button' => 'Làm tươi',
 'confirm-purge-top' => 'Làm sạch vùng nhớ đệm của trang này?',
 'confirm-purge-bottom' => 'Làm mới một trang sẽ giúp xóa bộ đệm và buộc hiển thị phiên bản gần nhất.',
 
index c52243f..cd26458 100644 (file)
@@ -233,6 +233,7 @@ $messages = array(
 'namespaces' => "Mga ngaran-lat'ang",
 'variants' => 'Mga pagkadirudilain',
 
+'navigation-heading' => 'Menu hit nabigasyon',
 'errorpagetitle' => 'Sayop',
 'returnto' => 'Balik ngadto ha $1.',
 'tagline' => 'Tikang ha {{SITENAME}}',
@@ -353,6 +354,7 @@ $1',
 'restorelink' => '{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}',
 'feedlinks' => 'Igsulod:',
 'feed-invalid' => 'Inbalido nga pagpapaabot',
+'feed-unavailable' => 'Waray mga syndication feed',
 'site-rss-feed' => '$1 RSS nga feed',
 'site-atom-feed' => '$1 Atom nga feed',
 'page-rss-feed' => '"$1" RSS nga feed',
@@ -400,6 +402,9 @@ Nagbalik hin sayop an database nga "$3: $4"',
 'laggedslavemode' => 'Pahimatngon: It pakli bangin waray mga kabag-ohan nga bag-o.',
 'readonly' => 'Gintrankahan an database',
 'enterlockreason' => 'Pagbutang hin rason para han pagtrangka, upod hin banabana kon san-o kukuha-on an pagtrangka',
+'readonlytext' => 'An database in nakatrangka yana ha bag-o nga mga entrada ngan iba nga mga modipikasyon, tungod siguro ha routine database maintenance, kahuman ini in mabalik ha normal.
+
+An magdudumara nga nagtrangka hini in naghatag hini nga kasayoran: $1',
 'missing-article' => 'Ini nga database in waray nakaagi han teksto han pakli nga dapat mabilngan, nga ginngaranan nga "$1" $2.
 
 Ini in agsob hinungdan han pagsunod han kadaan nga kaibhan o sumpay han kaagi ngadto ha pakli nga ginpara.
@@ -461,11 +466,17 @@ An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
 'exception-nologin-text' => 'Ini nga pakli o pagbuhat in nagkikinahanglan nga ikaw in mag-log-in ha dinhi nga wiki.',
 
 # Virus scanner
+'virus-badscanner' => "Maraot nga configuration: Waray kasabti nga virus scanner: ''$1''",
 'virus-scanfailed' => 'Pakyas an pag-scan (kodigo $1)',
 'virus-unknownscanner' => 'diri-nasasabtan nga antivirus:',
 
 # Login and logout pages
+'logouttext' => "'''Nakalog-out kana.'''
+
+Puydi ka magpadayon paggamit hin {{SITENAME}} nga diri magpapakilala, o puydi ka gihapon <span class='plainlinks'>[$1 mag-log in utro]</span> ha parehas o iba nga gumaramit.",
 'welcomeuser' => '¡Uswag ngan Dayon, $1!',
+'welcomecreation-msg' => 'An im akawnt in nahimo na.
+Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].',
 'yourname' => 'Agnay hit gumaramit:',
 'yourpassword' => 'Tigaman-pagsulod:',
 'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
@@ -496,6 +507,7 @@ Alayon pagpili hin lain nga ngaran.',
 'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
 'nocookieslogin' => '{{SITENAME}} in nagkikinahanglan hin mga kuki para makapagpalog-in hin mga gumaramit.  An im mga kuki in diri nagana.
 Alayon paganaha hira ngan utro liwat.',
+'noname' => 'Waray ka nakahatag hin maupay nga agnay-hit-gumaramit.',
 'loginsuccesstitle' => 'Malinamposon an pagsulod',
 'loginsuccess' => "'''Ikaw in nakalog-in ha {{SITENAME}} komo \"\$1\".'''",
 'nosuchuser' => 'Waray gumaramit an may-ada ngaran nga "$1".
@@ -552,8 +564,9 @@ Ikaw in naglalog-in yana...',
 
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
-'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
+'passwordreset-text' => 'Kumpletoha ini nga porma para makareset han imo password.',
 'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
 'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
@@ -561,9 +574,9 @@ Ikaw in naglalog-in yana...',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
 Temporaryo nga tigaman han pagsakob: $2',
-'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
-'passwordreset-emailsent-capture' => 'Mayda pahinumdom nga ginpadangat ha im e-mail, kun diin ini in ginpapakita ha ubos.',
-'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero pakyas an pagpadangat ngada ha gumaramit: $1',
+'passwordreset-emailsent' => 'Ginpadangat an password reset email.',
+'passwordreset-emailsent-capture' => 'Ginpadangat an password reset email, nga ginpakita ha ubos.',
+'passwordreset-emailerror-capture' => 'Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Igliwan an e-mail address',
@@ -573,6 +586,7 @@ Temporaryo nga tigaman han pagsakob: $2',
 'changeemail-oldemail' => 'Yana nga e-mail address:',
 'changeemail-newemail' => 'Bag-o nga e-mail address:',
 'changeemail-none' => '(waray)',
+'changeemail-password' => 'An imo {{SITENAME}} password:',
 'changeemail-submit' => 'Igbalyo an e-mail',
 'changeemail-cancel' => 'Pasagdi',
 
@@ -893,10 +907,12 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'prefs-namespaces' => "Ngaran-lat'ang",
 'default' => 'aada-nga-daan',
 'prefs-files' => 'Mga paypay',
+'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
+'prefs-textboxsize' => 'Kadako han editing window',
 'youremail' => 'E-mail:',
 'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
 'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
-'prefs-memberingroups' => 'Api han {{PLURAL:$1| nga hugpo|nga mga hugpo}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:',
 'prefs-registration' => 'Oras han pagrehistro:',
 'yourrealname' => 'Tinuod nga ngaran:',
 'yourlanguage' => 'Yinaknan:',
@@ -908,6 +924,8 @@ Dapat diri malabaw ha $1 {{PLURAL:$1|agi|mga agi}} nga kahilaba.',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babaye',
 'email' => 'E-mail',
+'prefs-help-realname' => 'Opsyonal an tinuod nga ngaran.
+Kun pilion mo nga ihatag, ini in gagamiton ha paghatag hin atribusyon ha imo mga buhat.',
 'prefs-help-email' => "Diri pinipirit it pagbutang hin E-mail address, pero kinahanglan ini para hin pag-utro hin tigaman-hit-pagsulod (''password''), ngan kun mangalimot ka hit imo tigaman-hit-pagsulod.",
 'prefs-help-email-others' => 'Puydi mo pilion nga it iba in makakontak ha imo gamit an e-mail pinaagi han sumpay ha imo gumaramit o hiruhimangraw nga pakli.
 An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makontak ha imo.',
@@ -1093,7 +1111,7 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 
 An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
 'upload-permitted' => 'Gintutugotan nga mga klase han paypay: $1.',
-'upload-preferred' => 'Mas karugag nga mga tipo hin paypay: %1.',
+'upload-preferred' => 'Karuyag nga mga tipo hin paypay: $1.',
 'upload-prohibited' => 'Gindidire nga mga klase han paypay: $1.',
 'uploadlog' => 'Talaan hin ginkarga-pasaka',
 'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
@@ -1113,6 +1131,7 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
 'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
+'overwrite' => 'It pagsapaw han aada nga paypay in diri gintutugotan.',
 'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
 'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
 'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
@@ -1177,6 +1196,8 @@ $1',
 'lockmanager-fail-acquirelock' => 'Diri nakakakarawat hin trangka para hit "$1".',
 'lockmanager-fail-openlock' => 'Diri nakakaabre han nakatrangka nga paypay para hit "$1".',
 'lockmanager-fail-releaselock' => 'Diri nakakabul-iw han trangka para hit "$1".',
+'lockmanager-fail-svr-acquire' => 'Diri nakakakarawat in mga trangka ha serbidor $1.',
+'lockmanager-fail-svr-release' => 'Diri nakakabul-iw in mga trangka ha serbidor $1.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'An espisipikado nga paypay in diri naka ZIP nga paypay.',
@@ -1189,6 +1210,9 @@ $1',
 'img-auth-nofile' => 'Waray ngada an paypay nga "$1".',
 
 # HTTP errors
+'http-read-error' => 'HTTP maysayop ha pagbasa.',
+'http-timed-out' => 'Naubosan hin oras ha pagpaalayon ha HTTP.',
+'http-curl-error' => 'May sayop ha pagkuha hin URL: $1',
 'http-host-unreachable' => 'Diri nakakaabot ha URL.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1409,12 +1433,6 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listusers-noresult' => 'Waray gumaramit nga nahiagian.',
 'listusers-blocked' => '(ginpugngan)',
 
-# Special:ActiveUsers
-'activeusers' => 'Taramdan hin mga gumaramit nga nanggigios',
-'activeusers-hidebots' => 'Igtago an mga bot',
-'activeusers-hidesysops' => 'Igtago an mga magdudumara',
-'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Hugpo',
 'listgrouprights-rights' => 'Mga katungod',
@@ -1424,8 +1442,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listgrouprights-removegroup' => 'Tanggala {{PLURAL:$2|hugpo|mga hugpo}}: $1',
 'listgrouprights-addgroup-all' => 'Igdugang ngatanan nga mga hugpo',
 'listgrouprights-removegroup-all' => 'Igtanggal ngatanan nga mga hugpo',
+'listgrouprights-addgroup-self' => 'Igdugang an {{PLURAL:$2|grupo|mga grupo}} ha kalugaringon nga akawnt: $1',
+'listgrouprights-removegroup-self' => 'Igtanggal an {{PLURAL:$2|grupo|mga grupo}} tikang ha kalugaringon nga akawnt: $1',
+'listgrouprights-addgroup-self-all' => 'Igdugang an ngatanan nga mga grupo ha kalugaringon nga akawnt',
+'listgrouprights-removegroup-self-all' => 'Igtanggal an ngatanan nga mga grupo tikang ha kalugaringon nga akawnt',
 
 # Email user
+'mailnologin' => 'Waray kakadtoan nga address',
 'emailuser' => 'Ig-e-mail ini nga gumaramit',
 'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
 'emailuser-title-notarget' => 'Gumaramit han e-mail',
@@ -1455,10 +1478,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'watchlistfor2' => 'Para ha $1 $2',
 'watchnologin' => 'Diri nakalog-in',
 'addwatch' => 'Igdugang an listahan hit binabantayan',
+'removewatch' => 'Tanggala tikang ha listahan han binabantayan',
 'watch' => 'Bantayi',
 'watchthispage' => 'Bantayi ini nga pakli',
 'unwatch' => 'Pabay-i an pagbantay',
 'unwatchthispage' => 'Undangi pagbantay',
+'notanarticle' => 'Diri uska unod nga pakli',
+'notvisiblerev' => 'An urhi nga pagliwat han iba nga gumaramit in ginpara',
 'watchlist-details' => '{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri lakip an mga hiruhimangraw-nga-pakli.',
 'wlshowlast' => 'Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3',
 'watchlist-options' => 'Mga pirilian han talaan han binabantayan',
@@ -1469,6 +1495,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 
 'enotif_reset' => 'Markahi an ngatanan nga mga pakli nga ginbisita na',
 'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
+'enotif_subject_deleted' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginpara}} ni $2',
+'enotif_subject_created' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginhimo}} ni $2',
+'enotif_subject_moved' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalhin}} ni $2',
+'enotif_subject_restored' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalik}} ni $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 has been {{GENDER:$2|ginbal-iw}} by $2',
 'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
 'created' => 'nahimo',
 'changed' => 'naliwanan',
@@ -1504,6 +1535,9 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'rollbacklink' => 'libot-pabalik',
 'rollbackfailed' => 'Diri malinamposon an paglibot-pabalik',
 
+# Edit tokens
+'sessionfailure-title' => 'Pakyas an sesyon',
+
 # Protect
 'protectlogpage' => 'Talaan han pinasaliporan',
 'protectedarticle' => 'pinasaliporan "[[$1]]"',
@@ -1867,6 +1901,10 @@ Makikit-an nimo an ginkuhaaan',
 'pageinfo-contentpage' => 'Ginlakip komo uska unod nga pakli',
 'pageinfo-contentpage-yes' => 'Oo',
 'pageinfo-protect-cascading-yes' => 'Oo',
+'pageinfo-category-info' => 'Impormasyon han kaarangay',
+'pageinfo-category-pages' => 'Ihap han mga pakli',
+'pageinfo-category-subcats' => 'Ihap han mga ubos-kaarangay',
+'pageinfo-category-files' => 'Ihap han mga paypay',
 
 # Patrolling
 'markaspatrolleddiff' => 'Igmarka komo ginpatrolya na',
@@ -2219,11 +2257,13 @@ An iba in daan nakatago.
 'specialpages-group-maintenance' => 'Mga sumat han pagmintinar',
 'specialpages-group-other' => 'Mga iba nga pinaurog nga pakli',
 'specialpages-group-login' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
+'specialpages-group-changes' => 'Mga kababag-o pala ngan mga log',
+'specialpages-group-media' => 'Sumat media ngan mga ginkarga-pasaka',
 'specialpages-group-users' => 'Mga gumaramit ngan mga katungod',
 'specialpages-group-highuse' => 'Mga pakli nga damo nagamit',
 'specialpages-group-pages' => 'Talaan hin mga pakli',
 'specialpages-group-pagetools' => 'Mga higamit han pakli',
-'specialpages-group-wiki' => 'Datos ngan mga higamit han Wiki',
+'specialpages-group-wiki' => 'Datos ngan mga higamit',
 'specialpages-group-redirects' => 'Ginreredirek an mga pakli nga pinaurog',
 'specialpages-group-spam' => 'Mga higamit han spam',
 
@@ -2258,6 +2298,8 @@ An iba in daan nakatago.
 
 # Database error messages
 'dberr-header' => 'Ini nga wiki mayda problema',
+'dberr-problems' => 'Pasayloi!
+Ini nga sityo in nageeksperyensya hin mga pagkuri teknikal.',
 
 # HTML forms
 'htmlform-submit' => 'Isumite',
index 2da4ece..fe51e6e 100644 (file)
@@ -11,6 +11,7 @@
  * @author O
  * @author Reedy
  * @author Wu-chinese.com
+ * @author Yfdyh000
  */
 
 $fallback = 'zh-hans';
@@ -46,8 +47,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示监控此页个用户数目',
 'tog-oldsig' => '现在签名个预览:',
 'tog-fancysig' => '拿签名当成wiki文本(弗产生自动链接)',
-'tog-externaleditor' => '默认使用外部编辑器(仅供高手使用,需要来许电脑上作出特殊设置)',
-'tog-externaldiff' => '默认使用外部分析(仅供高手使用,需要来许电脑上作出特殊设置)',
 'tog-showjumplinks' => '启用“跳转”链接',
 'tog-uselivepreview' => '使用实时预览(Javascript)(试验)',
 'tog-forceeditsummary' => '编辑摘要为空个辰光提醒我',
@@ -900,14 +899,6 @@ $1",
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}个搜索已禁用。侬可以暂时使用Google搜索,须注意渠拉索引个{{SITENAME}}内容作兴会过时。',
 
-# Quickbar
-'qbsettings' => '快速导航排',
-'qbsettings-none' => '呒',
-'qbsettings-fixedleft' => '左许固定',
-'qbsettings-fixedright' => '右许固定',
-'qbsettings-floatingleft' => '左许氽移',
-'qbsettings-floatingright' => '右许氽移',
-
 # Preferences page
 'preferences' => '偏好',
 'mypreferences' => '个人设置',
@@ -1574,12 +1565,12 @@ Variants for Chinese language
 'autosumm-new' => '新页面:$1',
 
 # Watchlist editor
-'watchlistedit-normal-title' => '编辑监列表',
+'watchlistedit-normal-title' => '编辑监列表',
 
 # Watchlist editing tools
 'watchlisttools-view' => '查看搭界个修改',
 'watchlisttools-edit' => '查看并编辑监控列表',
-'watchlisttools-raw' => '编辑源监控列表',
+'watchlisttools-raw' => '编辑原始监视列表',
 
 # Special:Version
 'version' => '版本',
index d6b3df2..8a7c25b 100644 (file)
@@ -46,6 +46,10 @@ $namespaceAliases = array(
        'באזונדער' => NS_SPECIAL,
        'באנוצער' => NS_USER,
        'באנוצער_רעדן' => NS_USER_TALK,
+       'משתמש' => NS_USER,
+       'שיחת_משתמש' => NS_USER_TALK,
+       'משתמשת' => NS_USER,
+       'שיחת_משתמשת' => NS_USER_TALK,
        'בילד' => NS_FILE,
        'בילד_רעדן' => NS_FILE_TALK,
        'מעדיעוויקי' => NS_MEDIAWIKI,
@@ -55,6 +59,10 @@ $namespaceAliases = array(
        'באניצער' => NS_USER,
        'באניצער_רעדן' => NS_USER_TALK,
 );
+$namespaceGenderAliases = array(
+       NS_USER      => array( 'male' => 'באַניצער', 'female' => 'באַניצערין' ),
+       NS_USER_TALK => array( 'male' => 'באַניצער_רעדן', 'female' => 'באַניצערין_רעדן' ),
+);
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'טעטיגע_באניצער' ),
@@ -630,16 +638,16 @@ $2',
 'createaccountmail' => 'ניצן א פראוויזאריש פאסווארט און שיקן צום ע-פאסט אדרעס געצייכנט אונטן',
 'createaccountreason' => 'אורזאַך:',
 'badretype' => 'די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.',
-'userexists' => 'דער באַניצער נאָמען איז שוין געניצט. 
+'userexists' => 'דער באַניצער נאָמען איז שוין געניצט.
 ביטע קלײַבט אױס אַן אַנדער נאָמען.',
 'loginerror' => 'לאגירן פֿעלער',
 'createaccounterror' => 'האט נישט געקענט שאַפֿן קאנטע: $1',
 'nocookiesnew' => 'די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.
 {{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.
-איר האט קיכלעך נישט-ערמעגלעכט. 
+איר האט קיכלעך נישט-ערמעגלעכט.
 ביטע ערמעגלעכט זיי, דאן טוט אריינלאגירן מיט אייערע נייע באניצער נאמען און פאסווארט.',
-'nocookieslogin' => '{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער. 
-בײַ אײַך זענען קיכלעך אומדערמעגלעכט. 
+'nocookieslogin' => '{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער.
+בײַ אײַך זענען קיכלעך אומדערמעגלעכט.
 ביטע אַקטיווירט זיי און פרובירט נאכאַמאָל.',
 'nocookiesfornew' => 'מען האט נישט געשאַפֿן די באַניצער קאנטע, ווײַל מען האט נישט געקענט באַשטעטיקן איר מקור.
 טוט פֿעסטשטעלן אָז קיכלעך זענען אַקטיווירט, לאָדט אָן נאכאַמאל דעם בלאַט און פרואווט ווידער.',
@@ -649,7 +657,7 @@ $2',
 'nosuchuser' => 'נישטא קיין באניצער מיטן נאמען  "$1".
 
 קוקט איבער אײַער אויסלייג, אדער [[Special:UserLogin/signup|שאַפֿט א נײַע קאנטע]].',
-'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1". 
+'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1".
 ביטע באַשטעטיקט דעם אויסלייג.',
 'nouserspecified' => 'איר ברויכט ספעציפֿיצירן א באַניצער-נאָמען.',
 'login-userblocked' => 'דער באַניצער איז בלאקירט. ארײַנלאגירן נישט ערלויבט.',
@@ -742,19 +750,19 @@ $2',
 $2
 
 {{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.
-איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה, 
+איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,
 אדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,
  קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.',
-'passwordreset-emailtext-user' => 'באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4). 
+'passwordreset-emailtext-user' => 'באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4).
 די פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}} פארבונדן מיט דעם ע־פאסט אדרעס:
 
 $2
 
 {{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.
-איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה, 
+איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,
 אדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,
  קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.',
-'passwordreset-emailelement' => 'באַניצער נאָמען: $1 
+'passwordreset-emailelement' => 'באַניצער נאָמען: $1
 פראוויזארישער פּאַראָל: $2',
 'passwordreset-emailsent' => "מ'האט געשיקט א פאסווארט צוריקשטעלן ע-פּאָסט.",
 'passwordreset-emailsent-capture' => 'מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.',
@@ -868,7 +876,7 @@ $2
 
 דאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.
 פרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].',
-'userpage-userdoesnotexist' => 'באניצער קאנטע "$1" איז נישט אײַנגעשריבן. 
+'userpage-userdoesnotexist' => 'באניצער קאנטע "$1" איז נישט אײַנגעשריבן.
 קוקט איבער צי איר ווילט שאפֿן/רעדאקטירן דעם בלאט.',
 'userpage-userdoesnotexist-view' => 'באניצער קאנטע "$1" איז נישט איינגעשריבן.',
 'blocked-notice-logextract' => 'דער באַניצער איז דערווייַל פֿאַרשפאַרט.
@@ -932,7 +940,7 @@ $2
 
 אזוי אויך, זאגט איר צו אז איר האט דאס געשריבן אליין, אדער דאס איבערקאפירט פון א מקור מיט פולן רשות דאס מפקיר זיין (זעט $1 פאר מער פרטים).
 '''זיכט נישט באניצן מיט שטאף וואס איז באשיצט מיט קאפירעכטן!'''",
-'longpageerror' => "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}. 
+'longpageerror' => "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}.
 ער קען נישט ווערן אפגעהיטן.'''",
 'readonlywarning' => "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''
 איר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.
@@ -1365,7 +1373,7 @@ $1",
 'email' => 'ע-פאסט',
 'prefs-help-realname' => '* עכטער נאמען (אפציאנאל): אויב וועט איר אויסוועלן צוצישטעלן דאס, וועט גענוצט ווערן צו געבן אטריביאציע צו אייער ארבייט.',
 'prefs-help-email' => 'ע-פאסט אַדרעס איז ברירהדיק, אבער עס דערמעגליכט אז מען קען אייך שיקן א ניי פאסווארט טאמער איר פֿארגעסט דאָס אַלטע.',
-'prefs-help-email-others' => 'איר קענט אויך אויסקלייבן צו לאזן אנדערע פֿארבינדן מיט אייך דורך ע־פאסט דורך א לינק אויף אייער באניצער אדער שמועס בלאט. 
+'prefs-help-email-others' => 'איר קענט אויך אויסקלייבן צו לאזן אנדערע פֿארבינדן מיט אייך דורך ע־פאסט דורך א לינק אויף אייער באניצער אדער שמועס בלאט.
 מען וועט נישט אנטפלעקן אייער ע־פאסט אדרעס ווען אנדערע פֿארבינדן זיך מיט אייך.',
 'prefs-help-email-required' => 'בליצפאסט אדרעס באדארפט.',
 'prefs-info' => 'גרונטלעכע אינפֿארמאַציע',
@@ -1663,11 +1671,11 @@ $1",
 'file-thumbnail-no' => "דער טעקע־נאמען הייבט אן מיט <strong>$1</strong>.
 זי זעט אויס ווי א פארקלענערט בילד ''(מיניאטור)''.
 טאמער האט איר דאס בילד אין פולער רעזאלוציע טוט עס ארויפלאדן, אנדערשט זייט אזוי גוט און ענדערט דעם טעקע־נאמען.",
-'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן. 
-אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
+'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן.
+אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין אינעם צענטראַלן אַרכיוו.
-אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
+אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'די טעקע איז א דופליקאַט פון די פֿאלגנדע {{PLURAL:$1|טעקע|טעקעס}}:',
 'file-deleted-duplicate' => "א טעקע אידענטיש מיט דער טעקע ([[:$1]]) האט מען שוין אויסגעמעקט.
@@ -2075,20 +2083,11 @@ $1",
 'listusers-noresult' => 'קיין באניצער נישט געטראפֿן.',
 'listusers-blocked' => '(בלאקירט)',
 
-# Special:ActiveUsers
-'activeusers' => 'ליסטע פֿון אַקטיווע באַניצער',
-'activeusers-intro' => 'דאָס איז א ליסטע פֿון באַניצער וואָס זענען געווען אַקטיוו אינערהאָלב  $1 {{PLURAL:$1|דעם לעצטן טאָג|די לעצטע $1 טעג}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|פעולה|פעולות}} אין  {{PLURAL:$3|דעם לעצטן טאָג|די לעצטע $3 טעג}}',
-'activeusers-from' => 'ווײַזן באַניצער אָנהייבנדיג פון:',
-'activeusers-hidebots' => 'באַהאַלטן באטן',
-'activeusers-hidesysops' => 'באַהאַלטן סיסאפן',
-'activeusers-noresult' => 'קיין באניצער נישט געטראפֿן.',
-
 # Special:ListGroupRights
 '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' => 'רעכטן',
@@ -2206,7 +2205,7 @@ $PAGEINTRO $NEWPAGE
 
 עס וועט מער נישט זיין קיין מעלדונגען אין פאל פון נאך ענדערונגען נאר אויב איר וועט באזוכן דעם בלאט.
 איר קענט אויך צוריקשטעלן די מעלדונגען פאנען פון אלע אייערע אויפֿגעפאסטע בלעטער אין אייער אויפפאסונג ליסטע.
-             
+
 אייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם
 
 --
@@ -2357,8 +2356,8 @@ $UNWATCHURL
 'undeleterevisions' => '{{PLURAL:$1|איין ווערסיע|$1 ווערסיעס}} אַרכיווירט',
 'undeletehistory' => 'אויב איר שטעלט צוריק דעם בלאַט, וועלן אַלע רעוויזיעס ווערן צוריקגעשטעלט אין דער היסטאריע.
 אויב מען האט באַשאַפֿן א בלאַט מיטן זעלבן נאָמען זײַטן אויסמעקן, וועלן די צוריקגעשטעלטע רעוויזיעס זיך באַווײַזן אין דער פֿריערדיקער היסטאריע.',
-'undeletehistorynoadmin' => 'דער בלאַט איז געווארן אויסגעמעקט. 
- די סיבה פֿאַרן אויסמעקן ווערט געוויזן אין דער רעזומע אונטן, צוזאמען מיט פרטים פון די באַניצער וואס האבן רעדאַקטירט דעם בלאַט פֿאַרן אויסמעקן. 
+'undeletehistorynoadmin' => 'דער בלאַט איז געווארן אויסגעמעקט.
+ די סיבה פֿאַרן אויסמעקן ווערט געוויזן אין דער רעזומע אונטן, צוזאמען מיט פרטים פון די באַניצער וואס האבן רעדאַקטירט דעם בלאַט פֿאַרן אויסמעקן.
  דער טעקסט פון די אויסגעמעקטע ווערסיעס איז דערגרײַכלעך בלויז צו סיסאפן.',
 'undelete-revision' => 'אויסגעמעקטע ווערסיע פֿון $1 (פֿון $4, אום $5) פֿון $3:',
 'undeleterevision-missing' => 'אומגילטיקע אדער פֿעלנדיקע ווערסיע.
@@ -2545,7 +2544,7 @@ $1',
 דער פֿאַרשטיקונג לאג איז צוגעשטעלט אונטן:',
 'blocklogentry' => 'בלאקירט "[[$1]]" אויף אַ תקופה פון $2 $3',
 'reblock-logentry' => 'גענדערט די בלאקירונג דעפיניציעס פון [[$1]] מיטן צייט אפלויף פון $2 $3',
-'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער. 
+'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער.
 איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
 זעט די איצטיקע [[Special:BlockList|ליסטע פון בלאקירטע באניצער]].',
 'unblocklogentry' => 'אומבלאקירט $1',
@@ -2564,7 +2563,7 @@ $1',
 'ipb-needreblock' => '$1 איז שוין בלאקירט. צי ווילט איר טוישן די באַצייכנונגען?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|אנדער בלאקירונג|אנדערע בלאקירונגען}}',
 'unblock-hideuser' => 'איר קענט נישט אומבלאקירן דעם באניצער, ווײַל זײַן באַניצער נאָמען איז פֿאַרבארגן.',
-'ipb_cant_unblock' => "גרײַז: בלאק ID $1 נישט געפֿונען. 
+'ipb_cant_unblock' => "גרײַז: בלאק ID $1 נישט געפֿונען.
 ס'מעגליך שוין געווארן באַפֿרייט.",
 'ipb_blocked_as_range' => "טעות: דער IP אַדרעס $1 איז נישט בלאקירט גראָד און מען קען אים נישט אויפֿבלאקירן.
 דאך איז ער בלאקירט אַלס א טייל פֿון דעם אָפשטאַנד $2, וואָס מ'קען יא אויפֿבלאקירן.",
@@ -2607,11 +2606,11 @@ $1',
 
 איר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.
 
-דער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען. 
+דער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.
 פשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.
 
 '''ווארענונג!'''
- אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט; 
+ אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;
 ביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
 'movepagetext-noredirectfixer' => "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.
 
@@ -2621,7 +2620,7 @@ $1',
 
 איר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.
 
-אַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען. 
+אַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.
 פשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.
 
 '''ווארענונג:''' אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
@@ -2782,7 +2781,7 @@ $1',
 'import-nonewrevisions' => 'אַלע רעוויזיעס שוין אימפארטירט.',
 'xml-error-string' => '$1 בײַ שורה $2, זייל $3 (בייט $4): $5',
 'import-upload' => 'אַרויפֿלאָדן XML דאַטן',
-'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן. 
+'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן.
  ביטע פרובירט נאכאמאל.',
 'import-invalid-interwiki' => 'נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.',
 'import-error-edit' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.',
@@ -2881,13 +2880,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */',
-'standard.css' => '/* CSS געשטעלט דא ווירקט אויפן סטאנדארט סקין */',
-'nostalgia.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן נאסטאלגיע סקין */',
 'cologneblue.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן קעלנישן־בלוי סקין */',
 'monobook.css' => '/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */',
-'myskin.css' => '/* CSS געשטעלט דא ווירקט אויפן MySkin סקין */',
-'chick.css' => '/* CSS געשטעלט דא ווירקט אויפן טשיק סקין */',
-'simple.css' => '/* CSS געשטעלט דא ווירקט אויפן איינפאך סקין */',
 'modern.css' => '/* CSS געשטעלט דא ווירקט אויפן מאדערנעם סקין */',
 'vector.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */',
 
@@ -2963,13 +2957,8 @@ $1',
 'pageinfo-category-files' => 'צאָל טעקעס',
 
 # Skin names
-'skinname-standard' => 'קלאסיש',
-'skinname-nostalgia' => 'נאסטאלגיע',
 'skinname-cologneblue' => 'קעלניש בלוי',
 'skinname-monobook' => 'מאנאבוק',
-'skinname-myskin' => 'מיין סקין',
-'skinname-chick' => 'טשיק',
-'skinname-simple' => 'איינפֿאַך',
 'skinname-modern' => 'מאדערן',
 'skinname-vector' => 'וועקטאר',
 
@@ -3454,7 +3443,7 @@ $3
 $5
 
 דער באשטעטיגונג קאד גייט אויס $4.',
-'confirmemail_body_set' => 'עמעצער, ווארשיינליך איר, פֿון IP אַדרעס $1, 
+'confirmemail_body_set' => 'עמעצער, ווארשיינליך איר, פֿון IP אַדרעס $1,
 האט געענדערט דעם ע־פאסט אַדרעס פֿון דער קאנטע "$2" צו דעם אדרעס אויף {{SITENAME}}.
 
 צו באַשטעטיקן אַז די קאנטע געהערט טאקע צו אייך און ווידער אַקטיווירן ע־פאסט דינסטן אויף {{SITENAME}}, ביטע טוט עפֿענען דעם לינק אין אייער בלעטערער:
index be84b22..62a3b84 100644 (file)
@@ -377,8 +377,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
 'tog-fancysig' => '将签名以wiki文本对待(不产生自动链接)',
-'tog-externaleditor' => '默认使用外部编辑器(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
-'tog-externaldiff' => '默认使用外部差异分析(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-showjumplinks' => '启用“跳转到”访问链接',
 'tog-uselivepreview' => '使用实时预览(需要JavaScript)(实验功能)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
@@ -389,14 +387,15 @@ $messages = array(
 'tog-watchlisthideanons' => '在监视列表中隐藏匿名用户',
 'tog-watchlisthidepatrolled' => '在监视列表中隐藏已巡查的编辑',
 'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
-'tog-diffonly' => '比较差异时不显示页面内容',
+'tog-diffonly' => '不在版本差异下面显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
 'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
+'tog-useeditwarning' => '如在更改未保存时离开页面,则发出警告',
 
 'underline-always' => '总是使用',
 'underline-never' => '从不使用',
-'underline-default' => '浏览器默认设置',
+'underline-default' => '皮肤或浏览器默认设置',
 
 # Font style option in Special:Preferences
 'editfont-style' => '编辑区字体样式:',
@@ -543,7 +542,7 @@ $messages = array(
 'protect_change' => '更改',
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
-'unprotectthispage' => '更改本页面的保护',
+'unprotectthispage' => '更改本页面保护设置',
 'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
@@ -561,7 +560,7 @@ $messages = array(
 'templatepage' => '查看模板页面',
 'viewhelppage' => '查看帮助页面',
 'categorypage' => '查看分类页面',
-'viewtalkpage' => '查看讨论页面',
+'viewtalkpage' => '查看讨论',
 'otherlanguages' => '其他语言',
 'redirectedfrom' => '(重定向自$1)',
 'redirectpagesub' => '重定向页',
@@ -571,9 +570,9 @@ $messages = array(
 'jumpto' => '跳转至:',
 'jumptonavigation' => '导航',
 'jumptosearch' => '搜索',
-'view-pool-error' => '抱歉,服务器超负荷运转。
+'view-pool-error' => '抱歉,服务器目前正超负荷运转。
 过多用户正尝试查看本页面。
-请在再次尝试访问本页面之前稍等片刻
+请稍等片刻后再次尝试访问本页面
 
 $1',
 'pool-timeout' => '等待锁超时',
@@ -594,7 +593,7 @@ $1',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
-'policy-url' => 'Project:æ\96¹é\92\88',
+'policy-url' => 'Project:æ\94¿ç­\96',
 'portal' => '社区专页',
 'portal-url' => 'Project:社区专页',
 'privacy' => '隐私政策',
@@ -645,7 +644,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => '页面',
-'nstab-user' => '用户页',
+'nstab-user' => '用户页',
 'nstab-media' => '媒体页面',
 'nstab-special' => '特殊页面',
 'nstab-project' => '项目页面',
@@ -761,8 +760,8 @@ $2',
 'remembermypassword' => '在该浏览器保存我的登录状态(最长$1日)',
 'securelogin-stick-https' => '登录后继续使用HTTPS连接',
 'yourdomainname' => '您的域名:',
-'password-change-forbidden' => '你不能在本wiki更改密码。',
-'externaldberror' => '这可能是由于验证数据库错误或您被禁止更新您的外部账号。',
+'password-change-forbidden' => '您不能在本wiki上更改密码。',
+'externaldberror' => '验证数据库出错或您被禁止更新您的外部账号。',
 'login' => '登录',
 'nav-login-createaccount' => '登录/创建账户',
 'loginprompt' => '你必须启用Cookies才能登录{{SITENAME}}。',
@@ -859,7 +858,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
-'passwordreset-text' => '完成该表格以接收你账户信息的邮件提醒。',
+'passwordreset-text' => '完成该表格以重设你的密码。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此wiki已经禁用密码重置。',
 'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
@@ -869,21 +868,21 @@ $2',
 'passwordreset-capture-help' => '如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。',
 'passwordreset-email' => '电子邮件地址:',
 'passwordreset-emailtitle' => '在 {{SITENAME}} 的帐户详细信息',
-'passwordreset-emailtext-ip' => '有人通过IP地址 $1 (可能是您)请求获取 {{SITENAME}} ($4)上相关账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
+'passwordreset-emailtext-ip' => '有人通过IP地址$1(可能是您请求重设{{SITENAME}}($4)上相关账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
 
 $2
 
-{{PLURAL:$3|这个|这个}}临时密码将会在{{PLURAL:$5|一天|$5 天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
-'passwordreset-emailtext-user' => '用户 $1 请求获取 {{SITENAME}} ($4)上您的账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
+这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
+'passwordreset-emailtext-user' => '用户$1请求重设{{SITENAME}}($4)上您的账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
 
 $2
 
-{{PLURAL:$3|这个|这个}}临时密码将会在{{PLURAL:$5|一天|$5 天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
+这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
 'passwordreset-emailelement' => '用户名:$1
 临时密码:$2',
 'passwordreset-emailsent' => '密码重置邮件已发送。',
-'passwordreset-emailsent-capture' => '提醒电子邮件已发送,并在下面显示。',
-'passwordreset-emailerror-capture' => '生成的提醒电子邮件如下所示,但发送失败:$1',
+'passwordreset-emailsent-capture' => '密码重设电子邮件已发送,并在下面显示。',
+'passwordreset-emailerror-capture' => '生成的密码重设电子邮件如下所示,但发送失败:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改电子邮件地址',
@@ -1072,6 +1071,7 @@ $2
 'content-failed-to-parse' => '未能将 $2 内容转换为 $1:$3',
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
+'editwarning-warning' => '离开这个页面会令您遗失之前的所有更改。若您已经登入,您可在您参数设置的“{{int:prefs-editing}}”节中关闭此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki语法',
@@ -1335,19 +1335,10 @@ $1",
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索,须注意他们索引的{{SITENAME}}内容可能会过时。',
 
-# Quickbar
-'qbsettings' => '快速导航栏',
-'qbsettings-none' => '无',
-'qbsettings-fixedleft' => '左侧固定',
-'qbsettings-fixedright' => '右侧固定',
-'qbsettings-floatingleft' => '左侧漂移',
-'qbsettings-floatingright' => '右侧漂移',
-'qbsettings-directionality' => '根据您的语言文本方向固定位置',
-
 # Preferences page
-'preferences' => '参数设置',
+'preferences' => '设置',
 'mypreferences' => '系统设置',
-'prefs-edits' => '编辑数:',
+'prefs-edits' => '编辑数:',
 'prefsnologin' => '未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
 'changepassword' => '更改密码',
@@ -1406,7 +1397,7 @@ $1",
 'timezoneregion-europe' => '欧洲',
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '接受来自其他用户的邮件',
+'allowemail' => '接受来自其他用户的电子邮件',
 'prefs-searchoptions' => '搜索',
 'prefs-namespaces' => '名字空间',
 'defaultns' => '否则在这些名字空间中搜索:',
@@ -1867,7 +1858,6 @@ $1',
 'http-read-error' => 'HTTP读取错误。',
 'http-timed-out' => 'HTTP请求已过时。',
 'http-curl-error' => '撷取URL时出错:$1',
-'http-host-unreachable' => '无法到达URL。',
 'http-bad-status' => '进行HTTP请求时出现问题:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2185,15 +2175,6 @@ $1',
 'listusers-noresult' => '找不到用户。',
 'listusers-blocked' => '(已封禁)',
 
-# Special:ActiveUsers
-'activeusers' => '活跃用户列表',
-'activeusers-intro' => '这个列表列出了最近$1天进行过操作的用户。',
-'activeusers-count' => '最近$3天内有$1次编辑',
-'activeusers-from' => '显示用户开始于:',
-'activeusers-hidebots' => '隐藏机器人',
-'activeusers-hidesysops' => '隐藏管理员',
-'activeusers-noresult' => '找不到用户。',
-
 # Special:ListGroupRights
 'listgrouprights' => '用户组权限',
 'listgrouprights-summary' => '以下面是一个在这个维基中所定义出来的用户权限列表,以及它们的访问权。
@@ -2222,7 +2203,7 @@ $1',
 'emailpage' => '电邮联系',
 'emailpagetext' => '你可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。你在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。',
 'usermailererror' => 'Mail 对象返回错误:',
-'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
+'defemailsubject' => '来自{{SITENAME}}用户“$1”的电子邮件',
 'usermaildisabled' => '用户电子邮件停用',
 'usermaildisabledtext' => '你不能发送电子邮件至本wiki的其他用户',
 'noemailtitle' => '无电子邮件地址',
@@ -2451,7 +2432,7 @@ $UNWATCHURL
 'viewdeletedpage' => '查看被删页面',
 'undeletepagetext' => '以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。',
 'undelete-fieldset-title' => '恢复版本',
-'undeleteextrahelp' => "恢复整个编辑历史时,请清除所有复选框后点击'''''{{int:undeletebtn}}'''''。恢复特定版本时,请选择相应版本前的复选框后点击'''''{{int:undeletebtn}}'''''。",
+'undeleteextrahelp' => "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
 'undeleterevisions' => '$1版本存档',
 'undeletehistory' => '如果您恢复了该页面,所有版本都会被恢复到修订历史中。
 如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。',
@@ -2665,6 +2646,7 @@ $1被封禁的理由是:“$2”',
 'proxyblocksuccess' => '完成。',
 'sorbsreason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。',
 'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。',
+'xffblockreason' => '您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1',
 'cant-block-while-blocked' => '您无法在封禁期内封禁其他用户。',
 'cant-see-hidden-user' => '您尝试封禁的用户已被封禁并隐藏。
 由于您尚无隐藏用户的权限,您无法查看或编辑此用户的封禁。',
@@ -2970,13 +2952,8 @@ $1被封禁的理由是:“$2”',
 
 # Stylesheets
 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
-'standard.css' => '/* 此处的 CSS 将影响使用标准皮肤的用户 */',
-'nostalgia.css' => '/* 此处的 CSS 将影响使用怀旧皮肤的用户 */',
 'cologneblue.css' => '/* 此处的 CSS 将影响使用科隆香水蓝皮肤的用户 */',
 'monobook.css' => '/* 此处的 CSS 将影响使用 Monobook 皮肤的用户 */',
-'myskin.css' => '/* 此处的 CSS 将影响使用 MySkin 皮肤的用户 */',
-'chick.css' => '/* 此处的 CSS 将影响使用 Chick 皮肤的用户 */',
-'simple.css' => '/* 此处的 CSS 将影响使用 Simple 皮肤的用户 */',
 'modern.css' => '/* 此处的 CSS 将影响使用 Modern 皮肤的用户 */',
 'vector.css' => '/* 此处的 CSS 将影响使用 Vector 皮肤的用户 */',
 'print.css' => '/* 此处的 CSS 将影响打印输出 */',
@@ -2989,13 +2966,8 @@ $1被封禁的理由是:“$2”',
 
 # Scripts
 'common.js' => '/* 此处的JavaScript将加载于所有用户每一个页面。 */',
-'standard.js' => '/* 此处的JavaScript将加载于使用标准皮肤的用户 */',
-'nostalgia.js' => '/* 此处的JavaScript将加载于使用怀旧皮肤的用户 */',
 'cologneblue.js' => '/* 此处的JavaScript将加载于使用科隆香水蓝皮肤的用户 */',
 'monobook.js' => '/* 此处的JavaScript将加载于使用Monobook皮肤的用户 */',
-'myskin.js' => '/* 此处的JavaScript将加载于使用MySkin皮肤的用户 */',
-'chick.js' => '/* 此处的JavaScript将加载于使用Chick皮肤的用户 */',
-'simple.js' => '/* 此处的JavaScript将加载于使用Simple皮肤的用户 */',
 'modern.js' => '/* 此处的JavaScript将加载于使用Modern皮肤的用户 */',
 'vector.js' => '/* 此处的JavaScript将加载于使用Vector皮肤的用户 */',
 'group-autoconfirmed.js' => '/* 此处的JavaScript将仅加载于自动确认用户 */',
@@ -3075,10 +3047,7 @@ $1被封禁的理由是:“$2”',
 'pageinfo-category-files' => '文件数',
 
 # Skin names
-'skinname-standard' => '标准',
-'skinname-nostalgia' => '怀旧',
 'skinname-cologneblue' => '科隆香水蓝',
-'skinname-simple' => '简单',
 'skinname-modern' => '现代',
 
 # Patrolling
@@ -3764,8 +3733,8 @@ $5
 'watchlistedit-raw-removed' => '$1个标题被删除:',
 
 # Watchlist editing tools
-'watchlisttools-view' => '查看监视更改',
-'watchlisttools-edit' => 'æ\9f¥ç\9c\8b并编辑监视列表',
+'watchlisttools-view' => '查看监视更改',
+'watchlisttools-edit' => 'æ\9f¥ç\9c\8bå\92\8c编辑监视列表',
 'watchlisttools-raw' => '编辑原始监视列表',
 
 # Signatures
@@ -3914,14 +3883,14 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'logentry-delete-delete' => '$1删除页面$3',
 'logentry-delete-restore' => '$1恢复页面$3',
 'logentry-delete-event' => '$1已更改$3中$5项日志的可见性:$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日志的可见性',
-'logentry-delete-revision-legacy' => '$1已更改$3中历史版本的可见性',
-'logentry-suppress-delete' => '$1已隐藏页面$3',
-'logentry-suppress-event' => '$1已不可见地更改$3中{{PLURAL:$5|$5项日志|$5项日志}}的可见性:$4',
-'logentry-suppress-revision' => '$1已不可见地更改$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
-'logentry-suppress-event-legacy' => '$1已不可见地更改$3中日志的可见性',
-'logentry-suppress-revision-legacy' => '$1已不可见地更改$3中历史版本的可见性',
+'logentry-delete-revision' => '$1{{GENDER:$2|已更改}}$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
+'logentry-delete-event-legacy' => '$1{{GENDER:$2|已更改}}$3中日志的可见性',
+'logentry-delete-revision-legacy' => '$1{{GENDER:$2|已更改}}$3中历史版本的可见性',
+'logentry-suppress-delete' => '$1{{GENDER:$2|已隐藏}}页面$3',
+'logentry-suppress-event' => '$1已不可见地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5项日志|$5项日志}}的可见性:$4',
+'logentry-suppress-revision' => '$1已不可见地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
+'logentry-suppress-event-legacy' => '$1已不可见地{{GENDER:$2|更改}}$3中日志的可见性',
+'logentry-suppress-revision-legacy' => '!$1已不可见地{{GENDER:$2|更改}}$3中历史版本的可见性',
 'revdelete-content-hid' => '隐藏内容',
 'revdelete-summary-hid' => '隐藏编辑摘要',
 'revdelete-uname-hid' => '隐藏用户名',
@@ -3934,13 +3903,13 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 '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-patrol-patrol' => '$1{{GENDER:$2|标记}}页面$3的版本$4为已巡查',
+'logentry-patrol-patrol-auto' => '$1自动{{GENDER:$2|标记}}页面$3的版本$4为已巡查',
+'logentry-newusers-newusers' => '已{{GENDER:$2|创建}}用户帐户$1',
+'logentry-newusers-create' => '{{GENDER:$2|创建}}用户帐户$1',
 'logentry-newusers-create2' => '创建用户帐户 $3 由 $1',
 'logentry-newusers-byemail' => '$1创建用户$3,并且密码已通过电子邮件发送',
-'logentry-newusers-autocreate' => '帐户$1已被自动地创建',
+'logentry-newusers-autocreate' => '用户帐户$1已被自动{{GENDER:$2|创建}}',
 'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
 'logentry-rights-rights-legacy' => '$1更改$3的用户组',
 'logentry-rights-autopromote' => '$1的用户组已自动从$4改为$5',
index 45ec98c..7e3e306 100644 (file)
@@ -282,8 +282,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示監視用戶的數目',
 'tog-oldsig' => '原有簽名:',
 'tog-fancysig' => '將簽名以維基文字對待 (不產生自動連結)',
-'tog-externaleditor' => '預設使用外部編輯器 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
-'tog-externaldiff' => '預設使用外部差異分析 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
 'tog-showjumplinks' => '啟用「跳轉到」訪問連結',
 'tog-uselivepreview' => '使用實時預覽 (需要JavaScript)(試驗中)',
 'tog-forceeditsummary' => '當沒有輸入摘要時提醒我',
@@ -298,6 +296,7 @@ $messages = array(
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
 'tog-norollbackdiff' => '進行回退後略過差異比較',
+'tog-useeditwarning' => '當我在更改未儲存時離開頁面時警告我',
 
 'underline-always' => '總是使用',
 'underline-never' => '從不使用',
@@ -1019,6 +1018,8 @@ $2
 'content-failed-to-parse' => '未能轉換$2 內容成為$1:$3',
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
+'editwarning-warning' => '離開這個頁面可能會令您失去之前的所有更改。
+若您已經登入,您可在您偏好設定的「編輯」節中關閉此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki語法',
@@ -1283,15 +1284,7 @@ $1",
 'powersearch-togglenone' => '無',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。',
-
-# Quickbar
-'qbsettings' => '快速導航條',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '左側固定',
-'qbsettings-fixedright' => '右側固定',
-'qbsettings-floatingleft' => '左側漂移',
-'qbsettings-floatingright' => '右側漂移',
-'qbsettings-directionality' => '固定,取決於你的語言腳本的方向性',
+'search-error' => '搜尋時發生錯誤:$1',
 
 # Preferences page
 'preferences' => '偏好設定',
@@ -1826,7 +1819,6 @@ $1',
 'http-read-error' => 'HTTP讀取錯誤。',
 'http-timed-out' => 'HTTP請求已過時。',
 'http-curl-error' => '擷取URL時出錯:$1',
-'http-host-unreachable' => '無法到達URL。',
 'http-bad-status' => '進行HTTP請求時出現問題:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2152,15 +2144,6 @@ Template:消除歧義',
 'listusers-noresult' => '找不到用戶。',
 'listusers-blocked' => '(已封禁)',
 
-# Special:ActiveUsers
-'activeusers' => '活躍用戶列表',
-'activeusers-intro' => '這個是在最近$1天之內有一些動作的用戶列表。',
-'activeusers-count' => '最近$3天內有$1次編輯',
-'activeusers-from' => '顯示用戶開始於:',
-'activeusers-hidebots' => '隱藏機器人',
-'activeusers-hidesysops' => '隱藏管理員',
-'activeusers-noresult' => '找不到用戶。',
-
 # Special:ListGroupRights
 'listgrouprights' => '用戶群組權限',
 'listgrouprights-summary' => '以下面是一個在這個wiki中定義出來的用戶權限清單,以及它們的存取權。
@@ -2239,7 +2222,7 @@ Template:消除歧義',
 'notanarticle' => '不是頁面',
 'notvisiblerev' => '上次由不同用戶所作的修訂版本已經刪除',
 'watchnochange' => '在顯示的時間段內您所監視的頁面沒有更改。',
-'watchlist-details' => 'ä¸\8då\8c\85å\90«è¨\8eè«\96é \81ï¼\8cæ\9c\89 $1 é \81å\9c¨æ\82¨ç\9a\84ç\9b£è¦\96å\88\97表ä¸\8a。',
+'watchlist-details' => 'ä¸\8då\8c\85å\90«è¨\8eè«\96é \81ï¼\8cæ\82¨ç\9a\84ç\9b£è¦\96å\88\97表ä¸\8aæ\9c\89 $1 å\80\8bé \81é\9d¢。',
 'wlheader-enotif' => '* 已經啟動電子郵件通知功能。',
 'wlheader-showupdated' => "* 在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''",
 'watchmethod-recent' => '檢查被監視頁面的最近編輯',
@@ -2644,6 +2627,7 @@ $1被封禁的理由是“$2”',
 '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' => '您現正嘗試封鎖的用戶已經被封鎖或隱藏。
 您現在沒有隱藏用戶的權限,您不可以檢視或者編輯這位用戶的封鎖。',
@@ -2958,13 +2942,8 @@ $1被封禁的理由是“$2”',
 
 # Stylesheets
 'common.css' => '/* 此處的 CSS 將應用於所有的面板 */',
-'standard.css' => '/* 此處的 CSS 將影響使用標準面板的用戶 */',
-'nostalgia.css' => '/* 此處的 CSS 將影響使用懷舊面板的用戶 */',
 'cologneblue.css' => '/* 此處的 CSS 將影響使用科隆香水藍面板的用戶 */',
 'monobook.css' => '/* 此處的 CSS 將影響使用 Monobook 面板的用戶 */',
-'myskin.css' => '/* 此處的 CSS 將影響使用 MySkin 面板的用戶 */',
-'chick.css' => '/* 此處的 CSS 將影響使用 Chick 面板的用戶 */',
-'simple.css' => '/* 此處的 CSS 將影響使用 Simple 面板的用戶 */',
 'modern.css' => '/* 此處的 CSS 將影響使用 Modern 面板的用戶 */',
 'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
 'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
@@ -2977,13 +2956,8 @@ $1被封禁的理由是“$2”',
 
 # Scripts
 'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
-'standard.js' => '/* 此處的JavaScript將載入於使用標準面板的用戶 */',
-'nostalgia.js' => '/* 此處的JavaScript將載入於使用懷舊面板的用戶 */',
 'cologneblue.js' => '/* 此處的JavaScript將載入於使用科隆香水藍面板的用戶 */',
 'monobook.js' => '/* 此處的JavaScript將載入於使用Monobook面板的用戶 */',
-'myskin.js' => '/* 此處的JavaScript將載入於使用MySkin面板的用戶 */',
-'chick.js' => '/* 此處的JavaScript將載入於使用Chick面板的用戶 */',
-'simple.js' => '/* 此處的JavaScript將載入於使用Simple面板的用戶 */',
 'modern.js' => '/* 此處的JavaScript將載入於使用Modern面板的用戶 */',
 'vector.js' => '/* 此處的JavaScript將載入於使用Vector面板的用戶 */',
 
@@ -3059,10 +3033,7 @@ $1被封禁的理由是“$2”',
 'pageinfo-category-files' => '編輯數量',
 
 # Skin names
-'skinname-standard' => '標準',
-'skinname-nostalgia' => '懷舊',
 'skinname-cologneblue' => '科隆香水藍',
-'skinname-simple' => '簡單',
 'skinname-modern' => '現代',
 
 # Patrolling
@@ -3883,6 +3854,8 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤銷更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
 
 # SQLite database support
 'sqlite-has-fts' => '帶全文搜尋的版本$1',
diff --git a/maintenance/archives/patch-eu_local_id.sql b/maintenance/archives/patch-eu_local_id.sql
deleted file mode 100644 (file)
index bb59d06..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE /*_*/external_user
-CHANGE COLUMN eu_wiki_id
-eu_local_id int unsigned NOT NULL;
diff --git a/maintenance/archives/patch-external_user.sql b/maintenance/archives/patch-external_user.sql
deleted file mode 100644 (file)
index 176b46d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
diff --git a/maintenance/archives/patch-img_media_mime-index.sql b/maintenance/archives/patch-img_media_mime-index.sql
new file mode 100644 (file)
index 0000000..bfaf84f
--- /dev/null
@@ -0,0 +1,4 @@
+-- New index on image table to allow searches for types i.e. video webm
+-- Added 2013-01-08
+
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
diff --git a/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
new file mode 100644 (file)
index 0000000..bff63c7
--- /dev/null
@@ -0,0 +1,5 @@
+--
+-- Makes the iwl_prefix_title_from index for the iwlinks table non-unique
+--
+DROP INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks;
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-iwlinks-from-title-index.sql b/maintenance/archives/patch-iwlinks-from-title-index.sql
new file mode 100644 (file)
index 0000000..8b73f9e
--- /dev/null
@@ -0,0 +1,4 @@
+--
+-- Recreates the iwl_prefix_from_title index for the iwlinks table
+--
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
diff --git a/maintenance/archives/patch-kill-iwl_pft.sql b/maintenance/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 96e1435..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks;
-
diff --git a/maintenance/copyJobQueue.php b/maintenance/copyJobQueue.php
new file mode 100644 (file)
index 0000000..3e19397
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copy all jobs from one job queue system to another.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Copy all jobs from one job queue system to another.
+ * This uses an ad-hoc $wgJobQueueMigrationConfig setting,
+ * which is a map of queue system names to JobQueue::factory() parameters.
+ * The parameters should not have wiki or type settings and thus partial.
+ *
+ * @ingroup Maintenance
+ */
+class CopyJobQueue extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy jobs from one queue system to another.";
+               $this->addOption( 'src', 'Key to $wgJobQueueMigrationConfig for source', true, true );
+               $this->addOption( 'dst', 'Key to $wgJobQueueMigrationConfig for destination', true, true );
+               $this->addOption( 'type', 'Types of jobs to copy (use "all" for all)', true, true );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               global $wgJobQueueMigrationConfig;
+
+               $srcKey = $this->getOption( 'src' );
+               $dstKey = $this->getOption( 'dst' );
+
+               if ( !isset( $wgJobQueueMigrationConfig[$srcKey] ) ) {
+                       $this->error( "\$wgJobQueueMigrationConfig not set for '$srcKey'.", 1 );
+               } elseif ( !isset( $wgJobQueueMigrationConfig[$dstKey] ) ) {
+                       $this->error( "\$wgJobQueueMigrationConfig not set for '$dstKey'.", 1 );
+               }
+
+               $types = ( $this->getOption( 'type' ) === 'all' )
+                       ? JobQueueGroup::singleton()->getQueueTypes()
+                       : array( $this->getOption( 'type' ) );
+
+               foreach ( $types as $type ) {
+                       $baseConfig = array( 'type' => $type, 'wiki' => wfWikiID() );
+                       $src = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$srcKey] );
+                       $dst = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$dstKey] );
+
+                       list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllQueuedJobs() );
+                       $this->output( "Copied $totalOK/$total queued $type jobs.\n" );
+
+                       list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllDelayedJobs() );
+                       $this->output( "Copied $totalOK/$total delayed $type jobs.\n" );
+               }
+       }
+
+       protected function copyJobs( JobQueue $src, JobQueue $dst, $jobs ) {
+               $total = 0;
+               $totalOK = 0;
+               $batch = array();
+               foreach ( $jobs as $job ) {
+                       ++$total;
+                       $batch[] = $job;
+                       if ( count( $batch ) >= $this->mBatchSize ) {
+                               if ( $dst->push( $batch ) ) {
+                                       $totalOK += count( $batch );
+                               }
+                               $batch = array();
+                               $dst->waitForBackups();
+                       }
+               }
+               if ( count( $batch ) ) {
+                       if ( $dst->push( $batch ) ) {
+                               $totalOK += count( $batch );
+                       }
+                       $dst->waitForBackups();
+               }
+               return array( $total, $totalOK );
+       }
+}
+
+$maintClass = 'CopyJobQueue';
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 08aae29..7dfbec1 100644 (file)
@@ -63,11 +63,11 @@ class DumpLinks extends Maintenance {
                                        $this->output( "\n" );
                                }
                                $page = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $this->output( $page->getPrefixedUrl() );
+                               $this->output( $page->getPrefixedURL() );
                                $lastPage = $row->page_id;
                        }
                        $link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
-                       $this->output( " " . $link->getPrefixedUrl() );
+                       $this->output( " " . $link->getPrefixedURL() );
                }
                if ( isset( $lastPage ) )
                        $this->output( "\n" );
index e05e154..1eecfe4 100644 (file)
@@ -50,7 +50,7 @@ class DumpSisterSites extends Maintenance {
 
                foreach ( $result as $row ) {
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       $url = $title->getFullUrl();
+                       $url = $title->getFullURL();
                        $text = $title->getPrefixedText();
                        $this->output( "$url $text\n" );
                }
index 84e4021..83cc088 100644 (file)
@@ -3,6 +3,22 @@
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
 require 'jsduck/meta_tag'
 
+class SourceTag < JsDuck::MetaTag
+  def initialize
+    # This defines the name of the @tag
+    @name = 'source'
+  end
+
+  # Generate HTML output for this tag.
+  # One can make use of the #format method to easily support
+  # Markdown and {@link} tags inside the contents of the tag.
+  #
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
+  end
+end
+
 class ContextTag < JsDuck::MetaTag
   def initialize
     @name = 'context'
index 4a8ba8c..c29c91c 100644 (file)
        {
                "name": "jQuery",
                "groups": [
-                       {
-                               "name": "Core",
-                               "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
-                       },
                        {
                                "name": "Plugins",
                                "classes": ["jQuery.plugin.*"]
                ]
        },
        {
-               "name": "Misc",
+               "name": "Upstream",
                "groups": [
                        {
-                               "name": "Native",
+                               "name": "jQuery",
+                               "classes": ["jQuery", "jQuery.Event", "jQuery.Callbacks", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR", "QUnit"]
+                       },
+                       {
+                               "name": "JavaScript",
                                "classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
                        }
                ]
index c4705d8..e932b5c 100644 (file)
@@ -1,5 +1,6 @@
 {
-       "--title": "MediaWiki Code Documentation",
+       "--title": "MediaWiki core - Documentation",
+       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
        "--meta-tags": "./MetaTags.rb",
        "--warnings": ["-no_doc"],
@@ -15,4 +16,4 @@
                "../../resources/mediawiki.api",
                "../../resources/jquery/jquery.localize.js"
        ]
-}
\ No newline at end of file
+}
index 8ab102f..7910ec8 100644 (file)
@@ -1,26 +1,43 @@
 /**
  * @class jQuery
+ * @source <http://api.jquery.com/>
  */
 
 /**
  * @method ajax
+ * @source <http://api.jquery.com/jQuery.ajax/>
  * @return {jqXHR}
  */
 
 /**
  * @class jQuery.Event
+ * @source <http://api.jquery.com/Types/#Event>
+ */
+
+/**
+ * @class jQuery.Callbacks
+ * @source <http://api.jquery.com/jQuery.Callbacks/>
  */
 
 /**
  * @class jQuery.Promise
+ * @source <http://api.jquery.com/Types/#Promise>
  */
 
 /**
  * @class jQuery.Deferred
  * @mixins jQuery.Promise
+ * @source <http://api.jquery.com/jQuery.Deferred/>
  */
 
 /**
  * @class jQuery.jqXHR
+ * @source <http://api.jquery.com/Types/#jqXHR>
  * @alternateClassName jqXHR
  */
+
+
+/**
+ * @class QUnit
+ * @source <http://api.qunitjs.com/>
+ */
index 66cc1dc..f5bcb5d 100644 (file)
@@ -188,7 +188,6 @@ $wgIgnoredMessages = array(
        'fewestrevisions-summary',
        'upload-summary',
        'wantedtemplates-summary',
-       'activeusers-summary',
        'search-summary',
        'editpage-head-copy-warn',
        'editpage-tos-summary',
@@ -297,23 +296,13 @@ $wgOptionalMessages = array(
        'resetpass_text',
        'image_sample',
        'media_sample',
-       'skinname-standard',
-       'skinname-nostalgia',
        'skinname-cologneblue',
        'skinname-monobook',
-       'skinname-myskin',
-       'skinname-chick',
-       'skinname-simple',
        'skinname-modern',
        'skinname-vector',
        'common.css',
-       'standard.css',
-       'nostalgia.css',
        'cologneblue.css',
        'monobook.css',
-       'myskin.css',
-       'chick.css',
-       'simple.css',
        'modern.css',
        'vector.css',
        'print.css',
@@ -324,13 +313,8 @@ $wgOptionalMessages = array(
        'group-sysop.css',
        'group-bureaucrat.css',
        'common.js',
-       'standard.js',
-       'nostalgia.js',
        'cologneblue.js',
        'monobook.js',
-       'myskin.js',
-       'chick.js',
-       'simple.js',
        'modern.js',
        'vector.js',
        'group-autoconfirmed.js',
index 7c16df6..b7ad695 100644 (file)
@@ -56,8 +56,6 @@ $wgMessageStructure = array(
                'tog-shownumberswatching',
                'tog-oldsig',
                'tog-fancysig',
-               'tog-externaleditor',
-               'tog-externaldiff',
                'tog-showjumplinks',
                'tog-uselivepreview',
                'tog-forceeditsummary',
@@ -72,6 +70,7 @@ $wgMessageStructure = array(
                'tog-showhiddencats',
                'tog-noconvertlink',
                'tog-norollbackdiff',
+               'tog-useeditwarning',
        ),
        'underline' => array(
                'underline-always',
@@ -430,9 +429,15 @@ $wgMessageStructure = array(
                'welcomeuser',
                'welcomecreation-msg',
                'yourname',
+               'userlogin-yourname',
+               'userlogin-yourname-ph',
                'yourpassword',
+               'userlogin-yourpassword',
+               'userlogin-yourpassword-ph',
                'yourpasswordagain',
                'remembermypassword',
+               'userlogin-remembermypassword',
+               'userlogin-signwithsecure',
                'securelogin-stick-https',
                'yourdomainname',
                'password-change-forbidden',
@@ -446,12 +451,16 @@ $wgMessageStructure = array(
                'userlogout',
                'userlogout-summary',
                'notloggedin',
+               'userlogin-noaccount',
+               'userlogin-joinproject',
                'nologin',
                'nologinlink',
                'createaccount',
                'gotaccount',
                'gotaccountlink',
                'userlogin-resetlink',
+               'helplogin-url',
+               'userlogin-helplink',
                'createaccountmail',
                'createaccountreason',
                'badretype',
@@ -538,6 +547,7 @@ $wgMessageStructure = array(
                'passwordreset-text',
                'passwordreset-legend',
                'passwordreset-disabled',
+               'passwordreset-emaildisabled',
                'passwordreset-pretext',
                'passwordreset-username',
                'passwordreset-domain',
@@ -695,6 +705,7 @@ $wgMessageStructure = array(
                'content-failed-to-parse',
                'invalid-content-data',
                'content-not-allowed-here',
+               'editwarning-warning',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
@@ -943,19 +954,11 @@ $wgMessageStructure = array(
                'search-external',
                'searchdisabled',
                'googlesearch',
+               'search-error',
        ),
        'opensearch' => array(
                'opensearch-desc',
        ),
-       'quickbar' => array(
-               'qbsettings',
-               'qbsettings-none',
-               'qbsettings-fixedleft',
-               'qbsettings-fixedright',
-               'qbsettings-floatingleft',
-               'qbsettings-floatingright',
-               'qbsettings-directionality',
-       ),
        'preferences' => array(
                'preferences',
                'preferences-summary',
@@ -1480,7 +1483,6 @@ $wgMessageStructure = array(
                'http-read-error',
                'http-timed-out',
                'http-curl-error',
-               'http-host-unreachable',
                'http-bad-status',
        ),
 
@@ -1845,17 +1847,6 @@ $wgMessageStructure = array(
                'listusers-noresult',
                'listusers-blocked',
        ),
-       'activeusers' => array(
-               'activeusers',
-               'activeusers-summary',
-               'activeusers-intro',
-               'activeusers-count',
-               'activeusers-from',
-               'activeusers-hidebots',
-               'activeusers-hidesysops',
-               'activeusers-submit',
-               'activeusers-noresult',
-       ),
        'listgrouprights' => array(
                'listgrouprights',
                'listgrouprights-summary',
@@ -2291,6 +2282,7 @@ $wgMessageStructure = array(
                'sorbs',
                'sorbsreason',
                'sorbs_create_account_reason',
+               'xffblockreason',
                'cant-block-while-blocked',
                'cant-see-hidden-user',
                'ipbblocked',
@@ -2635,13 +2627,8 @@ $wgMessageStructure = array(
        ),
        'stylesheets' => array(
                'common.css',
-               'standard.css',
-               'nostalgia.css',
                'cologneblue.css',
                'monobook.css',
-               'myskin.css',
-               'chick.css',
-               'simple.css',
                'modern.css',
                'vector.css',
                'print.css',
@@ -2654,13 +2641,8 @@ $wgMessageStructure = array(
        ),
        'scripts' => array(
                'common.js',
-               'standard.js',
-               'nostalgia.js',
                'cologneblue.js',
                'monobook.js',
-               'myskin.js',
-               'chick.js',
-               'simple.js',
                'modern.js',
                'vector.js',
                'group-autoconfirmed.js',
@@ -2742,13 +2724,8 @@ $wgMessageStructure = array(
                'pageinfo-category-files'
        ),
        'skin' => array(
-               'skinname-standard',
-               'skinname-nostalgia',
                'skinname-cologneblue',
                'skinname-monobook',
-               'skinname-myskin',
-               'skinname-chick',
-               'skinname-simple',
                'skinname-modern',
                'skinname-vector',
        ),
@@ -3707,6 +3684,8 @@ $wgMessageStructure = array(
                'htmlform-submit',
                'htmlform-reset',
                'htmlform-selectorother-other',
+               'htmlform-no',
+               'htmlform-yes',
        ),
        'sqlite' => array(
                'sqlite-has-fts',
@@ -3904,7 +3883,6 @@ XHTML id names.",
        'diffs'               => 'Diffs',
        'search'              => 'Search results',
        'opensearch'          => 'OpenSearch description',
-       'quickbar'            => 'Quickbar',
        'preferences'         => 'Preferences page',
        'preferences-email'   => 'User preference: email validation using jQuery',
        'userrights'          => 'User rights',
@@ -3953,7 +3931,6 @@ XHTML id names.",
        'deletedcontribs'     => 'Special:DeletedContributions',
        'linksearch'          => 'Special:LinkSearch',
        'listusers'           => 'Special:ListUsers',
-       'activeusers'         => 'Special:ActiveUsers',
        'newuserlog'          => 'Special:Log/newusers',
        'listgrouprights'     => 'Special:ListGroupRights',
        'emailuser'           => 'Email user',
index 62596b2..fbba977 100644 (file)
@@ -98,7 +98,10 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       include_once( $fileName );
+       if ( !include_once( $fileName ) ) {
+               fwrite( STDERR, "Unable to read $fileName\n" );
+               exit( 1 );
+       }
 }
 fwrite( STDERR, "\n" );
 $s =
index ad99617..b76f57c 100644 (file)
@@ -305,17 +305,6 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*$wgDBprefix*/external_user (
-       -- Foreign key to user_id
-       eu_local_id INT NOT NULL PRIMARY KEY,
-       -- opaque identifier provided by the external database
-       eu_external_id NVARCHAR(255) NOT NULL,
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/eu_external_idx ON /*$wgDBprefix*/external_user(eu_external_id);
-
 --
 -- Track INTerlanguage links
 --
index fbd428f..cccc715 100755 (executable)
@@ -1,2 +1,17 @@
-#!/usr/bin/env sh
-jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
+#!/usr/bin/env bash
+
+JSDUCK_MWVERSION=master
+if [[ "$1" == "--version" && "$2" != "" ]]
+then
+       JSDUCK_MWVERSION="$2"
+elif [[ "$*" != "" ]]
+then
+       echo "Usage $0: [--version <mediawiki version>]"
+       echo
+       exit 1
+fi
+
+jsduck \
+--config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json \
+--footer="Documentation for MediaWiki core ($JSDUCK_MWVERSION). Generated on {DATE} by {JSDUCK} {VERSION}." \
+&& echo 'JSDuck execution finished.'
index b5b3b07..c5bf569 100644 (file)
@@ -218,13 +218,6 @@ CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from,
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
 CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
 
-CREATE TABLE &mw_prefix.external_user (
-  eu_local_id NUMBER NOT NULL,
-  eu_external_id varchar2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.external_user ADD CONSTRAINT &mw_prefix.external_user_pk PRIMARY KEY (eu_local_id);
-CREATE UNIQUE INDEX &mw_prefix.external_user_u01 ON &mw_prefix.external_user (eu_external_id);
-
 CREATE TABLE &mw_prefix.langlinks (
   ll_from    NUMBER  NOT NULL,
   ll_lang    VARCHAR2(20),
diff --git a/maintenance/postgres/archives/patch-external_user.sql b/maintenance/postgres/archives/patch-external_user.sql
deleted file mode 100644 (file)
index 6058a70..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
diff --git a/maintenance/postgres/archives/patch-kill-iwl_pft.sql b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 4419d9e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX iwl_prefix_from_title;
-
index a4bdb6a..0eb792e 100644 (file)
@@ -1,2 +1,2 @@
 DROP INDEX iwl_prefix;
-CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
index 9cbabfd..30a8e1b 100644 (file)
@@ -232,13 +232,6 @@ CREATE TABLE externallinks (
 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
 CREATE INDEX externallinks_index   ON externallinks (el_index);
 
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
-
 CREATE TABLE langlinks (
   ll_from    INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   ll_lang    TEXT,
@@ -679,6 +672,7 @@ CREATE TABLE iwlinks (
 );
 CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
 CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE UNIQUE INDEX iwl_prefix_from_title ON iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 CREATE TABLE msg_resource (
   mr_resource   TEXT         NOT NULL,
index b72c417..fb66db0 100644 (file)
@@ -63,7 +63,7 @@ class PurgeList extends Maintenance {
                        } elseif ( $page !== '' ) {
                                $title = Title::newFromText( $page );
                                if ( $title ) {
-                                       $url = $title->getInternalUrl();
+                                       $url = $title->getInternalURL();
                                        $this->output( "$url\n" );
                                        $urls[] = $url;
                                        if ( $this->getOption( 'purge' ) ) {
@@ -88,7 +88,7 @@ class PurgeList extends Maintenance {
                        $conds = array( 'page_namespace' => $namespace );
                }
                while ( true ) {
-                       $res = $dbr->select( 'page', 
+                       $res = $dbr->select( 'page',
                                array( 'page_id', 'page_namespace', 'page_title' ),
                                $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
                                __METHOD__,
@@ -104,7 +104,7 @@ class PurgeList extends Maintenance {
                        $urls = array();
                        foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $url = $title->getInternalUrl();
+                               $url = $title->getInternalURL();
                                $urls[] = $url;
                                $startId = $row->page_id;
                        }
index b1be714..66d8028 100644 (file)
@@ -82,10 +82,11 @@ class RunJobs extends Maintenance {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
+               $flags = JobQueueGroup::USE_CACHE | JobQueueGroup::USE_PRIORITY;
                $lastTime = time();
                do {
                        $job = ( $type === false )
-                               ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
+                               ? $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags )
                                : $group->pop( $type ); // job from a single queue
                        if ( $job ) { // found a job
                                ++$jobsRun;
@@ -107,7 +108,7 @@ class RunJobs extends Maintenance {
                                        $group->ack( $job ); // done
                                }
 
-                               if ( !$status ) {
+                               if ( $status === false ) {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
index 8b49517..831746d 100644 (file)
@@ -47,8 +47,13 @@ class ShowJobs extends Maintenance {
                                $queue   = $group->get( $type );
                                $pending = $queue->getSize();
                                $claimed = $queue->getAcquiredCount();
+                               $abandoned = $queue->getAbandonedCount();
+                               $active = ( $claimed - $abandoned );
                                if ( ( $pending + $claimed ) > 0 ) {
-                                       $this->output( "{$type}: $pending queued; $claimed acquired\n" );
+                                       $this->output(
+                                               "{$type}: $pending queued; " .
+                                               "$claimed claimed ($active active, $abandoned abandoned)\n"
+                                       );
                                }
                        }
                } else {
index e7359b2..dbbdab9 100644 (file)
@@ -48,6 +48,7 @@ class ShowSiteStats extends Maintenance {
                        'ss_good_articles' => 'Number of articles',
                        'ss_total_pages' => 'Total pages',
                        'ss_users' => 'Number of users',
+                       'ss_active_users' => 'Active users',
                        'ss_images' => 'Number of images',
                );
 
diff --git a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql b/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 8fc4b5c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX IF EXISTS /*i*/iwl_prefix;
-
index fd4c9ec..6d5b1bf 100644 (file)
@@ -2,4 +2,4 @@
 -- Recreates the iwl_prefix for the iwlinks table
 --
 DROP INDEX IF EXISTS /*i*/iwl_prefix;
-CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
index 4307c0c..19c740b 100644 (file)
@@ -626,21 +626,6 @@ CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
 
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-
-
 --
 -- Track interlanguage links
 --
@@ -674,7 +659,8 @@ CREATE TABLE /*_*/iwlinks (
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 
 --
@@ -862,6 +848,8 @@ CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
 CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
 -- Used in API and duplicate search
 CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+-- Used to get media of one type
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
 
 
 --
index a76a1ee..8118f68 100644 (file)
@@ -82,6 +82,10 @@ TEXT;
                        $collation = Collation::singleton();
                }
 
+               // Collation sanity check: in some cases the constructor will work,
+               // but this will raise an exception, breaking all category pages
+               $collation->getFirstLetterData();
+
                $options = array(
                        'LIMIT' => self::BATCH_SIZE,
                        'ORDER BY' => 'cl_to, cl_type, cl_from',
diff --git a/redirect.php b/redirect.php
deleted file mode 100644 (file)
index 5e6cfee..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Script that redirects to the article passed in the "wpDropdown" parameter.
- * This is used by the nostalgia skin for the special pages drop-down
- *
- * 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
- */
-
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'phase3/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
-
-global $wgArticlePath;
-
-$page = $wgRequest->getVal( 'wpDropdown' );
-
-$url = str_replace( "$1", urlencode( $page ), $wgArticlePath );
-
-header( "Location: {$url}", true, 301 );
diff --git a/redirect.php5 b/redirect.php5
deleted file mode 100644 (file)
index b65f69a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 engine.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-require './redirect.php';
diff --git a/redirect.phtml b/redirect.phtml
deleted file mode 100644 (file)
index 3e430bf..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// stub file for compatibility with older versions
-include_once('./redirect.php');
index 9593fa8..7e1e3a3 100644 (file)
@@ -60,12 +60,6 @@ return array(
         *
         * See Vector for an example.
         */
-
-       'skins.chick' => array(
-               'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.cologneblue' => array(
                'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
                'remoteBasePath' => $GLOBALS['wgStylePath'],
@@ -89,21 +83,6 @@ return array(
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
-       'skins.nostalgia' => array(
-               'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.simple' => array(
-               'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.standard' => array(
-               'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.vector' => array(
                // Keep in sync with WebInstallerOutput::getCSS()
                'styles' => array(
@@ -198,6 +177,7 @@ return array(
        ),
        'jquery.getAttrs' => array(
                'scripts' => 'resources/jquery/jquery.getAttrs.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.hidpi' => array(
                'scripts' => 'resources/jquery/jquery.hidpi.js',
@@ -757,6 +737,12 @@ return array(
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
+       'mediawiki.action.edit.editWarning' => array(
+               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+               'messages' => array(
+                       'editwarning-warning',
+               ),
+       ),
        // Alias for backwards compatibility
        'mediawiki.action.watch.ajax' => array(
                'dependencies' => 'mediawiki.page.watch.ajax'
@@ -951,6 +937,13 @@ return array(
        'mediawiki.special.userlogin.signup' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
        ),
+       'mediawiki.special.userlogin.vform' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.userLogin.vform.css',
+               ),
+               'position' => 'top',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
@@ -1050,4 +1043,11 @@ return array(
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
+       'mediawiki.ui' => array(
+               'skinStyles' => array(
+                       'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
+                       'vector' => 'resources/mediawiki.ui/mediawiki.ui.vector.css',
+               ),
+               'position' => 'top',
+       ),
 );
index 630002d..f07f1b7 100644 (file)
@@ -24,7 +24,7 @@
         * @param {Object|undefined} options
         */
        function toggleElement( $collapsible, action, $defaultToggle, options ) {
-               var $collapsibleContent, $containers;
+               var $collapsibleContent, $containers, hookCallback;
                options = options || {};
 
                // Validate parameters
                        return;
                }
 
+               // Trigger a custom event to allow callers to hook to the collapsing/expanding,
+               // allowing the module to be testable, and making it possible to
+               // e.g. implement persistence via cookies
+               $collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
+               hookCallback = function () {
+                       $collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
+               };
+
                // Handle different kinds of elements
 
                if ( !options.plainMode && $collapsible.is( 'table' ) ) {
                                // http://stackoverflow.com/questions/467336#920480
                                if ( options.instantHide ) {
                                        $containers.hide();
+                                       hookCallback();
                                } else {
-                                       $containers.stop( true, true ).fadeOut();
+                                       $containers.stop( true, true ).fadeOut( hookCallback );
                                }
                        } else {
-                               $containers.stop( true, true ).fadeIn();
+                               $containers.stop( true, true ).fadeIn( hookCallback );
                        }
 
                } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
                        if ( action === 'collapse' ) {
                                if ( options.instantHide ) {
                                        $containers.hide();
+                                       hookCallback();
                                } else {
-                                       $containers.stop( true, true ).slideUp();
+                                       $containers.stop( true, true ).slideUp( hookCallback );
                                }
                        } else {
-                               $containers.stop( true, true ).slideDown();
+                               $containers.stop( true, true ).slideDown( hookCallback );
                        }
 
                } else {
                                if ( action === 'collapse' ) {
                                        if ( options.instantHide ) {
                                                $collapsibleContent.hide();
+                                               hookCallback();
                                        } else {
-                                               $collapsibleContent.slideUp();
+                                               $collapsibleContent.slideUp( hookCallback );
                                        }
                                } else {
-                                       $collapsibleContent.slideDown();
+                                       $collapsibleContent.slideDown( hookCallback );
                                }
 
                        // Otherwise assume this is a customcollapse with a remote toggle
                                if ( action === 'collapse' ) {
                                        if ( options.instantHide ) {
                                                $collapsible.hide();
+                                               hookCallback();
                                        } else {
                                                if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $collapsible.fadeOut();
+                                                       $collapsible.fadeOut( hookCallback );
                                                } else {
-                                                       $collapsible.slideUp();
+                                                       $collapsible.slideUp( hookCallback );
                                                }
                                        }
                                } else {
                                        if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $collapsible.fadeIn();
+                                               $collapsible.fadeIn( hookCallback );
                                        } else {
-                                               $collapsible.slideDown();
+                                               $collapsible.slideDown( hookCallback );
                                        }
                                }
                        }
                                                .parent()
                                                .prepend( '&nbsp;[' )
                                                .append( ']&nbsp;' )
-                                               .on( 'click.mw-collapse', function ( e, opts ) {
+                                               .on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
                                                        toggleLinkDefault( $(this), e, opts );
                                                } );
 
                        // Bind the custom togglers
                        if ( $customTogglers && $customTogglers.length ) {
-                               $customTogglers.on( 'click.mw-collapse', function ( e, opts ) {
+                               $customTogglers.on( 'click.mw-collapsible', function ( e, opts ) {
                                        opts = $.extend( {}, options, opts );
                                        toggleLinkCustom( $(this), e, opts, $collapsible );
                                } );
                                        if ( !$toggle.length ) {
                                                $firstItem.eq(-1).prepend( $toggleLink );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
                                                }
                                                $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
                                        if ( !$toggle.length ) {
                                                $collapsible.prepend( $toggleLink );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
new file mode 100644 (file)
index 0000000..cfe9762
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Javascript for module editWarning
+ */
+( function ( mw, $ ) {
+       $( document ).ready( function () {
+               // Check if EditWarning is enabled and if we need it
+               if ( $( '#wpTextbox1' ).length === 0 ) {
+                       return true;
+               }
+               // Get the original values of some form elements
+               $( '#wpTextbox1, #wpSummary' ).each( function () {
+                       $( this ).data( 'origtext', $( this ).val() );
+               });
+               var savedWindowOnBeforeUnload;
+               $( window )
+                       .on( 'beforeunload.editwarning', function () {
+                               var retval;
+
+                               // Check if the current values of some form elements are the same as
+                               // the original values
+                               if (
+                                       mw.config.get( 'wgAction' ) === 'submit' ||
+                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
+                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+                               ) {
+                                       // Return our message
+                                       retval = mw.msg( 'editwarning-warning' );
+                               }
+
+                               // Unset the onbeforeunload handler so we don't break page caching in Firefox
+                               savedWindowOnBeforeUnload = window.onbeforeunload;
+                               window.onbeforeunload = null;
+                               if ( retval !== undefined ) {
+                                       // ...but if the user chooses not to leave the page, we need to rebind it
+                                       setTimeout( function () {
+                                               window.onbeforeunload = savedWindowOnBeforeUnload;
+                                       }, 1 );
+                                       return retval;
+                               }
+                       } )
+                       .on( 'pageshow.editwarning', function () {
+                               // Re-add onbeforeunload handler
+                               if ( !window.onbeforeunload ) {
+                                       window.onbeforeunload = savedWindowOnBeforeUnload;
+                               }
+                       } );
+
+               // Add form submission handler
+               $( '#editform' ).submit( function () {
+                       // Unbind our handlers
+                       $( window ).off( '.editwarning' );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
+
index 4de5291..8bba1fc 100644 (file)
                 * @return {boolean} return.done.isCategory Whether the category exists.
                 */
                isCategory: function ( title, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categoryinfo',
                                        titles: title.toString()
                                } )
@@ -36,7 +37,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
                 * @return {String[]} return.done.categories Matched categories
                 */
                getCategoriesByPrefix: function ( prefix, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
-                       this.get( {
+                       apiPromise = this.get( {
                                        list: 'allpages',
                                        apprefix: prefix,
                                        apnamespace: mw.config.get('wgNamespaceIds').category
@@ -72,7 +74,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
 
                 *  if title was not found.
                 */
                getCategories: function ( title, ok, err, async ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categories',
                                        titles: title.toString()
                                }, {
                                                } );
                                        }
                                        d.resolve( ret );
-                               })
+                               } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
        } );
index 3c775ad..2cd1b92 100644 (file)
                 * @return {string} return.done.token Received token.
                 */
                getEditToken: function ( ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'tokens',
                                        type: 'edit'
                                }, {
@@ -87,7 +88,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
index cf7443f..142c454 100644 (file)
                 */
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
-                               apiDeferred = $.Deferred();
+                               apiDeferred = $.Deferred(),
+                               xhr;
 
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
                        }
 
                        // Make the AJAX request
-                       $.ajax( ajaxOptions )
+                       xhr = $.ajax( ajaxOptions )
                                // If AJAX fails, reject API call with error code 'http'
                                // and details in second argument.
                                .fail( function ( xhr, textStatus, exception ) {
                                } );
 
                        // Return the Promise
-                       return apiDeferred.promise().fail( function ( code, details ) {
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                mw.log( 'mw.Api error: ', code, details );
-                       });
+                       } );
                }
 
        };
index ea0388c..4044655 100644 (file)
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
                parse: function ( wikitext, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'parse',
                                        text: wikitext
                                } )
@@ -31,7 +32,7 @@
                                } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
        } );
 
index c86a90a..e2be5c7 100644 (file)
@@ -19,7 +19,9 @@
         * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
        function doWatchInternal( page, ok, err, addParams ) {
-               var params, d = $.Deferred();
+               var params,
+                       d = $.Deferred(),
+                       apiPromise;
                // Backwards compatibility (< MW 1.20)
                d.done( ok );
                d.fail( err );
                        $.extend( params, addParams );
                }
 
-               this.post( params )
+               apiPromise = this.post( params )
                        .done( function ( data ) {
                                d.resolve( data.watch );
                        } )
                        .fail( d.reject );
 
-               return d.promise();
+               return d.promise( { abort: apiPromise.abort } );
        }
 
        $.extend( mw.Api.prototype, {
diff --git a/resources/mediawiki.special/images/glyph-people-large.png b/resources/mediawiki.special/images/glyph-people-large.png
new file mode 100644 (file)
index 0000000..2c251d7
Binary files /dev/null and b/resources/mediawiki.special/images/glyph-people-large.png differ
diff --git a/resources/mediawiki.special/images/icon-lock.png b/resources/mediawiki.special/images/icon-lock.png
new file mode 100644 (file)
index 0000000..306f1f1
Binary files /dev/null and b/resources/mediawiki.special/images/icon-lock.png differ
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.vform.css b/resources/mediawiki.special/mediawiki.special.userLogin.vform.css
new file mode 100644 (file)
index 0000000..312f811
--- /dev/null
@@ -0,0 +1,36 @@
+/* Styles just for VForm user login */
+#mw-userlogin-help {
+       text-align: center;
+}
+
+.mw-ui-vform .mw-secure {
+       /* @embed */
+       background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+       margin: 0 0 0 1px;
+       padding: 0 0 0 11px;
+}
+
+/* The login form invites users to create an account */
+#mw-createaccount-cta {
+       width: 20em;
+       height: 10em;
+       text-align: center;
+       /* @embed */
+       background: url(images/glyph-people-large.png) no-repeat 50%;
+       margin: 0 auto;
+}
+
+#mw-createaccount-cta h3 {
+       font-size: 0.9em;
+       font-weight: normal;
+       text-align: center;
+       padding-top: 4em;
+}
+
+#mw-createaccount-join {
+       margin-left: 0.75em;
+       /* Separate from background image */
+       box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
+       width: auto;
+       display: inline-block;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.vforms.css b/resources/mediawiki.special/mediawiki.special.vforms.css
new file mode 100644 (file)
index 0000000..4ae06df
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * When inside the VForm style, disable the border that Vector puts on the div
+ * surrounding the login/create account form.
+ * Also disable the margin and padding that Vector puts around the form.
+ */
+.mw-ui-container #userloginForm,
+.mw-ui-container #userlogin {
+       border: 0;
+       margin: 0;
+       padding: 0;
+}
+
+/* Reposition and resize language links, which appear on a per-wiki basis */
+.mw-ui-container #languagelinks {
+       margin-bottom: 3em;
+       font-size: 0.8em;
+}
+
+/*
+ * Besides errorbox there could be warningbox, successbox, msgbox, though
+ * spage has never seen these in practice.
+ * Vector has styles coloring warningbox cream and successbox green.
+ */
+.mw-ui-vform .errorbox,
+.mw-ui-vform .warningbox,
+.mw-ui-vform .successbox {
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       font-size: 0.9em;
+       margin: 0 0 1em 0;
+       padding: 0.5em;
+       color: #cc0000;
+       border: 1px solid #fac5c5;
+       background-color: #fae3e3;
+       text-shadow: 0 1px #fae3e3;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.default.css b/resources/mediawiki.ui/mediawiki.ui.default.css
new file mode 100644 (file)
index 0000000..0e0b40e
--- /dev/null
@@ -0,0 +1,254 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: #4a4a4a;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 48, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 52, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 57, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 12, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 17, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 26, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div label,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 33, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  font-size: 0.9em;
+  color: #7d7d7d;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 44, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label.mw-ui-checkbox-label, .mw-ui-vform > div label.mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-checkbox-label > input[type="radio"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
+/* line 51, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+
+/* line 66, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+
+/* line 71, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-block-label, .mw-ui-formlist div label {
+  font-size: 0.9em;
+  color: #7d7d7d;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-block-label *, .mw-ui-formlist div label * {
+  font-weight: normal;
+}
+
+/* line 80, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.vector.css b/resources/mediawiki.ui/mediawiki.ui.vector.css
new file mode 100644 (file)
index 0000000..4849fb4
--- /dev/null
@@ -0,0 +1,392 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: #4a4a4a;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 48, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 52, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 57, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button {
+  font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+  font-size: 1em;
+  line-height: 1.4em;
+}
+/* line 6, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-primary {
+  background-color: #3366bb;
+  *background-color: #3366bb;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4779CD', endColorstr='#FF3366BB');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4779cd), color-stop(100%, #3366bb));
+  background-image: -webkit-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -moz-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -o-linear-gradient(top, #4779cd, #3366bb);
+  background-image: linear-gradient(top, #4779cd, #3366bb);
+  color: white;
+  text-shadow: 0 1px 1px rgba(51, 102, 187, 0.75);
+  border: 1px solid #3162b3;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:hover, .mw-ui-button.mw-ui-primary.mw-ui-hover {
+  background-color: #4779cd;
+  *background-color: #4779cd;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5B88D2', endColorstr='#FF4779CD');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b88d2), color-stop(100%, #4779cd));
+  background-image: -webkit-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -moz-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -o-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: linear-gradient(top, #5b88d2, #4779cd);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:active, .mw-ui-button.mw-ui-primary.mw-ui-active {
+  background-image: none;
+  background-color: #305faf;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:disabled, .mw-ui-button.mw-ui-primary.mw-ui-disabled {
+  background-image: none;
+  background-color: #3366bb;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 10, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-constructive {
+  background-color: #27aa65;
+  *background-color: #27aa65;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF2EC977', endColorstr='#FF27AA65');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ec977), color-stop(100%, #27aa65));
+  background-image: -webkit-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -moz-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -o-linear-gradient(top, #2ec977, #27aa65);
+  background-image: linear-gradient(top, #2ec977, #27aa65);
+  color: white;
+  text-shadow: 0 1px 1px rgba(39, 170, 101, 0.75);
+  border: 1px solid #25a260;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:hover, .mw-ui-button.mw-ui-constructive.mw-ui-hover {
+  background-color: #2ec977;
+  *background-color: #2ec977;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF3ED384', endColorstr='#FF2EC977');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3ed384), color-stop(100%, #2ec977));
+  background-image: -webkit-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -moz-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -o-linear-gradient(top, #3ed384, #2ec977);
+  background-image: linear-gradient(top, #3ed384, #2ec977);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:active, .mw-ui-button.mw-ui-constructive.mw-ui-active {
+  background-image: none;
+  background-color: #249e5e;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:disabled, .mw-ui-button.mw-ui-constructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #27aa65;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 14, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-destructive {
+  background-color: #cc0000;
+  *background-color: #cc0000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFF20000', endColorstr='#FFCC0000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f20000), color-stop(100%, #cc0000));
+  background-image: -webkit-linear-gradient(top, #f20000, #cc0000);
+  background-image: -moz-linear-gradient(top, #f20000, #cc0000);
+  background-image: -o-linear-gradient(top, #f20000, #cc0000);
+  background-image: linear-gradient(top, #f20000, #cc0000);
+  color: white;
+  text-shadow: 0 1px 1px rgba(204, 0, 0, 0.75);
+  border: 1px solid #c20000;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:hover, .mw-ui-button.mw-ui-destructive.mw-ui-hover {
+  background-color: #f20000;
+  *background-color: #f20000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFFF0D0D', endColorstr='#FFF20000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff0d0d), color-stop(100%, #f20000));
+  background-image: -webkit-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -moz-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -o-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: linear-gradient(top, #ff0d0d, #f20000);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:active, .mw-ui-button.mw-ui-destructive.mw-ui-active {
+  background-image: none;
+  background-color: #bd0000;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:disabled, .mw-ui-button.mw-ui-destructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #cc0000;
+  opacity: 0.5;
+  text-shadow: none;
+}
+
+/* line 12, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 17, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 26, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div label,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 33, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  font-size: 0.9em;
+  color: #7d7d7d;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 44, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label.mw-ui-checkbox-label, .mw-ui-vform > div label.mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-checkbox-label > input[type="radio"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
+/* line 51, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+
+/* line 66, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+
+/* line 71, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-block-label, .mw-ui-formlist div label {
+  font-size: 0.9em;
+  color: #7d7d7d;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-block-label *, .mw-ui-formlist div label * {
+  font-weight: normal;
+}
+
+/* line 80, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
+
+/* line 5, sourcefiles/scss/components/vector/_forms.scss */
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+  font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+  font-size: 1em;
+  line-height: 1.4em;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/Makefile b/resources/mediawiki.ui/sourcefiles/Makefile
new file mode 100644 (file)
index 0000000..dea9013
--- /dev/null
@@ -0,0 +1,24 @@
+DATE=$(shell date +%I:%M%p)
+CHECK=\033[32m✔\033[39m
+HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
+
+build:
+       @echo "\n${HR}"
+       @echo "Building Agora..."
+       @echo "${HR}\n"
+       @compass compile
+       @echo "Compiling Compass project...            ${CHECK} Done"
+       @rm -rf .sass-cache
+       @echo "Removing .sass-cache...                 ${CHECK} Done"
+       @echo "\n${HR}"
+       @echo "Agora successfully built at ${DATE}."
+       @echo "${HR}\n"
+
+all: build
+
+watch:
+       @echo "\n${HR}"
+       @echo "Watching SCSS files for Agora..."
+       @echo "${HR}\n"
+       @compass watch
+       @echo "Started watching modules/scss at ${DATE}..."
diff --git a/resources/mediawiki.ui/sourcefiles/config.rb b/resources/mediawiki.ui/sourcefiles/config.rb
new file mode 100644 (file)
index 0000000..be96e64
--- /dev/null
@@ -0,0 +1,27 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+# (unused so far): http_path = "/"
+
+# Output to parent of build directory
+css_dir = ".."
+sass_dir = "scss"
+# (unused so far): images_dir = "modules/img"
+# (unused so far): javascripts_dir = "modules/js"
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+output_style = :expanded
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+# relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+line_comments = true
+
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
new file mode 100644 (file)
index 0000000..e7090eb
--- /dev/null
@@ -0,0 +1,3 @@
+@import "utilities";
+@import "default/buttons";
+@import "default/forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
new file mode 100644 (file)
index 0000000..4f1dba2
--- /dev/null
@@ -0,0 +1,17 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+.mw-ui-flush-left {
+    @include agora-flush-left;
+}
+
+.mw-ui-flush-right {
+    @include agora-flush-right;
+}
+
+.mw-ui-center-block {
+    @include agora-center-block;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
new file mode 100644 (file)
index 0000000..e52a1ed
--- /dev/null
@@ -0,0 +1,3 @@
+@import "utilities";
+@import "vector/buttons";
+@import "vector/forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
new file mode 100644 (file)
index 0000000..1ea9a18
--- /dev/null
@@ -0,0 +1,61 @@
+$buttonBorderRadius: 3px;
+
+// Button styling
+.mw-ui-button {
+    // Container layout
+    @include inline-block;
+    padding: 0.4em 1em 0.4em 1em;
+    margin: 0;
+
+    // Container styling
+    @include buttonColors($agoraGray);
+    @include border-radius($buttonBorderRadius);
+
+    // Content styling
+    vertical-align: middle;
+
+    text: {
+        align: center;
+        decoration: none;
+    }
+
+    font: {
+        weight: bold;
+    }
+
+    // Interaction styling
+    cursor: pointer;
+
+    &:disabled,
+    &.mw-ui-disabled {
+        cursor: default;
+    }
+
+    // Button sizes and displays
+    // -----------------------------------------
+    &.mw-ui-big {
+        font: {
+            size: $baseFontSize * 1.3;
+        }
+    }
+    &.mw-ui-block {
+        display: block;
+        width: 100%;
+    }
+}
+
+// Button groups
+.mw-ui-button-group > * {
+  @include border-radius(0);
+  float: left;
+
+  &:first-child{
+    @include border-top-left-radius($buttonBorderRadius);
+    @include border-bottom-left-radius($buttonBorderRadius);
+  }
+
+  &:last-child{
+    @include border-top-right-radius($buttonBorderRadius);
+    @include border-bottom-right-radius($buttonBorderRadius);
+  }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
new file mode 100644 (file)
index 0000000..440669e
--- /dev/null
@@ -0,0 +1,82 @@
+// Form elements and layouts
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'vform' stacked div design, the form can't be narrower than this.
+$captchaContainerWidth: 290px;
+$defaultFormWidth: $captchaContainerWidth;
+
+.mw-ui-vform {
+    @include box-sizing(border-box);
+
+    width: $defaultFormWidth;
+
+    & > div {
+        display: block;
+        margin: 0 0 15px 0;
+        padding: 0;
+        width: 100%;
+
+        // MW currently doesn't use the type attribute everywhere on inputs
+        input,
+        label,
+        .mw-ui-button {
+            display: block;
+            @include box-sizing(border-box);
+            margin: 0;
+            width: 100%;
+        }
+
+        input {
+            @include agora-field-styling; // mixins/_forms.scss
+        }
+
+        label {
+            @include agora-label-styling;
+
+            width: auto;
+            margin: 0 0 0.2em 0;
+            padding: 0;
+
+            &.mw-ui-checkbox-label, &.mw-ui-radio-label {
+                @include agora-inline-label-styling;
+            }
+        }
+
+        // Override the above styling just for checkboxes and radio inputs
+        input[type="checkbox"],
+        input[type="radio"] {
+            display: inline;
+            @include box-sizing(content-box);
+            width: auto;
+        }
+
+    }
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply mw-ui-input to fields individually to style them
+// You don't need to use this if <input> is within a Agora form container
+.mw-ui-input {
+    @include agora-field-styling; // mixins/_forms.scss
+}
+
+// Default label styling is mw-ui-block-label
+.mw-ui-block-label, .mw-ui-formlist div label {
+    @include agora-label-styling; // mixins/_forms.scss
+}
+
+// Checkbox and radio button label alignment hack
+//   <label class="mw-ui-checkbox-label">
+//       <input type="checkbox" />Label
+//   </label>
+
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+    @include agora-inline-label-styling;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
new file mode 100644 (file)
index 0000000..8d5f0b6
--- /dev/null
@@ -0,0 +1,19 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+
+.mw-ui-button {
+    // Button colors determined by function.
+    // -----------------------------------------
+    &.mw-ui-primary {
+        @include buttonColors($agoraBlue);
+    }
+
+    &.mw-ui-constructive {
+        @include buttonColors($agoraGreen);
+    }
+
+    &.mw-ui-destructive {
+        @include buttonColors($agoraRed);
+    }
+
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
new file mode 100644 (file)
index 0000000..73ea24e
--- /dev/null
@@ -0,0 +1,7 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
new file mode 100644 (file)
index 0000000..e6db523
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/default";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
new file mode 100644 (file)
index 0000000..ac113ee
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/vector";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
new file mode 100644 (file)
index 0000000..adc48cd
--- /dev/null
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "type";
+@import "effects";
+@import "forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
new file mode 100644 (file)
index 0000000..03fae1b
--- /dev/null
@@ -0,0 +1,62 @@
+/* _effects.scss */
+
+/* Mixins for visual effects in CSS3 */
+
+// ----------------------------------------------------------------------------
+// Gradients
+// ----------------------------------------------------------------------------
+@mixin vertical-gradient ($startColor: lighten($agoraGray, 95%), $endColor: $agoraGray) {
+       // Fallback
+    background-color: $endColor;
+    *background-color: $endColor; // IE7
+
+    // IE6-8
+    @include filter-gradient($startColor, $endColor, vertical);
+
+    // IE9+, Opera, Gecko, WebKit
+    @include background-image(linear-gradient(top, $startColor, $endColor));
+}
+
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+@mixin buttonColors ($baseColor: $agoraGray) {
+       // Background color
+       @include vertical-gradient(lighten($baseColor, 7.5%), $baseColor);
+
+       @if $baseColor == $agoraGray {
+               color: darken($baseColor, 50%);
+               @include text-shadow(0 1px 1px rgba($baseColor, 0.3));
+       } @else {
+               color: white;
+               @include text-shadow(0 1px 1px rgba($baseColor, 0.75));
+       }
+
+       border: 1px solid darken($baseColor, 2%);
+
+       &:hover,
+       &.mw-ui-hover {
+               @include vertical-gradient(lighten($baseColor, 12.5%), lighten($baseColor, 7.5%));
+               text-decoration: none;
+       }
+
+       &:active,
+       &.mw-ui-active {
+               background: {
+                       image: none;
+                       color: darken($baseColor, 3%);
+               }
+
+               text-shadow: none;
+       }
+
+       &:disabled,
+       &.mw-ui-disabled {
+               background: {
+                       image: none;
+                       color: $baseColor;
+               }
+               opacity: 0.5;
+               text-shadow: none;
+       }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
new file mode 100644 (file)
index 0000000..6316232
--- /dev/null
@@ -0,0 +1,62 @@
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+@mixin agora-field-styling() {
+    @include reset-focus;  // Removes OS field focus
+
+    border: {
+        style: solid;
+        width: 1px;
+        color: $agoraGray;
+    };
+
+    &:focus {
+        // @include box-shadow generates unneeded prefixes
+        // https://github.com/chriseppstein/compass/issues/1054 , so specify
+        // directly.
+        box-shadow: $agoraBlueShadow 0px 0px 5px;
+
+        border: {
+            color: $agoraBlueShadow;
+        };
+    }
+
+    color: $agoraTextColor;
+    padding: 0.35em 0 0.35em 0.5em;
+}
+
+@mixin agora-label-styling() {
+    font: {
+        //weight: bold;
+        size: 0.9em;
+    };
+    color: darken($agoraGray, 30%);
+
+    & * {
+        font-weight: normal;
+    }
+}
+
+@mixin agora-inline-label-styling() {
+    margin-bottom: 0.5em;
+    cursor: pointer;
+    vertical-align: bottom;
+    line-height: normal;
+
+    font: {
+        weight: normal;
+    };
+
+    & > input[type="checkbox"],
+    & > input[type="radio"] {
+        width: auto;
+        height: auto;
+        margin: 0 0.1em 0em 0;
+        padding: 0;
+        border: {
+            style: solid;
+            width: 1px;
+            color: $agoraGray;
+        }
+        cursor: pointer;
+    }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
new file mode 100644 (file)
index 0000000..964d590
--- /dev/null
@@ -0,0 +1,7 @@
+@mixin vector-type {
+    font: {
+        family: $baseFontFamily;
+        size: $baseFontSize;
+    }
+    line-height: $baseLineHeight;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
new file mode 100644 (file)
index 0000000..71a93b6
--- /dev/null
@@ -0,0 +1,19 @@
+@mixin agora-flush-left() {
+    float: left;
+    margin-left: 0;
+    padding-left: 0;
+}
+
+@mixin agora-flush-right() {
+    float: right;
+    margin-right: 0;
+    padding-right: 0;
+}
+
+@mixin agora-center-block() {
+    display: block;
+    margin: {
+        left: auto;
+        right: auto;
+    };
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
new file mode 100644 (file)
index 0000000..21ac292
--- /dev/null
@@ -0,0 +1,2 @@
+@import "colors";
+@import "typography";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
new file mode 100644 (file)
index 0000000..0c18bdb
--- /dev/null
@@ -0,0 +1,17 @@
+// Grays
+// -----------------------------------------
+$agoraGray: #c9c9c9;
+$agoraTextColor: #252525;
+
+// Blues
+// -----------------------------------------
+$agoraBlue: #3366bb;
+$agoraBlueShadow: #4091ed;
+
+// Greens
+// -----------------------------------------
+$agoraGreen: #27aa65;
+
+// Reds
+// -----------------------------------------
+$agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
new file mode 100644 (file)
index 0000000..5f0cea2
--- /dev/null
@@ -0,0 +1,6 @@
+$baseFontSize: 1em;
+$baseFontFamily: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+$baseLineHeight: 1.4 * $baseFontSize;
+$baseFontColor: $agoraTextColor;
+
+$smallFontSize: 0.75em;
\ No newline at end of file
index 643e5c3..a2d4d6c 100644 (file)
                                        uri = this,
                                        matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
                                $.each( properties, function ( i, property ) {
-                                       uri[ property ] = matches[ i+1 ];
+                                       uri[ property ] = matches[ i + 1 ];
                                } );
 
                                // uri.query starts out as the query string; we will parse it into key-val pairs then make
                                q = {};
                                // using replace to iterate over a string
                                if ( uri.query ) {
-                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
                                                var k, v;
                                                if ( $1 ) {
                                                        k = Uri.decode( $1 );
index 88af3c6..986917a 100644 (file)
                        $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
 
 
-                       entryTypeText = function( entryType ) {
+                       entryTypeText = function ( entryType ) {
                                switch ( entryType ) {
                                        case 'log':
                                                return 'Log';
index 183b525..5539d4d 100644 (file)
@@ -3,6 +3,7 @@
 * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
 *
 * @author neilk@wikimedia.org
+* @author mflaschen@wikimedia.org
 */
 ( function ( mw, $ ) {
        var oldParser,
                        magic : {
                                'SITENAME' : mw.config.get( 'wgSiteName' )
                        },
+                       // This is a whitelist based on, but simpler than, Sanitizer.php.
+                       // Self-closing tags are not currently supported.
+                       allowedHtmlElements : [
+                               'b',
+                               'i'
+                       ],
+                       // Key tag name, value allowed attributes for that tag.
+                       // See Sanitizer::setupAttributeWhitelist
+                       allowedHtmlCommonAttributes : [
+                               // HTML
+                               'id',
+                               'class',
+                               'style',
+                               'lang',
+                               'dir',
+                               'title',
+
+                               // WAI-ARIA
+                               'role'
+                       ],
+
+                       // Attributes allowed for specific elements.
+                       // Key is element name in lower case
+                       // Value is array of allowed attributes for that element
+                       allowedHtmlAttributesByElement : {},
                        messages : mw.messages,
                        language : mw.language,
 
 
                };
 
+       /**
+        * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
+        * convert what it detects as an htmlString to an element.
+        *
+        * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
+        *
+        * @param {jQuery} $parent Parent node wrapped by jQuery
+        * @param {Object|string|Array} children What to append, with the same possible types as jQuery
+        * @return {jQuery} $parent
+        */
+       function appendWithoutParsing( $parent, children ) {
+               var i, len;
+
+               if ( !$.isArray( children ) ) {
+                       children = [children];
+               }
+
+               for ( i = 0, len = children.length; i < len; i++ ) {
+                       if ( typeof children[i] !== 'object' ) {
+                               children[i] = document.createTextNode( children[i] );
+                       }
+               }
+
+               return $parent.append( children );
+       }
+
+       /**
+        * Decodes the main HTML entities, those encoded by mw.html.escape.
+        *
+        * @param {string} encode Encoded string
+        * @return {string} String with those entities decoded
+        */
+       function decodePrimaryHtmlEntities( encoded ) {
+               return encoded
+                       .replace( /&#039;/g, '\'' )
+                       .replace( /&quot;/g, '"' )
+                       .replace( /&lt;/g, '<' )
+                       .replace( /&gt;/g, '>' )
+                       .replace( /&amp;/g, '&' );
+       }
+
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         * @param {Object} parser options
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
-                               return $( '<span>' ).append( key + ': ' + e.message );
+                               return $( '<span>' ).text( key + ': ' + e.message );
                        }
                };
        }
                 */
                return function () {
                        var $target = this.empty();
-                       // TODO: Simply $target.append( failableParserFn( arguments ).contents() )
-                       // or Simply $target.append( failableParserFn( arguments ) )
+                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
+                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
                        $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               $target.append( node );
+                               appendWithoutParsing( $target, node );
                        } );
                        return $target;
                };
                 * @return {Mixed} abstract syntax tree
                 */
                wikiTextToAst: function ( input ) {
-                       var pos,
+                       var pos, settings = this.settings, concat = Array.prototype.concat,
                                regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
-                               backslash, anyCharacter, escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
-                               whitespace, dollar, digits,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openLink, closeLink, templateName, pipe, colon,
+                               doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
+                               escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+                               whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
+                               htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
+                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
                                nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
 
                                        return result;
                                };
                        }
+
+                       /**
+                        * Makes a regex parser, given a RegExp object.
+                        * The regex being passed in should start with a ^ to anchor it to the start
+                        * of the string.
+                        *
+                        * @param {RegExp} regex anchored regex
+                        * @return {Function} function to parse input based on the regex
+                        */
                        function makeRegexParser( regex ) {
                                return function () {
                                        var matches = input.substr( pos ).match( regex );
                        // but some debuggers can't tell you exactly where they come from. Also the mutually
                        // recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
                        // This may be because, to save code, memoization was removed
-                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
                        regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
                        regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
                        regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+
                        backslash = makeStringParser( '\\' );
+                       doubleQuote = makeStringParser( '"' );
+                       singleQuote = makeStringParser( '\'' );
                        anyCharacter = makeRegexParser( /^./ );
+
+                       openHtmlStartTag = makeStringParser( '<' );
+                       optionalForwardSlash = makeRegexParser( /^\/?/ );
+                       openHtmlEndTag = makeStringParser( '</' );
+                       htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
+                       closeHtmlTag = makeRegexParser( /^\s*>/ );
+
                        function escapedLiteral() {
                                var result = sequence( [
                                        backslash,
                                return result === null ? null : result.join('');
                        }
 
+                       asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
+                       htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
+                       htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
+
                        whitespace = makeRegexParser( /^\s+/ );
                        dollar = makeStringParser( '$' );
                        digits = makeRegexParser( /^\d+/ );
                        }
                        openExtlink = makeStringParser( '[' );
                        closeExtlink = makeStringParser( ']' );
-                       // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
+                       // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
                        function extlink() {
                                var result, parsedResult;
                                result = null;
                                        openExtlink,
                                        nonWhitespaceExpression,
                                        whitespace,
-                                       expression,
+                                       nOrMore( 1, expression ),
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                        result = [ 'LINK', parsedResult[1], parsedResult[3] ];
+                                       result = [ 'EXTLINK', parsedResult[1] ];
+                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
+                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
+                                       if ( parsedResult[3].length === 1 ) {
+                                               result.push( parsedResult[3][0] );
+                                       } else {
+                                               result.push( ['CONCAT'].concat( parsedResult[3] ) );
+                                       }
                                }
                                return result;
                        }
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
                        }
-                       openLink = makeStringParser( '[[' );
-                       closeLink = makeStringParser( ']]' );
+                       openWikilink = makeStringParser( '[[' );
+                       closeWikilink = makeStringParser( ']]' );
                        pipe = makeStringParser( '|' );
 
                        function template() {
                                wikilinkPage // unpiped link
                        ] );
 
-                       function link() {
+                       function wikilink() {
                                var result, parsedResult, parsedLinkContents;
                                result = null;
 
                                parsedResult = sequence( [
-                                       openLink,
+                                       openWikilink,
                                        wikilinkContents,
-                                       closeLink
+                                       closeWikilink
                                ] );
                                if ( parsedResult !== null ) {
                                        parsedLinkContents = parsedResult[1];
-                                       result = [ 'WLINK' ].concat( parsedLinkContents );
+                                       result = [ 'WIKILINK' ].concat( parsedLinkContents );
+                               }
+                               return result;
+                       }
+
+                       // TODO: Support data- if appropriate
+                       function doubleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       doubleQuote,
+                                       htmlDoubleQuoteAttributeValue,
+                                       doubleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function singleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       singleQuote,
+                                       htmlSingleQuoteAttributeValue,
+                                       singleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function htmlAttribute() {
+                               var parsedResult = sequence( [
+                                       whitespace,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributeEquals,
+                                       choice( [
+                                               doubleQuotedHtmlAttributeValue,
+                                               singleQuotedHtmlAttributeValue
+                                       ] )
+                               ] );
+                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+                       }
+
+                       /**
+                        * Checks if HTML is allowed
+                        *
+                        * @param {string} startTagName HTML start tag name
+                        * @param {string} endTagName HTML start tag name
+                        * @param {Object} attributes array of consecutive key value pairs,
+                        *  with index 2 * n being a name and 2 * n + 1 the associated value
+                        * @return {boolean} true if this is HTML is allowed, false otherwise
+                        */
+                       function isAllowedHtml( startTagName, endTagName, attributes ) {
+                               var i, len, attributeName;
+
+                               startTagName = startTagName.toLowerCase();
+                               endTagName = endTagName.toLowerCase();
+                               if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
+                                       return false;
+                               }
+
+                               for ( i = 0, len = attributes.length; i < len; i += 2 ) {
+                                       attributeName = attributes[i];
+                                       if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
+                                            $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+                       }
+
+                       function htmlAttributes() {
+                               var parsedResult = nOrMore( 0, htmlAttribute )();
+                               // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
+                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+                       }
+
+                       // Subset of allowed HTML markup.
+                       // Most elements and many attributes allowed on the server are not supported yet.
+                       function html() {
+                               var result = null, parsedOpenTagResult, parsedHtmlContents,
+                                       parsedCloseTagResult, wrappedAttributes, attributes,
+                                       startTagName, endTagName, startOpenTagPos, startCloseTagPos,
+                                       endOpenTagPos, endCloseTagPos;
+
+                               // Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
+                               // 1. open through closeHtmlTag
+                               // 2. expression
+                               // 3. openHtmlEnd through close
+                               // This will allow recording the positions to reconstruct if HTML is to be treated as text.
+
+                               startOpenTagPos = pos;
+                               parsedOpenTagResult = sequence( [
+                                       openHtmlStartTag,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributes,
+                                       optionalForwardSlash,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedOpenTagResult === null ) {
+                                       return null;
                                }
+
+                               endOpenTagPos = pos;
+                               startTagName = parsedOpenTagResult[1];
+
+                               parsedHtmlContents = nOrMore( 0, expression )();
+
+                               startCloseTagPos = pos;
+                               parsedCloseTagResult = sequence( [
+                                       openHtmlEndTag,
+                                       asciiAlphabetLiteral,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedCloseTagResult === null ) {
+                                       // Closing tag failed.  Return the start tag and contents.
+                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents );
+                               }
+
+                               endCloseTagPos = pos;
+                               endTagName = parsedCloseTagResult[1];
+                               wrappedAttributes = parsedOpenTagResult[2];
+                               attributes = wrappedAttributes.slice( 1 );
+                               if ( isAllowedHtml( startTagName, endTagName, attributes) ) {
+                                       result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ].concat( parsedHtmlContents );
+                               } else {
+                                       // HTML is not allowed, so contents will remain how
+                                       // it was, while HTML markup at this level will be
+                                       // treated as text
+                                       // E.g. assuming script tags are not allowed:
+                                       //
+                                       // <script>[[Foo|bar]]</script>
+                                       //
+                                       // results in '&lt;script&gt;' and '&lt;/script&gt;'
+                                       // (not treated as an HTML tag), surrounding a fully
+                                       // parsed HTML link.
+                                       //
+                                       // Concatenate everything from the tag, flattening the contents.
+                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+                               }
+
                                return result;
                        }
+
                        templateName = transform(
                                // see $wgLegalTitleChars
                                // not allowing : due to the need to catch "PLURAL:$1"
                        closeTemplate = makeStringParser('}}');
                        nonWhitespaceExpression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
                        ] );
                        paramExpression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
 
                        expression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
+                               html,
                                literal
                        ] );
 
                        $.each( nodes, function ( i, node ) {
                                if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        $.each( node.contents(), function ( j, childNode ) {
-                                               $span.append( childNode );
+                                               appendWithoutParsing( $span, childNode );
                                        } );
                                } else {
                                        // Let jQuery append nodes, arrays of nodes and jQuery objects
                                        // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-                                       $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
+                                       appendWithoutParsing( $span, node );
                                }
                        } );
                        return $span;
                 *
                 * @param nodes
                 */
-               wlink: function ( nodes ) {
+               wikilink: function ( nodes ) {
                        var page, anchor, url;
 
                        page = nodes[0];
                        } ).text( anchor );
                },
 
+               /**
+                * Converts array of HTML element key value pairs to object
+                *
+                * @param {Array} nodes array of consecutive key value pairs, with index 2 * n being a name and 2 * n + 1 the associated value
+                * @return {Object} object mapping attribute name to attribute value
+                */
+               htmlattributes: function ( nodes ) {
+                       var i, len, mapping = {};
+                       for ( i = 0, len = nodes.length; i < len; i += 2 ) {
+                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+                       }
+                       return mapping;
+               },
+
+               /**
+                * Handles an (already-validated) HTML element.
+                *
+                * @param {Array} nodes nodes to process when creating element
+                * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+                */
+               htmlelement: function ( nodes ) {
+                       var tagName, attributes, contents, $element;
+
+                       tagName = nodes.shift();
+                       attributes = nodes.shift();
+                       contents = nodes;
+                       $element = $( document.createElement( tagName ) ).attr( attributes );
+                       return appendWithoutParsing( $element, contents );
+               },
+
                /**
                 * Transform parsed structure into external link
                 * If the href is a jQuery object, treat it as "enclosing" the link text.
                 * @param {Array} of two elements, {jQuery|Function|String} and {String}
                 * @return {jQuery}
                 */
-               link: function ( nodes ) {
+               extlink: function ( nodes ) {
                        var $el,
                                arg = nodes[0],
                                contents = nodes[1];
                                        $el.attr( 'href', arg.toString() );
                                }
                        }
-                       $el.append( contents );
-                       return $el;
+                       return appendWithoutParsing( $el, contents );
                },
 
                /**
-                * This is basically use a combination of replace + link (link with parameter
+                * This is basically use a combination of replace + external link (link with parameter
                 * as url), but we don't want to run the regular replace here-on: inserting a
                 * url as href-attribute of a link will automatically escape it already, so
                 * we don't want replace to (manually) escape it as well.
                 * @param {Array} of one element, integer, n >= 0
                 * @return {String} replacement
                 */
-               linkparam: function ( nodes, replacements ) {
+               extlinkparam: function ( nodes, replacements ) {
                        var replacement,
                                index = parseInt( nodes[0], 10 );
                        if ( index < replacements.length) {
                        } else {
                                replacement = '$' + ( index + 1 );
                        }
-                       return this.link( [ replacement, nodes[1] ] );
+                       return this.extlink( [ replacement, nodes[1] ] );
                },
 
                /**
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
                // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|\[/.test(this.map.get( this.key ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test(this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
index 2ceb3ea..6c7e697 100644 (file)
@@ -32,8 +32,8 @@ var mw = ( function ( $, undefined ) {
                 *
                 * If called with no arguments, all values will be returned.
                 *
-                * @param selection mixed String key or array of keys to get values for.
-                * @param fallback mixed Value to use in case key(s) do not exist (optional).
+                * @param {string|Array} selection String key or array of keys to get values for.
+                * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
                 * @return mixed If selection was a string returns the value or null,
                 *  If selection was an array, returns an object of key/values (value is null if not found),
                 *  If selection was not passed or invalid, will return the 'values' object member (be careful as
@@ -73,8 +73,8 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Sets one or multiple key/value pairs.
                 *
-                * @param selection {mixed} String key or array of keys to set values for.
-                * @param value {mixed} Value to set (optional, only in use when key is a string)
+                * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+                * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
                 * @return {Boolean} This returns true on success, false on failure.
                 */
                set: function ( selection, value ) {
@@ -96,7 +96,7 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Checks if one or multiple keys exist.
                 *
-                * @param selection {mixed} String key or array of keys to check
+                * @param {Mixed} selection String key or array of keys to check
                 * @return {boolean} Existence of key(s)
                 */
                exists: function ( selection ) {
@@ -134,8 +134,7 @@ var mw = ( function ( $, undefined ) {
 
        Message.prototype = {
                /**
-                * Simple message parser, does $N replacement, HTML-escaping (only for
-                * 'escaped' format), and nothing else.
+                * Simple message parser, does $N replacement and nothing else.
                 *
                 * This may be overridden to provide a more complex message parser.
                 *
@@ -363,7 +362,7 @@ var mw = ( function ( $, undefined ) {
                         *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
                         *             'group': 'somegroup', (or) null,
                         *             'source': 'local', 'someforeignwiki', (or) null
-                        *             'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
+                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
                         *             'script': ...,
                         *             'style': ...,
                         *             'messages': { 'key': 'value' },
@@ -393,7 +392,9 @@ var mw = ( function ( $, undefined ) {
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null,
                                // Buffer for addEmbeddedCSS.
-                               cssBuffer = '';
+                               cssBuffer = '',
+                               // Callbacks for addEmbeddedCSS.
+                               cssCallbacks = $.Callbacks();
 
                        /* Private methods */
 
@@ -470,10 +471,15 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * @param {string} [cssText=cssBuffer] If called without cssText,
                         * the internal buffer will be inserted instead.
+                        * @param {Function} [callback]
                         */
-                       function addEmbeddedCSS( cssText ) {
+                       function addEmbeddedCSS( cssText, callback ) {
                                var $style, styleEl;
 
+                               if ( callback ) {
+                                       cssCallbacks.add( callback );
+                               }
+
                                // Yield once before inserting the <style> tag. There are likely
                                // more calls coming up which we can combine this way.
                                // Appending a stylesheet and waiting for the browser to repaint
@@ -487,7 +493,13 @@ var mw = ( function ( $, undefined ) {
                                                // TODO: Use requestAnimationFrame in the future which will
                                                // perform even better by not injecting styles while the browser
                                                // is paiting.
-                                               setTimeout( addEmbeddedCSS );
+                                               setTimeout( function () {
+                                                       // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
+                                                       // (below version 13) has the non-standard behaviour of passing a
+                                                       // numerical "lateness" value as first argument to this callback
+                                                       // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
+                                                       addEmbeddedCSS();
+                                               } );
                                                return;
                                        }
 
@@ -525,11 +537,14 @@ var mw = ( function ( $, undefined ) {
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( String( cssText ) ) );
                                                }
+                                               cssCallbacks.fire().empty();
                                                return;
                                        }
                                }
 
                                $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+
+                               cssCallbacks.fire().empty();
                        }
 
                        /**
@@ -643,7 +658,7 @@ var mw = ( function ( $, undefined ) {
                         *
                         * @private
                         * @param {string|string[]} states Module states to filter by
-                        * @param {Array} modules List of module names to filter (optional, by default the entire
+                        * @param {Array} [modules] List of module names to filter (optional, by default the entire
                         * registry is used)
                         * @return {Array} List of filtered module names
                         */
@@ -874,7 +889,8 @@ var mw = ( function ( $, undefined ) {
                         * @param {string} module Module name to execute
                         */
                        function execute( module ) {
-                               var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
+                               var key, value, media, i, urls, cssHandle, checkCssHandles,
+                                       cssHandlesRegistered = false;
 
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
@@ -883,7 +899,7 @@ var mw = ( function ( $, undefined ) {
                                } else if ( registry[module].state === 'loading' ) {
                                        throw new Error( 'Module has not completed loading yet: ' + module );
                                } else if ( registry[module].state === 'ready' ) {
-                                       throw new Error( 'Module has already been loaded: ' + module );
+                                       throw new Error( 'Module has already been executed: ' + module );
                                }
 
                                /**
@@ -901,6 +917,80 @@ var mw = ( function ( $, undefined ) {
                                        el.href = url;
                                }
 
+                               function runScript() {
+                                       var script, markModuleReady, nestedAddScript;
+                                       try {
+                                               script = registry[module].script;
+                                               markModuleReady = function () {
+                                                       registry[module].state = 'ready';
+                                                       handlePending( module );
+                                               };
+                                               nestedAddScript = function ( arr, callback, async, i ) {
+                                                       // Recursively call addScript() in its own callback
+                                                       // for each element of arr.
+                                                       if ( i >= arr.length ) {
+                                                               // We're at the end of the array
+                                                               callback();
+                                                               return;
+                                                       }
+
+                                                       addScript( arr[i], function () {
+                                                               nestedAddScript( arr, callback, async, i + 1 );
+                                                       }, async );
+                                               };
+
+                                               if ( $.isArray( script ) ) {
+                                                       nestedAddScript( script, markModuleReady, registry[module].async, 0 );
+                                               } else if ( $.isFunction( script ) ) {
+                                                       registry[module].state = 'ready';
+                                                       script( $ );
+                                                       handlePending( module );
+                                               }
+                                       } catch ( e ) {
+                                               // This needs to NOT use mw.log because these errors are common in production mode
+                                               // and not in debug mode, such as when a symbol that should be global isn't exported
+                                               log( 'Exception thrown by ' + module + ': ' + e.message, e );
+                                               registry[module].state = 'error';
+                                               handlePending( module );
+                                       }
+                               }
+
+                               // This used to be inside runScript, but since that is now fired asychronously
+                               // (after CSS is loaded) we need to set it here right away. It is crucial that
+                               // when execute() is called this is set synchronously, otherwise modules will get
+                               // executed multiple times as the registry will state that it isn't loading yet.
+                               registry[module].state = 'loading';
+
+                               // Add localizations to message system
+                               if ( $.isPlainObject( registry[module].messages ) ) {
+                                       mw.messages.set( registry[module].messages );
+                               }
+
+                               // Make sure we don't run the scripts until all (potentially asynchronous)
+                               // stylesheet insertions have completed.
+                               ( function () {
+                                       var pending = 0;
+                                       checkCssHandles = function () {
+                                               // cssHandlesRegistered ensures we don't take off too soon, e.g. when
+                                               // one of the cssHandles is fired while we're still creating more handles.
+                                               if ( cssHandlesRegistered && pending === 0 && runScript ) {
+                                                       runScript();
+                                                       runScript = undefined; // Revoke
+                                               }
+                                       };
+                                       cssHandle = function () {
+                                               var check = checkCssHandles;
+                                               pending++;
+                                               return function () {
+                                                       if (check) {
+                                                               pending--;
+                                                               check();
+                                                               check = undefined; // Revoke
+                                                       }
+                                               };
+                                       };
+                               }() );
+
                                // Process styles (see also mw.loader.implement)
                                // * back-compat: { <media>: css }
                                // * back-compat: { <media>: [url, ..] }
@@ -919,7 +1009,7 @@ var mw = ( function ( $, undefined ) {
                                                                // Strings are pre-wrapped in "@media". The media-type was just ""
                                                                // (because it had to be set to something).
                                                                // This is one of the reasons why this format is no longer used.
-                                                               addEmbeddedCSS( value );
+                                                               addEmbeddedCSS( value, cssHandle() );
                                                        } else {
                                                                // back-compat: { <media>: [url, ..] }
                                                                media = key;
@@ -936,7 +1026,7 @@ var mw = ( function ( $, undefined ) {
                                                                        addLink( media, value[i] );
                                                                } else if ( key === 'css' ) {
                                                                        // { "css": [css, ..] }
-                                                                       addEmbeddedCSS( value[i] );
+                                                                       addEmbeddedCSS( value[i], cssHandle() );
                                                                }
                                                        }
                                                // Not an array, but a regular object
@@ -953,47 +1043,9 @@ var mw = ( function ( $, undefined ) {
                                        }
                                }
 
-                               // Add localizations to message system
-                               if ( $.isPlainObject( registry[module].messages ) ) {
-                                       mw.messages.set( registry[module].messages );
-                               }
-
-                               // Execute script
-                               try {
-                                       script = registry[module].script;
-                                       markModuleReady = function () {
-                                               registry[module].state = 'ready';
-                                               handlePending( module );
-                                       };
-                                       nestedAddScript = function ( arr, callback, async, i ) {
-                                               // Recursively call addScript() in its own callback
-                                               // for each element of arr.
-                                               if ( i >= arr.length ) {
-                                                       // We're at the end of the array
-                                                       callback();
-                                                       return;
-                                               }
-
-                                               addScript( arr[i], function () {
-                                                       nestedAddScript( arr, callback, async, i + 1 );
-                                               }, async );
-                                       };
-
-                                       if ( $.isArray( script ) ) {
-                                               registry[module].state = 'loading';
-                                               nestedAddScript( script, markModuleReady, registry[module].async, 0 );
-                                       } else if ( $.isFunction( script ) ) {
-                                               registry[module].state = 'ready';
-                                               script( $ );
-                                               handlePending( module );
-                                       }
-                               } catch ( e ) {
-                                       // This needs to NOT use mw.log because these errors are common in production mode
-                                       // and not in debug mode, such as when a symbol that should be global isn't exported
-                                       log( 'Exception thrown by ' + module + ': ' + e.message, e );
-                                       registry[module].state = 'error';
-                                       handlePending( module );
-                               }
+                               // Kick off.
+                               cssHandlesRegistered = true;
+                               checkCssHandles();
                        }
 
                        /**
@@ -1261,12 +1313,12 @@ var mw = ( function ( $, undefined ) {
                                 * Registers a module, letting the system know about it and its
                                 * properties. Startup modules contain calls to this function.
                                 *
-                                * @param module {String}: Module name
-                                * @param version {Number}: Module version number as a timestamp (falls backs to 0)
-                                * @param dependencies {String|Array|Function}: One string or array of strings of module
+                                * @param {string} module Module name
+                                * @param {number} version Module version number as a timestamp (falls backs to 0)
+                                * @param {string|Array|Function} dependencies One string or array of strings of module
                                 *  names on which this module depends, or a function that returns that array.
-                                * @param group {String}: Group which the module is in (optional, defaults to null)
-                                * @param source {String}: Name of the source. Defaults to local.
+                                * @param {string} [group=null] Group which the module is in
+                                * @param {string} [source='local'] Name of the source
                                 */
                                register: function ( module, version, dependencies, group, source ) {
                                        var m;
@@ -1368,10 +1420,10 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Executes a function as soon as one or more required modules are ready
                                 *
-                                * @param dependencies {String|Array} Module name or array of modules names the callback
+                                * @param {string|Array} dependencies Module name or array of modules names the callback
                                 *  dependends on to be ready before executing
-                                * @param ready {Function} callback to execute when all dependencies are ready (optional)
-                                * @param error {Function} callback to execute when if dependencies have a errors (optional)
+                                * @param {Function} [ready] callback to execute when all dependencies are ready
+                                * @param {Function} [error] callback to execute when if dependencies have a errors
                                 */
                                using: function ( dependencies, ready, error ) {
                                        var tod = typeof dependencies;
@@ -1405,15 +1457,15 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Loads an external script or one or more modules for future use
                                 *
-                                * @param modules {mixed} Either the name of a module, array of modules,
+                                * @param {string|Array} modules Either the name of a module, array of modules,
                                 *  or a URL of an external script or style
-                                * @param type {String} mime-type to use if calling with a URL of an
+                                * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
                                 *  external script or style; acceptable values are "text/css" and
                                 *  "text/javascript"; if no type is provided, text/javascript is assumed.
-                                * @param async {Boolean} (optional) If true, load modules asynchronously
-                                *  even if document ready has not yet occurred. If false (default),
-                                *  block before document ready and load async after. If not set, true will
-                                *  be assumed if loading a URL, and false will be assumed otherwise.
+                                * @param {boolean} [async] If true, load modules asynchronously
+                                *  even if document ready has not yet occurred. If false, block before
+                                *  document ready and load async after. If not set, true will be
+                                *  assumed if loading a URL, and false will be assumed otherwise.
                                 */
                                load: function ( modules, type, async ) {
                                        var filtered, m, module, l;
@@ -1485,8 +1537,8 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Changes the state of a module
                                 *
-                                * @param module {String|Object} module name or object of module name/state pairs
-                                * @param state {String} state name
+                                * @param {string|Object} module module name or object of module name/state pairs
+                                * @param {string} state state name
                                 */
                                state: function ( module, state ) {
                                        var m;
@@ -1514,7 +1566,7 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Gets the version of a module
                                 *
-                                * @param module string name of module to get version for
+                                * @param {string} module name of module to get version for
                                 */
                                getVersion: function ( module ) {
                                        if ( registry[module] !== undefined && registry[module].version !== undefined ) {
@@ -1533,7 +1585,7 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Gets the state of a module
                                 *
-                                * @param module string name of module to get state for
+                                * @param {string} module name of module to get state for
                                 */
                                getState: function ( module ) {
                                        if ( registry[module] !== undefined && registry[module].state !== undefined ) {
@@ -1611,9 +1663,9 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Create an HTML element string, with safe escaping.
                                 *
-                                * @param name The tag name.
-                                * @param attrs An object with members mapping element names to values
-                                * @param contents The contents of the element. May be either:
+                                * @param {string} name The tag name.
+                                * @param {Object} attrs An object with members mapping element names to values
+                                * @param {Mixed} contents The contents of the element. May be either:
                                 *  - string: The string is escaped.
                                 *  - null or undefined: The short closing form is used, e.g. <br/>.
                                 *  - this.Raw: The value attribute is included without escaping.
index 308e4ad..e036dc9 100644 (file)
                 * expiration time is reset each time the ID is queried, so in most cases this ID will
                 * persist until the browser's cookies are cleared or the user doesn't visit for 1 year.
                 *
-                * @return String: User name or random session ID
+                * @return {string} User name or random session ID
                 */
-               this.id = function() {
+               this.id = function () {
                        var id,
                                name = user.getName();
                        if ( name ) {
                 * must have at least one pair)
                 * @param options.version Number: Version of bucket test, changing this forces rebucketing
                 * (optional, default: 0)
-                * @param options.tracked Boolean: Track the event of bucketing through the API module of
-                * the ClickTracking extension (optional, default: false)
                 * @param options.expires Number: Length of time (in days) until the user gets rebucketed
                 * (optional, default: 30)
                 * @return String: Bucket name - the randomly chosen key of the options.buckets object
                 *     mw.user.bucket( 'test', {
                 *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
                 *         'version': 1,
-                *         'tracked': true,
                 *         'expires': 7
                 *     } );
                 */
                        options = $.extend( {
                                buckets: {},
                                version: 0,
-                               tracked: false,
                                expires: 30
                        }, options || {} );
 
                                                break;
                                        }
                                }
-                               if ( options.tracked ) {
-                                       mw.loader.using( 'jquery.clickTracking', function () {
-                                               $.trackAction(
-                                                       'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
-                                               );
-                                       } );
-                               }
                                $.cookie(
                                        'mediaWiki.user.bucket:' + key,
                                        version + ':' + bucket,
index 5211b0d..1bd7430 100644 (file)
                                $link.attr( 'title', tooltip );
                        }
 
-                       // Some skins don't have any portlets
-                       // just add it to the bottom of their 'sidebar' element as a fallback
-                       switch ( mw.config.get( 'skin' ) ) {
-                       case 'standard':
-                               $( '#quickbar' ).append( $link.after( '<br/>' ) );
-                               return $link[0];
-                       case 'nostalgia':
-                               $( '#searchform' ).before( $link ).before( ' &#124; ' );
-                               return $link[0];
-                       default: // Skins like chick, modern, monobook, myskin, simple, vector...
-
-                               // Select the specified portlet
-                               $portlet = $( '#' + portlet );
-                               if ( $portlet.length === 0 ) {
-                                       return null;
-                               }
-                               // Select the first (most likely only) unordered list inside the portlet
-                               $ul = $portlet.find( 'ul' ).eq( 0 );
-
-                               // If it didn't have an unordered list yet, create it
-                               if ( $ul.length === 0 ) {
-
-                                       $ul = $( '<ul>' );
+                       // Select the specified portlet
+                       $portlet = $( '#' + portlet );
+                       if ( $portlet.length === 0 ) {
+                               return null;
+                       }
+                       // Select the first (most likely only) unordered list inside the portlet
+                       $ul = $portlet.find( 'ul' ).eq( 0 );
 
-                                       // If there's no <div> inside, append it to the portlet directly
-                                       if ( $portlet.find( 'div:first' ).length === 0 ) {
-                                               $portlet.append( $ul );
-                                       } else {
-                                               // otherwise if there's a div (such as div.body or div.pBody)
-                                               // append the <ul> to last (most likely only) div
-                                               $portlet.find( 'div' ).eq( -1 ).append( $ul );
-                                       }
-                               }
-                               // Just in case..
-                               if ( $ul.length === 0 ) {
-                                       return null;
-                               }
+                       // If it didn't have an unordered list yet, create it
+                       if ( $ul.length === 0 ) {
 
-                               // Unhide portlet if it was hidden before
-                               $portlet.removeClass( 'emptyPortlet' );
+                               $ul = $( '<ul>' );
 
-                               // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
-                               // and back up the selector to the list item
-                               if ( $portlet.hasClass( 'vectorTabs' ) ) {
-                                       $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+                               // If there's no <div> inside, append it to the portlet directly
+                               if ( $portlet.find( 'div:first' ).length === 0 ) {
+                                       $portlet.append( $ul );
                                } else {
-                                       $item = $link.wrap( '<li></li>' ).parent();
+                                       // otherwise if there's a div (such as div.body or div.pBody)
+                                       // append the <ul> to last (most likely only) div
+                                       $portlet.find( 'div' ).eq( -1 ).append( $ul );
                                }
+                       }
+                       // Just in case..
+                       if ( $ul.length === 0 ) {
+                               return null;
+                       }
 
-                               // Implement the properties passed to the function
-                               if ( id ) {
-                                       $item.attr( 'id', id );
-                               }
-                               if ( accesskey ) {
-                                       $link.attr( 'accesskey', accesskey );
-                                       tooltip += ' [' + accesskey + ']';
-                                       $link.attr( 'title', tooltip );
-                               }
-                               if ( accesskey && tooltip ) {
-                                       util.updateTooltipAccessKeys( $link );
-                               }
+                       // Unhide portlet if it was hidden before
+                       $portlet.removeClass( 'emptyPortlet' );
 
-                               // Where to put our node ?
-                               // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-                               if ( nextnode && nextnode.parentNode === $ul[0] ) {
-                                       $(nextnode).before( $item );
+                       // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
+                       // and back up the selector to the list item
+                       if ( $portlet.hasClass( 'vectorTabs' ) ) {
+                               $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+                       } else {
+                               $item = $link.wrap( '<li></li>' ).parent();
+                       }
 
-                               // - nextnode is a CSS selector for jQuery
-                               } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
-                                       $ul.find( nextnode ).eq( 0 ).before( $item );
+                       // Implement the properties passed to the function
+                       if ( id ) {
+                               $item.attr( 'id', id );
+                       }
+                       if ( accesskey ) {
+                               $link.attr( 'accesskey', accesskey );
+                               tooltip += ' [' + accesskey + ']';
+                               $link.attr( 'title', tooltip );
+                       }
+                       if ( accesskey && tooltip ) {
+                               util.updateTooltipAccessKeys( $link );
+                       }
 
-                               // If the jQuery selector isn't found within the <ul>,
-                               // or if nextnode was invalid or not passed at all,
-                               // then just append it at the end of the <ul> (this is the default behavior)
-                               } else {
-                                       $ul.append( $item );
-                               }
+                       // Where to put our node ?
+                       // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+                       if ( nextnode && nextnode.parentNode === $ul[0] ) {
+                               $(nextnode).before( $item );
 
+                       // - nextnode is a CSS selector for jQuery
+                       } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
+                               $ul.find( nextnode ).eq( 0 ).before( $item );
 
-                               return $item[0];
+                       // If the jQuery selector isn't found within the <ul>,
+                       // or if nextnode was invalid or not passed at all,
+                       // then just append it at the end of the <ul> (this is the default behavior)
+                       } else {
+                               $ul.append( $item );
                        }
+
+                       return $item[0];
                },
 
                /**
index deff7e6..e4a16d8 100644 (file)
  * This function will be deleted after it's used, so do not expand it to be
  * generally useful beyond startup.
  *
- * MediaWiki & jQuery compatibility:
- * - Internet Explorer 6.0+
- * - Firefox 10+
- * - Safari 5.0+
- * - Opera 11+
- * - Chrome
+ * See also:
+ * - https://www.mediawiki.org/wiki/Compatibility#Browser
+ * - http://jquerymobile.com/gbs/
+ * - http://jquery.com/browser-support/
  */
 
 /*jshint unused: false */
-function isCompatible() {
-       // IE < 6.0
-       if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
-               && parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) < 6 )
-       {
-               return false;
+function isCompatible( ua ) {
+       if ( ua === undefined ) {
+               ua = navigator.userAgent;
        }
-       return true;
+
+       // MediaWiki JS or jQuery is known to have issues with:
+       return !(
+               // Internet Explorer < 6
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
+               // Firefox < 3
+               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               // BlackBerry < 6
+               ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
+               // Open WebOS < 1.5
+               ua.match( /webOS\/1\.[0-4]/ ) ||
+               // Anything PlayStation based.
+               ua.match( /PlayStation/i ) ||
+               // Any Symbian based browsers
+               ua.match( /SymbianOS|Series60/ ) ||
+               // Any NetFront based browser
+               ua.match( /NetFront/ ) ||
+               // Opera Mini < 7
+               ua.match( /Opera Mini\/[0-6]\./ )
+       );
 }
 
 /**
diff --git a/skins/Chick.php b/skins/Chick.php
deleted file mode 100644 (file)
index 75b807a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
- * given at the bottom of the page instead, as in the unstyled MySkin.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinChick extends SkinTemplate {
-       var $skinname = 'chick', $stylename = 'chick',
-       $template = 'MonoBookTemplate', $useHeadElement = true;
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( 'skins.chick' );
-
-               // TODO: Migrate all of these to RL
-               $out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' );
-       }
-}
diff --git a/skins/MySkin.php b/skins/MySkin.php
deleted file mode 100644 (file)
index fb49b88..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * MySkin: Monobook without the CSS. The idea is that you
- * customise it using user or site CSS.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinMySkin extends SkinTemplate {
-       var $skinname = 'myskin', $stylename = 'myskin',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
-}
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
deleted file mode 100644 (file)
index 3028915..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinNostalgia extends SkinLegacy {
-       var $skinname = 'nostalgia', $stylename = 'nostalgia',
-               $template = 'NostalgiaTemplate';
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.nostalgia' );
-       }
-
-}
-
-class NostalgiaTemplate extends LegacyTemplate {
-
-       /**
-        * @return string
-        */
-       function doBeforeContent() {
-               $s = "\n<div id='content'>\n<div id='top'>\n";
-               $s .= '<div id="logo">' . $this->getSkin()->logoText( 'right' ) . '</div>';
-
-               $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle() . "\n";
-
-               $s .= '<div id="topbar">';
-               $s .= $this->topLinks() . "\n<br />";
-
-               $notice = $this->getSkin()->getSiteNotice();
-               if( $notice ) {
-                       $s .= "\n<div id='siteNotice'>$notice</div>\n";
-               }
-               $s .= $this->pageTitleLinks();
-
-               $ol = $this->otherLanguages();
-               if( $ol ) {
-                       $s .= '<br />' . $ol;
-               }
-
-               $s .= $this->getSkin()->getCategories();
-
-               $s .= "<br clear='all' /></div><hr />\n</div>\n";
-               $s .= "\n<div id='article'>";
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function topLinks() {
-               $sep = " |\n";
-
-               $s = $this->getSkin()->mainPageLink() . $sep
-                 . Linker::specialLink( 'Recentchanges' );
-
-               if ( $this->data['isarticle'] ) {
-                       $s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->talkLink() .
-                                       $sep . $this->historyLink();
-               }
-
-               /* show links to different language variants */
-               $s .= $this->variantLinks();
-               $s .= $this->extensionTabLinks();
-               if ( !$this->data['loggedin'] ) {
-                       $s .= $sep . Linker::specialLink( 'Userlogin' );
-               } else {
-                       /* show user page and user talk links */
-                       $user = $this->getSkin()->getUser();
-                       $s .= $sep . Linker::link( $user->getUserPage(), wfMessage( 'mypage' )->escaped() );
-                       $s .= $sep . Linker::link( $user->getTalkPage(), wfMessage( 'mytalk' )->escaped() );
-                       if ( $user->getNewtalk() ) {
-                               $s .= ' *';
-                       }
-                       /* show watchlist link */
-                       $s .= $sep . Linker::specialLink( 'Watchlist' );
-                       /* show my contributions link */
-                       $s .= $sep . Linker::link(
-                               SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
-                               wfMessage( 'mycontris' )->escaped() );
-                       /* show my preferences link */
-                       $s .= $sep . Linker::specialLink( 'Preferences' );
-                       /* show upload file link */
-                       if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
-                               $s .= $sep . $this->getUploadLink();
-                       }
-
-                       /* show log out link */
-                       $s .= $sep . Linker::specialLink( 'Userlogout' );
-               }
-
-               $s .= $sep . $this->specialPagesList();
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function doAfterContent() {
-               $s = "\n</div><br clear='all' />\n";
-
-               $s .= "\n<div id='footer'><hr />";
-
-               $s .= $this->bottomLinks();
-               $s .= "\n<br />" . $this->pageStats();
-               $s .= "\n<br />" . $this->getSkin()->mainPageLink()
-                               . ' | ' . $this->getSkin()->aboutLink()
-                               . ' | ' . $this->searchForm();
-
-               $s .= "\n</div>\n</div>\n";
-
-               return $s;
-       }
-}
diff --git a/skins/Simple.php b/skins/Simple.php
deleted file mode 100644 (file)
index 9a3ab94..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Simple: A lightweight skin with a simple white-background sidebar and no
- * top bar.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/** */
-require_once( __DIR__ . '/MonoBook.php' );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinSimple extends SkinTemplate {
-       var $skinname = 'simple', $stylename = 'simple',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( 'skins.simple' );
-
-               /* Add some userprefs specific CSS styling */
-               $rules = array();
-               $underline = "";
-
-               if ( $this->getUser()->getOption( 'underline' ) < 2 ) {
-                       $underline = "text-decoration: " . $this->getUser()->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
-               }
-               $style = implode( "\n", $rules );
-               $out->addInlineStyle( $style, 'flip' );
-
-       }
-}
diff --git a/skins/Standard.php b/skins/Standard.php
deleted file mode 100644 (file)
index 5b358e0..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-/**
- * Standard (a.k.a. Classic) skin: old MediaWiki default skin
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinStandard extends SkinLegacy {
-       var $skinname = 'standard', $stylename = 'standard',
-               $template = 'StandardTemplate';
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.standard' );
-
-               $qb = $this->qbSetting();
-               $rules = array();
-
-               if ( 2 == $qb ) { # Right
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; right: 4px; border-left: 2px solid #000000; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-               } elseif ( 1 == $qb || 3 == $qb ) {
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; left: 4px; border-right: 1px solid gray; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-left: 152px; }";
-                       if( 3 == $qb ) {
-                               $rules[] = "/* @noflip */#quickbar { position: fixed; padding: 4px; }";
-                       }
-               } elseif ( 4 == $qb ) {
-                       $rules[] = "/* @noflip */#quickbar { position: fixed; right: 0; top: 0; padding: 4px; }";
-                       $rules[] = "/* @noflip */#quickbar { border-right: 1px solid gray; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-               }
-               $style = implode( "\n", $rules );
-               $out->addInlineStyle( $style, 'flip' );
-       }
-
-}
-
-class StandardTemplate extends LegacyTemplate {
-
-       /**
-        * @return string
-        */
-       function doAfterContent() {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-1' );
-
-               $s = "\n</div><br style=\"clear:both\" />\n";
-               $s .= "\n<div id='footer'>";
-               $s .= '<table cellspacing="0"><tr>';
-
-               wfProfileOut( __METHOD__ . '-1' );
-               wfProfileIn( __METHOD__ . '-2' );
-               $l = $this->getSkin()->getLanguage()->alignStart();
-               $s .= "<td class='bottom' style='text-align: $l; vertical-align: top;'>";
-
-               $s .= $this->bottomLinks();
-               $s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
-                       $this->getSkin()->mainPageLink(),
-                       $this->getSkin()->aboutLink(),
-                       Linker::specialLink( 'Recentchanges' ),
-                       $this->searchForm() ) )
-                       . '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
-
-               $s .= '</td>';
-               $s .= "</tr></table>\n</div>\n</div>\n";
-
-               wfProfileOut( __METHOD__ . '-2' );
-               wfProfileIn( __METHOD__ . '-3' );
-               if ( $this->getSkin()->qbSetting() != 0 ) {
-                       $s .= $this->quickBar();
-               }
-               wfProfileOut( __METHOD__ . '-3' );
-               wfProfileOut( __METHOD__ );
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function quickBar() {
-               global $wgContLang;
-
-               wfProfileIn( __METHOD__ );
-
-               $action = $this->getSkin()->getRequest()->getText( 'action' );
-               $wpPreview = $this->getSkin()->getRequest()->getBool( 'wpPreview' );
-               $title = $this->getSkin()->getTitle();
-               $tns = $title->getNamespace();
-
-               $s = "\n<div id='quickbar'>";
-               $s .= "\n" . $this->getSkin()->logoText() . "\n<hr class='sep' />";
-
-               $sep = "\n<br />";
-
-               # Use the first heading from the Monobook sidebar as the "browse" section
-               $bar = $this->getSkin()->buildSidebar();
-               unset( $bar['SEARCH'] );
-               unset( $bar['LANGUAGES'] );
-               unset( $bar['TOOLBOX'] );
-
-               $barnumber = 1;
-               foreach ( $bar as $browseLinks ) {
-                       if ( is_array( $browseLinks ) ) {
-                               if ( $barnumber > 1 ) {
-                                       $s .= "\n<hr class='sep' />";
-                               }
-                               foreach ( $browseLinks as $link ) {
-                                       if ( $link['text'] != '-' ) {
-                                               $s .= "<a href=\"{$link['href']}\">" .
-                                                       htmlspecialchars( $link['text'] ) . '</a>' . $sep;
-                                       }
-                               }
-                       }
-                       if ( $barnumber == 1 ) {
-                               // only show watchlist link if logged in
-                               if( $this->data['loggedin'] ) {
-                                       $s.= Linker::specialLink( 'Watchlist' ) ;
-                                       $s .= $sep . Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Contributions' ),
-                                               wfMessage( 'mycontris' )->escaped(),
-                                               array(),
-                                               array( 'target' => $this->data['username'] )
-                                       );
-                               }
-                       }
-                       $barnumber = $barnumber + 1;
-               }
-
-               $s .= "\n<hr class='sep' />";
-               $articleExists = $title->getArticleID();
-               if ( $this->data['isarticle'] || $action == 'edit' || $action == 'history' || $wpPreview ) {
-                       if( $this->data['isarticle'] ) {
-                               $s .= '<strong>' . $this->editThisPage() . '</strong>';
-                       } else { # backlink to the article in edit or history mode
-                               if( $articleExists ){ # no backlink if no article
-                                       switch( $tns ) {
-                                               case NS_TALK:
-                                               case NS_USER_TALK:
-                                               case NS_PROJECT_TALK:
-                                               case NS_FILE_TALK:
-                                               case NS_MEDIAWIKI_TALK:
-                                               case NS_TEMPLATE_TALK:
-                                               case NS_HELP_TALK:
-                                               case NS_CATEGORY_TALK:
-                                                       $text = wfMessage('viewtalkpage');
-                                                       break;
-                                               case NS_MAIN:
-                                                       $text = wfMessage( 'articlepage' );
-                                                       break;
-                                               case NS_USER:
-                                                       $text = wfMessage( 'userpage' );
-                                                       break;
-                                               case NS_PROJECT:
-                                                       $text = wfMessage( 'projectpage' );
-                                                       break;
-                                               case NS_FILE:
-                                                       $text = wfMessage( 'imagepage' );
-                                                       break;
-                                               case NS_MEDIAWIKI:
-                                                       $text = wfMessage( 'mediawikipage' );
-                                                       break;
-                                               case NS_TEMPLATE:
-                                                       $text = wfMessage( 'templatepage' );
-                                                       break;
-                                               case NS_HELP:
-                                                       $text = wfMessage( 'viewhelppage' );
-                                                       break;
-                                               case NS_CATEGORY:
-                                                       $text = wfMessage( 'categorypage' );
-                                                       break;
-                                               default:
-                                                       $text = wfMessage( 'articlepage' );
-                                       }
-
-                                       $link = $title->getText();
-                                       $nstext = $wgContLang->getNsText( $tns );
-                                       if( $nstext ) { # add namespace if necessary
-                                               $link = $nstext . ':' . $link;
-                                       }
-
-                                       $s .= Linker::link( Title::newFromText( $link ), $text->escaped() );
-                               } elseif( $title->getNamespace() != NS_SPECIAL ) {
-                                       # we just throw in a "New page" text to tell the user that he's in edit mode,
-                                       # and to avoid messing with the separator that is prepended to the next item
-                                       $s .= '<strong>' . wfMessage( 'newpage' )->escaped() . '</strong>';
-                               }
-                       }
-
-                       # "Post a comment" link
-                       if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
-                               $s .= '<br />' . Linker::link(
-                                       $title,
-                                       wfMessage( 'postcomment' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'edit',
-                                               'section' => 'new'
-                                       )
-                               );
-
-                       /**
-                        * Watching could cause problems in edit mode:
-                        * if user edits article, then loads "watch this article" in background and then saves
-                        * article with "Watch this article" checkbox disabled, the article is transparently
-                        * unwatched. Therefore we do not show the "Watch this page" link in edit mode.
-                        */
-                       if ( $this->data['loggedin'] && $articleExists ) {
-                               if( $action != 'edit' && $action != 'submit' ) {
-                                       $s .= $sep . $this->watchThisPage();
-                               }
-                               if ( $title->userCan( 'edit' ) )
-                                       $s .= $sep . $this->moveThisPage();
-                       }
-                       if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) && $articleExists ) {
-                               $s .= $sep . $this->deleteThisPage() .
-                               $sep . $this->protectThisPage();
-                       }
-                       $s .= $sep . $this->talkLink();
-                       if( $articleExists && $action != 'history' ) {
-                               $s .= $sep . $this->historyLink();
-                       }
-                       $s .= $sep . $this->whatLinksHere();
-
-                       if( $this->getSkin()->getOutput()->isArticleRelated() ) {
-                               $s .= $sep . $this->watchPageLinksLink();
-                       }
-
-                       if (
-                               NS_USER == $title->getNamespace() ||
-                               $title->getNamespace() == NS_USER_TALK
-                       ) {
-
-                               $id = User::idFromName( $title->getText() );
-                               $ip = User::isIP( $title->getText() );
-
-                               if( $id || $ip ){
-                                       $s .= $sep . $this->userContribsLink();
-                               }
-                               if( $this->getSkin()->showEmailUser( $id ) ) {
-                                       $s .= $sep . $this->emailUserLink();
-                               }
-                       }
-                       $s .= "\n<br /><hr class='sep' />";
-               }
-
-               if( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getSkin()->getUser() ) === true ) {
-                       $s .= $this->getUploadLink() . $sep;
-               }
-
-               $s .= Linker::specialLink( 'Specialpages' );
-
-               global $wgSiteSupportPage;
-               if( $wgSiteSupportPage ) {
-                       $s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
-                       '" class="internal">' . wfMessage( 'sitesupport' )->escaped() . '</a>';
-               }
-
-               $s .= "\n<br /></div>\n";
-               wfProfileOut( __METHOD__ );
-               return $s;
-       }
-}
diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css
deleted file mode 100644 (file)
index 18e9655..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-#column-content {
-    float: none;
-    margin-left: 0;
-    height: 1%;
-}
-#column-content #content {
-    margin-left: 12.2em;
-    margin-top: 3em;
-    height: 1%;
-}
-#column-one {
-    position: absolute;
-    top: 0;
-    left: 0;
-    z-index: 4;
-}
-#footer {
-    margin-left: 13.6em;
-    border-left: 1px solid #fabd23;
-}
-
-/* the tabs */
-
-#p-cactions {
-    z-index: 3;
-}
-
-#p-cactions li {
-    padding-bottom: 0 !important;
-    border: none;
-    background-color: transparent;
-    cursor: default;
-    float: none !important;
-}
-#p-cactions li a {
-    display: inline-block !important;
-    vertical-align: top;
-    padding-bottom: 0;
-    border: solid #aaa;
-    border-width: 1px 1px 0;
-}
-#p-cactions li.selected a {
-    border-color: #fabd23;
-    padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
-    padding-bottom: 0.17em;
-}
-#portal-personaltools {
-    padding-bottom: 0.1em;
-}
-#bodyContent a.external {
-    background: url(external.png) center right no-repeat;
-    padding-right: 13px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
-    cursor: pointer;
-}
-div.visualClear {
-    width:100%;
-    line-height: 0;
-}
-textarea {
-    width: 96%;
-}
-
-div.editsection,
-#catlinks,
-div.tright,
-div.tleft {
-    position: relative;
-}
-/*{ border:1px solid Red !important;}*/
diff --git a/skins/chick/main.css b/skins/chick/main.css
deleted file mode 100644 (file)
index 5e2a2e7..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
-** MediaWiki 'chick' style sheet for PDAs or other small-screen devices.
-** Copyright Timwi
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on Monobook by Gabriel Wicke
-*/
-
-body {
-       font-family: sans-serif;
-       color: black;
-       background: white;
-       margin: 0;
-       padding: 0.3em;
-}
-
-a { color: #002bb8; }
-a:visited { color: #5a3696; }
-a:active { color: #ffa500; }
-a.stub { color: #772233; }
-a.new,
-#p-personal a.new { color:#ba0000; }
-a.new:visited,
-#p-personal a.new:visited { color:#a55858; }
-
-img {
-       border: none;
-       vertical-align: middle;
-}
-p {
-       margin: 0.4em 0em 0.5em 0em;
-       line-height: 1.5em;
-}
-
-p img { margin: 0; }
-
-hr {
-       height: 1px;
-       color: #aaaaaa;
-       background-color: #aaaaaa;
-       border: 0;
-       margin: 0.2em 0 0.2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       color: black;
-       background: none;
-       font-weight: normal;
-       margin: 0;
-       overflow: hidden;
-       padding-top: 0.5em;
-       padding-bottom: 0.17em;
-       border-bottom: 1px solid #aaaaaa;
-}
-.editsection {
-       font-weight: normal;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53.2%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 66.7%; }
-h3, h4, h5, h6 {
-       border-bottom: none;
-       font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 75.8%; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86.2%; }
-h5 { font-size: 100%; }
-h6 { font-size: 80%;  }
-h6 .editsection { font-size: 125%; }
-
-ul {
-       line-height: 1.5em;
-       margin: 0.3em 0 0 1.5em;
-       padding:0;
-}
-ol {
-       line-height: 1.5em;
-       margin: 0.3em 0 0 3.2em;
-       padding:0;
-       list-style-image: none;
-}
-li { margin-bottom: 0.1em; }
-dt {
-       font-weight: bold;
-       margin-bottom: 0.1em;
-}
-dl{
-       margin-top: 0.2em;
-       margin-bottom: 0.5em;
-}
-dd {
-       line-height: 1.5em;
-       margin-left: 2em;
-       margin-bottom: 0.1em;
-}
-
-fieldset {
-       border: 1px solid #2f6fab;
-       margin: 1em 0em 1em 0em;
-       padding: 0em 1em 1em 1em;
-       line-height: 1.5em;
-}
-legend {
-       background: white;
-       padding: 0.5em;
-       font-size: 95%;
-}
-form {
-       border: none;
-       margin: 0;
-}
-
-textarea {
-       border: 1px solid #2f6fab;
-       color: black;
-       background-color: white;
-       width: 100%;
-       padding: 0.1em;
-       overflow: auto;
-}
-/* hide this from ie/mac and konq2.2 */
-@media All {
-       head:first-child+body input {
-               visibility: visible;
-               border: 1px solid #2f6fab;
-               color: black;
-               background-color: white;
-               vertical-align: middle;
-               padding: 0.2em;
-       }
-}
-input.historysubmit {
-       padding: 0 0.3em 0.3em 0.3em !important;
-       font-size: 94%;
-       cursor: pointer;
-       height: 1.7em !important;
-       margin-left: 1.6em;
-}
-input[type="radio"],
-input[type="checkbox"] { border:none; }
-select {
-       border: 1px solid #2f6fab;
-       color: black;
-       vertical-align: top;
-}
-q {
-       font-family: Times, "Times New Roman", serif;
-       font-style: italic;
-}
-code { background-color: #f9f9f9; }
-pre, .mw-code {
-       padding: 1em;
-       border: 1px dashed #2f6fab;
-       color: black;
-       background-color: #f9f9f9;
-       line-height: 1.1em;
-}
-
-/*
-** the main content area
-*/
-
-span.subpages { display: block; }
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; }
-#bodyContent h3,
-#bodyContent h4,
-#bodyContent h5 {
-       margin-bottom: 0.3em;
-}
-#firstHeading { margin-bottom:0.1em; }
-
-/* user notification thing */
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 0.1em 0 0 0;
-       padding: 2px 5px;
-       vertical-align: middle;
-}
-#siteNotice {
-       text-align: center;
-       font-size: 95%;
-       padding: 0 0.9em 0 0.9em;
-}
-#siteNotice p { margin: 0; padding: 0; }
-.error {
-       color: red;
-       font-size: larger;
-}
-.catlinks {
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding: 2px 5px;
-       margin: 0.1em 0 0 0;
-       clear: both;
-}
-.catlinks { margin: 0; padding: 0; }
-
-/* emulate center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-/* small for tables and similar */
-.small { font-size: 94%; }
-table.small { font-size: 100% }
-
-/*
-** content styles
-*/
-
-#toc {
-       /*border:1px solid #2f6fab;*/
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding:5px;
-       font-size: 95%;
-}
-#toc ul { margin: 0 2em; }
-#toc .toctoggle { font-size: 94%; }
-#toc .editsection {
-       margin-top: 0.7em;
-       font-size: 94%;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0;
-       border: 0.5em solid white;
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0.3em 0.5em 0.5em 0;
-       border: 0.5em solid white;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
-       margin-bottom: 0.5em;
-       width: auto;
-}
-div.thumbinner {
-       border:1px solid #cccccc;
-       padding: 3px !important;
-       background-color:#f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-html .thumbimage {
-       border:1px solid #cccccc;
-}
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-       float: right;
-       border: none !important;
-       background: none !important;
-}
-div.magnify a, div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-/* @noflip */div.tright {
-       margin: 0.5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
-       margin: 0.5em 1.4em 1.3em 0;
-}
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
-       float:right;
-       position:relative;
-       margin-left:1em;
-       margin-bottom:1em;
-       text-align:center;
-}
-.toccolours {
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding:5px;
-       font-size: 95%;
-}
-
-/*
-** edit views etc
-*/
-.special li {
-       line-height: 1.4em;
-       margin: 0;
-       padding: 0;
-}
-
-a.external { color: #3366bb; }
-div#footer { text-align: center; }
-ul#f-list li { list-style: none;  text-align: center; }
-div.portlet { margin: 0.5em 0; }
-
-.redirectText {
-       font-size:150%;
-       margin:5px;
-}
-
-ul.special li.not-patrolled, ol.special li.not-patrolled {
-       background-color: #ffa;
-}
-div.patrollink {
-       font-size: 75%;
-       text-align: right;
-}
-
-span.updatedmarker {
-       color:black;
-       background-color:#00FF00;
-}
-
-div.gallerybox {
-       width:  150px;
-}
-
-#xjump-to-nav {
-       display: none;
-}
-
-.templatesUsed { margin-top: 1.5em; }
-
-#footer {
-       background-color: white;
-       border-top: 1px solid #fabd23;
-       border-bottom: 1px solid #fabd23;
-       margin: .6em 0 1em 0;
-       padding: .4em 0 1.2em 0;
-       text-align: center;
-       font-size: 90%;
-}
-#f-poweredbyico, #f-copyrightico {
-       display: inline;
-}
index 6cb213f..0229744 100644 (file)
@@ -191,7 +191,7 @@ a:link, a:visited {
 #content a.external.text:after,
 #content a.external.autonumber:after {
        /* Expand URLs for printing */
-       content: " (" attr(href) ") ";
+       content: " (" attr(href) ")";
 }
 
 #globalWrapper {
index 4cbc093..147cd15 100644 (file)
@@ -17,7 +17,7 @@ div#column-content {
 }
 div#content {
        margin: 2.8em 0 0 12.2em;
-       padding: 0 1em 1em 1em;
+       padding: 1em;
        position: relative;
        z-index: 2;
 }
@@ -93,6 +93,9 @@ pre, .mw-code {
        line-height: 1.1em;
 }
 
+#firstHeading {
+       padding-top: 0;
+}
 /*
 ** the main content area
 */
@@ -319,7 +322,7 @@ input.searchButton {
        position: absolute;
        left: 0;
        top: 0;
-       z-index: 0;
+       z-index: 3;
 }
 #p-personal {
        width: 100%;
diff --git a/skins/myskin/main.css b/skins/myskin/main.css
deleted file mode 100644 (file)
index f3ab020..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/* this file must be empty */
diff --git a/skins/nostalgia/screen.css b/skins/nostalgia/screen.css
deleted file mode 100644 (file)
index aed5715..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-body {
-       /* background color is set separately on page type */
-       color: black;
-}
-
-#specialform {
-       display: inline;
-}
-
-#powersearch {
-       background: #DDEEFF;
-       border-style: solid;
-       border-width: 1px;
-       padding: 2px;
-}
-
-a.new {
-       color: #ba0000;
-}
-
-a.interwiki,
-a.external {
-       color: #3366BB;
-}
-
-a.printable {
-       text-decoration: underline;
-}
-
-a.stub {
-       color: #772233;
-       text-decoration: none;
-}
-
-h1.pagetitle {
-       padding-top: 0;
-       margin-top: 0;
-       padding-bottom: 0;
-       margin-bottom: 0;
-}
-
-h2, h3, h4, h5, h6 {
-       margin-bottom: 0;
-}
-
-textarea {
-       overflow: auto;
-}
-
-p.subtitle {
-       padding-top: 0;
-       margin-top: 0;
-}
-div.sitenotice {
-       clear: both;
-}
diff --git a/skins/simple/discussionitem_icon.gif b/skins/simple/discussionitem_icon.gif
deleted file mode 100644 (file)
index e3ca6d9..0000000
Binary files a/skins/simple/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/simple/external.png b/skins/simple/external.png
deleted file mode 100644 (file)
index acf260f..0000000
Binary files a/skins/simple/external.png and /dev/null differ
diff --git a/skins/simple/file_icon.gif b/skins/simple/file_icon.gif
deleted file mode 100644 (file)
index 69dbeaf..0000000
Binary files a/skins/simple/file_icon.gif and /dev/null differ
diff --git a/skins/simple/link_icon.gif b/skins/simple/link_icon.gif
deleted file mode 100644 (file)
index 168c1a2..0000000
Binary files a/skins/simple/link_icon.gif and /dev/null differ
diff --git a/skins/simple/lock_icon.gif b/skins/simple/lock_icon.gif
deleted file mode 100644 (file)
index 8284403..0000000
Binary files a/skins/simple/lock_icon.gif and /dev/null differ
diff --git a/skins/simple/mail_icon.gif b/skins/simple/mail_icon.gif
deleted file mode 100644 (file)
index cf5680d..0000000
Binary files a/skins/simple/mail_icon.gif and /dev/null differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
deleted file mode 100644 (file)
index edb1d7d..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right.
- */
-
-h1 {
-       font-size: 2em;
-}
-h2 {
-       font-size: 1.5em;
-}
-h3 {
-       font-size: 1.17em;
-}
-h5 {
-       font-size: .83em;
-}
-h6 {
-       font-size: .75em;
-}
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bolder;
-}
-
-/* Now the custom parts */
-
-/* Make edit sections (which are inside h# tags) normal-sized */
-.editsection {
-       font-weight: normal;
-}
-h1 .editsection {
-       font-size: 50%;
-}
-h2 .editsection {
-       font-size: 66.7%;
-}
-h3 .editsection {
-       font-size: 85.5%;
-}
-h5 .editsection {
-       font-size: 120%;
-}
-h6 .editsection {
-       font-size: 133%;
-}
-
-#toolbar {
-       display: none;
-}
-
-div.center {
-       text-align: center;
-}
-
-#contentSub {
-       padding-left: 2em;
-}
-
-a {
-       text-decoration: none;
-}
-
-a:hover {
-       text-decoration: underline;
-}
-
-#column-content {
-       width: 100%;
-       float: right;
-       margin: 0 0 0.6em -12.2em;
-       padding: 0;
-}
-
-#content {
-       margin: 0em 0 0 12.2em;
-       padding: 0em 1em 1.5em 1em;
-       border-left: 1px solid #959595;
-       line-height: 1.5em;
-}
-
-#column-one {
-       position: absolute;
-       top: 0;
-       left: 0;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-body {
-       margin: 0;
-       padding: 0;
-}
-
-#globalWrapper {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.visualClear {
-       clear: both;
-}
-
-img {
-       border: none;
-}
-p {
-       margin: 0.4em 0em 0.5em 0em;
-       line-height: 1.5em;
-}
-p img {
-       margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       margin: 0;
-       padding-top: 0.5em;
-       padding-bottom: 0.17em;
-}
-fieldset {
-       margin: 1em 0em 1em 0em;
-       padding: 0em 1em 1em 1em;
-}
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 2em 0em 1em 0em;
-       padding: 0.5em 1em;
-       vertical-align: middle;
-}
-.error {
-       color: red;
-       font-size: larger;
-}
-
-table.rimage {
-       float: right;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
-.portlet {
-       border: none;
-       float: none;
-       padding: 0;
-       width: 11.8em;
-       overflow: hidden;
-}
-.portlet h4 {
-       font-weight: normal;
-       white-space: nowrap;
-}
-.portlet h5 {
-       padding: 0em 1em 0em 0.5em;
-       display: inline;
-       height: 1em;
-       font-weight: normal;
-       white-space: nowrap;
-}
-.portlet h6 {
-       padding: 0em 1em 0em 1em;
-       display: block;
-       height: 1.2em;
-       font-weight: normal;
-       white-space: nowrap;
-}
-.pBody {
-       border-collapse: collapse;
-       padding: 0 0.8em 0.3em 0.5em;
-}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
-       margin: 0;
-       padding: 0;
-       font-size: small;
-}
-
-#p-search .pBody {
-       text-align: center;
-}
-
-#searchInput {
-       width: 100%;
-       clear: both;
-       margin: 0 0 0 0;
-}
-
-input.searchButton {
-       margin-top: 1px;
-       padding: 0 0.4em;
-       cursor: pointer;
-}
-
-#p-search .pBody {
-       padding: 0.5em 0.4em 0.4em 0.4em;
-}
-
-/* feed links */
-a.feedlink {
-       background: url(../common/images/feed-icon.png) center left no-repeat;
-       padding-left: 16px;
-}
-
-textarea {
-       width: 100%;
-}
-
-.pBody li,
-.pBody ul {
-       padding-left: 0em;
-       margin-left: 0.5em;
-}
-
-pre, .mw-code {
-       margin: 2em;
-       border: solid 1px black;
-}
-
-h1.firstHeading,
-h2 {
-       border-bottom: solid 1px black;
-}
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-#bodyContent a.external[href ^="https://"],
-.link-https {
-       background: url(lock_icon.gif) center right no-repeat;
-       padding-right: 16px;
-}
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
-       background: url(mail_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="news:"] {
-       background: url(news_icon.png) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
-       background: url(file_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
-       background: url(discussionitem_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
-       color: #5E7CFF;
-}
-
-td.diff-addedline {
-       background-color: #B9FFB0;
-}
-
-td.diff-deletedline {
-       background-color: #f8ffaa;
-}
-
-.diffchange {
-       background-color: #FFCDF3;
-       text-decoration: none;
-}
-
-#pagehistory li {
-       border: none;
-}
-
-div.tocindent {
-       margin-left: 2em;
-}
-#toc {
-       text-align: left;
-       border-top: solid 1px black;
-       border-bottom: solid 1px black;
-}
-
-/* @noflip */div.floatright, table.floatright {
-       margin: 0;
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p {
-       font-style: italic;
-}
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0.3em 0.5em 0.5em 0;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p {
-       font-style: italic;
-}
-
-/* thumbnails */
-div.thumb {
-       margin-bottom: 0.5em;
-       width: auto;
-}
-div.thumbinner {
-       padding: 3px !important;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4;
-       padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-       float: right;
-       border: none !important;
-       background: none !important;
-}
-div.magnify a,
-div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-/* @noflip */div.tright {
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-/* @noflip */div.tleft {
-       margin-right: 0.5em;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-a.stub {
-       color: #772233;
-}
-a.new,
-#p-personal a.new {
-       color: #BA0000;
-       text-decoration: line-through;
-}
-li.new {
-       text-decoration: line-through;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-#catlinks {
-       text-align: center;
-}
-.catlinks {
-       text-align: center;
-       width: 80%;
-       margin-left: auto;
-       margin-right: auto;
-       padding: 3px;
-}
-
-#mytabs {
-       background-color: inherit;
-}
-#p-cactions {
-       background-color: inherit;
-}
-
-#footer {
-       padding-left: 11.8em;
-}
-
-#n-portal,
-#n-currentevents,
-#n-help,
-#n-sitesupport {
-       display: none;
-}
-
-#preftoc {
-       float: left;
-       margin: 1em;
-       width: 13em;
-}
-#preftoc li {
-}
-#preftoc li.selected {
-       border: 1px dashed #aaa;
-}
-#preftoc a,
-#preftoc a:active {
-       display: block;
-}
-div.htmlform-tip {
-       font-size: 95%;
-       margin-top: 1em;
-}
-
-#mw_trackbacks {
-       border-style: groove;
-}
-
-#jump-to-nav {
-       display: none;
-}
-
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-.templatesUsed {
-       margin-top: 1.5em;
-}
-
diff --git a/skins/standard/main.css b/skins/standard/main.css
deleted file mode 100644 (file)
index a4b03a8..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * This style sheet is used by the classic (aka standard) skin
- */
-
-#article {
-       padding: 4px;
-}
-
-#content {
-       margin: 0;
-       padding: 0;
-}
-
-#footer {
-       padding: 4px;
-       font-size: 95%;
-       clear: both;
-}
-
-#pagestats {
-       font-size: 9pt;
-}
-
-#powersearch {
-       background: #DDEEFF;
-       border-style: solid;
-       border-width: 1px;
-       padding: 2px;
-}
-
-#quickbar {
-       width: 140px;
-       height: 100%;
-       padding: 4px;
-       visibility: visible;
-       z-index: 99;
-       font-size: 95%;
-}
-
-#topbar {
-       padding: 4px;
-       font-size: 95%;
-}
-
-/* Table of contents */
-.toctoggle,
-.editsection {
-       font-size: smaller;
-}
-
-/* ... */
-#toolbar {
-       padding: 0;
-}
-
-#infobox {
-       background: #eeeeff;
-       color: black;
-}
-
-#editform {
-       margin-top: 1px;
-}
-
-a.interwiki,
-a.external {
-       color: #3366BB;
-}
-
-a.printable {
-       text-decoration: underline;
-}
-
-a.new {
-       color: #ba0000;
-}
-
-a.stub {
-       color: #772233;
-       text-decoration: none;
-}
-
-a:visited {
-       color: #5A3696;
-}
-
-body {
-       margin: 0;
-       padding: 4px;
-       color: black;
-}
-
-form.inline {
-       display: inline;
-}
-
-textarea {
-       overflow: auto;
-}
-
-h1.pagetitle {
-       padding-top: 0;
-       margin-top: 0;
-       padding-bottom: 0;
-       margin-bottom: 0;
-       font-size: 150%;
-}
-
-h1.pagetitle .editsection {
-       font-size: 66.7%;
-}
-
-h2 {
-       font-size: 120%;
-}
-
-h2 .editsection {
-       font-size: 83.3%;
-}
-
-h2, h3, h4, h5, h6 {
-       margin-bottom: 0;
-}
-
-h3 {
-       font-size: 106.25%;
-}
-
-h3 .editsection {
-       font-size: 94.1%;
-}
-
-h4 {
-       font-size: 103.125%;
-}
-
-h4 .editsection {
-       font-size: 97.0%;
-}
-
-h5 {
-       font-size: 100%;
-}
-
-h5 .editsection {
-       font-size: 100%;
-}
-
-h6 {
-       font-size: 95%;
-}
-
-h6 .editsection {
-       font-size: 105.3%;
-}
-
-hr.sep {
-       color: gray;
-       height: 1px;
-       background-color: gray;
-}
-
-p.subpages {
-       font-size: small;
-}
-
-p.subtitle {
-       padding-top: 0;
-       margin-top: 0;
-}
-
-.catlinks {
-       font-size: small;
-       margin-top: 0;
-       text-align:right;
-}
-
-td {
-       empty-cells: show;
-}
-
-td.bottom {
-       border-top: 1px solid gray;
-}
-
-td.top {
-       border-bottom: 1px solid gray;
-}
diff --git a/skins/vector/images/user-icon.svg b/skins/vector/images/user-icon.svg
new file mode 100644 (file)
index 0000000..767d510
--- /dev/null
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="12"
+   height="13.837458"
+   id="svg2108">
+  <metadata
+     id="metadata68">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient4356">
+      <stop
+         id="stop4358"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4360"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4344">
+      <stop
+         id="stop4346"
+         style="stop-color:#727e0a;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4348"
+         style="stop-color:#5b6508;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4338">
+      <stop
+         id="stop4340"
+         style="stop-color:#e9b15e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4342"
+         style="stop-color:#966416;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4163">
+      <stop
+         id="stop4165"
+         style="stop-color:#3b74bc;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4167"
+         style="stop-color:#2d5990;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3824">
+      <stop
+         id="stop3826"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3828"
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3816">
+      <stop
+         id="stop3818"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3820"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         id="stop3802"
+         style="stop-color:#f4d9b1;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3804"
+         style="stop-color:#df9725;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient3806"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient3822"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient3830"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient4169"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4171"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4175"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.707108,0)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4179"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4326"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4328"
+       xlink:href="#linearGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4330"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4332"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.125,-7)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4336"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient4350"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4362"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4372"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4374"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient1366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient1369"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient1372"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient1381"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2243"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient2245"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient2247"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2249"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient2251"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient2253"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient2255"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+  </defs>
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer1"
+     style="display:inline" />
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer2"
+     style="display:inline">
+    <g
+       transform="matrix(0.39012793,0,0,0.39012793,-1.0891578,28.22979)"
+       id="g2230">
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(1.77551,0,0,0.959183,-24.25322,18.77153)"
+         id="path4306"
+         style="color:#000000;fill:url(#radialGradient2243);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
+         id="path4308"
+         style="color:#000000;fill:url(#radialGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
+         id="path4310"
+         style="color:#000000;fill:url(#linearGradient2247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
+         id="path4312"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
+         id="path4314"
+         style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
+         id="path4316"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="translate(-0.125,3.5)"
+         id="path4318"
+         style="color:#000000;fill:url(#radialGradient2249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         id="path4320"
+         style="color:#000000;fill:url(#radialGradient2251);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)"
+         id="path4322"
+         style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
+         id="path4354"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
+         id="path4364"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+    </g>
+  </g>
+</svg>
index 2e09ee1..6acc994 100644 (file)
@@ -709,7 +709,6 @@ pre, .mw-code {
 #firstHeading {
        padding-top: 0;
        margin-top: 0;
-       padding-top: 0;
        font-size: 1.6em;
 }
 div#content a.external,
@@ -783,6 +782,12 @@ div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
 #pt-login {
        /* @embed */
        background: url(images/user-icon.png) left top no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/user-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/user-icon.svg);
        padding-left: 15px !important;
        text-transform: none;
 }
index 264ba69..4341891 100644 (file)
@@ -48,9 +48,6 @@ $wgAutoloadClasses += array(
        //db
        'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
 
-       //Selenium
-       'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
-
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
index 32b8154..3d34f34 100644 (file)
@@ -869,18 +869,36 @@ class ParserTest {
                $this->uploadDir = $this->setupUploadDir();
                $user = User::createNew( 'WikiSysop' );
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
+               # note that the size/width/height/bits/etc of the file
+               # are actually set by inspecting the file itself; the arguments
+               # to recordUpload2 have no effect.  That said, we try to make things
+               # match up so it is less confusing to readers of the code & tests.
                $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
-                       'size' => 12345,
+                       'size' => 7881,
                        'width' => 1941,
                        'height' => 220,
-                       'bits' => 24,
+                       'bits' => 8,
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+               # again, note that size/width/height below are ignored; see above.
+               $image->recordUpload2( '', 'Upload of some lame thumbnail', 'Some lame thumbnail', array(
+                       'size' => 22589,
+                       'width' => 135,
+                       'height' => 135,
+                       'bits' => 8,
+                       'media_type' => MEDIATYPE_BITMAP,
+                       'mime' => 'image/png',
+                       'metadata' => serialize( array() ),
+                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                       'fileExists' => true
+               ), $this->db->timestamp( '20130225203040' ), $user );
+
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
@@ -891,7 +909,7 @@ class ParserTest {
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
        }
@@ -960,6 +978,8 @@ class ParserTest {
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
                copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+               wfMkdirParents( $dir . '/e/ea', null, __METHOD__ );
+               copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" );
                wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
                copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
 
@@ -1008,6 +1028,8 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
                                "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+                               "$dir/e/ea/Thumb.png",
+
                                "$dir/0/09/Bad.jpg",
 
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
@@ -1024,6 +1046,9 @@ class ParserTest {
                                "$dir/thumb/3/3a",
                                "$dir/thumb/3",
 
+                               "$dir/e/ea",
+                               "$dir/e",
+
                                "$dir/0/09/",
                                "$dir/0/",
                                "$dir/thumb",
index e28074e..1d4102c 100644 (file)
@@ -363,6 +363,16 @@ Italics and bold
 
 !! end
 
+# this example taken from the simple/Moon article
+!! test
+Italics and possessives
+!! input
+obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
+!! result
+<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&amp;action=edit&amp;redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
+</p>
+!! end
+
 ###
 ### 2-quote opening sequence tests
 ###
@@ -397,13 +407,26 @@ Italics and bold: 2-quote opening sequence: (2,4)
 
 
 !! test
-Italics and bold: 2-quote opening sequence: (2,5)
+Italics and bold: 2-quote opening sequence: (2,5) (php)
+!! options
+php
 !! input
 ''foo'''''
 !! result
 <p><i>foo</i>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
+!! options
+parsoid
+!! input
+''foo'''''
+!! result
+<p><i>foo</i><b></b>
+</p>
+!!end
 
 
 ###
@@ -441,13 +464,26 @@ Italics and bold: 3-quote opening sequence: (3,4)
 
 
 !! test
-Italics and bold: 3-quote opening sequence: (3,5)
+Italics and bold: 3-quote opening sequence: (3,5) (php)
+!! options
+php
 !! input
 '''foo'''''
 !! result
 <p><b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
+!! options
+parsoid
+!! input
+'''foo'''''
+!! result
+<p><b>foo<i></i></b>
+</p>
+!!end
 
 
 ###
@@ -485,13 +521,26 @@ Italics and bold: 4-quote opening sequence: (4,4)
 
 
 !! test
-Italics and bold: 4-quote opening sequence: (4,5)
+Italics and bold: 4-quote opening sequence: (4,5) (php)
+!! options
+php
 !! input
 ''''foo'''''
 !! result
 <p>'<b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
+!! options
+parsoid
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo<i></i></b>
+</p>
+!!end
 
 
 ###
@@ -499,13 +548,26 @@ Italics and bold: 4-quote opening sequence: (4,5)
 ###
 
 !! test
-Italics and bold: 5-quote opening sequence: (5,2)
+Italics and bold: 5-quote opening sequence: (5,2) (php)
+!! options
+php
 !! input
 '''''foo''
 !! result
 <p><b><i>foo</i></b>
 </p>
 !!end
+# Parsoid reverses the nesting order, compared to the PHP parser
+!! test
+Italics and bold: 5-quote opening sequence: (5,2) (parsoid)
+!! options
+parsoid
+!! input
+'''''foo''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
 
 
 !! test
@@ -571,23 +633,49 @@ Italics and bold: multiple quote sequences: (2,4,4)
 
 
 !! test
-Italics and bold: multiple quote sequences: (3,4,2)
+Italics and bold: multiple quote sequences: (3,4,2) (php)
+!! options
+php
 !! input
 '''foo''''bar''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar<i></i>
+</p>
+!!end
 
 
 !! test
-Italics and bold: multiple quote sequences: (3,4,3)
+Italics and bold: multiple quote sequences: (3,4,3) (php)
+!! options
+php
 !! input
 '''foo''''bar'''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar<b></b>
+</p>
+!!end
 
 ###
 ### other quote tests
@@ -622,14 +710,32 @@ Italics and bold: other quote tests: (3,2,3,2)
 !!end
 
 
+# The Parsoid team believes the PHP parser's output on this test is wrong.
+# It only checks for convert-to-bold-on-single-character-word when the word
+# matches with a bold tag ("'''") that is *odd* in the list of quote tokens.
+# This means that the bold token in position 2 (0-indexed) gets converted by
+# parsoid, but doesn't get changed by the PHP parser.
 !! test
-Italics and bold: other quote tests: (3,2,3,3)
+Italics and bold: other quote tests: (3,2,3,3) (php)
+!! options
+php
 !! input
 '''this is about ''foo'''s family'''
 !! result
 <p>'<i>this is about </i>foo<b>s family</b>
 </p>
 !!end
+# This is the output the Parsoid team believes to be correct.
+!! test
+Italics and bold: other quote tests: (3,2,3,3) (parsoid)
+!! options
+parsoid
+!! input
+'''this is about ''foo'''s family'''
+!! result
+<p><b>this is about <i>foo'</i>s family</b>
+</p>
+!!end
 
 
 !! test
@@ -2071,8 +2177,13 @@ Definition Lists: Nesting: Test 4
 !! end
 
 
+## The Parsoid team believes the following three test exposes a
+## bug in the PHP parser.  (Parsoid team thinks the PHP parser is
+## wrong to close the <dl> after the <dt> containing the <ul>.)
 !! test
-Definition Lists: Mixed Lists: Test 1
+Definition Lists: Mixed Lists: Test 1 (php)
+!! options
+php
 !! input
 :;* foo
 ::* bar
@@ -2087,7 +2198,19 @@ Definition Lists: Mixed Lists: Test 1
 </dd></dl>
 
 !! end
-
+!! test
+Definition Lists: Mixed Lists: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+:;* foo
+::* 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>
+!! end
 
 !! test
 Definition Lists: Mixed Lists: Test 2
@@ -2219,9 +2342,15 @@ Definition Lists: Mixed Lists: Test 10
 
 !! end
 
+# The Parsoid team disagrees with the PHP parser's seemingly-random
+# rules regarding dd/dt on the next two tests.  Parsoid is more
+# consistent, and recognizes the shared nesting and keeps the
+# still-open tags around until the nesting is complete.
 
 !! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 11 (php)
+!! options
+php
 !! input
 *#*#;*;;foo :bar
 *#*#;boo :baz
@@ -2239,10 +2368,23 @@ Definition Lists: Mixed Lists: Test 11
 </li></ul>
 
 !! end
+!! test
+Definition Lists: Mixed Lists: Test 11 (parsoid)
+!! options
+parsoid
+!! input
+*#*#;*;;foo :bar
+*#*#;boo :baz
+!! result
+<ul><li><ol><li><ul><li><ol><li><dl><dt><ul><li><dl><dt><dl><dt>foo&nbsp;</dt><dd>bar
+</dd></dl></dt></dl></li></ul></dt><dt>boo&nbsp;</dt><dd>baz</dd></dl></li></ol></li></ul></li></ol></li></ul>
+!! end
 
 
 !! test
-Definition Lists: Weird Ones: Test 1
+Definition Lists: Weird Ones: Test 1 (php)
+!! options
+php
 !! input
 *#;*::;; foo : bar (who uses this?)
 !! result
@@ -2256,6 +2398,15 @@ Definition Lists: Weird Ones: Test 1
 </li></ol>
 </li></ul>
 
+!! end
+!! test
+Definition Lists: Weird Ones: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+*#;*::;; foo : bar (who uses this?)
+!! result
+<ul><li><ol><li><dl><dt><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> foo&nbsp;</dt><dd> bar (who uses this?)</dd></dl></dt></dl></dd></dl></dd></dl></li></ul></dt></dl></li></ol></li></ul>
 !! end
 
 ###
@@ -2932,7 +3083,9 @@ Normal text. '''''Bold italic text.''''' Normal text.
 
 
 !! test
-Unclosed and unmatched quotes
+Unclosed and unmatched quotes (php)
+!! options
+php
 !! input
 '''''Bold italic text '''with bold deactivated''' in between.'''''
 
@@ -2967,6 +3120,48 @@ Plain ''italic'''s plain
 </p><p>Plain <i>italic'</i>s plain
 </p>
 !! end
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair. (There's also a case where Parsoid nests <b> and <i>
+# differently than the PHP parser.)
+!! test
+Unclosed and unmatched quotes (parsoid)
+!! options
+parsoid
+!! input
+'''''Bold italic text '''with bold deactivated''' in between.'''''
+
+'''''Bold italic text ''with italic deactivated'' in between.'''''
+
+'''Bold text..
+
+..spanning two paragraphs (should not work).'''
+
+'''Bold tag left open
+
+''Italic tag left open
+
+Normal text.
+
+<!-- Unmatching number of opening, closing tags: -->
+'''This year''''s election ''should'' beat '''last year''''s.
+
+''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
+!! result
+<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
+</p><p><i><b>Bold italic text </b></i><b>with italic deactivated<i> in between.</i></b>
+</p><p><b>Bold text..</b>
+</p><p>..spanning two paragraphs (should not work).<b></b>
+</p><p><b>Bold tag left open</b>
+</p><p><i>Italic tag left open</i>
+</p><p>Normal text.
+</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
+</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
+</p>
+!! end
 
 ###
 ### Tables
@@ -2978,16 +3173,30 @@ Plain ''italic'''s plain
 # is the bare minimun required by the spec, see:
 # http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
 !! test
-A table with no data.
+A table with no data. (php)
+!! options
+php
 !! input
 {||}
 !! result
 !! end
+# Parsoid team replies: empty table tags are legal in HTML5
+!! test
+A table with no data. (parsoid)
+!! options
+parsoid
+!! input
+{||}
+!! result
+<table></table>
+!! end
 
 # A table with nothing but a caption is invalid XHTML, we might want to render
 # this as <p>caption</p>
 !! test
-A table with nothing but a caption
+A table with nothing but a caption (php)
+!! options
+php
 !! input
 {|
 |+ caption
@@ -2997,6 +3206,18 @@ A table with nothing but a caption
 <caption> caption
 </caption><tr><td></td></tr></table>
 
+!! end
+# Parsoid team replies: table with only a caption is legal in HTML5
+!! test
+A table with nothing but a caption (parsoid)
+!! options
+parsoid
+!! input
+{|
+|+ caption
+|}
+!! result
+<table><caption> caption</caption></table>
 !! end
 
 !! test
@@ -3497,6 +3718,23 @@ b
 
 !! end
 
+!! test
+Table cell with a single comment
+!! input
+{|
+| <!-- c1 -->
+| a
+|}
+!! result
+<table>
+<tr>
+<td>
+</td>
+<td> a
+</td></tr></table>
+
+!! end
+
 # The expected HTML structure in this test is debatable. The PHP parser does
 # not parse this kind of table at all. The main focus for Parsoid is on
 # round-tripping, so this output is ok for now. TODO: revisit!
@@ -4619,6 +4857,26 @@ Multiple list tags generated by templates
 
 !!end
 
+!!test
+Single-comment whitespace lines dont break lists, but multi-comment whitespace lines do
+!!input
+*a
+<!--This line will NOT split the list-->
+*b
+ <!--This line will NOT split the list either-->
+*c
+ <!--foo--> <!--This line with more than 1 comment will split the list-->
+*d
+!!result
+<ul><li>a
+</li><li>b
+</li><li>c
+</li></ul>
+<ul><li>d
+</li></ul>
+
+!!end
+
 ###
 ### Magic Words
 ###
@@ -4782,7 +5040,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! input
 {{NUMBEROFFILES}}
 !! result
-<p>2
+<p>3
 </p>
 !! end
 
@@ -6006,6 +6264,15 @@ Templates: HTML Tag: 6. Generation of end piece of HTML attr value
 
 !!end
 
+!!test
+Templates: HTML Tag: 7. Generation of partial attribute key string
+!!input
+<div st{{echo|yle}}="color:red;">foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
 !!test
 Templates: HTML Tables: 1. Generating start of a HTML table
 !!input
@@ -7151,6 +7418,8 @@ Image with link parameter (URL target) and unnamed parameter
 
 !! test
 Thumbnail image with link parameter
+!! options
+php
 !! input
 [[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
 !! result
@@ -7158,6 +7427,61 @@ Thumbnail image with link parameter
 
 !! end
 
+!! test
+Manually-specified thumbnail image
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link to wiki page
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link to url
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit no link
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link and alt text
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
 !! test
 Image with frame and link
 !! input
@@ -9580,7 +9904,7 @@ Fuzz testing: image with bogus manual thumbnail
 !!input
 [[Image:foobar.jpg|thumbnail= ]]
 !!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
 
 !!end
 
@@ -10598,11 +10922,23 @@ Handling of &#x0A; in URLs
 !!end
 
 !! test
-5 quotes, code coverage +1 line
+5 quotes, code coverage +1 line (php)
+!! options
+php
 !! input
 '''''
 !! result
 !! end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+5 quotes, code coverage +1 line (parsoid)
+!! options
+parsoid
+!! input
+'''''
+!! result
+<p><i><b></b></i></p>
+!! end
 
 !! test
 Special:Search page linking.
@@ -14060,6 +14396,26 @@ parsoid
 
 !! end
 
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+{{}}
+!! result
+{{}}
+!! end
+
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+}}{{
+!! result
+}}{{
+!! end
+
 !!test
 Accept empty td cell attribute
 !!input
@@ -14126,6 +14482,93 @@ Empty table rows go away
 
 !! end
 
+###
+### Parsoid-centric tests for testing RTing of inter-element separators
+### Edge cases not tested by existing parser tests and specific to
+### Parsoid-specific serialization strategies.
+###
+
+!!test
+RT-ed inter-element separators should be valid separators
+!!input
+{|
+|- [[foo]]
+|}
+!!result
+<table>
+
+</table>
+
+!!end
+
+!!test
+Trailing newlines in a deep dom-subtree that ends a wikitext line should be migrated out
+(Parsoid-only since PHP parser relies on Tidy for correct output)
+!!options
+disabled parsoid
+!!input
+{|
+|<small>foo
+bar
+|}
+
+{|
+|<small>foo<small>
+|}
+!!result
+!!end
+
+!!test
+Empty TD followed by TD with tpl-generated attribute
+!!input
+{|
+|-
+|
+|{{echo|style='color:red'}}|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Empty TR followed by a template-generated TR
+(Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
+!!options
+disabled parsoid
+!!input
+{|
+|-
+{{echo|<tr><td>foo</td></tr>}}
+|}
+!!result
+<table>
+<tbody>
+<tr>
+<td></td></tr>
+<tr>
+<td>foo</td></tr></tbody></table>
+!!end
+
+!!test
+Multi-line image caption generated by templates with/without trailing newlines
+!!options
+parsoid
+!!input
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
+!!result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
+
+!!end
+
 TODO:
 more images
 more tables
index c8f3868..e49ea6d 100644 (file)
@@ -12,7 +12,6 @@ class AutoLoaderTest extends MediaWikiTestCase {
 
        protected static function checkAutoLoadConf() {
                global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
-               static $supportsParsekit;
                $supportsParsekit = function_exists( 'parsekit_compile_file' );
 
                // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
index 7d95b07..ecc8ad1 100644 (file)
@@ -438,7 +438,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * even if using different parameters.
         *
         * @param DatabaseBase $db The database connection
-        * @param String  $prefix The prefix to use for the new table set (aka schema).
+        * @param String $prefix The prefix to use for the new table set (aka schema).
         *
         * @throws MWException if the database table prefix is already $prefix
         */
index 6e56add..7e8f30e 100644 (file)
@@ -146,11 +146,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index 69ae376..e02e3e1 100644 (file)
@@ -151,11 +151,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index b106d2b..8bfc28e 100644 (file)
@@ -157,11 +157,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index 19c9b68..0f37182 100644 (file)
@@ -228,4 +228,117 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
                $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
        }
+
+       function testBlocksOnXff() {
+
+               $blockList = array(
+                       array( 'target' => '70.2.0.0/16',
+                               'type' =>  Block::TYPE_RANGE,
+                               'desc' => 'Range Hardblock',
+                               'ACDisable' => false,
+                               'isHardblock' => true,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '2001:4860:4001::/48',
+                               'type' =>  Block::TYPE_RANGE,
+                               'desc' => 'Range6 Hardblock',
+                               'ACDisable' => false,
+                               'isHardblock' => true,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '60.2.0.0/16',
+                               'type' =>  Block::TYPE_RANGE,
+                               'desc' => 'Range Softblock with AC Disabled',
+                               'ACDisable' => true,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '50.2.0.0/16',
+                               'type' =>  Block::TYPE_RANGE,
+                               'desc' => 'Range Softblock',
+                               'ACDisable' => false,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '50.1.1.1',
+                               'type' =>  Block::TYPE_IP,
+                               'desc' => 'Exact Softblock',
+                               'ACDisable' => false,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+               );
+
+               foreach ( $blockList as $insBlock ) {
+                       $target = $insBlock['target'];
+
+                       if ( $insBlock['type'] === Block::TYPE_IP ) {
+                               $target = User::newFromName( IP::sanitizeIP( $target ), false )->getName();
+                       } elseif ( $insBlock['type'] === Block::TYPE_RANGE ) {
+                               $target = IP::sanitizeRange( $target );
+                       }
+
+                       $block = new Block();
+                       $block->setTarget( $target );
+                       $block->setBlocker( 'testblocker@global' );
+                       $block->mReason = $insBlock['desc'];
+                       $block->mExpiry = 'infinity';
+                       $block->prevents( 'createaccount', $insBlock['ACDisable'] );
+                       $block->isHardblock( $insBlock['isHardblock'] );
+                       $block->isAutoblocking( $insBlock['isAutoBlocking'] );
+                       $block->insert();
+               }
+
+               $xffHeaders = array(
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.1.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 50.1.1.1, 2.3.4.5',
+                               'count' => 3,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '50.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.1.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, <$A_BUNCH-OF{INVALID}TEXT\>, 60.2.1.1, 2.3.4.5',
+                               'count' => 1,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.2.1.1, 2001:4860:4001:802::1003, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range6 Hardblock'
+                       ),
+               );
+
+               foreach ( $xffHeaders as $test ) {
+                       $list = array_map( 'trim', explode( ',', $test['xff'] ) );
+                       $xffblocks = Block::getBlocksForIPList( $list, true );
+                       $this->assertEquals( $test['count'], count( $xffblocks ), 'Number of blocks for ' . $test['xff'] );
+                       $block = Block::chooseBlock( $xffblocks, $list );
+                       $this->assertEquals( $test['result'], $block->mReason, 'Correct block type for XFF header ' . $test['xff'] );
+               }
+
+       }
 }
diff --git a/tests/phpunit/includes/CollationTest.php b/tests/phpunit/includes/CollationTest.php
new file mode 100644 (file)
index 0000000..c746208
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+class CollationTest extends MediaWikiLangTestCase {
+       protected function setUp() {
+               parent::setUp();
+               if ( !extension_loaded( 'intl' ) ) {
+                       $this->markTestSkipped( 'These tests require intl extension' );
+               }
+       }
+
+       /**
+        * Test to make sure, that if you
+        * have "X" and "XY", the binary
+        * sortkey also has "X" being a
+        * prefix of "XY". Our collation
+        * code makes this assumption.
+        *
+        * @param $lang String Language code for collator
+        * @param $base String Base string
+        * @param $extended String String containing base as a prefix.
+        *
+        * @dataProvider prefixDataProvider
+        */
+       function testIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
+       }
+
+       function prefixDataProvider() {
+               return array(
+                       array( 'en', 'A', 'AA' ),
+                       array( 'en', 'A', 'AAA' ),
+                       array( 'en', 'Д', 'ДЂ' ),
+                       array( 'en', 'Д', 'ДA' ),
+                       // 'Ʒ' should expand to 'Z ' (note space).
+                       array( 'fi', 'Z', 'Ʒ' ),
+                       // 'Þ' should expand to 'th'
+                       array( 'sv', 't', 'Þ' ),
+                       // Javanese is a limited use alphabet, so should have 3 bytes
+                       // per character, so do some tests with it.
+                       array( 'en', 'ꦲ', 'ꦲꦤ' ),
+                       array( 'en', 'ꦲ', 'ꦲД' ),
+                       array( 'en', 'A', 'Aꦲ' ),
+               );
+       }
+       /**
+        * Opposite of testIsPrefix
+        *
+        * @dataProvider notPrefixDataProvider
+        */
+       function testNotIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
+       }
+
+       function notPrefixDataProvider() {
+               return array(
+                       array( 'en', 'A', 'B' ),
+                       array( 'en', 'AC', 'ABC' ),
+                       array( 'en', 'Z', 'Ʒ' ),
+                       array( 'en', 'A', 'ꦲ' ),
+               );
+       }
+
+       /**
+        * Test correct first letter is fetched.
+        *
+        * @param $collation String Collation name (aka uca-en)
+        * @param $string String String to get first letter of
+        * @param $firstLetter String Expected first letter.
+        *
+        * @dataProvider firstLetterProvider
+        */
+       function testGetFirstLetter( $collation, $string, $firstLetter ) {
+               $col = Collation::factory( $collation );
+               $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
+       }
+       function firstLetterProvider() {
+               return array(
+                       array( 'uppercase', 'Abc', 'A' ),
+                       array( 'uppercase', 'abc', 'A' ),
+                       array( 'identity', 'abc', 'a' ),
+                       array( 'uca-en', 'abc', 'A' ),
+                       array( 'uca-en', ' ', ' ' ),
+                       array( 'uca-en', 'Êveryone', 'E' ),
+                       array( 'uca-vi', 'Êveryone', 'Ê' ),
+                       // Make sure thorn is not a first letter.
+                       array( 'uca-sv', 'The', 'T' ),
+                       array( 'uca-sv', 'Å', 'Å' ),
+                       array( 'uca-hu', 'dzsdo', 'Dzs' ),
+                       array( 'uca-hu', 'dzdso', 'Dz' ),
+                       array( 'uca-hu', 'CSD', 'Cs' ),
+                       array( 'uca-root', 'CSD', 'C' ),
+                       array( 'uca-fi', 'Ǥ', 'G' ),
+                       array( 'uca-fi', 'Ŧ', 'T' ),
+                       array( 'uca-fi', 'Ʒ', 'Z' ),
+                       array( 'uca-fi', 'Ŋ', 'N' ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/JsonTest.php b/tests/phpunit/includes/JsonTest.php
deleted file mode 100644 (file)
index 96a2ead..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-class JsonTest extends MediaWikiTestCase {
-
-       function testPhpBug46944Test() {
-               $this->assertNotEquals(
-                       '\ud840\udc00',
-                       strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
-                       'Test encoding an broken json_encode character (U+20000)'
-               );
-
-       }
-
-       function testDecodeVarTypes() {
-               $this->assertInternalType(
-                       'object',
-                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
-                       'Default to object'
-               );
-
-               $this->assertInternalType(
-                       'array',
-                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
-                       'Optional array'
-               );
-       }
-}
index d4d93b0..ab93b2b 100644 (file)
@@ -85,7 +85,7 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                $wgUser->mFrom = 'defaults';
                $wgUser->mOptionsLoaded = true;
                // The user's data is ignored because the variant is set in the URL.
-               $wgUser->setOption( 'variant', 'tg-latn' ); 
+               $wgUser->setOption( 'variant', 'tg-latn' );
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
        }
 
index 2259187..9e50b4c 100644 (file)
@@ -151,18 +151,20 @@ class PathRouterTest extends MediaWikiTestCase {
                $router->add( array( 'qwerty' => "/qwerty/$1" ), array( 'qwerty' => '$key' ) );
                $router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
 
-               foreach ( array(
-                                       '/Foo' => array( 'title' => 'Foo' ),
-                                       '/Bar' => array( 'ping' => 'pong' ),
-                                       '/Baz' => array( 'marco' => 'polo' ),
-                                       '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
-                                       '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
-                                       '/a/Foo' => array( 'title' => 'Foo' ),
-                                       '/asdf/Foo' => array( 'title' => 'Foo' ),
-                                       '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
-                                       '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
-                                       '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
-                               ) as $path => $result ) {
+               foreach (
+                       array(
+                               '/Foo' => array( 'title' => 'Foo' ),
+                               '/Bar' => array( 'ping' => 'pong' ),
+                               '/Baz' => array( 'marco' => 'polo' ),
+                               '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
+                               '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
+                               '/a/Foo' => array( 'title' => 'Foo' ),
+                               '/asdf/Foo' => array( 'title' => 'Foo' ),
+                               '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
+                               '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
+                               '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
+                       ) as $path => $result
+               ) {
                        $this->assertEquals( $router->parse( $path ), $result );
                }
        }
index a54a57e..0530b44 100644 (file)
@@ -29,7 +29,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         */
        function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
                $this->assertEquals( $expected,
-                       StringUtils::isUtf8( $string, /** disable mbstring: */ true ),
+                       StringUtils::isUtf8( $string, /** disable mbstring: */true ),
                        'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
                );
        }
@@ -116,7 +116,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\xff" ),
                        array( $FAIL, "\xfe\xfe\xff\xff" ),
 
-                       /**
+                       /*
                        # The PHP implementation does not handle characters
                        # being represented in a form which is too long :(
 
@@ -133,7 +133,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\xf0\x8F\xbf\xbf" ),
                        array( $FAIL, "\xf8\x87\xbf\xbf" ),
                        array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-                       **/
+                       */
 
                        # non characters
                        array( $PASS, "\xef\xbf\xbe" ),
index a58702b..3a2c62a 100644 (file)
@@ -4,22 +4,27 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $this->setMwGlobals( array(
-                       'wgLocalTZoffset' => null,
-                       'wgContLang' => Language::factory( 'en' ),
-                       'wgLanguageCode' => 'en',
-               ) );
-
                $this->iniSet( 'precision', 15 );
        }
 
-       # Test offset usage for a given language::userAdjust
-       function testUserAdjust() {
-               global $wgLocalTZoffset, $wgContLang;
+       /**
+        * Test offset usage for a given language::userAdjust
+        * @dataProvider dataUserAdjust
+        */
+       public function testUserAdjust( $date, $localTZoffset, $expected ) {
+               global $wgContLang;
+
+               $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
-               #  Collection of parameters for Language_t_Offset.
-               # Format: date to be formatted, localTZoffset value, expected date
-               $userAdjust_tests = array(
+               $this->assertEquals(
+                       strval( $expected ),
+                       strval( $wgContLang->userAdjust( $date, '' ) ),
+                       "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
+               );
+       }
+
+       public static function dataUserAdjust() {
+               return array(
                        array( 20061231235959, 0, 20061231235959 ),
                        array( 20061231235959, 5, 20070101000459 ),
                        array( 20061231235959, 15, 20070101001459 ),
@@ -31,15 +36,5 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
                        array( 20061231235959, -30, 20061231232959 ),
                        array( 20061231235959, -60, 20061231225959 ),
                );
-
-               foreach ( $userAdjust_tests as $data ) {
-                       $wgLocalTZoffset = $data[1];
-
-                       $this->assertEquals(
-                               strval( $data[2] ),
-                               strval( $wgContLang->userAdjust( $data[0], '' ) ),
-                               "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
-                       );
-               }
        }
 }
index cff8a2f..970862b 100644 (file)
@@ -38,7 +38,7 @@ class TitleTest extends MediaWikiTestCase {
        function testBug31100FixSpecialName( $text, $expectedParam ) {
                $title = Title::newFromText( $text );
                $fixed = $title->fixSpecialName();
-               $stuff = explode( '/', $fixed->getDbKey(), 2 );
+               $stuff = explode( '/', $fixed->getDBkey(), 2 );
                if ( count( $stuff ) == 2 ) {
                        $par = $stuff[1];
                } else {
index 94082e5..696b145 100644 (file)
@@ -65,8 +65,7 @@ class ApiCreateAccountTest extends ApiTestCase {
                        'action' => 'login',
                        'lgname' => 'Apitestnew',
                        'lgpassword' => $password,
-                       )
-               );
+               ) );
 
                $result = $ret[0];
                $this->assertNotInternalType( 'bool', $result );
@@ -76,12 +75,14 @@ class ApiCreateAccountTest extends ApiTestCase {
                $this->assertEquals( 'NeedToken', $a );
                $token = $result['login']['token'];
 
-               $ret = $this->doApiRequest( array(
-                       'action' => 'login',
-                       'lgtoken' => $token,
-                       'lgname' => 'Apitestnew',
-                       'lgpassword' => $password,
-                       ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'login',
+                               'lgtoken' => $token,
+                               'lgname' => 'Apitestnew',
+                               'lgpassword' => $password,
+                       ),
+                       $ret[2]
                );
 
                $result = $ret[0];
@@ -92,9 +93,11 @@ class ApiCreateAccountTest extends ApiTestCase {
                $this->assertEquals( 'Success', $a );
 
                // log out to destroy the session
-               $ret = $this->doApiRequest( array(
-                       'action' => 'logout',
-                       ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'logout',
+                       ),
+                       $ret[2]
                );
                $this->assertEquals( array(), $ret[0] );
        }
index 2277028..e278fd0 100644 (file)
@@ -81,8 +81,7 @@ class ApiTest extends ApiTestCase {
                        "action" => "login",
                        "lgname" => $user->username,
                        "lgpassword" => "bad",
-                       )
-               );
+               ) );
 
                $result = $ret[0];
 
@@ -136,7 +135,7 @@ class ApiTest extends ApiTestCase {
                $token = $result["login"]["token"];
 
                $ret = $this->doApiRequest(
-                       array(
+                       array(
                                "action" => "login",
                                "lgtoken" => $token,
                                "lgname" => $user->username,
index 6d4e371..30ec6c3 100644 (file)
@@ -67,7 +67,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'links' => array(
                                        array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $templates = array(
                array( 'prop' => 'templates', 'titles' => 'AQBT-All' ),
@@ -78,7 +81,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'templates' => array(
                                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $categories = array(
                array( 'prop' => 'categories', 'titles' => 'AQBT-All' ),
@@ -89,7 +95,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'categories' => array(
                                        array( 'ns' => 14, 'title' => 'Category:AQBT-Cat' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $allpages = array(
                array( 'list' => 'allpages', 'apprefix' => 'AQBT-' ),
@@ -98,7 +107,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                        array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
                        array( 'pageid' => 3, 'ns' => 0, 'title' => 'AQBT-Links' ),
                        array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $alllinks = array(
                array( 'list' => 'alllinks', 'alprefix' => 'AQBT-' ),
@@ -107,40 +117,46 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                        array( 'ns' => 0, 'title' => 'AQBT-Categories' ),
                        array( 'ns' => 0, 'title' => 'AQBT-Links' ),
                        array( 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $alltransclusions = array(
                array( 'list' => 'alltransclusions', 'atprefix' => 'AQBT-' ),
                array( 'alltransclusions' => array(
                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-       ) ) );
+               ) )
+       );
 
        private static $allcategories = array(
                array( 'list' => 'allcategories', 'acprefix' => 'AQBT-' ),
                array( 'allcategories' => array(
                        array( '*' => 'AQBT-Cat' ),
-       ) ) );
+               ) )
+       );
 
        private static $backlinks = array(
                array( 'list' => 'backlinks', 'bltitle' => 'AQBT-Links' ),
                array( 'backlinks' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
-       ) ) );
+               ) )
+       );
 
        private static $embeddedin = array(
                array( 'list' => 'embeddedin', 'eititle' => 'Template:AQBT-T' ),
                array( 'embeddedin' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
                        array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $categorymembers = array(
                array( 'list' => 'categorymembers', 'cmtitle' => 'Category:AQBT-Cat' ),
                array( 'categorymembers' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
                        array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorAllpages = array(
                array( 'generator' => 'allpages', 'gapprefix' => 'AQBT-' ),
@@ -161,7 +177,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'pageid' => 4,
                                'ns' => 0,
                                'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorLinks = array(
                array( 'generator' => 'links', 'titles' => 'AQBT-Links' ),
@@ -178,14 +195,17 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'pageid' => 4,
                                'ns' => 0,
                                'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorLinksPropLinks = array(
                array( 'prop' => 'links' ),
                array( 'pages' => array(
                        '1' => array( 'links' => array(
                                array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-       ) ) ) ) );
+                       ) )
+               ) )
+       );
 
        private static $generatorLinksPropTemplates = array(
                array( 'prop' => 'templates' ),
@@ -194,7 +214,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
                        '4' => array( 'templates' => array(
                                array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
-               ) ) );
+               ) )
+       );
 
        /**
         * Test basic props
index 0a3ac1d..c68065d 100644 (file)
@@ -48,7 +48,7 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
         */
        public function testA() {
                $this->mVerbose = false;
-               $mk = function( $g, $p, $gDir ) {
+               $mk = function ( $g, $p, $gDir ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT73462-',
@@ -59,10 +59,10 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,true), 1, 'g1p', false );
-               $this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
-               $this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
-               $this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
-               $this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+               $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false );
+               $this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
+               $this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
+               $this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
+               $this->checkC( $data, $mk( 2, 2, false ), 3, 'g1p-22f' );
        }
 }
index cb8f181..33f4663 100644 (file)
@@ -58,21 +58,21 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function test1List() {
                $this->mVerbose = false;
-               $mk = function( $l ) {
+               $mk = function ( $l ) {
                        return array(
                                'list' => 'allpages',
                                'apprefix' => 'AQCT-',
                                'aplimit' => "$l",
                        );
                };
-               $data = $this->query( $mk(99), 1, '1L', false );
+               $data = $this->query( $mk( 99 ), 1, '1L', false );
 
                // 1 list
-               $this->checkC( $data, $mk(1), 5, '1L-1' );
-               $this->checkC( $data, $mk(2), 3, '1L-2' );
-               $this->checkC( $data, $mk(3), 2, '1L-3' );
-               $this->checkC( $data, $mk(4), 2, '1L-4' );
-               $this->checkC( $data, $mk(5), 1, '1L-5' );
+               $this->checkC( $data, $mk( 1 ), 5, '1L-1' );
+               $this->checkC( $data, $mk( 2 ), 3, '1L-2' );
+               $this->checkC( $data, $mk( 3 ), 2, '1L-3' );
+               $this->checkC( $data, $mk( 4 ), 2, '1L-4' );
+               $this->checkC( $data, $mk( 5 ), 1, '1L-5' );
        }
 
        /**
@@ -81,7 +81,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function test2Lists() {
                $this->mVerbose = false;
-               $mk = function( $l1, $l2 ) {
+               $mk = function ( $l1, $l2 ) {
                        return array(
                                'list' => 'allpages|alltransclusions',
                                'apprefix' => 'AQCT-',
@@ -92,12 +92,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // 2 lists
-               $data = $this->query( $mk(99,99), 1, '2L', false );
-               $this->checkC( $data, $mk(1,1), 5, '2L-11' );
-               $this->checkC( $data, $mk(2,2), 3, '2L-22' );
-               $this->checkC( $data, $mk(3,3), 2, '2L-33' );
-               $this->checkC( $data, $mk(4,4), 2, '2L-44' );
-               $this->checkC( $data, $mk(5,5), 1, '2L-55' );
+               $data = $this->query( $mk( 99, 99 ), 1, '2L', false );
+               $this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
+               $this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
+               $this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
+               $this->checkC( $data, $mk( 4, 4 ), 2, '2L-44' );
+               $this->checkC( $data, $mk( 5, 5 ), 1, '2L-55' );
        }
 
        /**
@@ -106,7 +106,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen1Prop() {
                $this->mVerbose = false;
-               $mk = function( $g, $p ) {
+               $mk = function ( $g, $p ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -116,12 +116,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk(99,99), 1, 'G1P', false );
-               $this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
-               $this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
-               $this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
-               $this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
-               $this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+               $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false );
+               $this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
+               $this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
+               $this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
+               $this->checkC( $data, $mk( 4, 4 ), 3, 'G1P-44' );
+               $this->checkC( $data, $mk( 5, 5 ), 2, 'G1P-55' );
        }
 
        /**
@@ -130,7 +130,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen2Prop() {
                $this->mVerbose = false;
-               $mk = function( $g, $p1, $p2 ) {
+               $mk = function ( $g, $p1, $p2 ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -141,17 +141,17 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 2 props
-               $data = $this->query( $mk(99,99,99), 1, 'G2P', false );
-               $this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
-               $this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
-               $this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
-               $this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
-               $this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
-               $this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
-               $this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
-               $this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
-               $this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
-               $this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false );
+               $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
+               $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
+               $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
+               $this->checkC( $data, $mk( 4, 4, 4 ), 4, 'G2P-444' );
+               $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G2P-555' );
+               $this->checkC( $data, $mk( 5, 1, 1 ), 10, 'G2P-511' );
+               $this->checkC( $data, $mk( 4, 2, 2 ), 7, 'G2P-422' );
+               $this->checkC( $data, $mk( 2, 3, 3 ), 7, 'G2P-233' );
+               $this->checkC( $data, $mk( 2, 4, 4 ), 5, 'G2P-244' );
+               $this->checkC( $data, $mk( 1, 5, 5 ), 5, 'G2P-155' );
        }
 
        /**
@@ -160,7 +160,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen1Prop1List() {
                $this->mVerbose = false;
-               $mk = function( $g, $p, $l ) {
+               $mk = function ( $g, $p, $l ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -174,24 +174,24 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
-               $this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
-               $this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
-               $this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
-               $this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
-               $this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
-               $this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
-               $this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false );
+               $this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
+               $this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
+               $this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
+               $this->checkC( $data, $mk( 4, 4, 4 ), 3, 'G1P1L-444' );
+               $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G1P1L-555' );
+               $this->checkC( $data, $mk( 5, 5, 1 ), 4, 'G1P1L-551' );
+               $this->checkC( $data, $mk( 5, 5, 2 ), 2, 'G1P1L-552' );
        }
 
        /**
         * Test smart continue - generator=allpages, prop=links|templates,
-        *                                         list=alllinks|alltransclusions, meta=siteinfo
+        *                       list=alllinks|alltransclusions, meta=siteinfo
         * @medium
         */
        public function testGen2Prop2List1Meta() {
                $this->mVerbose = false;
-               $mk = function( $g, $p1, $p2, $l1, $l2 ) {
+               $mk = function ( $g, $p1, $p2, $l1, $l2 ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -211,16 +211,16 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
-               $this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
-               $this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
-               $this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
-               $this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
-               $this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
-               $this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
-               $this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
-               $this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
-               $this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+               $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false );
+               $this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
+               $this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
+               $this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
+               $this->checkC( $data, $mk( 4, 4, 4, 4, 4 ), 4, 'G2P2L1M-44444' );
+               $this->checkC( $data, $mk( 5, 5, 5, 5, 5 ), 2, 'G2P2L1M-55555' );
+               $this->checkC( $data, $mk( 5, 5, 5, 1, 1 ), 4, 'G2P2L1M-55511' );
+               $this->checkC( $data, $mk( 5, 5, 5, 2, 2 ), 2, 'G2P2L1M-55522' );
+               $this->checkC( $data, $mk( 5, 1, 1, 5, 5 ), 10, 'G2P2L1M-51155' );
+               $this->checkC( $data, $mk( 5, 2, 2, 5, 5 ), 5, 'G2P2L1M-52255' );
        }
 
        /**
@@ -229,7 +229,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testSameGenAndProp() {
                $this->mVerbose = false;
-               $mk = function( $g, $gDir, $p, $pDir ) {
+               $mk = function ( $g, $gDir, $p, $pDir ) {
                        return array(
                                'titles' => 'AQCT-1',
                                'generator' => 'templates',
@@ -241,31 +241,31 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false );
 
-               $this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
-               $this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
-               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
-               $this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
-               $this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+               $this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
+               $this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
+               $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=P-3t3t' );
+               $this->checkC( $data, $mk( 1, true, 3, true ), 4, 'G=P-1t3t' );
+               $this->checkC( $data, $mk( 3, true, 1, true ), 2, 'G=P-3t1t' );
 
-               $this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
-               $this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
-               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
-               $this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
-               $this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+               $this->checkC( $data, $mk( 1, true, 1, false ), 4, 'G=P-1t1f' );
+               $this->checkC( $data, $mk( 2, true, 2, false ), 2, 'G=P-2t2f' );
+               $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=P-3t3f' );
+               $this->checkC( $data, $mk( 1, true, 3, false ), 4, 'G=P-1t3f' );
+               $this->checkC( $data, $mk( 3, true, 1, false ), 2, 'G=P-3t1f' );
 
-               $this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
-               $this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
-               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
-               $this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
-               $this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+               $this->checkC( $data, $mk( 1, false, 1, true ), 4, 'G=P-1f1t' );
+               $this->checkC( $data, $mk( 2, false, 2, true ), 2, 'G=P-2f2t' );
+               $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=P-3f3t' );
+               $this->checkC( $data, $mk( 1, false, 3, true ), 4, 'G=P-1f3t' );
+               $this->checkC( $data, $mk( 3, false, 1, true ), 2, 'G=P-3f1t' );
 
-               $this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
-               $this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
-               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
-               $this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
-               $this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+               $this->checkC( $data, $mk( 1, false, 1, false ), 4, 'G=P-1f1f' );
+               $this->checkC( $data, $mk( 2, false, 2, false ), 2, 'G=P-2f2f' );
+               $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=P-3f3f' );
+               $this->checkC( $data, $mk( 1, false, 3, false ), 4, 'G=P-1f3f' );
+               $this->checkC( $data, $mk( 3, false, 1, false ), 2, 'G=P-3f1f' );
        }
 
        /**
@@ -274,7 +274,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testSameGenList() {
                $this->mVerbose = false;
-               $mk = function( $g, $gDir, $l, $pDir ) {
+               $mk = function ( $g, $gDir, $l, $pDir ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -287,27 +287,27 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 list
-               $data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false );
 
-               $this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
-               $this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
-               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
-               $this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
-               $this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
-               $this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
-               $this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
-               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
-               $this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
-               $this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
-               $this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
-               $this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
-               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
-               $this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
-               $this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
-               $this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
-               $this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
-               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
-               $this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
-               $this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+               $this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
+               $this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
+               $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=L-3t3t' );
+               $this->checkC( $data, $mk( 1, true, 3, true ), 5, 'G=L-1t3t' );
+               $this->checkC( $data, $mk( 3, true, 1, true ), 5, 'G=L-3t1t' );
+               $this->checkC( $data, $mk( 1, true, 1, false ), 5, 'G=L-1t1f' );
+               $this->checkC( $data, $mk( 2, true, 2, false ), 3, 'G=L-2t2f' );
+               $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=L-3t3f' );
+               $this->checkC( $data, $mk( 1, true, 3, false ), 5, 'G=L-1t3f' );
+               $this->checkC( $data, $mk( 3, true, 1, false ), 5, 'G=L-3t1f' );
+               $this->checkC( $data, $mk( 1, false, 1, true ), 5, 'G=L-1f1t' );
+               $this->checkC( $data, $mk( 2, false, 2, true ), 3, 'G=L-2f2t' );
+               $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=L-3f3t' );
+               $this->checkC( $data, $mk( 1, false, 3, true ), 5, 'G=L-1f3t' );
+               $this->checkC( $data, $mk( 3, false, 1, true ), 5, 'G=L-3f1t' );
+               $this->checkC( $data, $mk( 1, false, 1, false ), 5, 'G=L-1f1f' );
+               $this->checkC( $data, $mk( 2, false, 2, false ), 3, 'G=L-2f2f' );
+               $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=L-3f3f' );
+               $this->checkC( $data, $mk( 1, false, 3, false ), 5, 'G=L-1f3f' );
+               $this->checkC( $data, $mk( 3, false, 1, false ), 5, 'G=L-3f1f' );
        }
 }
index 4717479..e0a84e1 100644 (file)
@@ -36,7 +36,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
        /**
         * Run query() and compare against expected values
         */
-       protected function checkC( $expected, $params, $expectedCount, $id, $continue = true  ) {
+       protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
                $result = $this->query( $params, $expectedCount, $id, $continue );
                $this->assertResult( $expected, $result, $id );
        }
@@ -52,7 +52,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         */
        protected function query( $params, $expectedCount, $id, $useContinue = true ) {
                if ( isset( $params['action'] ) ) {
-                       $this->assertEquals( 'query', $params['action'], 'Invalid query action');
+                       $this->assertEquals( 'query', $params['action'], 'Invalid query action' );
                } else {
                        $params['action'] = 'query';
                }
@@ -64,7 +64,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                $continue = array();
                do {
                        $request = array_merge( $params, $continue );
-                       uksort( $request, function( $a, $b ) {
+                       uksort( $request, function ( $a, $b ) {
                                // put 'continue' params at the end - lazy method
                                $a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
                                $b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
@@ -74,7 +74,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                        //$reqStr = str_replace( '&', ' & ', $reqStr );
                        $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
                        if ( $this->mVerbose ) {
-                               print ("$id (#$count): $reqStr\n");
+                               print ( "$id (#$count): $reqStr\n" );
                        }
                        try {
                                $data = $this->doApiRequest( $request );
@@ -107,48 +107,52 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                        } elseif ( !$useContinue ) {
                                $this->assertFalse( 'Non-smart query must be requested all at once' );
                        }
-               } while( true );
+               } while ( true );
        }
 
        private function printResult( $data ) {
                $q = $data['query'];
                $print = array();
-               if (isset($q['pages'])) {
-                       foreach ($q['pages'] as $p) {
+               if ( isset( $q['pages'] ) ) {
+                       foreach ( $q['pages'] as $p ) {
                                $m = $p['title'];
-                               if (isset($p['links'])) {
-                                       $m .= '/[' . implode(',', array_map(
-                                               function ($v) {
+                               if ( isset( $p['links'] ) ) {
+                                       $m .= '/[' . implode( ',', array_map(
+                                               function ( $v ) {
                                                        return $v['title'];
                                                },
-                                               $p['links'])) . ']';
+                                               $p['links'] ) ) . ']';
                                }
-                               if (isset($p['categories'])) {
-                                       $m .= '/(' . implode(',', array_map(
-                                               function ($v) {
-                                                       return str_replace('Category:', '', $v['title']);
+                               if ( isset( $p['categories'] ) ) {
+                                       $m .= '/(' . implode( ',', array_map(
+                                               function ( $v ) {
+                                                       return str_replace( 'Category:', '', $v['title'] );
                                                },
-                                               $p['categories'])) . ')';
+                                               $p['categories'] ) ) . ')';
                                }
                                $print[] = $m;
                        }
                }
-               if (isset($q['allcategories'])) {
-                       $print[] = '*Cats/(' . implode(',', array_map(
-                               function ($v) { return $v['*']; },
-                               $q['allcategories'])) . ')';
+               if ( isset( $q['allcategories'] ) ) {
+                       $print[] = '*Cats/(' . implode( ',', array_map(
+                               function ( $v ) {
+                                       return $v['*'];
+                               },
+                               $q['allcategories'] ) ) . ')';
                }
                self::GetItems( $q, 'allpages', 'Pages', $print );
                self::GetItems( $q, 'alllinks', 'Links', $print );
                self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
-               print(' ' . implode('  ', $print) . "\n");
+               print( ' ' . implode( '  ', $print ) . "\n" );
        }
 
        private static function GetItems( $q, $moduleName, $name, &$print ) {
-               if (isset($q[$moduleName])) {
-                       $print[] = "*$name/[" . implode(',',
-                               array_map( function ($v) { return $v['title']; },
-                                               $q[$moduleName])) . ']';
+               if ( isset( $q[$moduleName] ) ) {
+                       $print[] = "*$name/[" . implode( ',',
+                               array_map( function ( $v ) {
+                                               return $v['title'];
+                                       },
+                                       $q[$moduleName] ) ) . ']';
                }
        }
 
@@ -164,12 +168,12 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                        $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
                } else {
                        $sort = null;
-                       foreach( $newResult as $key => $value ) {
+                       foreach ( $newResult as $key => $value ) {
                                if ( !$numericIds && $sort === null ) {
                                        if ( !is_array( $value ) ) {
                                                $sort = false;
                                        } elseif ( array_key_exists( 'title', $value ) ) {
-                                               $sort = function( $a, $b ) {
+                                               $sort = function ( $a, $b ) {
                                                        return strcmp( $a['title'], $b['title'] );
                                                };
                                        } else {
index 7b9f8ed..3d96beb 100644 (file)
@@ -43,7 +43,7 @@ STR;
        protected function merge( /*...*/ ) {
                $request = array();
                $expected = array();
-               foreach ( func_get_args() as $v ) {
+               foreach ( func_get_args() as $v ) {
                        list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
                        $request = array_merge_recursive( $request, $req );
                        $this->mergeExpected( $expected, $exp );
@@ -57,7 +57,7 @@ STR;
         */
        private function validateRequestExpectedPair( $v ) {
                $this->assertType( 'array', $v, self::PARAM_ASSERT );
-               $this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+               $this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
                $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
                $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
                $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
@@ -71,7 +71,7 @@ STR;
        private function mergeExpected( &$all, $item ) {
                foreach ( $item as $k => $v ) {
                        if ( array_key_exists( $k, $all ) ) {
-                               if ( is_array ( $all[$k] ) ) {
+                               if ( is_array( $all[$k] ) ) {
                                        $this->mergeExpected( $all[$k], $v );
                                } else {
                                        $this->assertEquals( $all[$k], $v );
diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php
deleted file mode 100644 (file)
index eda06d4..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group Cache
- */
-class MessageCacheTest extends MediaWikiLangTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               MessageCache::singleton()->enable();
-       }
-
-       function addDBData() {
-               // be sure english messages under $key, not $key/en
-               $this->setMwGlobals( array(
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
-               ) );
-
-               // Set up messages and fallbacks ab -> ru -> en
-               $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
-               $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
-               $this->makePage( 'FallbackLanguageTest-Full', 'en' );
-
-               // Fallbacks where ab does not exist
-               $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
-               $this->makePage( 'FallbackLanguageTest-Partial', 'en' );
-
-               // Fallback to english
-               $this->makePage( 'FallbackLanguageTest-English', 'en' );
-
-               // Full key tests -- always want russian
-               $this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
-               $this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
-       }
-
-       /**
-        * Helper function for addDBData -- adds a simple page to the database
-        *
-        * @param string $title Title of page to be created
-        * @param string $lang  Language and content of the created page
-        */
-       protected function makePage( $title, $lang ) {
-               global $wgContLang;
-
-               $title = Title::newFromText(
-                       ($lang == $wgContLang->getCode()) ? $title : "$title/$lang",
-                       NS_MEDIAWIKI
-               );
-               $wikiPage = new WikiPage( $title );
-               $content = ContentHandler::makeContent( $lang, $title );
-               $wikiPage->doEditContent( $content, "$lang translation test case" );
-       }
-
-       /**
-        * Test message fallbacks, bug #1495
-        *
-        * @dataProvider provideMessagesForFallback
-        */
-       function testMessageFallbacks( $message, $lang, $expectedContent ) {
-               $result = MessageCache::singleton()->get( $message, true, $lang );
-               $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
-       }
-
-       public static function provideMessagesForFallback() {
-               return array(
-                       array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
-                       array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
-                       array( 'FallbackLanguageTest-English', 'ab', 'en' ),
-                       array( 'FallbackLanguageTest-None', 'ab', false ),
-               );
-       }
-
-       /**
-        * There's a fallback case where the message key is given as fully qualified -- this
-        * should ignore the passed $lang and use the language from the key
-        *
-        * @dataProvider provideMessagesForFullKeys
-        */
-       function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
-               $result = MessageCache::singleton()->get( $message, true, $lang, true );
-               $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
-       }
-
-       public static function provideMessagesForFullKeys() {
-               return array(
-                       array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
-                       array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
-                       array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
-               );
-       }
-
-}
index ac8dcef..67d4fde 100644 (file)
@@ -257,8 +257,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                } catch ( MWException $ex ) {
                        if ( !$shouldFail ) {
                                $this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
-                       }
-                       else {
+                       } else {
                                // dummy, so we don't get the "test did not perform any assertions" message.
                                $this->assertTrue( true );
                        }
index cacaaa3..39611cb 100644 (file)
@@ -36,7 +36,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        }
                } else {
                        $this->singleBackend = new FSFileBackend( array(
-                               'name'        => 'localtesting',
+                               'name' => 'localtesting',
                                'lockManager' => 'fsLockManager',
                                #'parallelize' => 'implicit',
                                'containerPaths' => array(
@@ -45,23 +45,23 @@ class FileBackendTest extends MediaWikiTestCase {
                        ) );
                }
                $this->multiBackend = new FileBackendMultiWrite( array(
-                       'name'        => 'localtesting',
+                       'name' => 'localtesting',
                        'lockManager' => 'fsLockManager',
                        'parallelize' => 'implicit',
-                       'backends'    => array(
+                       'backends' => array(
                                array(
-                                       'name'          => 'localmultitesting1',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
+                                       'name' => 'localmultitesting1',
+                                       'class' => 'FSFileBackend',
+                                       'lockManager' => 'nullLockManager',
                                        'containerPaths' => array(
                                                'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
                                                'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
                                        'isMultiMaster' => false
                                ),
                                array(
-                                       'name'          => 'localmultitesting2',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
+                                       'name' => 'localmultitesting2',
+                                       'class' => 'FSFileBackend',
+                                       'lockManager' => 'nullLockManager',
                                        'containerPaths' => array(
                                                'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
                                                'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
@@ -817,32 +817,66 @@ class FileBackendTest extends MediaWikiTestCase {
                        "$base/unittest-cont1/e/fileB.a",
                        "$base/unittest-cont1/e/fileC.a"
                );
-               $ops = array();
+               $createOps = array();
                $purgeOps = array();
                foreach ( $files as $path ) {
                        $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
                        $this->assertGoodStatus( $status,
                                "Preparing $path succeeded without warnings ($backendName)." );
-                       $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0, 50000) );
+                       $createOps[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand( 0, 50000 ) );
+                       $copyOps[] = array( 'op' => 'copy', 'src' => $path, 'dst' => "$path-2" );
+                       $moveOps[] = array( 'op' => 'move', 'src' => "$path-2", 'dst' => "$path-3" );
                        $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+                       $purgeOps[] = array( 'op' => 'delete', 'src' => "$path-3" );
                }
                $purgeOps[] = array( 'op' => 'null' );
-               $status = $this->backend->doQuickOperations( $ops );
-               $this->assertGoodStatus( $status,
-                       "Creation of source files succeeded ($backendName)." );
 
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $createOps ),
+                       "Creation of source files succeeded ($backendName)." );
                foreach ( $files as $file ) {
                        $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
                                "File $file exists." );
                }
 
-               $status = $this->backend->doQuickOperations( $purgeOps );
-               $this->assertGoodStatus( $status,
-                       "Quick deletion of source files succeeded ($backendName)." );
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $copyOps ),
+                       "Quick copy of source files succeeded ($backendName)." );
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+                               "File $file-2 exists." );
+               }
 
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $moveOps ),
+                       "Quick move of source files succeeded ($backendName)." );
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+                               "File $file-3 move in." );
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+                               "File $file-2 moved away." );
+               }
+
+               $this->assertGoodStatus(
+                       $this->backend->quickCopy( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+                       "Copy of file {$files[0]} over itself succeeded ($backendName)." );
+               $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+                       "File {$files[0]} still exists." );
+
+               $this->assertGoodStatus(
+                       $this->backend->quickMove( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+                       "Move of file {$files[0]} over itself succeeded ($backendName)." );
+               $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+                       "File {$files[0]} still exists." );
+
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $purgeOps ),
+                       "Quick deletion of source files succeeded ($backendName)." );
                foreach ( $files as $file ) {
                        $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
                                "File $file purged." );
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+                               "File $file-3 purged." );
                }
        }
 
@@ -873,8 +907,8 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $srcs as $i => $source ) {
                        $this->prepare( array( 'dir' => dirname( $source ) ) );
                        $ops[] = array(
-                               'op'      => 'create', // operation
-                               'dst'     => $source, // source
+                               'op' => 'create', // operation
+                               'dst' => $source, // source
                                'content' => $srcsContent[$i]
                        );
                        $expContent .= $srcsContent[$i];
@@ -1834,7 +1868,9 @@ class FileBackendTest extends MediaWikiTestCase {
                }
 
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $iter ) {} // no errors
+               foreach ( $iter as $iter ) {
+                       // no errors
+               }
        }
 
        public function testGetDirectoryList() {
@@ -2031,7 +2067,10 @@ class FileBackendTest extends MediaWikiTestCase {
                }
 
                $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $file ) {} // no errors
+               foreach ( $iter as $file ) {
+                       // no errors
+               }
+
                $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
                $this->assertEquals( array(), $items, "Directory listing is empty." );
 
@@ -2071,7 +2110,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "subdir2/subdir/sub/120-px-file.txt",
                );
 
-               for ( $i=0; $i<25; $i++ ) {
+               for ( $i = 0; $i < 25; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
                        $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
                                "Locking of files succeeded ($backendName) ($i)." );
index 7d4b2bb..820f8c5 100644 (file)
@@ -43,7 +43,7 @@ class JobQueueTest extends MediaWikiTestCase {
                foreach ( $variants as $q => $settings ) {
                        try {
                                $this->$q = JobQueue::factory( $settings + $baseConfig );
-                               if ( ! ( $this->$q instanceof JobQueueDB ) ) {
+                               if ( !( $this->$q instanceof JobQueueDB ) ) {
                                        $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
                                }
                        } catch ( MWException $e ) {}; // unsupported? (@TODO: what if it was another error?)
@@ -52,10 +52,12 @@ class JobQueueTest extends MediaWikiTestCase {
 
        protected function tearDown() {
                parent::tearDown();
-               foreach ( array(
-                       'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
-                       'queueFifo', 'queueFifoTTL'
-               ) as $q ) {
+               foreach (
+                       array(
+                               'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
+                               'queueFifo', 'queueFifoTTL'
+                       ) as $q
+               ) {
                        if ( $this->$q ) {
                                do {
                                        $job = $this->$q->pop();
@@ -104,6 +106,9 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->flushCaches();
                $this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
+               $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
+
 
                $job1 = $queue->pop();
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -153,15 +158,16 @@ class JobQueueTest extends MediaWikiTestCase {
                        $this->markTestSkipped( $desc );
                }
 
-
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
                $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
-               $this->assertTrue( $queue->batchPush(
-                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
+               $this->assertTrue(
+                       $queue->batchPush(
+                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+                       ),
                        "Push worked ($desc)" );
 
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -170,9 +176,12 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
-               $this->assertTrue( $queue->batchPush(
-                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
-                       "Push worked ($desc)" );
+               $this->assertTrue(
+                       $queue->batchPush(
+                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+                       ),
+                       "Push worked ($desc)"
+               );
 
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
 
@@ -206,7 +215,6 @@ class JobQueueTest extends MediaWikiTestCase {
                        $this->markTestSkipped( $desc );
                }
 
-
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
@@ -260,7 +268,6 @@ class JobQueueTest extends MediaWikiTestCase {
                        $this->markTestSkipped( $desc );
                }
 
-
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
diff --git a/tests/phpunit/includes/json/FormatJsonTest.php b/tests/phpunit/includes/json/FormatJsonTest.php
new file mode 100644 (file)
index 0000000..0782e4e
--- /dev/null
@@ -0,0 +1,161 @@
+<?php
+
+class FormatJsonTest extends MediaWikiTestCase {
+
+       public function testEncoderPrettyPrinting() {
+               $obj = array(
+                       'emptyObject' => new stdClass,
+                       'emptyArray' => array(),
+                       'string' => 'foobar\\',
+                       'filledArray' => array(
+                               array(
+                                       123,
+                                       456,
+                               ),
+                               '"7":["8",{"9":"10"}]',
+                       ),
+               );
+
+               // 4 space indent, no trailing whitespace, no trailing linefeed
+               $json = '{
+    "emptyObject": {
+
+    },
+    "emptyArray": [
+
+    ],
+    "string": "foobar\\\\",
+    "filledArray": [
+        [
+            123,
+            456
+        ],
+        "\"7\":[\"8\",{\"9\":\"10\"}]"
+    ]
+}';
+
+               $json = str_replace( "\r", '', $json ); // Windows compat
+               $this->assertSame( $json, FormatJson::encode( $obj, true ) );
+       }
+
+       public static function provideEncodeDefault() {
+               return self::getEncodeTestCases( array() );
+       }
+
+       /**
+        * @dataProvider provideEncodeDefault
+        */
+       public function testEncodeDefault( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from ) );
+       }
+
+       public static function provideEncodeUtf8() {
+               return self::getEncodeTestCases( array( 'unicode' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeUtf8
+        */
+       public function testEncodeUtf8( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::UTF8_OK ) );
+       }
+
+       public static function provideEncodeXmlMeta() {
+               return self::getEncodeTestCases( array( 'xmlmeta' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeXmlMeta
+        */
+       public function testEncodeXmlMeta( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::XMLMETA_OK ) );
+       }
+
+       public static function provideEncodeAllOk() {
+               return self::getEncodeTestCases( array( 'unicode', 'xmlmeta' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeAllOk
+        */
+       public function testEncodeAllOk( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::ALL_OK ) );
+       }
+
+       public function testEncodePhpBug46944() {
+               $this->assertNotEquals(
+                       '\ud840\udc00',
+                       strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
+                       'Test encoding an broken json_encode character (U+20000)'
+               );
+
+       }
+
+       public function testDecodeReturnType() {
+               $this->assertInternalType(
+                       'object',
+                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
+                       'Default to object'
+               );
+
+               $this->assertInternalType(
+                       'array',
+                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
+                       'Optional array'
+               );
+       }
+
+       /**
+        * Generate a set of test cases for a particular combination of encoder options.
+        *
+        * @param array $unescapedGroups List of character groups to leave unescaped
+        * @return array: Arrays of unencoded strings and corresponding encoded strings
+        */
+       private static function getEncodeTestCases( array $unescapedGroups ) {
+               $groups = array(
+                       'always' => array(
+                               // Forward slash (always unescaped)
+                               '/' => '/',
+
+                               // Control characters
+                               "\0" => '\u0000',
+                               "\x08" => '\b',
+                               "\t" => '\t',
+                               "\n" => '\n',
+                               "\r" => '\r',
+                               "\f" => '\f',
+                               "\x1f" => '\u001f', // representative example
+
+                               // Double quotes
+                               '"' => '\"',
+
+                               // Backslashes
+                               '\\' => '\\\\',
+                               '\\\\' => '\\\\\\\\',
+                               '\\u00e9' => '\\\u00e9', // security check for Unicode unescaping
+
+                               // Line terminators
+                               "\xe2\x80\xa8" => '\u2028',
+                               "\xe2\x80\xa9" => '\u2029',
+                       ),
+                       'unicode' => array(
+                               "\xc3\xa9" => '\u00e9',
+                               "\xf0\x9d\x92\x9e" => '\ud835\udc9e', // U+1D49E, outside the BMP
+                       ),
+                       'xmlmeta' => array(
+                               '<' => '\u003C', // JSON_HEX_TAG uses uppercase hex digits
+                               '>' => '\u003E',
+                               '&' => '\u0026',
+                       ),
+               );
+
+               $cases = array();
+               foreach ( $groups as $name => $rules ) {
+                       $leaveUnescaped = in_array( $name, $unescapedGroups );
+                       foreach ( $rules as $from => $to ) {
+                               $cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
+                       }
+               }
+               return $cases;
+       }
+}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
deleted file mode 100644 (file)
index 5051830..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/* 
- * Test cases for our Services_Json library. Requires PHP json support as well,
- * so we can compare output
- */
-class ServicesJsonTest extends MediaWikiTestCase {
-       /**
-        * Test to make sure core json_encode() and our Services_Json()->encode()
-        * produce the same output
-        *
-        * @dataProvider provideValuesToEncode
-        */
-       public function testJsonEncode( $input, $desc ) {
-               if ( !function_exists( 'json_encode' ) ) {
-                       $this->markTestIncomplete( 'No PHP json support, unable to test' );
-                       return;
-               } elseif ( strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
-                       $this->markTestIncomplete( 'Have buggy PHP json support, unable to test' );
-                       return;
-               } else {
-                       $jsonObj = new Services_JSON();
-                       $this->assertEquals(
-                               $jsonObj->encode( $input ),
-                               json_encode( $input ),
-                               $desc
-                       );
-               }
-       }
-
-       /**
-        * Test to make sure core json_decode() and our Services_Json()->decode()
-        * produce the same output
-        *
-        * @dataProvider provideValuesToDecode
-        */
-       public function testJsonDecode( $input, $desc ) {
-               if ( !function_exists( 'json_decode' ) ) {
-                       $this->markTestIncomplete( 'No PHP json support, unable to test' );
-                       return;
-               } else {
-                       $jsonObj = new Services_JSON();
-                       $this->assertEquals(
-                               $jsonObj->decode( $input ),
-                               json_decode( $input ),
-                               $desc
-                       );
-               }
-       }
-
-       public static function provideValuesToEncode() {
-               $obj = new stdClass();
-               $obj->property = 'value';
-               $obj->property2 = null;
-               $obj->property3 = 1.234;
-               return array(
-                       array( 1, 'basic integer' ),
-                       array( -1, 'negative integer' ),
-                       array( 1.1, 'basic float' ),
-                       array( true, 'basic bool true' ),
-                       array( false, 'basic bool false' ),
-                       array( 'some string', 'basic string test' ),
-                       array( "some string\nwith newline", 'newline string test' ),
-                       array( '♥ü', 'unicode string test' ),
-                       array( array( 'some', 'string', 'values' ), 'basic array of strings' ),
-                       array( array( 'key1' => 'val1', 'key2' => 'val2' ), 'array with string keys' ),
-                       array( array( 1 => 'val1', 3 => 'val2', '2' => 'val3' ), 'out of order numbered array test' ),
-                       array( array(), 'empty array test' ),
-                       array( $obj, 'basic object test' ),
-                       array( new stdClass, 'empty object test' ),
-                       array( null, 'null test' ),
-               );
-       }
-
-       public static function provideValuesToDecode() {
-               return array(
-                       array( '1', 'basic integer' ),
-                       array( '-1', 'negative integer' ),
-                       array( '1.1', 'basic float' ),
-                       array( '1.1e1', 'scientific float' ),
-                       array( 'true', 'basic bool true' ),
-                       array( 'false', 'basic bool false' ),
-                       array( '"some string"', 'basic string test' ),
-                       array( '"some string\nwith newline"', 'newline string test' ),
-                       array( '"♥ü"', 'unicode character string test' ),
-                       array( '"\u2665"', 'unicode \\u string test' ),
-                       array( '["some","string","values"]', 'basic array of strings' ),
-                       array( '[]', 'empty array test' ),
-                       array( '{"key":"value"}', 'Basic key => value test' ),
-                       array( '{}', 'empty object test' ),
-                       array( 'null', 'null test' ),
-               );
-       }
-}
index 99ec05d..68efd86 100644 (file)
  *
  * @ingroup UtfNormal
  * @group Large
+ *
+ * We ignore code coverage for this test suite until they are rewritten
+ * to use data providers (bug 46561).
+ * @codeCoverageIgnore
  */
 class CleanUpTest extends MediaWikiTestCase {
        /** @todo document */
index 5732beb..77311b9 100644 (file)
@@ -187,6 +187,10 @@ class NewParserTest extends MediaWikiTestCase {
                # We will upload the actual files later. Note that if anything causes LocalFile::load()
                # to be triggered before then, it will break via maybeUpgrade() setting the fileExists
                # member to false and storing it in cache.
+               # note that the size/width/height/bits/etc of the file
+               # are actually set by inspecting the file itself; the arguments
+               # to recordUpload2 have no effect.  That said, we try to make things
+               # match up so it is less confusing to readers of the code & tests.
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
                        $image->recordUpload2(
@@ -194,19 +198,39 @@ class NewParserTest extends MediaWikiTestCase {
                                'Upload of some lame file',
                                'Some lame file',
                                array(
-                                       'size' => 12345,
+                                       'size' => 7881,
                                        'width' => 1941,
                                        'height' => 220,
-                                       'bits' => 24,
+                                       'bits' => 8,
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
                }
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2(
+                               '', // archive name
+                               'Upload of some lame thumbnail',
+                               'Some lame thumbnail',
+                               array(
+                                       'size' => 22589,
+                                       'width' => 135,
+                                       'height' => 135,
+                                       'bits' => 8,
+                                       'media_type' => MEDIATYPE_BITMAP,
+                                       'mime' => 'image/png',
+                                       'metadata' => serialize( array() ),
+                                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                                       'fileExists' => true ),
+                               $this->db->timestamp( '20130225203040' ), $user
+                       );
+               }
+
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
@@ -222,7 +246,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
@@ -429,6 +453,10 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
                ) );
+               $backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
+               $backend->store( array(
+                       'src' => "$IP/skins/monobook/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+               ) );
                $backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
@@ -478,8 +506,9 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
                                "$base/local-thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+                               "$base/local-public/e/ea/Thumb.png",
+
                                "$base/local-public/0/09/Bad.jpg",
-                               "$base/local-thumb/0/09/Bad.jpg",
 
                                "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
index 3601274..1f60293 100755 (executable)
@@ -8,7 +8,7 @@ has_binary () {
 }
 
 if [ `id -u` -ne 0 ]; then
-    echo '*** ERROR' Must be root to run
+    echo '*** ERROR: Must be root to run'
     exit 1
 fi
 
index 8bc908d..3fcc0e5 100644 (file)
@@ -34,7 +34,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms =  array( 'one', 'few', 'many', 'other' );
+               $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
@@ -44,7 +44,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -61,7 +61,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms =  array( 'one', 'other' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
index 06374d4..93ee0f0 100644 (file)
@@ -19,7 +19,7 @@ class LanguageCsTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
index a368371..562d6d9 100644 (file)
@@ -9,7 +9,7 @@
 class LanguageCuTest extends LanguageClassesTestCase {
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms =  array( 'one', 'two', 'few', 'other' );
+               $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
@@ -19,7 +19,7 @@ class LanguageCuTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
index 221a498..435da4f 100644 (file)
@@ -19,7 +19,7 @@ class LanguageCyTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
index da7cf12..73c4800 100644 (file)
@@ -19,7 +19,7 @@ class LanguageGaTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
index 4ff97ea..edf8e50 100644 (file)
@@ -14,7 +14,7 @@ class LanguageGdTest extends LanguageClassesTestCase {
        }
 
        public static function providerPlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -33,15 +33,15 @@ class LanguageGdTest extends LanguageClassesTestCase {
        }
 
        public static function providerPluralExplicit() {
-               return array (
-                               array( 'other', 0 ),
-                               array( 'one', 1 ),
-                               array( 'two', 2 ),
-                               array( 'Form11', 11 ),
-                               array( 'Form12', 12 ),
-                               array( 'few', 3 ),
-                               array( 'few', 19 ),
-                               array( 'other', 200 ),
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'Form11', 11 ),
+                       array( 'Form12', 12 ),
+                       array( 'few', 3 ),
+                       array( 'few', 19 ),
+                       array( 'other', 200 ),
                );
        }
 }
index ef95c5f..71c0160 100644 (file)
@@ -11,7 +11,7 @@ class LanguageGvTest extends LanguageClassesTestCase {
        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' );
+               $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
@@ -22,7 +22,7 @@ class LanguageGvTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'Form 4', 0 ),
                        array( 'Form 2', 1 ),
                        array( 'Form 3', 2 ),
index 3fbd51e..a8524bb 100644 (file)
@@ -7,24 +7,71 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
 class LanguageHeTest extends LanguageClassesTestCase {
-       /** @dataProvider providePlural */
-       function testPlural( $result, $value ) {
+       /*
+       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 ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /** @dataProvider provideThreePluralForms */
+       function testThreePluralForms( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider providePlural */
+       /** @dataProvider provideFourPluralForms */
+       function testFourPluralForms( $result, $value ) {
+               $forms = array( 'one', 'two', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /** @dataProvider provideFourPluralForms */
        function testGetPluralRuleType( $result, $value ) {
                $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       public static function providePlural() {
-               return array (
-                       array( 'other', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'other', 3 ),
-                       array( 'other', 10 ),
+       public static function provideTwoPluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'other', 2 ), // No third form provided, use it as plural
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
+               );
+       }
+
+       public static function provideThreePluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
+               );
+       }
+
+       public static function provideFourPluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
+                       array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
                );
        }
 
@@ -36,31 +83,31 @@ class LanguageHeTest extends LanguageClassesTestCase {
        // The comments in the beginning of the line help avoid RTL problems
        // with text editors.
        public static function provideGrammar() {
-               return array (
+               return array(
                        array(
-                               /* result */ 'וויקיפדיה',
-                               /* word   */ 'ויקיפדיה',
-                               /* case   */ 'תחילית',
+                               /* result */'וויקיפדיה',
+                               /* word   */'ויקיפדיה',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ 'וולפגנג',
-                               /* word   */ 'וולפגנג',
-                               /* case   */ 'prefixed',
+                               /* result */'וולפגנג',
+                               /* word   */'וולפגנג',
+                               /* case   */'prefixed',
                        ),
                        array(
-                               /* result */ 'קובץ',
-                               /* word   */ 'הקובץ',
-                               /* case   */ 'תחילית',
+                               /* result */'קובץ',
+                               /* word   */'הקובץ',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ '־Wikipedia',
-                               /* word   */ 'Wikipedia',
-                               /* case   */ 'תחילית',
+                               /* result */'־Wikipedia',
+                               /* word   */'Wikipedia',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ '־1995',
-                               /* word   */ '1995',
-                               /* case   */ 'תחילית',
+                               /* result */'־1995',
+                               /* word   */'1995',
+                               /* case   */'תחילית',
                        ),
                );
        }
index badfd11..7516bac 100644 (file)
@@ -19,7 +19,7 @@ class LanguageHrTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
index f520b7e..1abc375 100644 (file)
@@ -20,7 +20,7 @@ class LanguageHyTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index e863490..291c59b 100644 (file)
@@ -19,7 +19,7 @@ class LanguageKshTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index 45f083b..e5a10b5 100644 (file)
@@ -9,7 +9,7 @@
 class LanguageLtTest extends LanguageClassesTestCase {
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms =  array( 'one', 'few', 'other' );
+               $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
@@ -19,7 +19,7 @@ class LanguageLtTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
@@ -36,13 +36,13 @@ class LanguageLtTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testOneFewPlural( $result, $value ) {
-               $forms =  array( 'one', 'other' );
+               $forms = array( 'one', 'other' );
                // This fails for 21, but not sure why.
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        public static function providePluralTwoForms() {
-               return array (
+               return array(
                        array( 'one', 1 ),
                        array( 'other', 2 ),
                        array( 'other', 15 ),
index 3ff9589..368ac8c 100644 (file)
@@ -19,7 +19,7 @@ class LanguageLvTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
index 4ff2e3e..0ae533d 100644 (file)
@@ -19,7 +19,7 @@ class LanguageMkTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
index 3ffa4e7..3b162b7 100644 (file)
@@ -19,11 +19,11 @@ class LanguageMoTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'few',   0 ),
-                       array( 'one',   1 ),
-                       array( 'few',   2 ),
-                       array( 'few',   19 ),
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index 350aa08..12af2e8 100644 (file)
@@ -19,13 +19,13 @@ class LanguageMtTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'few',   0 ),
-                       array( 'one',   1 ),
-                       array( 'few',   2 ),
-                       array( 'few',   10 ),
-                       array( 'many',  11 ),
-                       array( 'many',  19 ),
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
@@ -46,23 +46,23 @@ class LanguageMtTest extends LanguageClassesTestCase {
        }
 
        public static function providerPluralTwoForms() {
-               return array (
-                       array( 'other',  0 ),
-                       array( 'one',   1 ),
-                       array( 'other',  2 ),
-                       array( 'other',  10 ),
-                       array( 'other',  11 ),
-                       array( 'other',  19 ),
-                       array( 'other',  20 ),
-                       array( 'other',  99 ),
-                       array( 'other',  100 ),
-                       array( 'other',  101 ),
-                       array( 'other',  102 ),
-                       array( 'other',  110 ),
-                       array( 'other',  111 ),
-                       array( 'other',  119 ),
-                       array( 'other',  120 ),
-                       array( 'other',  201 ),
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'other', 101 ),
+                       array( 'other', 102 ),
+                       array( 'other', 110 ),
+                       array( 'other', 111 ),
+                       array( 'other', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 201 ),
                );
        }
 }
index 059de44..1d62567 100644 (file)
@@ -19,9 +19,9 @@ class LanguageNsoTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'one',  0 ),
-                       array( 'one',  1 ),
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
                        array( 'other', 2 ),
                );
        }
index 837fc3a..9ec2a88 100644 (file)
@@ -19,23 +19,23 @@ class LanguagePlTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'many',  0 ),
-                       array( 'one',   1 ),
-                       array( 'few',   2 ),
-                       array( 'few',   3 ),
-                       array( 'few',   4 ),
-                       array( 'many',  5 ),
-                       array( 'many',  9 ),
-                       array( 'many',  10 ),
-                       array( 'many',  11 ),
-                       array( 'many',  21 ),
-                       array( 'few',   22 ),
-                       array( 'few',   23 ),
-                       array( 'few',   24 ),
-                       array( 'many',  25 ),
-                       array( 'many',  200 ),
-                       array( 'many',  201 ),
+               return array(
+                       array( 'many', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'many', 5 ),
+                       array( 'many', 9 ),
+                       array( 'many', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 21 ),
+                       array( 'few', 22 ),
+                       array( 'few', 23 ),
+                       array( 'few', 24 ),
+                       array( 'many', 25 ),
+                       array( 'many', 200 ),
+                       array( 'many', 201 ),
                );
        }
 
@@ -46,23 +46,23 @@ class LanguagePlTest extends LanguageClassesTestCase {
        }
 
        public static function providerPluralTwoForms() {
-               return array (
-                       array( 'other',  0 ),
-                       array( 'one',   1 ),
-                       array( 'other',  2 ),
-                       array( 'other',  3 ),
-                       array( 'other',  4 ),
-                       array( 'other',  5 ),
-                       array( 'other',  9 ),
-                       array( 'other',  10 ),
-                       array( 'other',  11 ),
-                       array( 'other',  21 ),
-                       array( 'other',  22 ),
-                       array( 'other',  23 ),
-                       array( 'other',  24 ),
-                       array( 'other',  25 ),
-                       array( 'other',  200 ),
-                       array( 'other',  201 ),
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+                       array( 'other', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 9 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 21 ),
+                       array( 'other', 22 ),
+                       array( 'other', 23 ),
+                       array( 'other', 24 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+                       array( 'other', 201 ),
                );
        }
 }
index 70324f5..919a744 100644 (file)
@@ -19,11 +19,11 @@ class LanguageRoTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'few',   0 ),
-                       array( 'one',   1 ),
-                       array( 'few',   2 ),
-                       array( 'few',   19 ),
+               return array(
+                       array( 'few', 0 ),
+                       array( 'one', 1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index ccfda20..bfd5074 100644 (file)
@@ -20,7 +20,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -37,7 +37,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms =  array( 'one', 'other' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
index 9b9297c..70efa3b 100644 (file)
@@ -19,7 +19,7 @@ class LanguageSeTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -34,7 +34,7 @@ class LanguageSeTest extends LanguageClassesTestCase {
        }
 
        public static function providerPluralTwoForms() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index 8dd18ea..9f34db5 100644 (file)
@@ -19,9 +19,9 @@ class LanguageShTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'many', 0 ),
-                       array( 'one',  1 ),
+                       array( 'one', 1 ),
                        array( 'few', 2 ),
                        array( 'few', 4 ),
                        array( 'many', 5 ),
index da09b56..3f32c66 100644 (file)
@@ -20,7 +20,7 @@ class LanguageSkTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
index 8329791..84c2e01 100644 (file)
@@ -20,12 +20,12 @@ class LanguageSlTest extends LanguageClassesTestCase {
        }
 
        public static function providerPlural() {
-               return array (
-                       array( 'other',  0 ),
-                       array( 'one',   1 ),
-                       array( 'two',   2 ),
-                       array( 'few',   3 ),
-                       array( 'few',   4 ),
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
                        array( 'other', 5 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index 2eb8113..5819831 100644 (file)
@@ -19,7 +19,7 @@ class LanguageSmaTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -34,7 +34,7 @@ class LanguageSmaTest extends LanguageClassesTestCase {
        }
 
        public static function providerPluralTwoForms() {
-               return array (
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index 05e8875..11d00f3 100644 (file)
@@ -122,7 +122,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -207,8 +207,8 @@ class LanguageSrTest extends LanguageClassesTestCase {
                return $this->getLang()
                        ->mConverter
                        ->convertTo(
-                       $text, $variant
-               );
+                               $text, $variant
+                       );
        }
 
        function convertToCyrillic( $text ) {
index f55684f..d5dbfb2 100644 (file)
@@ -511,10 +511,10 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * bug 33454. sprintfDate should always use UTC.
+        * sprintfDate should always use UTC when no zone is given.
         * @dataProvider provideSprintfDateSamples
         */
-       function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
+       function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
                $oldTZ = date_default_timezone_get();
                $res = date_default_timezone_set( 'Asia/Seoul' );
                if ( !$res ) {
@@ -530,42 +530,65 @@ class LanguageTest extends LanguageClassesTestCase {
                date_default_timezone_set( $oldTZ );
        }
 
+       /**
+        * sprintfDate should use passed timezone
+        * @dataProvider provideSprintfDateSamples
+        */
+       function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
+               $tz = new DateTimeZone( 'Asia/Seoul' );
+               if ( !$tz ) {
+                       $this->markTestSkipped( "Error getting Timezone" );
+               }
+
+               $this->assertEquals(
+                       $expected,
+                       $this->getLang()->sprintfDate( $format, $ts, $tz ),
+                       "sprintfDate('$format', '$ts', 'Asia/Seoul'): $msg"
+               );
+       }
+
        public static function provideSprintfDateSamples() {
                return array(
                        array(
                                'xiY',
                                '20111212000000',
                                '1390', // note because we're testing English locale we get Latin-standard digits
+                               '1390',
                                'Iranian calendar full year'
                        ),
                        array(
                                'xiy',
                                '20111212000000',
                                '90',
+                               '90',
                                'Iranian calendar short year'
                        ),
                        array(
                                'o',
                                '20120101235000',
                                '2011',
+                               '2011',
                                'ISO 8601 (week) year'
                        ),
                        array(
                                'W',
                                '20120101235000',
                                '52',
+                               '52',
                                'Week number'
                        ),
                        array(
                                'W',
                                '20120102235000',
                                '1',
+                               '1',
                                'Week number'
                        ),
                        array(
                                'o-\\WW-N',
                                '20091231235000',
                                '2009-W53-4',
+                               '2009-W53-4',
                                'leap week'
                        ),
                        // What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
@@ -573,252 +596,336 @@ class LanguageTest extends LanguageClassesTestCase {
                                'Y',
                                '20120102090705',
                                '2012',
+                               '2012',
                                'Full year'
                        ),
                        array(
                                'y',
                                '20120102090705',
                                '12',
+                               '12',
                                '2 digit year'
                        ),
                        array(
                                'L',
                                '20120102090705',
                                '1',
+                               '1',
                                'Leap year'
                        ),
                        array(
                                'n',
                                '20120102090705',
                                '1',
+                               '1',
                                'Month index, not zero pad'
                        ),
                        array(
                                'N',
                                '20120102090705',
                                '01',
+                               '01',
                                'Month index. Zero pad'
                        ),
                        array(
                                'M',
                                '20120102090705',
                                'Jan',
+                               'Jan',
                                'Month abbrev'
                        ),
                        array(
                                'F',
                                '20120102090705',
                                'January',
+                               'January',
                                'Full month'
                        ),
                        array(
                                'xg',
                                '20120102090705',
                                'January',
+                               'January',
                                'Genitive month name (same in EN)'
                        ),
                        array(
                                'j',
                                '20120102090705',
                                '2',
+                               '2',
                                'Day of month (not zero pad)'
                        ),
                        array(
                                'd',
                                '20120102090705',
                                '02',
+                               '02',
                                'Day of month (zero-pad)'
                        ),
                        array(
                                'z',
                                '20120102090705',
                                '1',
+                               '1',
                                'Day of year (zero-indexed)'
                        ),
                        array(
                                'D',
                                '20120102090705',
                                'Mon',
+                               'Mon',
                                'Day of week (abbrev)'
                        ),
                        array(
                                'l',
                                '20120102090705',
                                'Monday',
+                               'Monday',
                                'Full day of week'
                        ),
                        array(
                                'N',
                                '20120101090705',
                                '7',
+                               '7',
                                'Day of week (Mon=1, Sun=7)'
                        ),
                        array(
                                'w',
                                '20120101090705',
                                '0',
+                               '0',
                                'Day of week (Sun=0, Sat=6)'
                        ),
                        array(
                                'N',
                                '20120102090705',
                                '1',
+                               '1',
                                'Day of week'
                        ),
                        array(
                                'a',
                                '20120102090705',
                                'am',
+                               'am',
                                'am vs pm'
                        ),
                        array(
                                'A',
                                '20120102120000',
                                'PM',
+                               'PM',
                                'AM vs PM'
                        ),
                        array(
                                'a',
                                '20120102000000',
                                'am',
+                               'am',
                                'AM vs PM'
                        ),
                        array(
                                'g',
                                '20120102090705',
                                '9',
+                               '9',
                                '12 hour, not Zero'
                        ),
                        array(
                                'h',
                                '20120102090705',
                                '09',
+                               '09',
                                '12 hour, zero padded'
                        ),
                        array(
                                'G',
                                '20120102090705',
                                '9',
+                               '9',
                                '24 hour, not zero'
                        ),
                        array(
                                'H',
                                '20120102090705',
                                '09',
+                               '09',
                                '24 hour, zero'
                        ),
                        array(
                                'H',
                                '20120102110705',
                                '11',
+                               '11',
                                '24 hour, zero'
                        ),
                        array(
                                'i',
                                '20120102090705',
                                '07',
+                               '07',
                                'Minutes'
                        ),
                        array(
                                's',
                                '20120102090705',
                                '05',
+                               '05',
                                'seconds'
                        ),
                        array(
                                'U',
                                '20120102090705',
                                '1325495225',
+                               '1325462825',
                                'unix time'
                        ),
                        array(
                                't',
                                '20120102090705',
                                '31',
+                               '31',
                                'Days in current month'
                        ),
                        array(
                                'c',
                                '20120102090705',
                                '2012-01-02T09:07:05+00:00',
+                               '2012-01-02T09:07:05+09:00',
                                'ISO 8601 timestamp'
                        ),
                        array(
                                'r',
                                '20120102090705',
                                'Mon, 02 Jan 2012 09:07:05 +0000',
+                               'Mon, 02 Jan 2012 09:07:05 +0900',
                                'RFC 5322'
                        ),
+                       array(
+                               'e',
+                               '20120102090705',
+                               'UTC',
+                               'Asia/Seoul',
+                               'Timezone identifier'
+                       ),
+                       array(
+                               'I',
+                               '19880602090705',
+                               '0',
+                               '1',
+                               'DST indicator'
+                       ),
+                       array(
+                               'O',
+                               '20120102090705',
+                               '+0000',
+                               '+0900',
+                               'Timezone offset'
+                       ),
+                       array(
+                               'P',
+                               '20120102090705',
+                               '+00:00',
+                               '+09:00',
+                               'Timezone offset with colon'
+                       ),
+                       array(
+                               'T',
+                               '20120102090705',
+                               'UTC',
+                               'KST',
+                               'Timezone abbreviation'
+                       ),
+                       array(
+                               'Z',
+                               '20120102090705',
+                               '0',
+                               '32400',
+                               'Timezone offset in seconds'
+                       ),
                        array(
                                'xmj xmF xmn xmY',
                                '20120102090705',
                                '7 Safar 2 1433',
+                               '7 Safar 2 1433',
                                'Islamic'
                        ),
                        array(
                                'xij xiF xin xiY',
                                '20120102090705',
                                '12 Dey 10 1390',
+                               '12 Dey 10 1390',
                                'Iranian'
                        ),
                        array(
                                'xjj xjF xjn xjY',
                                '20120102090705',
                                '7 Tevet 4 5772',
+                               '7 Tevet 4 5772',
                                'Hebrew'
                        ),
                        array(
                                'xjt',
                                '20120102090705',
                                '29',
+                               '29',
                                'Hebrew number of days in month'
                        ),
                        array(
                                'xjx',
                                '20120102090705',
                                'Tevet',
+                               'Tevet',
                                'Hebrew genitive month name (No difference in EN)'
                        ),
                        array(
                                'xkY',
                                '20120102090705',
                                '2555',
+                               '2555',
                                'Thai year'
                        ),
                        array(
                                'xoY',
                                '20120102090705',
                                '101',
+                               '101',
                                'Minguo'
                        ),
                        array(
                                'xtY',
                                '20120102090705',
                                '平成24',
+                               '平成24',
                                'nengo'
                        ),
                        array(
                                'xrxkYY',
                                '20120102090705',
                                'MMDLV2012',
+                               'MMDLV2012',
                                'Roman numerals'
                        ),
                        array(
                                'xhxjYY',
                                '20120102090705',
                                'ה\'תשע"ב2012',
+                               'ה\'תשע"ב2012',
                                'Hebrew numberals'
                        ),
                        array(
                                'xnY',
                                '20120102090705',
                                '2012',
+                               '2012',
                                'Raw numerals (doesn\'t mean much in EN)'
                        ),
                        array(
                                '[[Y "(yea"\\r)]] \\"xx\\"',
                                '20120102090705',
                                '[[2012 (year)]] "x"',
+                               '[[2012 (year)]] "x"',
                                'Various escaping'
                        ),
 
index b2cc4c3..36446c4 100644 (file)
@@ -19,9 +19,9 @@ class LanguageTiTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'one',  0 ),
-                       array( 'one',  1 ),
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
                        array( 'other', 2 ),
                );
        }
index 0299653..422ad43 100644 (file)
@@ -19,9 +19,9 @@ class LanguageTlTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'one',  0 ),
-                       array( 'one',  1 ),
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
                        array( 'other', 2 ),
                );
        }
index 66cd183..3180d30 100644 (file)
@@ -20,7 +20,7 @@ class LanguageUkTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
+               return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
index 813222d..ffa3375 100644 (file)
@@ -19,9 +19,9 @@ class LanguageWaTest extends LanguageClassesTestCase {
        }
 
        public static function providePlural() {
-               return array (
-                       array( 'one',  0 ),
-                       array( 'one',  1 ),
+               return array(
+                       array( 'one', 0 ),
+                       array( 'one', 1 ),
                        array( 'other', 2 ),
                );
        }
index 2ec0744..2a1ebc3 100755 (executable)
@@ -50,8 +50,11 @@ class PHPUnitMaintClass extends Maintenance {
 
                // Bug 44192 Do not attempt to send a real e-mail
                Hooks::clear( 'AlternateUserMailer' );
-               Hooks::register( 'AlternateUserMailer',
-                       function() { return false; }
+               Hooks::register(
+                       'AlternateUserMailer',
+                       function () {
+                               return false;
+                       }
                );
        }
 
index 279932f..876876b 100644 (file)
@@ -116,13 +116,13 @@ class SideBarTest extends MediaWikiLangTestCase {
                                # ** Baz|Fred
                                array(
                                        'text' => 'Fred',
-                                       'href' => Title::newFromText( 'Baz' )->getLocalUrl(),
+                                       'href' => Title::newFromText( 'Baz' )->getLocalURL(),
                                        'id' => 'n-Fred',
                                        'active' => null,
                                ),
                                array(
                                        'text' => 'title-to-display',
-                                       'href' => Title::newFromText( 'page-to-go-to' )->getLocalUrl(),
+                                       'href' => Title::newFromText( 'page-to-go-to' )->getLocalURL(),
                                        'id' => 'n-title-to-display',
                                        'active' => null,
                                ),
index 28d38ab..3200e0b 100644 (file)
@@ -16,9 +16,10 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
        protected function setUp() {
-               global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
-                       $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
-                       $wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
+               global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
+                       $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
+                       $wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+                       $parserMemc;
 
                $tmpGlobals = array();
 
index 01072d8..c874375 100644 (file)
@@ -6,6 +6,7 @@ return array(
 
        'mediawiki.tests.qunit.suites' => array(
                'scripts' => array(
+                       'tests/qunit/suites/resources/startup.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -16,6 +17,7 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
@@ -45,6 +47,7 @@ return array(
                        'jquery.hidpi',
                        'jquery.highlightText',
                        'jquery.localize',
+                       'jquery.makeCollapsible',
                        'jquery.mwExtension',
                        'jquery.tabIndex',
                        'jquery.tablesorter',
@@ -61,6 +64,5 @@ return array(
                        'mediawiki.language',
                        'mediawiki.cldr',
                ),
-               'position' => 'top',
        )
 );
index 7ff392a..f6eff77 100644 (file)
@@ -24,6 +24,7 @@
  */
 header( 'Content-Type: text/javascript; charset=utf-8' );
 
+require_once __DIR__ . '/../../../includes/json/FormatJson.php';
 require_once __DIR__ . '/../../../includes/Xml.php';
 
 $moduleImplementations = array(
@@ -50,7 +51,7 @@ if ( isset( $_GET['modules'] ) ) {
                if ( isset( $moduleImplementations[$module] ) ) {
                        $response .= $moduleImplementations[$module];
                } else {
-                       $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
+                       $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ), true );
                }
        }
 }
index 62dd81a..3f3c899 100644 (file)
@@ -38,6 +38,8 @@
                tooltip: 'Enable debug mode in ResourceLoader'
        } );
 
+       QUnit.config.requireExpects = true;
+
        /**
         * Load TestSwarm agent
         */
@@ -53,8 +55,9 @@
 
        /**
         * CompletenessTest
+        *
+        * Adds toggle checkbox to header
         */
-        // Adds toggle checkbox to header
        QUnit.config.urlConfig.push( {
                id: 'completenesstest',
                label: 'Run CompletenessTest',
@@ -93,8 +96,9 @@
 
        /**
         * Test environment recommended for all QUnit test modules
+        *
+        * Whether to log environment changes to the console
         */
-        // Whether to log environment changes to the console
        QUnit.config.urlConfig.push( 'mwlogenv' );
 
        /**
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
 
+       QUnit.test( 'Loader status', 2, function ( assert ) {
+               var i, len, state,
+                       modules = mw.loader.getModuleNames(),
+                       error = [],
+                       missing = [];
+
+               for ( i = 0, len = modules.length; i < len; i++ ) {
+                       state = mw.loader.getState( modules[i] );
+                       if ( state === 'error' ) {
+                               error.push( modules[i] );
+                       } else if ( state === 'missing' ) {
+                               missing.push( modules[i] );
+                       }
+               }
+
+               assert.deepEqual( error, [], 'Modules in error state' );
+               assert.deepEqual( missing, [], 'Modules in missing state' );
+       } );
+
        QUnit.test( 'htmlEqual', 8, function ( assert ) {
                assert.htmlEqual(
                        '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
diff --git a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
new file mode 100644 (file)
index 0000000..9f34bee
--- /dev/null
@@ -0,0 +1,118 @@
+( function ( mw, $ ) {
+       var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
+
+       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
+
+       function prepareCollapsible( html, options ) {
+               return $( $.parseHTML( html ) )
+                       .appendTo( '#qunit-fixture' )
+                       // options might be undefined here - this is okay
+                       .makeCollapsible( options );
+       }
+
+       QUnit.asyncTest( 'testing hooks (triggers)', 4, function ( assert ) {
+               var $collapsible, $content, $toggle;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+               $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+               // In one full collapse-expand cycle, each event will be fired once
+
+               // On collapse...
+               $collapsible.on( 'beforeCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'first beforeCollapseExpand: content is visible' );
+               } );
+               $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'first afterCollapseExpand: content is hidden' );
+
+                       // On expand...
+                       $collapsible.on( 'beforeExpand.mw-collapsible', function () {
+                               assert.assertTrue( $content.is( ':hidden' ), 'second beforeCollapseExpand: content is hidden' );
+                       } );
+                       $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                               assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' );
+
+                               QUnit.start();
+                       } );
+
+                       // ...expanding happens here
+                       $toggle.trigger( 'click' );
+               } );
+
+               // ...collapsing happens here
+               $toggle.trigger( 'click' );
+       } );
+
+       QUnit.asyncTest( 'basic operation', 3, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               assert.equal( $content.length, 1, 'content is present' );
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.test( 'basic operation with instantHide (synchronous test)', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                       { instantHide: true }
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+
+               assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+       } );
+
+       QUnit.asyncTest( 'initially collapsed - mw-collapsed class', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               // Synchronous - mw-collapsed should cause instantHide: true to be used on initial collapsing
+               assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+               $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.asyncTest( 'initially collapsed - options', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                       { collapsed: true }
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               // Synchronous - collapsed: true should cause instantHide: true to be used on initial collapsing
+               assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+               $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+}( mediaWiki, jQuery ) );
index 307b044..1a380a5 100644 (file)
                }
        );
 
-       QUnit.test( 'Test detection routine', function ( assert ) {
+       QUnit.test( 'Test detection routine', 1, function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
        } );
 
        /** FIXME: the diff output is not very readeable. */
-       QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
+       QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
                );
        } );
 
-       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
+       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
                var $table, data;
 
                // Example 1: All cells except one cell without data-sort-value,
                }
        );
 
-       QUnit.test( 'Sorting images using alt text', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
index ce03b69..5fe2394 100644 (file)
 
                        var start = opt.before.start,
                                end = opt.before.end;
-                       if ( window.opera ) {
-                               // Compensate for Opera's craziness converting \n to \r\n and counting that as two chars
-                               var newLinesBefore = opt.before.text.substring( 0, start ).split( '\n' ).length - 1,
-                                       newLinesInside = opt.before.text.substring( start, end ).split( '\n' ).length - 1;
-                               start += newLinesBefore;
-                               end += newLinesBefore + newLinesInside;
-                       }
 
                        var options = $.extend( {}, opt.replace ); // Clone opt.replace
                        options.selectionStart = start;
index 9389651..ee854ae 100644 (file)
@@ -3,7 +3,7 @@
 
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-       QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+       QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
                var selectHtml, $env, $options;
 
                // from Special:Recentchanges
index 0a9df96..e0e823d 100644 (file)
@@ -1,20 +1,17 @@
 ( function ( mw, $ ) {
-       var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests, specialCharactersPageName,
+       var mwLanguageCache = {}, formatText, formatParse, formatnumTests, specialCharactersPageName,
                expectedListUsers, expectedEntrypoints;
 
+       // When the expected result is the same in both modes
+       function assertBothModes( assert, parserArguments, expectedResult, assertMessage ) {
+               assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
+               assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
+       }
+
        QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
                setup: function () {
                        this.orgMwLangauge = mw.language;
                        mw.language = $.extend( true, {}, this.orgMwLangauge );
-                       oldGetOuterHtml = $.fn.getOuterHtml;
-                       $.fn.getOuterHtml = function () {
-                               var $div = $( '<div>' ), html;
-                               $div.append( $( this ).eq( 0 ).clone() );
-                               html = $div.html();
-                               $div.empty();
-                               $div = undefined;
-                               return html;
-                       };
 
                        // Messages that are reused in multiple tests
                        mw.messages.set( {
                                'external-link-replace': 'Foo [$1 bar]'
                        } );
 
+                       mw.config.set( {
+                               wgArticlePath: '/wiki/$1'
+                       } );
+
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
-                       expectedListUsers = '注册' + $( '<a>' ).attr( {
-                               title: 'Special:ListUsers',
-                               href: mw.util.wikiGetlink( 'Special:ListUsers' )
-                       } ).text( '用户' ).getOuterHtml();
+                       expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
+
+                       formatText = mw.jqueryMsg.getMessageFunction( {
+                               format: 'text'
+                       } );
+
+                       formatParse = mw.jqueryMsg.getMessageFunction( {
+                               format: 'parse'
+                       } );
                },
                teardown: function () {
                        mw.language = this.orgMwLangauge;
-                       $.fn.getOuterHtml = oldGetOuterHtml;
                }
        } ) );
 
        }
 
        QUnit.test( 'Replace', 9, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
-               assert.equal( parser( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
-               assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
-               assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
+               assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
+               assert.equal( formatParse( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
+               assert.equal( formatParse( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
 
                mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
 
                assert.equal(
-                       parser( 'plain-input', 'bar' ),
+                       formatParse( 'plain-input', 'bar' ),
                        '&lt;foo foo="foo"&gt;xbary&amp;lt;&lt;/foo&gt;z',
                        'Input is not considered html'
                );
                mw.messages.set( 'plain-replace', 'Foo $1' );
 
                assert.equal(
-                       parser( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
+                       formatParse( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
                        'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
                        'Replacement is not considered html'
                );
                mw.messages.set( 'object-replace', 'Foo $1' );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
                        'Foo <div class="bar">&gt;</div>',
                        'jQuery objects are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
                        'Foo <div class="bar">&gt;</div>',
                        'HTMLElement objects are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
                        'Foo <div class="bar">&gt;</div>',
                        'HTMLElement[] arrays are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'external-link-replace', 'http://example.org/?x=y&z' ),
+                       formatParse( 'external-link-replace', 'http://example.org/?x=y&z' ),
                        'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
                        'Href is not double-escaped in wikilink function'
                );
        } );
 
        QUnit.test( 'Plural', 3, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
-               assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
-               assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
-               assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
+               assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+               assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+               assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
        } );
 
        QUnit.test( 'Gender', 11, function ( assert ) {
                // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
                // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-               var user = mw.user,
-                       parser = mw.jqueryMsg.getMessageFunction();
+               var user = mw.user;
 
                user.options.set( 'gender', 'male' );
                assert.equal(
-                       parser( 'gender-msg', 'Bob', 'male' ),
+                       formatParse( 'gender-msg', 'Bob', 'male' ),
                        'Bob: blue',
                        'Masculine from string "male"'
                );
                assert.equal(
-                       parser( 'gender-msg', 'Bob', user ),
+                       formatParse( 'gender-msg', 'Bob', user ),
                        'Bob: blue',
                        'Masculine from mw.user object'
                );
 
                user.options.set( 'gender', 'unknown' );
                assert.equal(
-                       parser( 'gender-msg', 'Foo', user ),
+                       formatParse( 'gender-msg', 'Foo', user ),
                        'Foo: green',
                        'Neutral from mw.user object' );
                assert.equal(
-                       parser( 'gender-msg', 'Alice', 'female' ),
+                       formatParse( 'gender-msg', 'Alice', 'female' ),
                        'Alice: pink',
                        'Feminine from string "female"' );
                assert.equal(
-                       parser( 'gender-msg', 'User' ),
+                       formatParse( 'gender-msg', 'User' ),
                        'User: green',
                        'Neutral when no parameter given' );
                assert.equal(
-                       parser( 'gender-msg', 'User', 'unknown' ),
+                       formatParse( 'gender-msg', 'User', 'unknown' ),
                        'User: green',
                        'Neutral from string "unknown"'
                );
                mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
 
                assert.equal(
-                       parser( 'gender-msg-one-form', 'male', 10 ),
+                       formatParse( 'gender-msg-one-form', 'male', 10 ),
                        'User: 10 edits',
                        'Gender neutral and plural form'
                );
                assert.equal(
-                       parser( 'gender-msg-one-form', 'female', 1 ),
+                       formatParse( 'gender-msg-one-form', 'female', 1 ),
                        'User: 1 edit',
                        'Gender neutral and singular form'
                );
 
                mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
                assert.equal(
-                       parser( 'gender-msg-lowercase', 'male' ),
+                       formatParse( 'gender-msg-lowercase', 'male' ),
                        'he is awesome',
                        'Gender masculine'
                );
                assert.equal(
-                       parser( 'gender-msg-lowercase', 'female' ),
+                       formatParse( 'gender-msg-lowercase', 'female' ),
                        'she is awesome',
                        'Gender feminine'
                );
 
                mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
                assert.equal(
-                       parser( 'gender-msg-wrong', 'female' ),
+                       formatParse( 'gender-msg-wrong', 'female' ),
                        ' test',
                        'Invalid syntax should result in {{gender}} simply being stripped away'
                );
        } );
 
        QUnit.test( 'Grammar', 2, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
-               assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+               assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
 
                mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
-               assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
+               assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
        } );
 
        QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
        } );
 
        QUnit.test( 'Links', 6, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction(),
-                       expectedDisambiguationsText,
+               var expectedDisambiguationsText,
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
                 the bold was removed because it is not yet implemented.
                 */
 
-               assert.equal(
-                       parser( 'jquerymsg-test-statistics-users' ),
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-statistics-users' ),
                        expectedListUsers,
                        'Piped wikilink'
                );
 
                expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
-                       $( '<a>' ).attr( {
-                               title: 'MediaWiki:Disambiguationspage',
-                               href: mw.util.wikiGetlink( 'MediaWiki:Disambiguationspage' )
-                       } ).text( 'MediaWiki:Disambiguationspage' ).getOuterHtml() + '.';
+                       '<a title="MediaWiki:Disambiguationspage" href="/wiki/MediaWiki:Disambiguationspage">MediaWiki:Disambiguationspage</a>.';
+
                mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
-               assert.equal(
-                       parser( 'disambiguations-text' ),
+               assert.htmlEqual(
+                       formatParse( 'disambiguations-text' ),
                        expectedDisambiguationsText,
                        'Wikilink without pipe'
                );
 
-               assert.equal(
-                       parser( 'jquerymsg-test-version-entrypoints-index-php' ),
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
                        expectedEntrypoints,
                        'External link'
                );
                // Pipe trick is not supported currently, but should not parse as text either.
                mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
                assert.equal(
-                       parser( 'pipe-trick' ),
+                       formatParse( 'pipe-trick' ),
                        'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
                        'Pipe trick should return error string.'
                );
 
-               expectedMultipleBars = $( '<a>' ).attr( {
-                       title: 'Main Page',
-                       href: mw.util.wikiGetlink( 'Main Page' )
-               } ).text( 'Main|Page' ).getOuterHtml();
+               expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
                mw.messages.set( 'multiple-bars', '[[Main Page|Main|Page]]' );
-               assert.equal(
-                       parser( 'multiple-bars' ),
+               assert.htmlEqual(
+                       formatParse( 'multiple-bars' ),
                        expectedMultipleBars,
                        'Bar in anchor'
                );
 
-               expectedSpecialCharacters = $( '<a>' ).attr( {
-                       title: specialCharactersPageName,
-                       href: mw.util.wikiGetlink( specialCharactersPageName )
-               } ).text( specialCharactersPageName ).getOuterHtml();
+               expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_%27Exotic_Island%27%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
 
                mw.messages.set( 'special-characters', '[[' + specialCharactersPageName + ']]' );
-               assert.equal(
-                       parser( 'special-characters' ),
+               assert.htmlEqual(
+                       formatParse( 'special-characters' ),
                        expectedSpecialCharacters,
                        'Special characters'
                );
 
 // Tests that {{-transformation vs. general parsing are done as requested
        QUnit.test( 'Curly brace transformation', 14, function ( assert ) {
-               var formatText, formatParse, oldUserLang;
-
-               oldUserLang = mw.config.get( 'wgUserLanguage' );
-
-               formatText = mw.jqueryMsg.getMessageFunction( {
-                       format: 'text'
-               } );
-
-               formatParse = mw.jqueryMsg.getMessageFunction( {
-                       format: 'parse'
-               } );
-
-               // When the expected result is the same in both modes
-               function assertBothModes( parserArguments, expectedResult, assertMessage ) {
-                       assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
-                       assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
-               }
+               var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
-               assertBothModes( ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+               assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
 
-               assertBothModes( ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+               assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
 
-               assertBothModes( ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+               assertBothModes( assert, ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
 
                mw.config.set( 'wgUserLanguage', 'en' );
-               assertBothModes( ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
+               assertBothModes( assert, ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
 
                // Test non-{{ wikitext, where behavior differs
 
                        mw.messages.get( 'jquerymsg-test-statistics-users' ),
                        'Internal link message unchanged when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'jquerymsg-test-statistics-users' ),
                        expectedListUsers,
                        'Internal link message parsed when format is \'parse\''
                        mw.messages.get( 'jquerymsg-test-version-entrypoints-index-php' ),
                        'External link message unchanged when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
                        expectedEntrypoints,
                        'External link message processed when format is \'parse\''
                        'Foo [http://example.com bar]',
                        'External link message only substitutes parameter when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'external-link-replace', 'http://example.com' ),
                        'Foo <a href="http://example.com">bar</a>',
                        'External link message processed when format is \'parse\''
        } );
 
        QUnit.test( 'Int', 4, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction(),
-                       newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
-                       expectedNewarticletext;
+               var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
+                       expectedNewarticletext,
+                       helpPageTitle = 'Help:Contents';
 
-               mw.messages.set( 'helppage', 'Help:Contents' );
+               mw.messages.set( 'helppage', helpPageTitle );
 
                expectedNewarticletext = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the ' +
-                       $( '<a>' ).attr( {
-                               title: mw.msg( 'helppage' ),
-                               href: mw.util.wikiGetlink( mw.msg( 'helppage' ) )
-                       } ).text( 'help page' ).getOuterHtml() + ' for more info). If you are here by mistake, click your browser\'s back button.';
+                       '<a title="Help:Contents" href="/wiki/Help:Contents">help page</a> for more info). If you are here by mistake, click your browser\'s back button.';
 
                mw.messages.set( 'newarticletext', newarticletextSource );
 
-               assert.equal(
-                       parser( 'newarticletext' ),
+               assert.htmlEqual(
+                       formatParse( 'newarticletext' ),
                        expectedNewarticletext,
                        'Link with nested message'
                );
 
                assert.equal(
-                       parser( 'see-portal-url' ),
+                       formatParse( 'see-portal-url' ),
                        'Project:Community portal is an important community page.',
                        'Nested message'
                );
                mw.messages.set( 'newarticletext-lowercase',
                        newarticletextSource.replace( 'Int:Helppage', 'int:helppage' ) );
 
-               assert.equal(
-                       parser( 'newarticletext-lowercase' ),
+               assert.htmlEqual(
+                       formatParse( 'newarticletext-lowercase' ),
                        expectedNewarticletext,
                        'Link with nested message, lowercase include'
                );
                mw.messages.set( 'uses-missing-int', '{{int:doesnt-exist}}' );
 
                assert.equal(
-                       parser( 'uses-missing-int' ),
+                       formatParse( 'uses-missing-int' ),
                        '[doesnt-exist]',
                        'int: where nested message does not exist'
                );
@@ -596,4 +566,149 @@ QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
        } );
 } );
 
+// HTML in wikitext
+QUnit.test( 'HTML', 26, function ( assert ) {
+       mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
+
+       assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
+
+       mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
+       assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+
+       mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
+       assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+
+       mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
+       assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+
+       mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
+
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-with-link' ),
+               'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.wikiGetlink( 'link' ) ) + '">wiki-link</i>',
+               'Italics with link inside in parse mode'
+       );
+
+       assert.equal(
+               formatText( 'jquerymsg-italics-with-link' ),
+               mw.messages.get( 'jquerymsg-italics-with-link' ),
+               'Italics with link unchanged in text mode'
+       );
+
+       mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-id-class' ),
+               mw.messages.get( 'jquerymsg-italics-id-class' ),
+               'ID and class are allowed'
+       );
+
+       mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-onclick' ),
+               '&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
+               'element with onclick is escaped because it is not allowed'
+       );
+
+       mw.messages.set( 'jquerymsg-script-msg', '<script  >alert( "Who put this tag here?" );</script>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-script-msg' ),
+               '&lt;script  &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
+               'Tag outside whitelist escaped in parse mode'
+       );
+
+       assert.equal(
+               formatText( 'jquerymsg-script-msg' ),
+               mw.messages.get( 'jquerymsg-script-msg' ),
+               'Tag outside whitelist unchanged in text mode'
+       );
+
+       mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-script-link-msg' ),
+               '&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.wikiGetlink( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
+               'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
+       );
+
+       mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-mismatched-html' ),
+               '&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
+               'Mismatched HTML start and end tag treated as text'
+       );
+
+       // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
+       // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
+       mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-script-and-external-link' ),
+               '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+               'HTML tags in external links not interfering with escaping of other tags'
+       );
+
+       mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-link-script' ),
+               '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+               'Non-whitelisted HTML tag in external link anchor treated as text'
+       );
+
+       // Intentionally not using htmlEqual for the quote tests
+       mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
+       assert.equal(
+               formatParse( 'jquerymsg-double-quotes-preserved' ),
+               mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
+               'Attributes with double quotes are preserved as such'
+       );
+
+       mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
+       assert.equal(
+               formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
+               '<i id="single">Single</i>',
+               'Attributes with single quotes are normalized to double'
+       );
+
+       mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
+               mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
+               'Escaped attributes are parsed correctly'
+       );
+
+       mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
+               mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
+               'Escaped attributes are parsed correctly'
+       );
+
+
+       mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-wikitext-contents-parsed' ),
+               '<i><a href="http://example.com">Example</a></i>',
+               'Contents of valid tag are treated as wikitext, so external link is parsed'
+       );
+
+       mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-wikitext-contents-script' ),
+               '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+               'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
+       );
+
+       mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-unclosed-tag' ),
+               'Foo&lt;tag&gt;bar',
+               'Nonsupported unclosed tags are escaped'
+       );
+
+       mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-self-closing-tag' ),
+               'Foo&lt;tag/&gt;bar',
+               'Self-closing tags don\'t cause a parse error'
+       );
+} );
+
 }( mediaWiki, jQuery ) );
index e8663f8..e338675 100644 (file)
                                'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
                                'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
                                'formatnum-msg': '{{formatnum:$1}}',
-                               'int-msg': 'Some {{int:other-message}}'
+                               'int-msg': 'Some {{int:other-message}}',
+                               'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+                               'external-link-replace': 'Foo [$1 bar]'
                        } );
 
-                       // For formatnum tests
-                       mw.config.set( 'wgUserLanguage', 'en' );
+                       mw.config.set( {
+                               wgArticlePath: '/wiki/$1',
+
+                               // For formatnum tests
+                               wgUserLanguage: 'en'
+                       } );
 
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
                }
                assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
        } );
 
-       QUnit.test( 'mw.message & mw.messages', 54, function ( assert ) {
+       QUnit.test( 'mw.message & mw.messages', 83, function ( assert ) {
                var goodbye, hello;
 
                // Convenience method for asserting the same result for multiple formats
                assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
                assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
-               assert.ok( mw.messages.set( 'escaped-with-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ) );
-               assert.equal( mw.message( 'escaped-with-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName' ) + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+               assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
+               assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message', 'Curly brace format works correctly' );
+               assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
+               assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+
+               assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
+               assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
+               assert.equal( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+               assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
+                       '<a title="Project:Community portal" href="/wiki/Project:Community_portal">community portal</a>' +
+                       ' &amp; <a title="Project:Help desk" href="/wiki/Project:Help_desk">help desk</a>', 'Internal links work with parse' );
 
-               assert.ok( mw.messages.set( 'escaped-with-square-brackets', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ) );
-               assert.equal( mw.message( 'escaped-with-square-brackets' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+               assertMultipleFormats( ['mediawiki-test-version-entrypoints-index-php'], ['plain', 'text', 'escaped'], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
+               assert.htmlEqual( mw.message( 'mediawiki-test-version-entrypoints-index-php' ).parse(), '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>', 'External link works correctly in parse mode' );
+
+               assertMultipleFormats( ['external-link-replace', 'http://example.org/?x=y&z'], ['plain', 'text'] , 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
+               assert.equal( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).escaped(), 'Foo [http://example.org/?x=y&amp;z bar]', 'In escaped mode, parameters are substituted and ampersand is escaped, but external link is not processed' );
+               assert.htmlEqual( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).parse(), 'Foo <a href="http://example.org/?x=y&amp;z">bar</a>', 'External link with replacement works in parse mode without double-escaping' );
 
                hello.parse();
                assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
                assert.ok( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b>−</b>]' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
 
-               assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ) );
+               assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
 
                assertMultipleFormats( ['gender-plural-msg', 'male', 1], ['text', 'parse', 'escaped'], 'he is awesome', 'Gender and plural are resolved' );
 
                assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
                assert.equal( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
+
+               assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
+               assertMultipleFormats( ['mediawiki-italics-msg'], ['plain', 'text', 'parse'], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-msg' ).escaped(),
+                       '&lt;i&gt;Very&lt;/i&gt; important',
+                       'Italics are escaped in escaped mode'
+               );
+
+               assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
+               assertMultipleFormats( ['mediawiki-italics-with-link'], ['plain', 'text'], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-with-link' ).escaped(),
+                       'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
+                       'Italics and link unchanged except for escaping in escaped mode'
+               );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-with-link' ).parse(),
+                       'An <i>italicized <a title="link" href="' + mw.util.wikiGetlink( 'link' ) + '">wiki-link</i>',
+                       'Italics with link inside in parse mode'
+               );
+
+               assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script  >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
+               assertMultipleFormats( ['mediawiki-script-msg'], ['plain', 'text'], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-script-msg' ).escaped(),
+                       '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+                       'Script escaped when using escaped format'
+               );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-script-msg' ).parse(),
+                       '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+                       'Script escaped when using parse format'
+               );
+
+
        } );
 
        QUnit.test( 'mw.msg', 14, function ( assert ) {
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
                assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
 
-               assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ) );
+               assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
                assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
                assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
        function assertStyleAsync( assert, $element, prop, val, fn ) {
                var styleTestStart,
                        el = $element.get( 0 ),
-                       styleTestTimeout = ( QUnit.config.testTimeout - 200 ) || 5000;
+                       styleTestTimeout = ( QUnit.config.testTimeout || 5000 ) - 200;
 
                function isCssImportApplied() {
                        // Trigger reflow, repaint, redraw, whatever (cross-browser)
                } );
        } );
 
-       QUnit.test( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+       QUnit.asyncTest( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                mw.loader.implement(
                        'test.implement.a',
                        function () {
-                               QUnit.stop();
-                               setTimeout(function () {
-                                       assert.equal(
-                                               $element.css( 'float' ),
-                                               'right',
-                                               'style is applied'
-                                       );
-                                       QUnit.start();
-                               });
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'style is applied'
+                               );
+                               QUnit.start();
                        },
                        {
                                'all': '.mw-test-implement-a { float: right; }'
                ] );
        } );
 
-// Backwards compatibility
-       QUnit.test( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+       // Backwards compatibility
+       QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                mw.loader.implement(
                        'test.implement.c',
                        function () {
-                               QUnit.stop();
-                               setTimeout(function () {
-                                       assert.equal(
-                                               $element.css( 'float' ),
-                                               'right',
-                                               'style is applied'
-                                       );
-                                       QUnit.start();
-                               });
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'style is applied'
+                               );
+                               QUnit.start();
                        },
                        {
                                'all': '.mw-test-implement-c { float: right; }'
                ] );
        } );
 
-// Backwards compatibility
+       // Backwards compatibility
        QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' );
                ] );
        } );
 
-// @import (bug 31676)
+       // @import (bug 31676)
        QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 5, function ( assert ) {
                var isJsExecuted, $element;
 
diff --git a/tests/qunit/suites/resources/startup.test.js b/tests/qunit/suites/resources/startup.test.js
new file mode 100644 (file)
index 0000000..cc8e640
--- /dev/null
@@ -0,0 +1,127 @@
+/*global isCompatible: true */
+( function ( $ ) {
+       var testcases = {
+               // Supported: Compatible
+               gradeA: [
+                       // Chrome
+                       'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
+                       // Firefox 4+
+                       'Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0',
+                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
+                       'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4',
+                       'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0',
+                       'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1',
+                       // Kindle Fire
+                       'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
+                       // Safari 5.0+
+                       'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
+                       // Opera 11+
+                       'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
+                       // Internet Explorer 6+
+                       'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
+                       'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+                       'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
+                       // IE Mobile
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)',
+                       // BlackBerry 6+
+                       'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
+                       'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
+                       'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+',
+                       // Open WebOS 1.4+ (HP Veer 4G)
+                       'Mozilla/5.0 (webOS/2.1.2; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160UNA/1.0',
+                       // Firefox Mobile
+                       'Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0',
+                       // iOS
+                       'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+                       'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+                       // Android
+                       'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17',
+                       // Recent Opera Mini - JS mostly doesn't work, but serving jQuery doesn't hurt users
+                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+               ],
+               // Supported: Uncompatible, serve basic content
+               gradeB: [
+                       // Internet Explorer < 6
+                       'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
+                       'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
+                       'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
+                       'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
+                       // Firefox < 3.6
+                       'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
+                       'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
+                       // BlackBerry < 6
+                       'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
+                       'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
+                       // Open WebOS < 1.5 (Palm Pre, Palm Pixi)
+                       'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0',
+                       'Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1 ',
+                       // SymbianOS
+                       'NokiaN95_8GB-3;Mozilla/5.0 SymbianOS/9.2;U;Series60/3.1 NokiaN95_8GB-3/11.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 AppleWebKit/413 (KHTML, like Gecko)',
+                       'Nokia7610/2.0 (5.0509.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0 ',
+                       'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413',
+                       'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-2/091.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.34 Mobile Safari/533.4',
+                       // NetFront
+                       'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)',
+                       'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)',
+                       'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2',
+                       // Opera Mini < 7
+                       'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
+                       'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
+                       'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54'
+               ],
+               // No explicit support for or against these browsers, they're
+               // given a shot at Grade A at their own risk.
+               gradeX: [
+                       // Firefox 3.6
+                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+                       // Gecko
+                       'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
+                       'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
+                       // KHTML
+                       'Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.5 (like Gecko)',
+                       // Text browsers
+                       'Links (2.1pre33; Darwin 8.11.0 Power Macintosh; x)',
+                       'Links (6.9; Unix 6.9-astral sparc; 80x25)',
+                       'Lynx/2.8.6rel.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8g',
+                       'w3m/0.5.1',
+                       // Bots
+                       'Googlebot/2.1 (+http://www.google.com/bot.html)',
+                       'Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)',
+                       'Mozilla/5.0 (compatible; YandexBot/3.0)',
+                       // Scripts
+                       'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5',
+                       'Wget/1.9',
+                       'Wget/1.10.1 (Red Hat modified)',
+                       // Unknown
+                       'I\'m an unknown browser',
+                       // Empty
+                       ''
+               ]
+       };
+
+       QUnit.module( 'startup', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'isCompatible( Grade A )', testcases.gradeA.length, function ( assert ) {
+               $.each( testcases.gradeA, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), true, ua );
+                       }
+               );
+       } );
+
+       QUnit.test( 'isCompatible( Grade B )', testcases.gradeB.length, function ( assert ) {
+               $.each( testcases.gradeB, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), false, ua );
+                       }
+               );
+       } );
+
+       QUnit.test( 'isCompatible( Grade X )', testcases.gradeX.length, function ( assert ) {
+               $.each( testcases.gradeX, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), true, ua );
+                       }
+               );
+       } );
+
+}( jQuery ) );